为什么我用gds做mw和lef做mw的frame会不一样呢!
ISOHID4M这个cell是设计中要用到的,但是standar cell没有,我们就自己做了layout,然后用astro抽取frame给icc place&route使用!
但是出现了问题!我在astro中用import gds的方法抽取的frame,在icc中cell不在cell track上,但是用lef in这个方法做的frame是没有问题的,
lef文件也是同一个gds抽取的!同学们帮我看看问题出在哪里啦?
这张是import gds的方法抽取的frame!isohid4m这个cell离左右的cell都有缝隙!
这张是lef in做的frame!这个就没有缝隙!
这是我import gds to frame的脚本!
- define lib_name "iso_slow"
- define tech_file "smic18m_5lm.tf"
- define gds_file "ISO.gds"
- define metal1text_num "141"
- define metal2text_num "142"
- define metal3text_num "143"
- define metal4text_num "144"
- define metal5text_num "145"
- define cellpitch_width "0.56"
- define cellpitch_length "3.92"
- define prBoundary_layer "127"
- menuReload "astro_data_prep"
- cmCreateLib
- setFormField "Create Library" "Library Name" lib_name
- setFormField "Create Library" "Set Case Sensitive" "1"
- setFormField "Create Library" "Technology File Name" tech_file
- formOK "Create Library"
- geOpenLib
- setFormField "Open Library" "Library Name" lib_name
- formOK "Open Library"
- auStreamIn
- setFormField "Stream In Data File" "Stream File Name" gds_file
- setFormField "Stream In Data File" "Library Name" lib_name
- setFormField "Stream In Data File" "Use Layer for Boundary" "1"
- setFormField "Stream In Data File" "Boundary Layer" prBoundary_layer
- setFormField "Stream In Data File" "Cell Type Definition File" ""
- formOK "Stream In Data File"
- dbSetCellPortTypes lib_name "*" '(
- ("VDD" "Power")
- ("VSS" "Ground")
- ("ISO" "Input")
- ("I" "Input")
- ("Z" "Output")
- )#f
- cmMarkCellType
- setFormField "Mark Cell Type" "Library Name" lib_name
- setFormField "Mark Cell Type" "Cell Name" ".*"
- setFormField "Mark Cell Type" "pattern match" "1"
- setFormField "Mark Cell Type" "Cell Type" "std cell"
- formOK "Mark Cell Type"
- auExtractBlockagePinVia
- setFormField "Extract Blockage" "Library Name" lib_name
- setFormField "Extract Blockage" "macro" "0"
- setFormField "Extract Blockage" "pad" "0"
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- formButton "Extract Blockage" "extractBlkg"
- setFormField "Extract Blockage" "Routing Blockage Output Layer" "metBlk"
- setFormField "Extract Blockage" "Poly Blockage As Thin" "1"
- setFormField "Extract Blockage" "Metal1 Blockage As Thin" "1"
- setFormField "Extract Blockage" "Metal2 Blockage As Thin" "1"
- setFormField "Extract Blockage" "Metal3 Blockage As Thin" "1"
- setFormField "Extract Blockage" "Metal4 Blockage As Thin" "1"
- setFormField "Extract Blockage" "Metal5 Blockage As Thin" "1"
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- formButton "Extract Blockage" "extractPin"
- setFormField "Extract Blockage" "Metal1 Text" metal1text_num
- setFormField "Extract Blockage" "Metal2 Text" metal2text_num
- setFormField "Extract Blockage" "Metal3 Text" metal3text_num
- setFormField "Extract Blockage" "Metal4 Text" metal4text_num
- setFormField "Extract Blockage" "Metal5 Text" metal5text_num
- setFormField "Extract Blockage" "extract connectivity" "0"
- setFormField "Extract Blockage" "text fall through" "0"
- setFormField "Extract Blockage" "double fall through" "0"
- ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
- formButton "Extract Blockage" "extractVia"
- formOK "Extract Blockage"
- auSetPRBdry
- setFormField "Set PR Boundary" "Library Name" lib_name
- setFormField "Set PR Boundary" "Height" "specify"
- setFormField "Set PR Boundary" "Height Value" cellpitch_length
- setFormField "Set PR Boundary" "Width" "specify"
- setFormField "Set PR Boundary" "Width Value" cellpitch_width
- formOK "Set PR Boundary"
- geConfirmCloseLib
- formYes "Dialog Box"
auSetPRBdry结束后需要下面的操作:
设置WireTrack。
Milkyway : Wire Tracks -> Define Unit Tile Wire Tracks …
设置的原则是横向的offset要设置为0,纵向的offset要设置为Pitch的一半。
好的!谢谢!我试试!
但是其中还有一个cell是ISOLOD4M,这个cell是和ISOHID4M这个cell一样的脚本的,但是它好像就没有这个问题的!
好高森 马克一下
两个cell的size是一样的吗?可能是碰巧那个cell满足track。
通常std cell做Milkyway数据都需要做wire track
两个cell的大小是不同的!按你的要求做了wire track,好像还是不行呢!
有没有cell track的设置呢!
这个cell是你自己做的?cell的boundary size一定要是最小std cell的H/W的整数倍。
wire track设定是针对routing的。我刚开始没有细看你的描述,只看了你的script
嗯!那我的脚本有没有什么问题呢?
脚本需要添加wire track,否则routing会有问题
好的!多谢了!
给你两个建议:
1.不要在新建的milkyway上生成frameview,将GDS导入到已经存在的std库中,可以先把std库拷到当前目录,因为std库中有个叫unitTile的cell。
2.在你的脚本中加一个命令:
两个都读出GDS来,在virtuoso下看看有没缝
好的!我明天试试!
用了你的方法,还是没效果哦,是不是不得要领呢!
我发现问题了,在做完auSetPRBdry这步以后,两个cell的frame变成了这样了!
HID这个cell两边出现了绿框!这就是为什么这个cell不能和别的cell贴合的原因了!
LOD就没有这个绿框!我量了一下,HID绿框的宽度是和LOD黄色的框子的宽度是一样的!
不知道问什么会出现这样的情况!是不是需要哪里设置一下啊!
看到图片中的108了吗,你这个option没设对,所以工具把你的gds的boundary认错了,你的绿框应该是NW或者NP,PP之类的层次吧。
找出你的techfile中可以用作bounary的层次,然后你在gds加上boundary这一层,再在Milkyway里设置对应的层次为boundary。
我的prboundary就是127这层,反复确认了!现在的情况是库里面只有一个cell,做的frame都是对的!但是有多个cell的时候,frame就不对了!它会把最大的cell boundary做
默认的boundary,cell不够宽度的,就显示上面那张图的绿色框补足!
哎!不知道什么情况!
做任何一个单独的cell都对么?
能否把你的gds2Arcs.map文件发来看看,127是你在gds里面的boundary层,那对应的synopsys的boundary层是多少?
是啊!很奇怪啊!
有个变通的方法可以试试,每个cell都单独建个library,都做完了在拷贝到同一个library下。
是gds2Inlayer.map这个文件吧!
- ;;
- ;Astro!Layer GDS2Layer[:GDS2DataType]
- 14:014:0; N-WellConverts GDS2 layer14to Astro layer14
- 10:010:0; DiffConverts GDS2 layer10to Astro layer10
- 30:030:0; PolyConverts GDS2 layer30to Astro layer30
- 43:043:0; PIMPConverts GDS2 layer43to Astro layer43
- 40:040:0; NIMPConverts GDS2 layer40to Astro layer40
- 50:050:0; ContactConverts GDS2 layer50to Astro layer50
- 61:061:0; METAL1Converts GDS2 layer61to Astro layer61
- 141:0141:0; METAL1 txtConverts GDS2 layer141to Astro layer141
- 70:070:0; VIA12Converts GDS2 layer70to Astro layer70
- 62:062:0; METAL2Converts GDS2 layer62to Astro layer62
- 142:0142:0; METAL2 txtConverts GDS2 layer142to Astro layer142
- 71:071:0; VIA23Converts GDS2 layer71to Astro layer71
- 63:063:0; METAL3Converts GDS2 layer63to Astro layer63
- 143:0143:0; METAL3 txtConverts GDS2 layer143to Astro layer143
- 72:072:0; VIA34Converts GDS2 layer72to Astro layer72
- 64:064:0; METAL4Converts GDS2 layer64to Astro layer64
- 144:0144:0; METAL4 txtConverts GDS2 layer144to Astro layer144
- 73:073:0; VIA45Converts GDS2 layer73to Astro layer73
- 65:065:0; METAL5Converts GDS2 layer65to Astro layer65
- 145:0145:0; METAL5 txtConverts GDS2 layer145to Astro layer145
- 74:074:0; VIA56Converts GDS2 layer74to Astro layer74
- 66:066:0; METAL6Converts GDS2 layer66to Astro layer66
- 146:0146:0; METAL6 txtConverts GDS2 layer146to Astro layer146
- 80:080:0; PADConverts GDS2 layer80to Astro layer80
- 127:0127:0; prBoundaryConverts GDS2 layer127to Astro layer127
- 138:0138:0; DIODEConverts GDS2 layer138to Astro layer138
- 110:063:63; Artisan TEXT layerConverts GDS2 layer63:63to Astro layer110
- 162:0162:0; NWELLtxtConverts GDS2 layer 162to Astro layer162
- 163:0163:0; DIFFtxtConverts GDS2 layer 163to Astro layer163
- 161:0161:0; PWELLtxtConverts GDS2 layer 161to Astro layer161
嗯,我现在就是这样做的,好在只有两个cell,不过为什么会这样呢?
赶脚还是你的boundary设置问题。
是gds2Inlayer.map这个文件吧!
- ;;
- ;Astro!Layer GDS2Layer[:GDS2DataType]
- 14:014:0; N-WellConverts GDS2 layer14to Astro layer14
- 10:010:0; DiffConverts GDS2 layer10to Astro layer10
- 30:030:0; PolyConverts GDS2 layer30to Astro layer30
- 43:043:0; PIMPConverts GDS2 layer43to Astro layer43
- 40:040:0; NIMPConverts GDS2 layer40to Astro layer40
- 50:050:0; ContactConverts GDS2 layer50to Astro layer50
- 61:061:0; METAL1Converts GDS2 layer61to Astro layer61
- 141:0141:0; METAL1 txtConverts GDS2 layer141to Astro layer141
- 70:070:0; VIA12Converts GDS2 layer70to Astro layer70
- 62:062:0; METAL2Converts GDS2 layer62to Astro layer62
- 142:0142:0; METAL2 txtConverts GDS2 layer142to Astro layer142
- 71:071:0; VIA23Converts GDS2 layer71to Astro layer71
- 63:063:0; METAL3Converts GDS2 layer63to Astro layer63
- 143:0143:0; METAL3 txtConverts GDS2 layer143to Astro layer143
- 72:072:0; VIA34Converts GDS2 layer72to Astro layer72
- 64:064:0; METAL4Converts GDS2 layer64to Astro layer64
- 144:0144:0; METAL4 txtConverts GDS2 layer144to Astro layer144
- 73:073:0; VIA45Converts GDS2 layer73to Astro layer73
- 65:065:0; METAL5Converts GDS2 layer65to Astro layer65
- 145:0145:0; METAL5 txtConverts GDS2 layer145to Astro layer145
- 74:074:0; VIA56Converts GDS2 layer74to Astro layer74
- 66:066:0; METAL6Converts GDS2 layer66to Astro layer66
- 146:0146:0; METAL6 txtConverts GDS2 layer146to Astro layer146
- 80:080:0; PADConverts GDS2 layer80to Astro layer80
- 127:0127:0; prBoundaryConverts GDS2 layer127to Astro layer127
- 138:0138:0; DIODEConverts GDS2 layer138to Astro layer138
- 110:063:63; Artisan TEXT layerConverts GDS2 layer63:63to Astro layer110
- 162:0162:0; NWELLtxtConverts GDS2 layer 162to Astro layer162
- 163:0163:0; DIFFtxtConverts GDS2 layer 163to Astro layer163
- 161:0161:0; PWELLtxtConverts GDS2 layer 161to Astro layer161
哎!悲剧了!
请教个问题,我在用GDS转FRAM的时候,因为是定制cell,有的cell高度是stdcell的几倍,在icc check_legality的时候报 bounding box not multiple of tile. (APL-026)这样的warning。
在生成FRAM的过程中,进行了如下设置:
cmMarkCellType
setFormField "Mark Cell Type" "Library Name" "lib_name"
setFormField "Mark Cell Type" "Cell Name" "*"
setFormField "Mark Cell Type" "Cell Type" "std cell"
setFormField "Mark Cell Type" "Cell Type" "triple+ height"
formOK "Mark Cell Type"
auSetPRBdry
setFormField set_pr_boundary library_name lib_name
setFormField "Set PR Boundary" "allOrN" "all"
setFormField "Set PR Boundary" "Width" "specify"
setFormField "Set PR Boundary" "Width Value" "0.01"
setFormField "Set PR Boundary" "Left Boundary" "specify"
setFormField "Set PR Boundary" "Left From" "Origin (0,0)"
setFormField "Set PR Boundary" "Bottom Boundary" "specify"
setFormField "Set PR Boundary" "Bottom From" "Origin (0,0)"
setFormField "Set PR Boundary" "Bottom From" "Origin (0,0)"
setFormField "Set PR Boundary" "Multiple (2x, 3x)" "based on cell height"
setFormField "Set PR Boundary" "Tile Name" "unit"
formOK "Set PR Boundary"
谢谢!
prBoundary layer name是否和milkyway里的固有图层名冲突了?
Thanks for your sharing.