转工艺笔记
tower 转到 xfab 工艺
原理图
- tower 工艺默认单位 um,而 xfab 工艺默认单位 m,需要修改 skill 脚本来实现(已解决)
- tower 工艺使用 fingerW 来计算总 W,xfab 工艺使用总 W 和 finger 数量(skill 脚本转换,已解决)
问题:
- 3.3V 管子选哪个?ne3?
- LVS 问题: 以 blockB_lyf full_adder_1bit 为例,尺寸有 1% 偏差(很多其它地方也是)
- 很多错误是转之前就存在的,原来的版图的 DRC 和 LVS 就存在问题
版图
- 将所需版图导出 Stream,GDS 文件
- 修改 map 文件(已完成),从源工艺到目标工艺
- 将导出的 gds 文件导入到目标工艺项目中
- 将末尾带编号的器件,换成库中对应尺寸的器件,然后删除并在上一级打散即可
map 文件
ACTIVE drawing 3 0
AREA2 drawing 4 0
CS drawing 15 0
GC drawing 13 0
GC label 13 3
GC_nooconn ny 13 4
M1 drawing 16 0
M1 label 16 3
M2 drawing 18 0
M2 label 18 3
M3 drawing 28 0
M3 label 28 3
NS drawing 34 0
PAD drawing 19 0
TOP_M drawing 31 0
TOP_M label 31 3
TOP_V drawing 29 0
V2 drawing 17 0
V3 drawing 27 0
WB drawing 68 0
WN drawing 2 0
XN drawing 8 0
XP drawing 7 0
instance drawing
prBoundary drawing 190 0
text drawing 230 0
器件替换 Skill 脚本
procedure(CCSdelInstCreate(library @optional
;; Modify device list as per your primitive devices
(deviceMapList '(
("pmos_18" ("PRIMLIB" "pe"))
("nmos_18" ("PRIMLIB" "ne"))
("pmos_33" ("PRIMLIB" "pe3"))
("nmos_33" ("PRIMLIB" "ne3"))
("ddwnps18" ("PRIMLIB" "ddnw"))
))
;; Modify propMapList as per the properties you want to copy
(addSuffixProps '("w" "l" "fw"))
(propMapList '(
("l" "l")
("w" "wtot")
("m" "m")
("fingers" "ng")
))
"tll"
)
let (
(cv cellname name transform libId instId deviceList deviceTable propTable)
libId = ddGetObj(library)
unless(libId error("Specified library: %s does not exists, cannot proceed!\n" library))
deviceTable = makeTable("deviceTable")
foreach (dev deviceMapList
deviceTable[car(dev)] = cadr(dev)
deviceList = cons(car(dev) deviceList)
)
propTable = makeTable("propTable")
foreach (cellId libId~>cells
;; Check if the cell has schematic view
if (exists(x cellId~>views~>name (x == "schematic"))
then
printf("Operating on Lib: %s Cell:%s View: schematic\n" library cellId~>name )
cv = dbOpenCellViewByType(library cellId~>name "schematic" "schematic" "a")
;; Check if cellview has the instances of given device
foreach (inst cv~>instances
if (member(inst~>cellName deviceList) then
transform = inst~>transform
name = inst~>name
cellname = inst~>cellName
;; Populate old property values to table
cdfId = cdfGetInstCDF(inst)
foreach (propList propMapList
propTable[car(propList)] = cdfFindParamByName(cdfId car(propList))~>value
) ;; foreach
;; Delete old instance
dbDeleteObject(inst)
;; Create new instance
instId = dbCreateInstByMasterName(cv car(deviceTable[cellname])
cadr(deviceTable[cellname])
"symbol" name
car(transform)
cadr(transform))
;; Populate the inst parameter values from prop table
foreach (propList propMapList
let ((oldProp newProp oldValue)
oldProp = car(propList)
newProp = cadr(propList)
oldValue = propTable[oldProp]
if (oldValue && stringp(oldValue) && member(oldProp addSuffixProps)
then dbSet(instId strcat(oldValue "u") newProp)
else dbSet(instId oldValue newProp)
) ;; end of if
) ;; end of foreach
dbSet(instId "DeviceWidth" "calcMethod")
) ;; if member
) ;; foreach inst
;; Uncomment below line to check and save the cellview
;; if(dbIsCellViewModified(cv) then schCheck(cv) dbSave(cv))
) ;; if
) ;; foreach
) ;; let
) ;; proc