L
A D I N G

[ Shell ] 通过 Shell 脚本导出 GDSII/OASIS 文件

https://www.cnblogs.com/yeungchie/

常见的集成电路版图数据库文件格式有 GDSII 和 OASIS,virtuoso 提供了下面两个工具,可以用来通过命令行导出版图数据。

  • strmout (导出为 GDSII 格式)

    strmout -help
    Usage: Usage: strmout     -library                        <Input Library>     -strmFile                       <Output Stream File>     [-strmVersion]                  <Stream Version Number>     [-runDir]                       <Run Directory>     [-topCell]                      <Toplevel Cells to Translate>     [-view]                         <Toplevel Cell View Name>     [-logFile]                      <Output Log File Name>     [-summaryFile]                  <Output Summary File>     [-techLib]                      <Technology Library>     [-hierDepth]                    <Hierarchical Depth to Translate to>     [-layerMap]                     <Quoted List of Layer Map Files>     [-translateUnmappedLPP]         <Allow undefined LPP to be translated by incrementally mapping LPP using layerMap file, SKILL hook poLayerMap, and automatic layer mapping>     [-labelMap]                     <Input Label Map File>     [-labelDepth]                   <Hierarchical Depth to Add Labels to>     [-replaceBusBitChar]            <Replace "<>" With "[]">     [-cellMap]                      <Input Cell Map File>     [-fontMap]                      <Input Font Map File>     [-propMap]                      <Input Property Map File>     [-objectMap]                    <Quoted List of Object Mapping Files>     [-viaMap]                       <Via Mapping File>     [-viaCutArefThreshold]          <Threshold Value For Creating AREF For Cut Geometries For Via>     [-userSkillFile]                <User Skill File>     [-refLibList]                   <Name of The File Containing Refliblist >     [-arrayInstToScalar]     [-cellNamePrefix]               <Cell Name Prefix>     [-cellNameSuffix]               <Cell Name Suffix>     [-ignoreTopCellPrefixSuffix]    <Ignores cellName Prefix and Suffix for topCell>     [-case]                         <upper | lower | preserve >     [-labelCase]                    <upper | lower | preserve >     [-ignoreLines]     [-noOutputTextDisplays]     [-noOutputUnplacedInst]         <Do not Output Unplaced Instances>     [-convertDot]                   <node | polygon | ignore >     [-convertPin]                   <geometry | text | geometryAndText | ignore >     [-pinAttNum]                    <Stream Attribute Num (1-127) For Preserving Pins>     [-pathToPolygon]                <Convert Paths to Polygons>     [-diagonalPathToPolygon]        <Convert Paths with non-orthogonal segments to polygons>     [-propValueOnly]                <Output Property Values Only>     [-rectToBox]     [-respectGDSIINameLimit]     [-gdsCellNameLength]            <Truncate GDS Cell/STRUCT name length to specified value (>=10)>     [-flattenPcells]     [-flattenVias]     [-outputViaShapesToViaPurp]     <Output Shapes of Via to Via Purpose>     [-doNotPreservePcellPins]     [-snapToGrid]     [-dbuPerUU]                     <DB Units per user units>     [-reportPrecisionLoss]          <Report Precision Loss Because of dbuPerUU Value>     [-noObjectProp]     [-ignorePcellEvalFail]     [-mergePathSegsToPath]          <Merging pathSegs into a single PATH>     [-noConvertHalfWidthPath]       <Do not Convert The Half Width Path to Boundary>     [-checkPolygon]                 <Report Bad Polygons And Paths>     [-backupGdsLogFiles]            <Backup GDSII and LOG files, if they already exist>     [-maxVertices]                  <Maximum Limit of Vertices (5-4000) Allowed in Stream File>     [-strmTextNS]                   <NameSpace of The TEXT Records in The Stream File>     [-templateFile]                 <Name of The File Containing Option Names And Values>     [-cellListFile]                 <Name of the file containing cellList>     [-outputDir]                    <output directory>     [-noInfo]                       <Quoted List of Info Message Ids>     [-noWarn]                       <Quoted List of Warning Message Ids>     [-warnToErr]                    <Quoted List of warning Message Ids>     [-infoToWarn]                   <Quoted List of Info Message Ids>     [-donutNumSides]                <Number of sides (4-131072) for the BOUNDARY of donut>     [-ellipseNumSides]              <Number of sides (4-131072) for the BOUNDAR of ellipse>     [-wildCardInCellMap]            <Wild Card in cell map file>     [-ignoreMissingCells]           <Ignores Missing cellViews During Translation and Continue Translation>     [-ignoreMissingVias]            <Ignores Missing standard/custom vias During Translation and Continue Translation>     [-subMasterSeparator]           <Separator to used for sub-master naming (default: "_CDNS_")>     [-convertPcellPin]              <geometry | text | geometryAndText | ignore (default: convertPin value)>     [-guiHistory]                   <Use options of last successful translation from the XStream Out GUI>     [-ignoreZeroWidthPathSeg]       <Ignores zero width PathSeg during translation>     [-ignoreObjectMapFromTech]      <Ignores object map file from technology>     [-ignoreCurrentTimestamp]       <Ignores current timestamp>     [-verbose]                      <Generate detailed information in the log and summary files>ose] <Generate detailed information in the log and summary files>
  • oasisout (导出为 OASIS 格式)

    oasisout -help
    Usage: oasisout     -library                        <Input Library>     -oasisFile                      <Output OASIS File>     [-arrayInstToScalar]            <Convert Arrays to Scalar Instances>     [-backupOasisLogFiles]          <Backup OASIS and LOG files, if they    already exist>     [-case]                         <upper | lower | preserve>     [-cellMap]                      <Input cell map file>     [-cellListFile]                 <Name of the file containing cellList>     [-cellNamePrefix]               <Cell name prefix>     [-cellNameSuffix]               <Cell name suffix>     [-checkPolygon]                 <Report bad polygons and paths>     [-circleToPolygon]              <Convert Cricle/Ellipse object to Polygon>     [-compress]                     <Enable CBLOCK compression>     [-compressLevel]                <Set the compression level for CBLOCK   compression>     [-convertDot]                   <polygon | circle | ignore>     [-convertPcellPin]              <geometry | text | geometryAndText |    ignore (default: convertPin value)>     [-convertPin]                   <geometry | text | geometryAndText |    ignore>     [-dbuPerUU]                     <DB Units per user units>     [-diagonalPathToPolygon]        <Convert Paths with non-orthogonal  segments to Polygons>     [-doNotPreservePcellPins]       <Do not preserve the PCell Pins>     [-donutNumSides]                <Number of sides (4-131072) for the     BOUNDARY of Donut>     [-ellipseNumSides]              <Number of sides (4-131072) for the     BOUNDAR of Circle/Ellipse>     [-flattenPcells]                <Flatten the PCell Instances>     [-flattenViaShapesToViaPurp]    <Flatten Vias' Shapes to Via Purpose>     [-flattenVias]                  <Flatten the Vias>     [-GDSIICompatible]              <Generate the OASIS file with GDSII     specific limits>     [-guiHistory]                   <Use options of last successful     translation from the XOasis Out GUI>     [-hierDepth]                    <Hierarchical depth to translate to>     [-ignoreLines]                  <Ignore Line objects>     [-ignoreMissingCells]           <Ignore missing cellViews during    translation and continue translation>     [-ignoreMissingVias]            <Ignore missing standard/custom vias    during translation and continue translation>     [-ignoreObjectMapFromTech]      <Ignore object map file from technology>     [-ignorePcellEvalFail]          <Ignore the PCell evaluation failure>     [-ignoreRoutes]                 <Ignore Route objects>     [-ignoreZeroWidthPathSeg]       <Ignore zero width PathSeg during   translation>     [-infoToWarn]                   <Quoted list of Info message Ids>     [-labelMap]                     <Input label map file>     [-labelDepth]                   <Hierarchical depth to add labels to>     [-layerMap]                     <Quoted list of layer map files>     [-logFile]                      <Output log file name>     [-mergePathSegsToPath]          <Merge pathSegs into a single PATH>     [-noConvertHalfWidthPath]       <Do not convert the half width Path to  Boundary>     [-noInfo]                       <Quoted list of info message Ids>     [-noObjectProp]                 <Do not write the special object    properties>     [-noOutputTextDisplays]         <Do not output Text Displays>     [-noOutputUnplacedInst]         <Do not output Unplaced Instances>     [-noWarn]                       <Quoted list of warning message Ids>     [-objectMap]                    <Quoted list of object mapping files>     [-outputDir]                    <output directory>     [-pathToPolygon]                <Convert Path object to Polygon>     [-preservePinAtt]               <Preserve Pin connectivity information>     [-preserveTextAtt]              <Preserve Text attributes as properties>     [-propMap]                      <Input property map file>     [-refLibList]                   <Name of the file containing reference  libraries list>     [-replaceBusBitChar]            <Replace "<>" with "[]">     [-runDir]                       <Run directory>     [-snapToGrid]                   <Snap to grid>     [-subMasterSeparator]           <Separator to used for sub-master naming    (default: "_CDNS_")>     [-summaryFile]                  <Output summary file>     [-techLib]                      <Technology library>     [-templateFile]                 <Name of the file containing option names   And values>     [-textCase]                     <upper | lower | preserve>     [-topCell]                      <Toplevel cells to translate>     [-translateUnmappedLPP]         <Allow undefined LPP to be translated by    incrementally mapping LPP using layerMap file, SKILL hook poLayerMap, and  automatic layer mapping>     [-userSkillFile]                <User skill file>     [-verbose]                      <Generate detailed information in the log   and summary files>     [-viaMap]                       <Via mapping file>     [-view]                         <Toplevel cell view name>     [-warnToErr]                    <Quoted list of warning message Ids>     [-wildCardInCellMap]            <Wild card in cell map file>

OASIS 的文件体积声称可以比 GDSII 小 10~50 倍,实际在我的使用中这个数字可以到 20+(以项目情况而定),当项目数据较大的情况下,文件小了确实可以加快运行速度、节省时间(估计是硬盘读写环节拖累了整体运行时间)。
oasisoutstrmout 几个常用的参数都是相同的,下面讲下如何使用。

另外,命令的运行路径必须在 virtuoso 启动路径(能在当前路径下找得到 cds.lib 文件)。

参数解释

必要的

首先有几个必要的运行条件和参数。

  • -library

    这个参数用来指定导出的单元库 (library) 名。

  • -strmFile

    当使用strmout 时,这个参数用来指定导出的 GDSII 文件名称。

  • -oasisFile

    当使用oasisout 时,这个参数用来指定导出的 OASIS 文件名称。

推荐的

其次还有几个是可选的参数,但是建议也指定一下。

  • -topCell

    指定导出单元的顶层 Cell 名称,指定了顶层 Cell 就不会导出该顶层没有调用的单元,否则会导出当前库下的所有 Cell 。

  • -view

    指定导出单元的顶层 View 名称,默认为layout

  • -runDir

    指定运行路径。

    注意这里的运行路径 不同于前面提到的命令的运行路径。
    当定义了-runDir-strmFile-oasisFile-logFile-summaryFile 等参数如果定义的是相对路径,则会以-runDir 为参考。

  • -logFile

    生成 log 文件,默认生成文件名为strmOut.logoasisOut.log

  • -summaryFile

    生成 summary 文件,默认不生成。

  • -layerMap

    指定 layermap 文件,默认情况是调用 attach tech 中的 layermap,当对层次转换有特殊要求时可以通过这个参数来指定自定义的 layermap 。

编写脚本 export_layout

下面写个脚本优化一下这个运行方式。

点击查看完整代码
#!/bin/bash #-------------------------- # Program  : export_layout.sh # Language : Bash # Author   : YEUNGCHIE # Version  : 2022.04.05 #-------------------------- HelpInfo(){     cat <<EOF ------------------------------------------------- Export Layout ( GDSII or OASIS ) File ------------------------------------------------- Usage: export_layout -path cdslibDir -lib libName -cell cellName [ OPTIONS ]      -path       Path where the cds.lib file is located     -lib        Layout top cell libName     -cell       Layout top cell cellName     -view       Layout top cell viewName    ( Default: layout )     -file       Output file name            ( Default: <cellName>.gds or <cellName>.oasis )     -log        Log file                    ( Default: export_layout.log )     -sum        Summary file     -layermap   Specified the layermap file     -oasis      Specified the file format is OASIS, and GDSII if not specified     -h, -help   Display this help  Examples:   export_layout\\                 -path       \$project/work/                 -lib        Xeon                 -cell       X999                 -oasis  Output:     OASIS file - X999.oasis EOF }  viewName='layout' logFile='export_layout.log'  # 命令行参数分析 while [[ -n $1 ]]; do     if [[ -n $opt ]]; then         case $opt in             lib_opt)    libName=$1  ;;             cell_opt)   cellName=$1 ;;             view_opt)   viewName=$1 ;;             file_opt)   file=$1     ;;             path_opt)   path=$1     ;;             log_opt)    logFile=$1  ;;             map_opt)                 mapCmd="-layerMap $1"             ;;             sum_opt)                 sumCmd="-summaryFile $1"             ;;         esac         unset opt     else         case $1 in             -lib)       opt='lib_opt'   ;;             -cell)      opt='cell_opt'  ;;             -view)      opt='view_opt'  ;;             -file)      opt='file_opt'  ;;             -path)      opt='path_opt'  ;;             -log)       opt='log_opt'   ;;             -sum)       opt='sum_opt'   ;;             -layermap)  opt='map_opt'   ;;             -oasis)     OASIS=1         ;;             -h|-help)                 HelpDoc >&2                 exit 1             ;;             *)                 echo "Invalid option - '$1'" >&2                 echo "Try -h or -help for more infomation." >&2                 exit 1             ;;         esac     fi     shift done  # 记录当前路径 runDir=$(pwd -P)  # 参数检查 if [[ ! ( $path && $libName && $cellName ) ]]; then     # 缺少必要参数时,打印 help 并退出     HelpInfo >&2     exit 1 elif [[ -d $path ]]; then     cd $path else     # 找不到目标路径文件,打印报错     echo "No such directory - $path" >&2     echo "Try -h or -help for more infomation." >&2     exit 1 fi  ## 不同的文件格式 if [[ $OASIS ]]; then     if [[ ! $file ]]; then file="${cellName}.oasis" ; fi     command="oasisout -oasisFile $file" else     if [[ ! $file ]]; then file="${cellName}.gds" ; fi     command="strmout -strmFile $file" fi  command="$command -runDir $runDir -library $libName -topCell $cellName -view $viewName -logFile $logFile $sumCmd $mapCmd"  # 运行 exec $command

优化后的脚本有三个必要的参数需要指定

  • -path
    指定 cds.lib 文件所在的文件夹路径
  • -lib
    指定导出单元的顶层 Library 名称
  • -cell
    指定导出单元的顶层 Cell 名称

通过 -path 参数来定义 virtuoso 启动路径,实现在任意路径下可运行,生成的文件都在当前路径下。

运行实例

例:cdslib 文件所在路径为 ../project

  1. 导出版图verify/ad01d0/layout 单元为 GDSII 文件。

    export_layout -path ../project -lib verify -cell ad01d0
  2. 导出版图verify/inv0d0/layout 单元为 OASIS 文件,指定输出文件名inv.oasis,指定 log 文件为inv.log

    export_layout -path ../project -lib verify -cell inv0d0 -file inv.oasis -oasis -log inv.log