mirror of https://github.com/VLSIDA/OpenRAM.git
Simplify configuration file to allow all options to be over-riden. Move default module types to options.py to simplify config file.
This commit is contained in:
parent
72b0617e81
commit
490a70dee9
2
LICENSE
2
LICENSE
|
|
@ -1,4 +1,4 @@
|
||||||
Copyright 2017 Regents of the University of California and The Board
|
Copyright 2018 Regents of the University of California and The Board
|
||||||
of Regents for the Oklahoma Agricultural and Mechanical College
|
of Regents for the Oklahoma Agricultural and Mechanical College
|
||||||
(acting for and on behalf of Oklahoma State University)
|
(acting for and on behalf of Oklahoma State University)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ class bank(design.design):
|
||||||
"bitcell_array", "sense_amp_array", "precharge_array",
|
"bitcell_array", "sense_amp_array", "precharge_array",
|
||||||
"column_mux_array", "write_driver_array", "tri_gate_array"]
|
"column_mux_array", "write_driver_array", "tri_gate_array"]
|
||||||
for mod_name in mod_list:
|
for mod_name in mod_list:
|
||||||
config_mod_name = getattr(OPTS.config, mod_name)
|
config_mod_name = getattr(OPTS, mod_name)
|
||||||
class_file = reload(__import__(config_mod_name))
|
class_file = reload(__import__(config_mod_name))
|
||||||
mod_class = getattr(class_file , config_mod_name)
|
mod_class = getattr(class_file , config_mod_name)
|
||||||
setattr (self, "mod_"+mod_name, mod_class)
|
setattr (self, "mod_"+mod_name, mod_class)
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,8 @@ class bitcell_array(design.design):
|
||||||
self.column_size = cols
|
self.column_size = cols
|
||||||
self.row_size = rows
|
self.row_size = rows
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.bitcell))
|
c = reload(__import__(OPTS.bitcell))
|
||||||
self.mod_bitcell = getattr(c, OPTS.config.bitcell)
|
self.mod_bitcell = getattr(c, OPTS.bitcell)
|
||||||
self.cell = self.mod_bitcell()
|
self.cell = self.mod_bitcell()
|
||||||
self.add_mod(self.cell)
|
self.add_mod(self.cell)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -59,15 +59,15 @@ class control_logic(design.design):
|
||||||
self.inv16 = pinv(16)
|
self.inv16 = pinv(16)
|
||||||
self.add_mod(self.inv16)
|
self.add_mod(self.inv16)
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.ms_flop_array))
|
c = reload(__import__(OPTS.ms_flop_array))
|
||||||
ms_flop_array = getattr(c, OPTS.config.ms_flop_array)
|
ms_flop_array = getattr(c, OPTS.ms_flop_array)
|
||||||
self.msf_control = ms_flop_array(name="msf_control",
|
self.msf_control = ms_flop_array(name="msf_control",
|
||||||
columns=3,
|
columns=3,
|
||||||
word_size=3)
|
word_size=3)
|
||||||
self.add_mod(self.msf_control)
|
self.add_mod(self.msf_control)
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.replica_bitline))
|
c = reload(__import__(OPTS.replica_bitline))
|
||||||
replica_bitline = getattr(c, OPTS.config.replica_bitline)
|
replica_bitline = getattr(c, OPTS.replica_bitline)
|
||||||
self.replica_bitline = replica_bitline(rows=int(math.ceil(self.num_rows / 10.0)))
|
self.replica_bitline = replica_bitline(rows=int(math.ceil(self.num_rows / 10.0)))
|
||||||
self.add_mod(self.replica_bitline)
|
self.add_mod(self.replica_bitline)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,8 @@ class delay_chain(design.design):
|
||||||
self.num_inverters = 1 + sum(fanout_list)
|
self.num_inverters = 1 + sum(fanout_list)
|
||||||
self.num_top_half = round(self.num_inverters / 2.0)
|
self.num_top_half = round(self.num_inverters / 2.0)
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.bitcell))
|
c = reload(__import__(OPTS.bitcell))
|
||||||
self.mod_bitcell = getattr(c, OPTS.config.bitcell)
|
self.mod_bitcell = getattr(c, OPTS.bitcell)
|
||||||
self.bitcell = self.mod_bitcell()
|
self.bitcell = self.mod_bitcell()
|
||||||
|
|
||||||
self.add_pins()
|
self.add_pins()
|
||||||
|
|
|
||||||
|
|
@ -4,24 +4,6 @@ num_banks = 1
|
||||||
|
|
||||||
tech_name = "freepdk45"
|
tech_name = "freepdk45"
|
||||||
|
|
||||||
output_path = "./temp"
|
output_path = "temp"
|
||||||
output_name = "sram_2_16_1_freepdk45"
|
output_name = "sram_2_16_1_freepdk45"
|
||||||
|
|
||||||
decoder = "hierarchical_decoder"
|
|
||||||
ms_flop = "ms_flop"
|
|
||||||
ms_flop_array = "ms_flop_array"
|
|
||||||
control_logic = "control_logic"
|
|
||||||
bitcell_array = "bitcell_array"
|
|
||||||
sense_amp = "sense_amp"
|
|
||||||
sense_amp_array = "sense_amp_array"
|
|
||||||
precharge_array = "precharge_array"
|
|
||||||
column_mux_array = "single_level_column_mux_array"
|
|
||||||
write_driver = "write_driver"
|
|
||||||
write_driver_array = "write_driver_array"
|
|
||||||
tri_gate = "tri_gate"
|
|
||||||
tri_gate_array = "tri_gate_array"
|
|
||||||
wordline_driver = "wordline_driver"
|
|
||||||
replica_bitline = "replica_bitline"
|
|
||||||
replica_bitcell = "replica_bitcell"
|
|
||||||
bitcell = "bitcell"
|
|
||||||
delay_chain = "delay_chain"
|
|
||||||
|
|
|
||||||
|
|
@ -4,24 +4,6 @@ num_banks = 1
|
||||||
|
|
||||||
tech_name = "scn3me_subm"
|
tech_name = "scn3me_subm"
|
||||||
|
|
||||||
output_path = "./temp"
|
output_path = "temp"
|
||||||
output_name = "sram_2_16_1_scn3me_subm"
|
output_name = "sram_2_16_1_scn3me_subm"
|
||||||
|
|
||||||
decoder = "hierarchical_decoder"
|
|
||||||
ms_flop = "ms_flop"
|
|
||||||
ms_flop_array = "ms_flop_array"
|
|
||||||
control_logic = "control_logic"
|
|
||||||
bitcell_array = "bitcell_array"
|
|
||||||
sense_amp = "sense_amp"
|
|
||||||
sense_amp_array = "sense_amp_array"
|
|
||||||
precharge_array = "precharge_array"
|
|
||||||
column_mux_array = "single_level_column_mux_array"
|
|
||||||
write_driver = "write_driver"
|
|
||||||
write_driver_array = "write_driver_array"
|
|
||||||
tri_gate = "tri_gate"
|
|
||||||
tri_gate_array = "tri_gate_array"
|
|
||||||
wordline_driver = "wordline_driver"
|
|
||||||
replica_bitline = "replica_bitline"
|
|
||||||
replica_bitcell = "replica_bitcell"
|
|
||||||
bitcell = "bitcell"
|
|
||||||
delay_chain = "delay_chain"
|
|
||||||
|
|
|
||||||
|
|
@ -145,18 +145,14 @@ def read_config(config_file):
|
||||||
# Import the configuration file of which modules to use
|
# Import the configuration file of which modules to use
|
||||||
debug.info(1, "Configuration file is " + config_file + ".py")
|
debug.info(1, "Configuration file is " + config_file + ".py")
|
||||||
try:
|
try:
|
||||||
OPTS.config = importlib.import_module(file_name)
|
config = importlib.import_module(file_name)
|
||||||
except:
|
except:
|
||||||
debug.error("Unable to read configuration file: {0}".format(config_file),2)
|
debug.error("Unable to read configuration file: {0}".format(config_file),2)
|
||||||
|
|
||||||
# This path must be setup after the config file.
|
# The config file will over-ride all command line args
|
||||||
try:
|
for k,v in config.__dict__.items():
|
||||||
# If path not set on command line, try config file.
|
OPTS.__dict__[k]=v
|
||||||
if OPTS.output_path=="":
|
|
||||||
OPTS.output_path=OPTS.config.output_path
|
|
||||||
except:
|
|
||||||
# Default to current directory.
|
|
||||||
OPTS.output_path="."
|
|
||||||
if not OPTS.output_path.endswith('/'):
|
if not OPTS.output_path.endswith('/'):
|
||||||
OPTS.output_path += "/"
|
OPTS.output_path += "/"
|
||||||
debug.info(1, "Output saved in " + OPTS.output_path)
|
debug.info(1, "Output saved in " + OPTS.output_path)
|
||||||
|
|
@ -247,7 +243,7 @@ def import_tech():
|
||||||
debug.info(2,"Importing technology: " + OPTS.tech_name)
|
debug.info(2,"Importing technology: " + OPTS.tech_name)
|
||||||
|
|
||||||
# Set the tech to the config file we read in instead of the command line value.
|
# Set the tech to the config file we read in instead of the command line value.
|
||||||
OPTS.tech_name = OPTS.config.tech_name
|
OPTS.tech_name = OPTS.tech_name
|
||||||
|
|
||||||
|
|
||||||
# environment variable should point to the technology dir
|
# environment variable should point to the technology dir
|
||||||
|
|
|
||||||
|
|
@ -21,8 +21,8 @@ class hierarchical_decoder(design.design):
|
||||||
def __init__(self, rows):
|
def __init__(self, rows):
|
||||||
design.design.__init__(self, "hierarchical_decoder_{0}rows".format(rows))
|
design.design.__init__(self, "hierarchical_decoder_{0}rows".format(rows))
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.bitcell))
|
c = reload(__import__(OPTS.bitcell))
|
||||||
self.mod_bitcell = getattr(c, OPTS.config.bitcell)
|
self.mod_bitcell = getattr(c, OPTS.bitcell)
|
||||||
self.bitcell_height = self.mod_bitcell.height
|
self.bitcell_height = self.mod_bitcell.height
|
||||||
|
|
||||||
self.pre2x4_inst = []
|
self.pre2x4_inst = []
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ class hierarchical_predecode(design.design):
|
||||||
self.number_of_outputs = int(math.pow(2, self.number_of_inputs))
|
self.number_of_outputs = int(math.pow(2, self.number_of_inputs))
|
||||||
design.design.__init__(self, name="pre{0}x{1}".format(self.number_of_inputs,self.number_of_outputs))
|
design.design.__init__(self, name="pre{0}x{1}".format(self.number_of_inputs,self.number_of_outputs))
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.bitcell))
|
c = reload(__import__(OPTS.bitcell))
|
||||||
self.mod_bitcell = getattr(c, OPTS.config.bitcell)
|
self.mod_bitcell = getattr(c, OPTS.bitcell)
|
||||||
self.bitcell_height = self.mod_bitcell.height
|
self.bitcell_height = self.mod_bitcell.height
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,8 +20,8 @@ class ms_flop_array(design.design):
|
||||||
design.design.__init__(self, name)
|
design.design.__init__(self, name)
|
||||||
debug.info(1, "Creating {}".format(self.name))
|
debug.info(1, "Creating {}".format(self.name))
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.ms_flop))
|
c = reload(__import__(OPTS.ms_flop))
|
||||||
self.mod_ms_flop = getattr(c, OPTS.config.ms_flop)
|
self.mod_ms_flop = getattr(c, OPTS.ms_flop)
|
||||||
self.ms = self.mod_ms_flop("ms_flop")
|
self.ms = self.mod_ms_flop("ms_flop")
|
||||||
self.add_mod(self.ms)
|
self.add_mod(self.ms)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -39,19 +39,19 @@ globals.print_banner()
|
||||||
globals.init_openram(args[0])
|
globals.init_openram(args[0])
|
||||||
|
|
||||||
# Check if all arguments are integers for bits, size, banks
|
# Check if all arguments are integers for bits, size, banks
|
||||||
if type(OPTS.config.word_size)!=int:
|
if type(OPTS.word_size)!=int:
|
||||||
debug.error("{0} is not an integer in config file.".format(OPTS.config.word_size))
|
debug.error("{0} is not an integer in config file.".format(OPTS.word_size))
|
||||||
if type(OPTS.config.num_words)!=int:
|
if type(OPTS.num_words)!=int:
|
||||||
debug.error("{0} is not an integer in config file.".format(OPTS.config.sram_size))
|
debug.error("{0} is not an integer in config file.".format(OPTS.sram_size))
|
||||||
if type(OPTS.config.num_banks)!=int:
|
if type(OPTS.num_banks)!=int:
|
||||||
debug.error("{0} is not an integer in config file.".format(OPTS.config.num_banks))
|
debug.error("{0} is not an integer in config file.".format(OPTS.num_banks))
|
||||||
|
|
||||||
if not OPTS.config.tech_name:
|
if not OPTS.tech_name:
|
||||||
debug.error("Tech name must be specified in config file.")
|
debug.error("Tech name must be specified in config file.")
|
||||||
|
|
||||||
word_size = OPTS.config.word_size
|
word_size = OPTS.word_size
|
||||||
num_words = OPTS.config.num_words
|
num_words = OPTS.num_words
|
||||||
num_banks = OPTS.config.num_banks
|
num_banks = OPTS.num_banks
|
||||||
|
|
||||||
if (OPTS.output_name == ""):
|
if (OPTS.output_name == ""):
|
||||||
OPTS.output_name = "sram_{0}_{1}_{2}_{3}".format(word_size,
|
OPTS.output_name = "sram_{0}_{1}_{2}_{3}".format(word_size,
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,8 @@ import os
|
||||||
|
|
||||||
class options(optparse.Values):
|
class options(optparse.Values):
|
||||||
"""
|
"""
|
||||||
Class for holding all of the OpenRAM options.
|
Class for holding all of the OpenRAM options. All of these options can be over-riden in a configuration file
|
||||||
|
that is the sole required command-line positional argument for openram.py.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# This is the technology directory.
|
# This is the technology directory.
|
||||||
|
|
@ -12,7 +13,8 @@ class options(optparse.Values):
|
||||||
# This is the name of the technology.
|
# This is the name of the technology.
|
||||||
tech_name = ""
|
tech_name = ""
|
||||||
# This is the temp directory where all intermediate results are stored.
|
# This is the temp directory where all intermediate results are stored.
|
||||||
openram_temp = "/tmp/openram_{0}_{1}_temp/".format(getpass.getuser(),os.getpid())
|
#openram_temp = "/tmp/openram_{0}_{1}_temp/".format(getpass.getuser(),os.getpid())
|
||||||
|
openram_temp = "/Users/{}/openram_temp/".format(getpass.getuser())
|
||||||
# This is the verbosity level to control debug information. 0 is none, 1
|
# This is the verbosity level to control debug information. 0 is none, 1
|
||||||
# is minimal, etc.
|
# is minimal, etc.
|
||||||
debug_level = 0
|
debug_level = 0
|
||||||
|
|
@ -35,8 +37,29 @@ class options(optparse.Values):
|
||||||
# Use detailed LEF blockages
|
# Use detailed LEF blockages
|
||||||
detailed_blockages = True
|
detailed_blockages = True
|
||||||
# Define the output file paths
|
# Define the output file paths
|
||||||
output_path = ""
|
output_path = "."
|
||||||
# Define the output file base name
|
# Define the output file base name
|
||||||
output_name = ""
|
output_name = "sram"
|
||||||
# Use analytical delay models by default rather than (slow) characterization
|
# Use analytical delay models by default rather than (slow) characterization
|
||||||
analytical_delay = True
|
analytical_delay = True
|
||||||
|
|
||||||
|
# These are the default modules that can be over-riden
|
||||||
|
decoder = "hierarchical_decoder"
|
||||||
|
ms_flop = "ms_flop"
|
||||||
|
ms_flop_array = "ms_flop_array"
|
||||||
|
control_logic = "control_logic"
|
||||||
|
bitcell_array = "bitcell_array"
|
||||||
|
sense_amp = "sense_amp"
|
||||||
|
sense_amp_array = "sense_amp_array"
|
||||||
|
precharge_array = "precharge_array"
|
||||||
|
column_mux_array = "single_level_column_mux_array"
|
||||||
|
write_driver = "write_driver"
|
||||||
|
write_driver_array = "write_driver_array"
|
||||||
|
tri_gate = "tri_gate"
|
||||||
|
tri_gate_array = "tri_gate_array"
|
||||||
|
wordline_driver = "wordline_driver"
|
||||||
|
replica_bitline = "replica_bitline"
|
||||||
|
replica_bitcell = "replica_bitcell"
|
||||||
|
bitcell = "bitcell"
|
||||||
|
delay_chain = "delay_chain"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,8 @@ class pinv(pgate.pgate):
|
||||||
from center of rail to rail.. The route_output will route the
|
from center of rail to rail.. The route_output will route the
|
||||||
output to the right side of the cell for easier access.
|
output to the right side of the cell for easier access.
|
||||||
"""
|
"""
|
||||||
c = reload(__import__(OPTS.config.bitcell))
|
c = reload(__import__(OPTS.bitcell))
|
||||||
bitcell = getattr(c, OPTS.config.bitcell)
|
bitcell = getattr(c, OPTS.bitcell)
|
||||||
|
|
||||||
unique_id = 1
|
unique_id = 1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,8 @@ class pnand2(pgate.pgate):
|
||||||
This model use ptx to generate a 2-input nand within a cetrain height.
|
This model use ptx to generate a 2-input nand within a cetrain height.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.bitcell))
|
c = reload(__import__(OPTS.bitcell))
|
||||||
bitcell = getattr(c, OPTS.config.bitcell)
|
bitcell = getattr(c, OPTS.bitcell)
|
||||||
|
|
||||||
unique_id = 1
|
unique_id = 1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,8 @@ class pnand3(pgate.pgate):
|
||||||
This model use ptx to generate a 2-input nand within a cetrain height.
|
This model use ptx to generate a 2-input nand within a cetrain height.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.bitcell))
|
c = reload(__import__(OPTS.bitcell))
|
||||||
bitcell = getattr(c, OPTS.config.bitcell)
|
bitcell = getattr(c, OPTS.bitcell)
|
||||||
|
|
||||||
unique_id = 1
|
unique_id = 1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,8 @@ class pnor2(pgate.pgate):
|
||||||
This model use ptx to generate a 2-input nor within a cetrain height.
|
This model use ptx to generate a 2-input nor within a cetrain height.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.bitcell))
|
c = reload(__import__(OPTS.bitcell))
|
||||||
bitcell = getattr(c, OPTS.config.bitcell)
|
bitcell = getattr(c, OPTS.bitcell)
|
||||||
|
|
||||||
unique_id = 1
|
unique_id = 1
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@ class precharge(pgate.pgate):
|
||||||
pgate.pgate.__init__(self, name)
|
pgate.pgate.__init__(self, name)
|
||||||
debug.info(2, "create single precharge cell: {0}".format(name))
|
debug.info(2, "create single precharge cell: {0}".format(name))
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.bitcell))
|
c = reload(__import__(OPTS.bitcell))
|
||||||
self.mod_bitcell = getattr(c, OPTS.config.bitcell)
|
self.mod_bitcell = getattr(c, OPTS.bitcell)
|
||||||
self.bitcell = self.mod_bitcell()
|
self.bitcell = self.mod_bitcell()
|
||||||
|
|
||||||
self.beta = parameter["beta"]
|
self.beta = parameter["beta"]
|
||||||
|
|
|
||||||
|
|
@ -18,14 +18,14 @@ class replica_bitline(design.design):
|
||||||
def __init__(self, rows, name="replica_bitline"):
|
def __init__(self, rows, name="replica_bitline"):
|
||||||
design.design.__init__(self, name)
|
design.design.__init__(self, name)
|
||||||
|
|
||||||
g = reload(__import__(OPTS.config.delay_chain))
|
g = reload(__import__(OPTS.delay_chain))
|
||||||
self.mod_delay_chain = getattr(g, OPTS.config.delay_chain)
|
self.mod_delay_chain = getattr(g, OPTS.delay_chain)
|
||||||
|
|
||||||
g = reload(__import__(OPTS.config.replica_bitcell))
|
g = reload(__import__(OPTS.replica_bitcell))
|
||||||
self.mod_replica_bitcell = getattr(g, OPTS.config.replica_bitcell)
|
self.mod_replica_bitcell = getattr(g, OPTS.replica_bitcell)
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.bitcell))
|
c = reload(__import__(OPTS.bitcell))
|
||||||
self.mod_bitcell = getattr(c, OPTS.config.bitcell)
|
self.mod_bitcell = getattr(c, OPTS.bitcell)
|
||||||
|
|
||||||
for pin in ["en", "out", "vdd", "gnd"]:
|
for pin in ["en", "out", "vdd", "gnd"]:
|
||||||
self.add_pin(pin)
|
self.add_pin(pin)
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,8 @@ class sense_amp_array(design.design):
|
||||||
design.design.__init__(self, "sense_amp_array")
|
design.design.__init__(self, "sense_amp_array")
|
||||||
debug.info(1, "Creating {0}".format(self.name))
|
debug.info(1, "Creating {0}".format(self.name))
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.sense_amp))
|
c = reload(__import__(OPTS.sense_amp))
|
||||||
self.mod_sense_amp = getattr(c, OPTS.config.sense_amp)
|
self.mod_sense_amp = getattr(c, OPTS.sense_amp)
|
||||||
self.amp = self.mod_sense_amp("sense_amp")
|
self.amp = self.mod_sense_amp("sense_amp")
|
||||||
self.add_mod(self.amp)
|
self.add_mod(self.amp)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@ class single_level_column_mux(design.design):
|
||||||
design.design.__init__(self, name)
|
design.design.__init__(self, name)
|
||||||
debug.info(2, "create single columnmux cell: {0}".format(name))
|
debug.info(2, "create single columnmux cell: {0}".format(name))
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.bitcell))
|
c = reload(__import__(OPTS.bitcell))
|
||||||
self.mod_bitcell = getattr(c, OPTS.config.bitcell)
|
self.mod_bitcell = getattr(c, OPTS.bitcell)
|
||||||
self.bitcell = self.mod_bitcell()
|
self.bitcell = self.mod_bitcell()
|
||||||
|
|
||||||
self.ptx_width = tx_size * drc["minwidth_tx"]
|
self.ptx_width = tx_size * drc["minwidth_tx"]
|
||||||
|
|
|
||||||
|
|
@ -19,18 +19,18 @@ class sram(design.design):
|
||||||
|
|
||||||
def __init__(self, word_size, num_words, num_banks, name):
|
def __init__(self, word_size, num_words, num_banks, name):
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.control_logic))
|
c = reload(__import__(OPTS.control_logic))
|
||||||
self.mod_control_logic = getattr(c, OPTS.config.control_logic)
|
self.mod_control_logic = getattr(c, OPTS.control_logic)
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.ms_flop_array))
|
c = reload(__import__(OPTS.ms_flop_array))
|
||||||
self.mod_ms_flop_array = getattr(c, OPTS.config.ms_flop_array)
|
self.mod_ms_flop_array = getattr(c, OPTS.ms_flop_array)
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.bitcell))
|
c = reload(__import__(OPTS.bitcell))
|
||||||
self.mod_bitcell = getattr(c, OPTS.config.bitcell)
|
self.mod_bitcell = getattr(c, OPTS.bitcell)
|
||||||
self.bitcell = self.mod_bitcell()
|
self.bitcell = self.mod_bitcell()
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.ms_flop))
|
c = reload(__import__(OPTS.ms_flop))
|
||||||
self.mod_ms_flop = getattr(c, OPTS.config.ms_flop)
|
self.mod_ms_flop = getattr(c, OPTS.ms_flop)
|
||||||
self.ms_flop = self.mod_ms_flop()
|
self.ms_flop = self.mod_ms_flop()
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,21 +8,3 @@ tech_name = "freepdk45"
|
||||||
output_path = "/tmp/freepdk45_sram"
|
output_path = "/tmp/freepdk45_sram"
|
||||||
output_name = "sram_2_16_1_freepdk45"
|
output_name = "sram_2_16_1_freepdk45"
|
||||||
|
|
||||||
decoder = "hierarchical_decoder"
|
|
||||||
ms_flop = "ms_flop"
|
|
||||||
ms_flop_array = "ms_flop_array"
|
|
||||||
control_logic = "control_logic"
|
|
||||||
bitcell_array = "bitcell_array"
|
|
||||||
sense_amp = "sense_amp"
|
|
||||||
sense_amp_array = "sense_amp_array"
|
|
||||||
precharge_array = "precharge_array"
|
|
||||||
column_mux_array = "single_level_column_mux_array"
|
|
||||||
write_driver = "write_driver"
|
|
||||||
write_driver_array = "write_driver_array"
|
|
||||||
tri_gate = "tri_gate"
|
|
||||||
tri_gate_array = "tri_gate_array"
|
|
||||||
wordline_driver = "wordline_driver"
|
|
||||||
replica_bitline = "replica_bitline"
|
|
||||||
replica_bitcell = "replica_bitcell"
|
|
||||||
bitcell = "bitcell"
|
|
||||||
delay_chain = "delay_chain"
|
|
||||||
|
|
|
||||||
|
|
@ -8,21 +8,3 @@ tech_name = "scn3me_subm"
|
||||||
output_path = "/tmp/scn3me_subm_mysram"
|
output_path = "/tmp/scn3me_subm_mysram"
|
||||||
output_name = "sram_2_16_1_scn3me_subm"
|
output_name = "sram_2_16_1_scn3me_subm"
|
||||||
|
|
||||||
decoder = "hierarchical_decoder"
|
|
||||||
ms_flop = "ms_flop"
|
|
||||||
ms_flop_array = "ms_flop_array"
|
|
||||||
control_logic = "control_logic"
|
|
||||||
bitcell_array = "bitcell_array"
|
|
||||||
sense_amp = "sense_amp"
|
|
||||||
sense_amp_array = "sense_amp_array"
|
|
||||||
precharge_array = "precharge_array"
|
|
||||||
column_mux_array = "single_level_column_mux_array"
|
|
||||||
write_driver = "write_driver"
|
|
||||||
write_driver_array = "write_driver_array"
|
|
||||||
tri_gate = "tri_gate"
|
|
||||||
tri_gate_array = "tri_gate_array"
|
|
||||||
wordline_driver = "wordline_driver"
|
|
||||||
replica_bitline = "replica_bitline"
|
|
||||||
replica_bitcell = "replica_bitcell"
|
|
||||||
bitcell = "bitcell"
|
|
||||||
delay_chain = "delay_chain"
|
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,8 @@ class tri_gate_array(design.design):
|
||||||
design.design.__init__(self, "tri_gate_array")
|
design.design.__init__(self, "tri_gate_array")
|
||||||
debug.info(1, "Creating {0}".format(self.name))
|
debug.info(1, "Creating {0}".format(self.name))
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.tri_gate))
|
c = reload(__import__(OPTS.tri_gate))
|
||||||
self.mod_tri_gate = getattr(c, OPTS.config.tri_gate)
|
self.mod_tri_gate = getattr(c, OPTS.tri_gate)
|
||||||
self.tri = self.mod_tri_gate("tri_gate")
|
self.tri = self.mod_tri_gate("tri_gate")
|
||||||
self.add_mod(self.tri)
|
self.add_mod(self.tri)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -168,9 +168,9 @@ def run_drc(cell_name, gds_name, extract=False):
|
||||||
for line in results:
|
for line in results:
|
||||||
if "error tiles" in line:
|
if "error tiles" in line:
|
||||||
debug.info(0,line.rstrip("\n"))
|
debug.info(0,line.rstrip("\n"))
|
||||||
debug.error("{0}\tErrors: {1}".format(cell_name, errors))
|
debug.error("DRC Errors {0}\t{1}".format(cell_name, errors))
|
||||||
else:
|
else:
|
||||||
debug.info(1, "{0}\tErrors: {1}".format(cell_name, errors))
|
debug.info(1, "DRC Errors {0}\t{1}".format(cell_name, errors))
|
||||||
|
|
||||||
return errors
|
return errors
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,8 @@ class write_driver_array(design.design):
|
||||||
design.design.__init__(self, "write_driver_array")
|
design.design.__init__(self, "write_driver_array")
|
||||||
debug.info(1, "Creating {0}".format(self.name))
|
debug.info(1, "Creating {0}".format(self.name))
|
||||||
|
|
||||||
c = reload(__import__(OPTS.config.write_driver))
|
c = reload(__import__(OPTS.write_driver))
|
||||||
self.mod_write_driver = getattr(c, OPTS.config.write_driver)
|
self.mod_write_driver = getattr(c, OPTS.write_driver)
|
||||||
self.driver = self.mod_write_driver("write_driver")
|
self.driver = self.mod_write_driver("write_driver")
|
||||||
self.add_mod(self.driver)
|
self.add_mod(self.driver)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,10 +22,16 @@ os.environ["MGC_TMPDIR"] = "/tmp"
|
||||||
###########################
|
###########################
|
||||||
#OpenRAM Paths
|
#OpenRAM Paths
|
||||||
|
|
||||||
DRCLVS_HOME= PDK_DIR+"/ncsu_basekit/techfile/calibre"
|
try:
|
||||||
|
DRCLVS_HOME = os.path.abspath(os.environ.get("DRCLVS_HOME"))
|
||||||
|
except:
|
||||||
|
DRCLVS_HOME= PDK_DIR+"/ncsu_basekit/techfile/calibre"
|
||||||
os.environ["DRCLVS_HOME"] = DRCLVS_HOME
|
os.environ["DRCLVS_HOME"] = DRCLVS_HOME
|
||||||
|
|
||||||
os.environ["SPICE_MODEL_DIR"] = PDK_DIR+"/ncsu_basekit/models/hspice/tran_models/models_nom"
|
try:
|
||||||
|
SPICE_MODEL_DIR = os.path.abspath(os.environ.get("SPICE_MODEL_DIR"))
|
||||||
|
except:
|
||||||
|
os.environ["SPICE_MODEL_DIR"] = PDK_DIR+"/ncsu_basekit/models/hspice/tran_models/models_nom"
|
||||||
|
|
||||||
##########################
|
##########################
|
||||||
#Paths required for OPENRAM to function
|
#Paths required for OPENRAM to function
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,14 @@ os.environ["MGC_TMPDIR"] = "/tmp"
|
||||||
|
|
||||||
###########################
|
###########################
|
||||||
# OpenRAM Paths
|
# OpenRAM Paths
|
||||||
OPENRAM_TECH=os.path.abspath(os.environ.get("OPENRAM_TECH"))
|
|
||||||
DRCLVS_HOME=OPENRAM_TECH+"/scn3me_subm/tech"
|
try:
|
||||||
|
DRCLVS_HOME = os.path.abspath(os.environ.get("DRCLVS_HOME"))
|
||||||
|
except:
|
||||||
|
OPENRAM_TECH=os.path.abspath(os.environ.get("OPENRAM_TECH"))
|
||||||
|
DRCLVS_HOME=OPENRAM_TECH+"/scn3me_subm/tech"
|
||||||
os.environ["DRCLVS_HOME"] = DRCLVS_HOME
|
os.environ["DRCLVS_HOME"] = DRCLVS_HOME
|
||||||
# You can override the spice model diretory in the environment
|
|
||||||
try:
|
try:
|
||||||
SPICE_MODEL_DIR = os.path.abspath(os.environ.get("SPICE_MODEL_DIR"))
|
SPICE_MODEL_DIR = os.path.abspath(os.environ.get("SPICE_MODEL_DIR"))
|
||||||
except:
|
except:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue