Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Структура языка и его синтаксисСтр 1 из 4Следующая ⇒
Язык SKILL
Структура языка и его синтаксис Четкой структуры программы не существует. Переменные задаются в процессе проектирования (написания программы). Имя переменной не может начинаться с числа. Регистр важен. Несколько выражений можно писать через пробел. Обычно принят, но не обязателен следующий синтаксис: Procedure(< name>( ) … … ) Специальные символы и операторы SKILL использует многие арифметические операторы:
** - возведение в степень; * - умножение; / - деление; + - сложение(плюс); - - вычитание(минус); ++а - инкремент; --а - декремент; == - сравнение (равно); != - неравно = - присваивание;
В следующей таблице приведен список специальных символов и их значений в SKILL.
Замечание: Всем символам, не являющимся буквами цифрами и ( _ или ?) , которые используются в имени переменных(функций) должен предшествовать, символ обратной косой черты (\).
Специальные символы SKILL
Пример: If(( ( ] ; результат – все скобки закрыты
Пробел Пробел иногда приобретает смысловое значение, поэтому необходимо рассмотреть несколько синтаксических ограничений. При написании функции, имя функции пишется перед левой скобкой и пробел между ними недопустим. Например, f( a b c) и g() правильное название , но f ( a b c) и g () неверно. Также минус должен непосредственно предшествовать (без пробела) тому оператору, которому он принадлежит. Например, -1, - a, и -( a* b) правильная конструкция, но - 1, - a, и - ( a* b) неверно. Двойной минус (оператор вычитания) должен быть с обеих сторон окружен пробелами, либо пробелов ни там, ни там вообще быть не должно. Для избежания неясности один из методов должен быть использован постоянно. Например, a - b и a- b правильная конструкция для двойного минуса, но a - b неверно.
Комментарии SKILL допускает два типа комментариев. Один стиль – блочно-ориентированный, где для разделения используются знаки /* и */. Например: /* This s a bloc of comments comment line2 comment line3 etc. */ Второй стиль – линейно ориентирован. Точка с запятой (;) указывает, что вся информация до конца строки, после нее является комментарием.
Например, x = 1 ; comment ;comment line1 Как более простой, рекомендуется линейно – ориентированный стиль. Типы данных Skill поддерживает различные типы данных.
array ó a (одномерный массив, двумерный получается комбинированием); dbobject ó d (объект базы данных); flonum ó f (число с плавающей точкой); list ó l (связанный список); integer ó x (целое число); symbol ó s(символ); stringSymbol ó S(символ или строка символов); windowtype ó w(тип окна).
Масштабные коэффициенты
Тип данных Atom Atom – все объекты SKILL, кроме непустых листов. nil является одновременно и типом atom, и типом list. Другими словами это все скалярные типы данных. Но есть несколько основных nil – не верно (для логических операций) или пустой лист t – верно (для логических операций) unbound – переменная не была заданна Нельзя пользоваться этими обозначениями для имен переменных.
Тип данных строка Строка это последовательность символов, заключенных в двойные кавычки. Например: “acd” “123” Тип данных List SKILL list – это упорядоченный набор объектов данных SKILL. Структура данных list является основной в SKILL и может быть использована в самых различных ситуациях. Элементы, входящие в list, могут быть любого типа данных, а также могут быть переменными или другими листами. List может включать в себя набор элементов или быть пустым. Пустой list обозначается пустыми скобками “( )” или специальным словом nil. В любом случае list должен быть заключен в скобки. List может содержать несколько элементов типа list для формирования структур данных любой сложности. Задание List может осуществляться двумя способами: задание элементов списка указанием количества аргументов функции list: a = list(1 2 3) задание элементов списка поименно с помощью оператора ('): a = ‘(1 2 3) List может состоять из символов, быть пустым, или содержать другие списки. Примеры: a = ‘(1 a 3) a = ‘( ) a = ‘(‘(1 2)’(3 4)) Функции работы с list SKILL обладает широким набором функций для создания и управления list. Многие функции SKILL в качестве возвращаемого значения имеют list. SKILL может использовать несколько строк терминала для вывода list (глобальная переменная SKILL _itemsperline хранит соответствующее целое значение) append( list1 list2)-объединяет два списка. Результат применения функции append следует сохранять в переменную, иначе дальнейшая работа со списком будет невозможна.
Пример: append( ‘(1 2) ‘(3 4)) =>’(1 2 3 4) a=’(1 2) b=’(3 4) append(a b) =>’(1 2 3 4) oneList = '( 4 5 6 ) => ( 4 5 6 ) aList = '( 1 2 3 ) => ( 1 2 3 ) bList = append( oneList aList) => ( 4 5 6 1 2 3 )
append1( list arg )-добавляет новый элемент в конец списка.
Пример: append1( ‘(1 2 3) 4)) =>’(1 2 3 4) car( list )- возвращает первый элемент списка. Сам список остается прежним. Пример: b = ‘(1 2 3) a= car(b) => (1) a =>(1) z = ‘(1 2 3) =>(1 2 3) y = car(z) => 1 y =>1 z =>(1 2 3) car(nil) => nil cdr( list )-возвращает все элементы списка кроме первого(возвращает лист). Пример: cdr ( '(a b c) ) => (b c) z = '(1 2 3) cdr ( z ) => (2 3) Функции cdr car можно использовать вложенным способом
Пример: caaar ('(((1 2 3)(4 5 6))(7 8 9))) => 1 caaar - car( car( car( l_list))). caadr ('(((1 2 3)(4 5 6))(7 8 9))) => 7 car( car( cdr( l_list))). caar ('(((1 2 3)(4 5 6))(7 8 9))) => (1 2 3) car( car( l_list)). z = '(1 2 3) => (1 2 3) cadr ( z ) => 2 nth( x _ index 0 l _ list ) – возвращает n-ый элемент списка. Возвращает nil если x _ index 0 отрицательный, больше или равен числу элементов списка. Нумерация начинается с нуля. При n = 0 функция как и car возвращает первый элемент.
Пример: nth ( 1 '( a b c ) ) => b z = '(1 2 3) => (1 2 3) nth (2 z ) => 3 nth (3 z ) => nil nthelem( x _ index 1 l _ list )- возвращает n-ый элемент списка. Возвращает nil если x _ index 1 меньше или равен 0 и больше чем число элементов списка. Нумерация начинается с единицы. При n = 1 функция как и car возвращает первый элемент.
Пример: nthelm ( 1 ‘(a b c)) =>a z = ‘(1 2 3) nthelem (2 z) =>2 cons( element list )-добавляет на первое место списка один элемент. Результат применения функции cons следует сохранять в переменную, иначе дальнейшая работа со списком будет невозможна. Обычно результат передается в переменную, до этого хранившую исходный список. Пример: cons(1 nil) => (1) cons(‘a ‘(b c)) => (a b c) result = '( 2 3 ) => ( 2 3 ) result = cons( 1 result ) => ( 1 2 3 ) Следующий пример показывает как быстро можно создать список от 100 до 1. x=nil for( i 1 100 x = cons(i x)) => t x => (100 99 98 . . 2 1) Можно сделать x = reverse( x) =>(1 2 3 …100) nthcdr( x _ count l _ list ) применяет команду cdr к данному списку заданное количество раз.
Пример: nthcdr ( 3 ‘(a b c d)) =>(d) z = ‘(1 2 3) nthcdr (2 z) =>(3) nthcdr (-1 z) =>(nil 1 2 3) Если x _ count меньше 0, то возвращается результат выполнения cons ( nil l _ list ) tconc( l_ ptr g_ x) добавление элемента в конец списка. для создания новой tconc структуры(списка) l_ptr должна быть определена как nil. g_x элемент добавляемый в конец списка. В результате выполнения этой функции мы получаем список l_ptr с добавленным в конец элементом.
Пример: x = tconc ( nil 1) => x ((1) 1) tconc ( x 2 ) =>x ((1 2) 2) tconc ( x 3 ) =>x ((1 2 3) 3) x = car( x ) =>x (1 2 3) lconc( l_ tconc l_ list ) добавление списка к другому списку l_ tconc структура(лист), созданная с помощью команды tconc. l_ list список, добавляемый в конец структуры l_tconc. В результате выполнения этой функции мы получаем список l_tconc с добавленным в конец списком.
Пример: x = tconc(nil 1) => x ((1) 1) lconc ( x ‘(2 3 4)) => x ((1 2 3 4) 4) lconc ( x ‘(5)) => x ((1 2 3 4 5) 5) x = car( x ) => x (1 2 3 4 5) nconc( l_arg1 l_arg2 [l_arg3…] ) объединение нескольких списков
Пример: x = ‘( a b c) nconc ( x ‘(d)) => x (a b c d) nconc ( x ‘(e f g)) => x (a b c d e f g) данная функция быстрее чем append? Но медленнее чем tconc и lconc. Данная функция использует меньше памяти. length( lao _ arg ) – возвращает количество элементов списка или массива.
Пример: length( ‘(a b c d)) =>4 z = ‘(1 2 3) length( z ) =>3 Лекция 2. Операторы доступа в SKILL Некоторые операторы доступа имеют характерный тип (вид). То есть синтаксис доступа к различным типам данных может быть одинаковым. Оператор “стрелка” (->) Применяется для доступа к свойствам ассоциативных таблиц, списков, структур, определяемых пользователем и др. Свойства, к которым осуществляется доступ этим оператором, всегда должны быть символами, значения которых могут быть любым типом данных SKILL.
Оператор “волнистая стрелка” (~>) Этот оператор является обобщением обычной стрелки. Кроме доступа непосредственно к объекту с помощью этого оператора также можно осуществить доступ к списку подобных объектов. В этом случае оператор «стрелка» будет применён к каждому элементу списка.
Символы ( Symbol) В SKILL символы играют ту же роль, что и переменные в С. Часто термины “символ” и “переменная” подменяют друг друга; при этом символы в SKILL могут быть использованы и для других целей. Каждый символ обладает следующими составляющими: § имя § значение § функциональное выражение § список свойств. За исключением имени, остальные свойства являются необязательными (могут быть пустыми). Не рекомендуется одновременно задавать символу значение и функциональное выражение.
Значение символа Значение символа может быть любого типа, включая тип символ.
Придание символу значения Чтобы придать символу значение используйте оператор (=). Пример x = 5 => 5 Получение значения символа Для получения значения символа необходимо сослаться на его имя. x=> 5
Строки( String) Строка – это некоторый набор символов. a = “ a b c” Условные операторы . if( g_condition g_thenExpression [ g_elseExpression ] ) => g_result
if( g_condition then g_thenExpr1 ... [ else g_elseExpr1 ... ] ) => g_result
Пример: x = 2 if( (x > 5) 1 0) => 0 ; Returns 0 because x is less than 5. x = 7 if( (x > 5) then 1 else 0) => 1 ; Returns 1 because x is greater than 5. if( (x > 5) then println("x is greater than 5") x + 1 else print("x is less ") x - 1)
x is greater than 5 ; Printed if x was 7. => 8 ; Returned 8 if x was 7.
when( g_condition g_expr1 ... ) => g_result | nil Пример: x = -123 when( x < 0 println("x is negative") -x) => 123 ;Prints "x is negative" as side effect.
when( x >= 0 println("x is positive") x) => nil Функция case предлагает выполнение различных выражений при различных условиях: case( g_selectionExpr l_clause1 [ l_clause2 ... ] ) => g_ result | nil caseq быстрее чем case, синтаксис одинаковый.
Пример: nameofmonth = "February"
month = case( nameofmonth ("January" 1) ("February" 2) (t 'Other)) => 2 Операторы цикла . for( s_loopVar x_initialValue x_finalValue g_expr1 [ g_expr2 ... ] ) => t Пример: sum = 0 for( i 1 10 sum = sum + i printf("%d\n" sum)) ð t foreach( s_formalVar g_exprList g_expr1 [ g_expr2 ... ] ) => l_ valueList / l_ result используется для списков.
Пример: foreach ( x '(1 2 3 4) println(x))
1 ; Prints the numbers 1 through 4. 2 3 4 ð (1 2 3 4) Порты . Весь ввод/вывод в Skill осуществляется с помощью типа данных «порт» .Порт может быть открыт для чтения (входной порт) или для записи (выходной порт). В операционной системе Unix количество одновременно открытых портов ограничено, поэтому после использования порты всегда нужно освобождать (закрывать). Предопределенные порты Большинство функций ввода/вывода в языке Skill принимают порт в качестве необязательного аргумента. Если порт не указан, по умолчанию используются порты piport и poport в качестве входного и выходного портов соответственно. В таблице ниже находится список и назначение предопределённых портов. Данные порты все время открыты системой, поэтому их не надо открывать или закрывать.
Вывод данных. Skill предусматривает функции для форматированного и неформатированного вывода.
Неформатированный вывод.
print( g_ value [ p_ outputPort ] ) => nil Печатает объекты SKILL , используя формат по умолчанию для типов данных значений (вычислений). Например, строка символов заключается в двойные кавычки. g_ value - любой объект SKILL p_ outputPort - порт выхода для печати. По умолчанию - poport Всегда возвращает nil после того, как объект напечатан.
Пример: print ("hello") "hello" ð nil println(g_value [ p_outputPort ] ) => nil Печатает объекты SKILL, используя формат по умолчанию для типов данных значений, затем печатает символ, обозначающий конец текстовой строки и возвращающий печатающую головку принтера на начало (левый край) следующей строки. g_ value - любой объект SKILL p_ outputPort - порт выхода для печати. По умолчанию - poport Всегда возвращает nil после того, как объект напечатан.
Пример: for( i 1 3 println( "hello" )) "hello" "hello" "hello"
Форматированный вывод. Вы можете предопределить формат вывода с помощью соответствующего поля спецификации. Например, %5d означает, что будет напечатано целое число, которое имеет ширину 5 позиций. Если число начинается с 0, то те позиции которые не заняты заполняются 0 вместо пробелов. Форматы вывода:
printf( t_formatString [ g_arg1 ... ] ) => t Форматированный вывод в poport.
Пример: x = 197.9687 => 197.9687 printf ("The test measures %10.2f.\n" x) The test measures 197.97 sprintf( {s_Var | nil } t_formatString [ g_arg1 ... ] ) => t_ string Форматированный вывод в строку.
Пример: sprintf (s "Memorize %s number %d!" "transaction" 5) => "Memorize transaction number 5!"
s => "Memorize transaction number 5!"
p = outfile(sprintf(nil "test%d.out" 10)) => port:"test10.out" Ввод. evalstring( t_string [ s_langMode ] ) => g_value | nil Читает и вычисляет выражения, сохраненные в строке символов. t_ string- строка, содержащая Skill выражение, которое необходимо вычислить s_ langMode - данный аргумент должет быть типа символ. Доступные значения: ‘ils вычисляет строку в Skill++ ‘il вычисляет строку в Skill, данное значение установлено по умолчанию Возвращает вычисленное значение или nil если строка не прочитана.
Пример: evalstring ("1+2") => 3 The 1+2 infix notation is the same as (plus 1 2). evalstring ("cons('a '(b c))") => (a b c) car '(1 2 3) => 1 load( t_fileName [ t_password ] ) => t Открывает файл, неоднократно вызывает функцию lineread для чтения в файл. Сразу же после прочтения вычисляет каждую форму. Использует расширение файла для определения модели языка (.il для SKILL и .ils для SKILL). Закрывает файл, когда достигнут конец файла. Если не обнаружены ошибки, файл читается спокойно. Если load прервана нажатием клавиши Control- c, функция пропускает остаток загруженного файла. t_ fileName – имя файла, который необходимо загрузить t_ password – пароль, если файл зашифрованный Возвращает t, если файл загружен успешно.
Пример: load( "testfns.il") loadi( t_fileName [ t_password ] ) => t В отличии от функции load, функция loadi игнорирует ошибки, обнаруженные во время загрузки. Прежде чем остановиться, loadi печатает сообщение, указывая причину ошибки, и продолжает загрузку пока не дойдет до конца файла. Во всем остальном loadi подобна функции load.
Базы данных Все средства Cadence используют унифицированную базу данных DFII, это двоичная база данных, которая хранит данные, как объекты. Существует большое количество типов объектов, например: · rectangle; · terminal; · instance; · cellview и др. База данных DFII хранит как физическую, так и логическую информацию о проекте. Физическая информация, хранящаяся в объектах, - геометрические формы и IC топология. Логическая информация – цепи и схемы, которые могут существовать без соответствующей физической реализации. Для доступа к объекту необходимо использовать метку – идентификатор объекта, его ID. Каждый ID однозначно определяет объект базы данных и представлен специальным типом dbObject. Только внутренние программы базы данных могут создавать ID, и пользователь не может изменять их напрямую. Когда вы используете функцию, которая работает с объектами баз данных, необходимо указывать ID в качестве аргумента. Различные типы и классы объектов формируют иерархию классов. Когда количество отдельных типов объектов, использующих общие атрибуты, превышает некоторое число, создается класс объектов. Например, геометрические фигуры имеют атрибуты layer, purpose, bounding box.
Атрибуты объектов Каждый тип объектов имеет набор атрибутов, которые можно узнать, используя специальные для данного типа функции доступа. Существует три типа атрибутов: · обязательные – должны быть заданы во время создания объекта. Большинство атрибутов относится к этому типу. · необязательные – не являются обязательными для объекта. Данные атрибуты не нужно задавать во время создания объекта. Они могут быть добавлены в любое время. · вторичные – получаются из других атрибутов объекта. Вторичные атрибуты доступны пользователю только для чтения. Эти атрибуты играют большую роль в ускорении процесса расчетов.
Свойства объектов Свойства объектов имеют имена и значения, например целое, с плавающей точкой, строка. Объект может обладать произвольным количеством свойств. Свойства нужны для хранения различной информации.
DbOpenCellViewByType Эта функция открывает Cellview для чтения, записи, дозаписи. Если Cellview открывается для чтения, то она должна существовать. Для всех остальных режимов, если Cellview не существует, то она создается автоматически.
dbOpenCellViewByType ( ( gt _ lib | ni ) l ; определяет ddId библиотеки, имя библиотеки t_ lib или nil. t_ cellName ; определяет имя cellview. lt _ viewName ; определяет имена view. [ t_ viewTypeName [ t_ mode [ d_ contextCellView ]] ; определяется тип view, t_mode определяет доступ к cellview и может принимать следующие значения: ; r Открывает cellview только для чтения. Cellview должна существовать. ; а Открывает cellview в режиме дозаписи. ; w Режим записи. ; s Открытие во временном режиме. Cellview нельзя сохранить на диск. ; и др. ) => d_ cellView / nil Пример: Открыть ячейку “ cellA ” view “ layout” в режиме для чтения, если она существует в библиотеке “ test”. cellview = dbOpenCellViewByType( “test” “cellA” “layout” ) Открыть ее в режиме дозаписи. Создать, если такой не существует: cellview = dbOpenCellViewByType(“test” “cellA” “layout” “maskLayout” “a” ) Открыть ее в режиме дозаписи только в случае, если она существует: cellview = dbOpenCellViewByType(“test” “cellA” “layout” “ ” “a” ) DbFindOpendCellView Эта функция находит открытую cellview.
dbFindOpenCellView ( g_ libId ; определяет ddId библиотеки. t_ cellName ; определяет имя cellview. t_ viewName ; определяет имена view. t_ version ; аргумент введен для совместимости различных версий, если задан, должен быть nil. ) =>d_cellViewId / nil Пример : с v = dbFindOpenedCellView( lib “abc” “schematic” ) Находит view “schematic” ячейки “abc” библиотеки “lib”. dbFindAnyInstByName( d_cellView t_name ) => d_ inst / nil Находит instance или группу instance (mosaic) с одним именем. Использование этой функции более эффективно, чем поиск в списке из всех instance. Пример: dbFindAnyInstByName (inCellView "inst1") dbFindAnyInstByName (inCellView "myInv<0:1>")
dbFindProp( d_object t_name ) ð d_propId / nil dbGetPropByName( d_object t_name ) => d_propId / nil Эти две функции выполняют одно и тоже. Находят свойство по заданному имени и возвращают его Id. Пример: propId = dbFindProp(instId "myProp") propId = dbGetPropByName(instId "myProp") Оператор ~>? возвращает список всех доступных атрибутов для dbObject. d_object ~>? => l_attributeNames <1> cv = dbOpenCellViewByType(nil "inv" "symbol") ; open a cellview db:2066752 <2> prop = car(cv~>prop) ; ; get the first property db:2068776 <3> prop~>? ;; fetch the attribute names (cellview objType prop enum name object range value valueType) Оператор ~>?? возвращает список всех доступных атрибутов и их значений как property list для dbObject. d_object ~>?? => l_attributeValuePairs <4> prop~>?? (db:2068776 cellview db:2066752 objType "prop" prop nil enum nil name "lastSchematicExtraction" object db:2066788 range nil value "May 20 19:41:08 1991" valueType "time") Доступ к значению свойства: prop_ name-> value dbSave Эта функция используется для сохранения измененной cellview.
dbSave( d_cellView d_destCellView ) => t / nil dbSave( d_cellView t_libName t_cellName t_ viewName ) => t / nil d_ cellView Cellview, которая должна быть сохранена. d_ destCellView Определяет cellview, в которую сохранить информацию. t_ cellName Определяет имя ячейки. lt _ viewName Оределяет имена view. t_ version аргумент введен для совместимости различных версий, если задан, должен быть nil.
Пример: Сохранить поверх существующей: dbSave ( cellview ) Сохранить в указанную библиотеку: destCV = dbOpenCellViewByType ( lib “ cellName ” “ schematic” “ schematic” “ w” ) dbSave ( cellview destCV ) Сохранить в cellview другой библиотеки: dbSave ( cellView “libName” “cellName” “viewName” ) DbClose Эта функция используется для закрытия cellview:
dbClose( d_ cellView ; определяет cellview, которую следует закрыть. ) => t / nil Пример: Сохранить изменения и закрыть cellview : dbSave ( cellview ) dbClose ( cellview ) Язык SKILL
Структура языка и его синтаксис Четкой структуры программы не существует. Переменные задаются в процессе проектирования (написания программы). Имя переменной не может начинаться с числа. Регистр важен. Несколько выражений можно писать через пробел. Обычно принят, но не обязателен следующий синтаксис: Procedure(< name>( ) … … ) |
Последнее изменение этой страницы: 2019-04-19; Просмотров: 187; Нарушение авторского права страницы