mirror of https://github.com/VLSIDA/OpenRAM.git
100 lines
3.8 KiB
Python
100 lines
3.8 KiB
Python
#!/usr/bin/env python
|
|
import gdsMill
|
|
#we are going to make an array of instances of an existing layout
|
|
#assume that we designed the "base cell" in cadence
|
|
#step 1 is to stream it out of cadence into a GDS to work with
|
|
# creater a streamer object to interact with the cadence libraries
|
|
|
|
gds_file_in = "sram_lib2.gds" #"sram_cell_6t.gds" #"gds_sram_tgate2.gds"
|
|
gds_file_out = "newcell.gds"
|
|
debug = 0
|
|
|
|
|
|
streamer = gdsMill.GdsStreamer()
|
|
|
|
# use the streamer to take a cadence layout, and convert it to GDS 2 for us to work with
|
|
# the GDS will be named testLayoutA.gds
|
|
#streamer.streamFromCadence(cadenceLibraryContainerPath = "~/design/600nmAmi",
|
|
# libraryName = "gdsMillTest",
|
|
# cellName = "testLayoutA",
|
|
# outputPath = "./gdsFiles")
|
|
|
|
#next, load our base cell layout from the GDS generated above
|
|
arrayCellLayout = gdsMill.VlsiLayout()
|
|
reader = gdsMill.Gds2reader(arrayCellLayout, debugToTerminal = debug)
|
|
reader.loadFromFile(gds_file_in)
|
|
|
|
##since we will be streaming into the same library that testLayout came from
|
|
#let's rename it here so that we don't overwrite accidentally later
|
|
#arrayCellLayout.rename("tom_2x2")
|
|
|
|
#now create a new layout
|
|
#be sure to assign a name, since this will be the root object in our hierarchy to which
|
|
#all other objects are referenced
|
|
#newLayout = gdsMill.VlsiLayout(name="arrayExample", debug=1, units=(5e-4,5e-10)) #
|
|
newLayout = gdsMill.VlsiLayout(name="tom_2x2", debug=0, units=(0.001,1.0000000000000001e-09)) #
|
|
|
|
#now place an instnace of our top level layout into the filled layout
|
|
#hierarchy looks like this:
|
|
# array example
|
|
# array cell layout
|
|
# layout elements
|
|
# layout elements
|
|
# layout elements
|
|
# cell instance
|
|
# cell instance
|
|
# cell instance
|
|
# connection elements .....
|
|
|
|
#now create the array of instances
|
|
for xIndex in range(0,2):
|
|
for yIndex in range(0,2):
|
|
if(yIndex%2 == 0):
|
|
mirror = "MX"
|
|
else:
|
|
mirror = "R0"
|
|
newLayout.addInstance(arrayCellLayout,
|
|
nameOfLayout = "cell_6t",
|
|
offsetInMicrons = (xIndex*1.25250,yIndex*1.820),
|
|
mirror = mirror,
|
|
rotate = 0.0)
|
|
|
|
|
|
#newLayout.addInstance(arrayCellLayout,
|
|
# nameOfLayout = "precharge",
|
|
# offsetInMicrons = (0*1.25250,1*3.640000),
|
|
# mirror = "R0",
|
|
# rotate = 0.0)
|
|
#newLayout.addInstance(arrayCellLayout,
|
|
# nameOfLayout = "precharge",
|
|
# offsetInMicrons = (1*1.25250,1*3.640000),
|
|
# mirror = "R0",
|
|
# rotate = 0.0)
|
|
|
|
#add a "wire" that in a real example might be a power rail, data bus, etc.
|
|
#newLayout.addPath(layerNumber = newLayout.layerNumbersInUse[7],
|
|
# coordinates = [(-20.0,0.0),(25.0,0),(25.0,10.0)],
|
|
# width = 1.0,
|
|
# updateInternalMap = False)
|
|
#add some text that in a real example might be an I/O pin
|
|
#newLayout.addText(text = "Hello",
|
|
# layerNumber = newLayout.layerNumbersInUse[5],
|
|
# offsetInMicrons = (0,0),
|
|
# magnification = 1,
|
|
# rotate = None,
|
|
# updateInternalMap=True)
|
|
|
|
#and now dump the filled layout to a new GDS file
|
|
writer = gdsMill.Gds2writer(newLayout)
|
|
writer.writeToFile(gds_file_out)
|
|
|
|
|
|
#and stream it into cadence
|
|
#streamer.streamToCadence(cadenceLibraryContainerPath = "~/design/600nmAmi",
|
|
# libraryName = "gdsMillTest",
|
|
# inputPath = "./gdsFiles/arrayLayout.gds")
|
|
|
|
|
|
print "LIB: %s" % gds_file_in
|
|
print "\nCompleted ", gds_file_out
|