
Базы данных
Все средства Cadence используют унифицированную базу данных DFII, это двоичная база данных, которая хранит данные, как объекты. Существует большое количество типов объектов, например:
-
rectangle;
-
terminal;
-
instance;
-
cellview и др.
База данных DFII хранит как физическую, так и логическую информацию о проекте. Физическая информация, хранящаяся в объектах, - геометрические формы и IC топология. Логическая информация – цепи и схемы, которые могут существовать без соответствующей физической реализации.
Для доступа к объекту необходимо использовать метку – идентификатор объекта, его ID. Каждый ID однозначно определяет объект базы данных и представлен специальным типом dbObject. Только внутренние программы базы данных могут создавать ID, и пользователь не может изменять их напрямую. Когда вы используете функцию, которая работает с объектами баз данных, необходимо указывать ID в качестве аргумента.
Различные типы и классы объектов формируют иерархию классов. Когда количество отдельных типов объектов, использующих общие атрибуты, превышает некоторое число, создается класс объектов. Например, геометрические фигуры имеют атрибуты layer, purpose, bounding box.
Атрибуты объектов
Каждый тип объектов имеет набор атрибутов, которые можно узнать, используя специальные для данного типа функции доступа. Существует три типа атрибутов:
-
обязательные – должны быть заданы во время создания объекта. Большинство атрибутов относится к этому типу.
-
необязательные – не являются обязательными для объекта. Данные атрибуты не нужно задавать во время создания объекта. Они могут быть добавлены в любое время.
-
вторичные – получаются из других атрибутов объекта. Вторичные атрибуты доступны пользователю только для чтения. Эти атрибуты играют большую роль в ускорении процесса расчетов.
Свойства объектов
Свойства объектов имеют имена и значения, например целое, с плавающей точкой, строка. Объект может обладать произвольным количеством свойств. Свойства нужны для хранения различной информации.
Различия между атрибутами и свойствами.
Главное отличие между атрибутами и свойствами заключается в том, что атрибуты предопределяются базой данных и доступ к ним регулируется базой данных, а свойства создаются в приложениях на основе базы данных.
Хотя свойства и не являются обязательными, часто они могут влиять на работу некоторых приложений, например, создание netlist.
Оператор доступа к базе данных ~> работает как с атрибутами, так и со свойствами объекта базы данных. Для этого оператора приоритетными являются атрибуты, что означает, что вы не сможете получить доступ к свойству с идентичным атрибуту именем.
Функции работы с библиотечными элементами.
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
dbGetq( d_object St_AttrOrPropName )
=> g_value
dbGet( d_object St_AttrOrPropName )
-
g_value
возвращает значение атрибута или свойства, связанного с объектом базы данных.
Пример:
dbGetq(c shapes) ; Does not evaluate second argument
c~>shapes ; Exactly equivalent to above
c~>"shapes" ; Exactly equivalent to above
dbGet(c 'shapes) ; Evaluates both its arguments
str = 'shapes ; Assigns attribute name
dbGet(c str) ; "str" is evaluated to shapes
dbSetq( d_object g_value St_AttrOrPropName )
=> g_value / nil
dbSet( d_object g_value St_AttrOrPropName )
-
g_value / nil
изменяет величину атрибута или свойства объекта базы данных.
Пример:
dbSetq(p 2 width) ; ; Does not evaluate third argument
p~>width = 2 ; ; Exactly equivalent to above
p~>"width" = 2 ; ; Exactly equivalent to above
dbSet(p 2 'width) ; ; Evaluates 1st & 3rd arguments
w = 'width ; ; Assigns attribute name
dbSet(p 2 w) ; ; "w" is evaluated to width
; Attach figure f to net n:
dbSetq(f n net) ; ; Does not evaluate third argument
f~>net = n ; ; Exactly equivalent to above
; Detach figure f from its net:
dbSet(f nil 'net) ; ; Evaluates 1st & 3rd argument
f~>net = nil ; ; Exactly equivalent to above
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 )
Логические функции.
leLayerAnd(
d_cellViewId
g_lpp1
g_lpp2
g_lpp3
)
-
l_shapes | nil
Создает фигуру в d_cellViewId из пересечения исходных фигур слоев g_lpp1 и g_lpp2. Пара layer-purpose это лист, содержащий имя слоя(layer name) и «предназначение» слоя(layer purpose)
Возвращает Id новой фигуры, если она создалась или nil.
Пример:
leLayerAnd( cell1 list("poly1" "drawing") list("pdiff" "drawing") list("activegate" "drawing") )
leLayerAndNot(
d_cellViewId
g_lpp1
g_lpp2
g_lpp3
)
-
l_shapes | nil
Создает фигуру в слое g_lpp3, которая содержит фигуры слоя g_lpp1 за исключением пересечений со слоем g_lpp2.
Пример:
leLayerAndNot( cell3 list("via" "drawing") list("metal2" "drawing") list("opencontacts" "drawing") )
leLayerOr(
d_cellViewId
g_lpp1
g_lpp2
g_lpp3
)
=> l_shapes | nil
Создает фигуру в слое g_lpp3, которая содержит фигуры слоев g_lpp1 и g_lpp2.
Пример:
leLayerOr( (cell3 list("metal1" "drawing") list("metal2" "drawing") list("allmetal" "drawing") )
leLayerSize(
d_cellViewId
g_lpp1
n_sizeAmount
g_lpp2
)
=> l_shapes | nil
Создает фигуру в слое g_lpp2 , которая увеличивает (или уменьшает) фигуру в слое g_lpp1 на n_sizeAmount . Данный коэффициент может быть как отрицательным, так и положительным.
Пример:
leLayerSize( cell2 list("gate" "drawing") 1.5 list("implant" "drawing") )
leLayerXor(
d_cellViewId
g_lpp1
g_lpp2
g_lpp3
)
=> l_shapes | nil
Создает фигуру в слое g_lpp3, которая содержит фигуры слоев g_lpp1 и g_lpp2 за исключением их пересечений.
Пример:
leLayerXor( cell2 list("pdiff" "drawing") list("nwell" "drawing") list("missingwell" "drawing") )
leMakeCell(
l_figs
t_libName
t_cellName
t_viewName
g_replace
)
=> d_cellViewId | nil
Создает ячейку, определенную как _libName, t_cellName, и t_viewName, которая содержит фигуры определенные в листе l_figs. Если ячейка уже существует, то старая заменяется на новую.
Пример:
leMakeCell( list(fig1 fig2) "mylib" "mycell" "layout" nil )
leFlattenInst(
d_instId
x_levels
[ g_flattenPCells ]
[ g_preservePins ]
[ g_preserveRODobjs ]
)
=> t | nil
Раскрывает указанное количество уровней иерархии ячейки.
[ g_flattenPCells ] параметр, отвечающий за раскрытие иерархии PCells. Принимает значения t или nil. По умолчанию nil.
Пример:
leFlattenInst( instance1 2 nil )
Flattens the instance instance1 through two levels of the hierarchy and does not flatten any pcells contained in the instance.
cellview = dbOpenCellViewByType("skill_tr" "inv" "layout" "" "a")
n = leLayerAnd(cellview list("Nimp" "drawing") list("Poly" "drawing")
list("Via1" "drawing"))
p = leLayerAnd(cellview list("Pimp" "drawing") list("Poly" "drawing")
list("Via1" "drawing"))
;printf( "shapes: '%L'\n" cellview->shapes~>?? )
shapesToCopy = `()
foreach( shape cellview->shapes
if( shape->layerName == "Metal1" || shape->layerName == "prBoundary" then
shapesToCopy = append1( shapesToCopy shape )
)
)
printf( "shapesToCopy: '%L'\n" shapesToCopy )
leMakeCell( shapesToCopy "skill_tr" "inv" "abstract" nil )
dbSave(cellview)
dbClose(cellview)