import sys, string import openaccess from openaccess import * args=sys.argv cdsInitNonCDSApp("clsbd"); args=oaDBInit(args) class cell: def __init__(self,libnamestr,cellnamestr,viewnamestr): print 'Opening cell ' + cellnamestr #self.ns=oaNativeNS() self.ns=oaVerilogNS() self.libname=oaScalarName(self.ns,libnamestr) self.cellname=oaScalarName(self.ns,cellnamestr) self.viewname=oaScalarName(self.ns,viewnamestr) self.cv=oaCellView.open(self.libname,self.cellname,self.viewname,'r') def close(self): self.cv.close() scalarname=oaScalarName() name=oaName() namestr=oaString() buflist = ['buf_4', 'buf_2', 'buf_1', 'inv_4', 'inv_2', 'inv_1' ] def traceNet(net): # Scan through the input instTerms connected to this net for it in net.getInstTermsIter(): type=str(it.getTerm().getTermType().getName()) if (type=='input'): # If this instance is in the buflist, then trace its output inst=it.getInst() inst.getCellName(scalarname) scalarname.get(namestr) if (str(namestr) in buflist): for iit in inst.getInstTermsIter(): type=str(iit.getTerm().getTermType().getName()) if (type=='output'): traceNet(iit.getNet()) # If this instance is not in the buflist, # then add the portname to the sinklist else: inst.getName(c.ns,namestr) sinkname=string.strip(str(namestr)) it.getTermName(name) name.get(namestr) sinkname=sinkname+'/'+str(namestr) # Strip the leading backslash, if necessary if (sinkname[0]=='\\'): sinkname=sinkname[1:] sinks.append(sinkname) # Look for the driving port for this sink, and add it # to the driverlist if it isn't there already for iit in net.getInstTermsIter(): type=str(iit.getTerm().getTermType().getName()) if (type=='output'): inst=iit.getInst() inst.getName(c.ns,namestr) drvname=string.strip(str(namestr)) iit.getTermName(name) name.get(namestr) drvname=drvname+'/'+str(namestr) # Strip the leading backslash, if necessary if (drvname[0]=='\\'): drvname=drvname[1:] if (drvname not in drivers): drivers.append(drvname) def writeSinkFile(c,netname,filename): global sinks, drivers sinks = [] drivers = [] net=oaNet.find(c.cv,oaName(c.ns,netname)) traceNet(net) f=open(filename,'w') f.write('set sinks { \\\n') for sink in sinks: f.write('\t'+sink+' \\\n') f.write('}\n\n') f.write('set laststage_drivers { \\\n') for drv in drivers: f.write('\t'+drv+' \\\n') f.write('}\n') f.close() c=cell('mylib','or1200_top','autoLayout') writeSinkFile(c,'clk_i','or1200_clk_i_sinks.tcl') writeSinkFile(c,'dwb_clk_i','or1200_dwb_clk_i_sinks.tcl') writeSinkFile(c,'iwb_clk_i','or1200_iwb_clk_i_sinks.tcl') c.close() c=cell('mylib','uart_top','autoLayout') writeSinkFile(c,'wb_clk_i','uart_wb_clk_i_sinks.tcl') c.close()