;---- Feb 9 17:12 96 cdsmgr 1271 -------------------------------------- ;; ;; A. Rylyakov June 6 1995 ;; functions for LVS netlister ;; should be kept in /home/cadence/tools/dfII/etc/skill/fnl/LVS.ile to work ;; encrypt("/home/cadence/tools/dfII/etc/skill/fnl/LVS.il" "/home/cadence/tools/dfII/etc/skill/fnl/LVS.ile" ) ;; ;; N. Joukov (Kolya) October 2001 - Revised for Cadence 4.4.5 ;; Some functions became obsolete - replaced ;; VDD net is now created by placing VDD symbol somewhere on schematics ;; By doing so we do not need most of the functions that were here before. ;; ;... lvsNetlistISCRG .......... Feb 9 96 cdsmgr 897 (procedure lvsNetlistISCRG(termName elemName) ;; we need this procedure for 2 reasons: ;; 1. there's no way to perform division using nlpExpr ;; 2. term name substitution [#vdd!] wouldn't work ;; if we don't have vdd! (as in schematics) ;; Kolya: Place VDD symbol and "VDD!" net will exist prog( (cellViewId vddName libName libId current biasVoltage res UPnum VDDnum formatString) cellViewId = fnlTopCell() libName = cellViewId -> libName ;; Kolya: this function is obsolete ;; libId = dbOpenLib( libName ) libId = ddGetObj(libName) current = cdfGetInstCDF( fnlCurrentInst())-> pnValue ->value biasVoltage = dbGet(libId "rsfqBiasVoltage") (cond ( ! biasVoltage biasVoltage = 8.66667 )) res = biasVoltage / (current + 0.00001) ;;; Feb 9, 1996 addition: if current is exactly zero ;;; do not netlist this element, ;;; a way out when we want to use the same schematic for ;;; lm2cir, LVS and PSCAN in cases when there's a non-trivial ;;; resistive tree (cond ( current == 0 return("") )) ;; Kolya: VDD! net exists ;; vddName = lvsRSFQGlobalVDDname ;this glob var was set in lvsFindPrintVDDNet() vddName = "VDD!" UPnum = fnlTermCdsNameExtName(termName) ;;; if( member(vddName fnlGetGlobalSigNames()) then ;;; VDDnum = fnlNetCdsNameExtName( vddName ) ;;; sprintf(formatString "i %s %s %s %s \"R %f\"" ;;; fnlCurrentInstExtName elemName UPnum VDDnum res) ;;; else VDDnum = 1 ;; Kolya ;; VDDnum = lvsRSFQGlobalVDDnum sprintf(formatString "i %s %s %s %d \"R %f\"" fnlCurrentInstExtName elemName UPnum VDDnum res) ;;; ) return(formatString) ) ; ** prog ** ) ;; Kolya: This function is not used anymore (procedure lvsCountAllNets(cellId) ;; this proc is recursive ;; global var lvsRSFQTotalNetCount is expected to be declared (let (instList instId scId libId ml mc vl) (cond (cellId~>netCount lvsRSFQTotalNetCount = lvsRSFQTotalNetCount + cellId~>netCount ) ) instList = cellId~>instances (while instList instId = car(instList) (cond (instId~>master~>cellViewType =="schematicSymbol" ml = instId~>master~>libName mc = instId~>master~>cellName ;; Kolya: obsolete function. ;; libId = dmFindLib(ml) libId = ddGetObj(ml) vl = dbAllCellViews(libId mc) (cond ( member("schematic" vl) scId=dbOpenCellView(ml mc "schematic") lvsCountAllNets(scId) )) ) (t lvsCountAllNets(instId~>master)) ) instList = cdr(instList)) ) ; ** let ** ) ; ** procedure ** ;... lvsFindPrintVDDNet ....... Jun 11 95 sasha 650 ;; Kolya: This function is not used anymore (procedure lvsFindPrintVDDNet() prog( (cellId vddName vddNum nline tline) ;; Purpose: we create the global vdd! net in the schematic netlist ;; (normally we don't have it in schematics and do have it in layout) ;; Invoked via the NLPnetlistHeader property in the nlpglobals-lvsview ;; FORMATS: ;; n netNum netName ;; t netNum sigName termDirection cellId = fnlTopCell() vddName = "vdd!" lvsRSFQGlobalVDDname = vddName ;; we use recursive function lvsCountAllNets(cellId) to estimate ;; total number of nets in the netlist lvsRSFQTotalNetCount = 0 lvsCountAllNets(cellId) ;; Kolya: Here we just suppose that this net will not be used ;; Place VDD symbol on schematics and this guess will not be needed vddNum = 2 * lvsRSFQTotalNetCount + 1 lvsRSFQGlobalVDDnum = vddNum lvsRSFQTotTermNum = lvsRSFQGlobalVDDnum if(cellId~>viewName == "schematic" && ! member(vddName fnlGetGlobalSigNames()) then sprintf( nline "n\t%d\t%s\n" vddNum vddName ) sprintf( tline "t\t%d\t\"%s\"\tglobal\n" vddNum vddName ) fnlPrint( nline ) fnlPrint( tline ) ) return(t) ) ) ; ** procedure **