From 7dfbb0b581048dc61523d35aebda924a78eb0428 Mon Sep 17 00:00:00 2001 From: Nayiri <38256927+nayiri-k@users.noreply.github.com> Date: Mon, 13 Nov 2023 14:35:52 -0800 Subject: [PATCH] Misc small fixes: Joules, Sky130 srams, A-machines setup (#821) * fixing paths on A machines * adding more reporting options and documentation * Create README.md * Update README.md * small fix * all report power commands work * changed joules tcl name * different simv names * small fixes * adding wmask to all Sram22 SRAMs to match behavioral verilog and pass sim * time-based analysis turned off when not required to save time * small e2e tweaks * fixing paths on A machines * joules docs update * reverting vcs file * reverting vcs file * added link to joules readme, removed old comment --- doc/CAD-Tools/Joules.md | 1 + doc/CAD-Tools/index.rst | 1 + e2e/Makefile | 6 +- e2e/configs-env/a-env.yml | 20 +- e2e/configs-env/bwrc-env.yml | 5 +- hammer/config/defaults.yml | 5 +- hammer/power/joules/README.md | 25 +++ hammer/power/joules/__init__.py | 45 +++-- .../sky130/extra/sram22/sram-cache-gen.py | 8 +- .../sky130/extra/sram22/sram-cache.json | 103 ++++++----- hammer/technology/sky130/sram-cache.json | 171 +++++++++++++++--- 11 files changed, 279 insertions(+), 111 deletions(-) create mode 120000 doc/CAD-Tools/Joules.md create mode 100644 hammer/power/joules/README.md diff --git a/doc/CAD-Tools/Joules.md b/doc/CAD-Tools/Joules.md new file mode 120000 index 000000000..e0ae529f7 --- /dev/null +++ b/doc/CAD-Tools/Joules.md @@ -0,0 +1 @@ +../../hammer/power/joules/README.md \ No newline at end of file diff --git a/doc/CAD-Tools/index.rst b/doc/CAD-Tools/index.rst index e47dd1cd2..a6f88ee9b 100644 --- a/doc/CAD-Tools/index.rst +++ b/doc/CAD-Tools/index.rst @@ -14,5 +14,6 @@ The package should contain an class object named 'tool' to create an instance of Hammer-CAD-Tools Tool-Plugin-Setup OpenROAD + Joules ICV Pegasus diff --git a/e2e/Makefile b/e2e/Makefile index 6b2a2fa09..bcd0a2fef 100644 --- a/e2e/Makefile +++ b/e2e/Makefile @@ -22,9 +22,9 @@ TOOLS_CONF ?= configs-tool/$(tools).yml # design-specific overrides of default configs DESIGN_CONF ?= configs-design/$(design)/common.yml DESIGN_PDK_CONF ?= configs-design/$(design)/$(pdk).yml -SIM_CONF ?= $(if $(findstring rtl,$(MAKECMDGOALS)), configs-design/$(design)/sim-rtl.yml, \ - $(if $(findstring syn,$(MAKECMDGOALS)), configs-design/$(design)/sim-syn.yml, \ - $(if $(findstring par,$(MAKECMDGOALS)), configs-design/$(design)/sim-par.yml, ))) +SIM_CONF ?= $(if $(findstring -rtl,$(MAKECMDGOALS)), configs-design/$(design)/sim-rtl.yml, \ + $(if $(findstring -syn,$(MAKECMDGOALS)), configs-design/$(design)/sim-syn.yml, \ + $(if $(findstring -par,$(MAKECMDGOALS)), configs-design/$(design)/sim-par.yml, ))) POWER_CONF ?= $(if $(findstring power-rtl,$(MAKECMDGOALS)), configs-design/$(design)/power-rtl-$(pdk).yml, \ $(if $(findstring power-syn,$(MAKECMDGOALS)), configs-design/$(design)/power-syn-$(pdk).yml, \ $(if $(findstring power-par,$(MAKECMDGOALS)), configs-design/$(design)/power-par-$(pdk).yml, ))) diff --git a/e2e/configs-env/a-env.yml b/e2e/configs-env/a-env.yml index 3c4a32fd4..4b9b2b606 100644 --- a/e2e/configs-env/a-env.yml +++ b/e2e/configs-env/a-env.yml @@ -8,29 +8,33 @@ cadence.CDS_LIC_FILE: "5280@bwrcflex-1.eecs.berkeley.edu:5280@bwrcflex-2.eecs.be cadence.extra_env_vars: [{"LM_PROJECT": "bwrc_users"}] synopsys.synopsys_home: "/ecad/tools/synopsys" -synopsys.SNPSLMD_LICENSE_FILE: "1701@bwrcflex-1.eecs.berkeley.edu:1701@bwrcflex-2.eecs.berkeley.edu" +synopsys.SNPSLMD_LICENSE_FILE: "1709@flex-lic.millennium.berkeley.edu:1701@bwrcflex-1.eecs.berkeley.edu:1701@bwrcflex-2.eecs.berkeley.edu" synopsys.MGLS_LICENSE_FILE: "1717@bwrcflex-1.eecs.berkeley.edu:1717@bwrcflex-2.eecs.berkeley.edu" # Commercial tool versions synthesis.genus.version: "211" par.innovus.version: "211" +power.joules.version: "201" synthesis.genus.genus_bin: "/ecad/tools/cadence/GENUS/GENUS211/bin/genus" # must point to binaries bc Hammer assumes DDI path now par.innovus.innovus_bin: "/ecad/tools/cadence/INNOVUS/INNOVUS211/bin/innovus" -sim.vcs.version: "P-2019.06-SP1" -sim.vcs.verdi_home: "/ecad/tools/synopsys/verdi/P-2019.06-SP2-2" +power.joules.joules_bin: "/ecad/tools/cadence/JLS/JLS201/bin/joules" +sim.vcs.version: "S-2021.09-SP1-1" +sim.vcs.verdi_home: "/ecad/tools/synopsys/verdi/S-2021.09-SP1-1" sim.vcs.verdi_home_meta: lazysubst lvs.calibre.version: "2022.2_24.16" drc.calibre.version: "2022.2_24.16" # Open-source tool paths -synthesis.yosys.yosys_bin: "/nscratch/vighneshiyer/miniconda3/envs/sky130/bin/yosys" -par.openroad.openroad_bin: "/nscratch/vighneshiyer/miniconda3/envs/sky130/bin/openroad" -drc.magic.magic_bin: "/nscratch/vighneshiyer/miniconda3/envs/sky130/bin/magic" -lvs.netgen.netgen_bin: "/nscratch/vighneshiyer/miniconda3/envs/sky130/bin/netgen" +synthesis.yosys.yosys_bin: "/nscratch/sky130/conda-yosys/bin/yosys" +par.openroad.openroad_bin: "/nscratch/sky130/conda-openroad/bin/openroad" +par.openroad.klayout_bin: "/nscratch/sky130/conda-klayout/bin/klayout" +drc.klayout.klayout_bin: "/nscratch/sky130/conda-klayout/bin/klayout" +drc.magic.magic_bin: "/nscratch/sky130/conda-signoff/bin/magic" +lvs.netgen.netgen_bin: "/nscratch/sky130/conda-signoff/bin/netgen" # Sky130 paths technology.sky130: - sky130A: "/nscratch/vighneshiyer/miniconda3/envs/sky130/share/pdk/sky130A" + sky130A: "/nscratch/sky130/conda-sky130/share/pdk/sky130A" sram22_sky130_macros: "/nscratch/sky130/sram22_sky130_macros" # sky130_nda: diff --git a/e2e/configs-env/bwrc-env.yml b/e2e/configs-env/bwrc-env.yml index cf8cc1884..613304ede 100644 --- a/e2e/configs-env/bwrc-env.yml +++ b/e2e/configs-env/bwrc-env.yml @@ -26,10 +26,11 @@ drc.klayout.klayout_bin: "/tools/commercial/skywater/local/chipyard-tutorial/.co drc.magic.magic_bin: "/tools/commercial/skywater/local/chipyard-tutorial/.conda-signoff/bin/magic" lvs.netgen.netgen_bin: "/tools/commercial/skywater/local/chipyard-tutorial/.conda-signoff/bin/netgen" + # Sky130 paths technology.sky130: - sky130A: "/tools/scratch/nayiri/sky130/open_pdks/sky130/sky130A" - sram22_sky130_macros: "/tools/commercial/skywater/local/chipyard-tutorial/sram22_sky130_macros" + sky130A: "/tools/commercial/skywater/local/sky130A" + sram22_sky130_macros: "/tools/commercial/skywater/local/sram22_sky130_macros" openram_lib: "/tools/commercial/skywater/local/sky130_sram_macros" sky130_nda: "/tools/commercial/skywater/swtech130/skywater-src-nda-20221031" sky130_cds: "/tools/commercial/skywater/sky130_cds/sky130_prelim_release_091123" diff --git a/hammer/config/defaults.yml b/hammer/config/defaults.yml index 0e416945c..a845fc103 100644 --- a/hammer/config/defaults.yml +++ b/hammer/config/defaults.yml @@ -884,7 +884,10 @@ power.inputs: # Default: waveform file name # output_formats (List[str]) - Optional. Report types to generate. Default: ["report"] # Valid options are: - # "report" - average power report (*.rpt), default + # "report" - average power report (*.power.rpt, *.hier.power.rpt), default + # "activity" - design activity during stimulus (*.activity.rpt, *.hier.activity.rpt) + # "ppa" - power, performance, area characteristics of the design (*.ppa.rpt) + # "area" - area report (*.area.rpt) # "plot_profile" - power profile over time, requires frame-based analysis (*.png, *.png.data) # "write_profile" - profiles all power types on all categories for all the sub-hierarchies for a given design instance (*.fsdb) # "profile" - run plot_profile + dump_profile diff --git a/hammer/power/joules/README.md b/hammer/power/joules/README.md new file mode 100644 index 000000000..7c73ef4bd --- /dev/null +++ b/hammer/power/joules/README.md @@ -0,0 +1,25 @@ +Cadence Joules RTL Power Tool Plugin +==================================== + +Tool Steps +---------- + +See ``__init__.py`` for the implementation of these steps. + + init_design + synthesize_design + report_power + + +A variety of different output reports may be generated with this tool. +Within the [Hammer default configs file](https://github.com/ucb-bar/hammer/blob/joules-fixes/hammer/config/defaults.yml), +the `power.inputs.report_configs` struct description +contains a summary of the different reporting options, specified via the `output_formats` struct field. + +Known Issues +------------ + +* Joules supports saving the read stimulus file to the SDB (stimulus database) format via the `write_sdb` command. However, subsequent reads of this SDB file via the `read_sdb` command fail for no apparent reason + * As a result, `read_stimulus`/`compute_power` cannot be a separate step in the plugin, because there is no way to save the results of these commands before running the various power reporting commands. + Thus these two commands are run as part of the `report_power` step. + * NOTE: this might not be a problem anymore with the new Joules version, so we should re-try this!! diff --git a/hammer/power/joules/__init__.py b/hammer/power/joules/__init__.py index 3559f4f8f..118283940 100644 --- a/hammer/power/joules/__init__.py +++ b/hammer/power/joules/__init__.py @@ -11,6 +11,7 @@ import os import errno from textwrap import dedent +from datetime import datetime from hammer.vlsi import HammerPowerTool, HammerToolStep, HammerToolHookAction, HammerTool, \ MMMCCornerType, FlowLevel, PowerReport @@ -240,6 +241,9 @@ def report_power(self) -> bool: # Replace . to / formatting in case argument passed from sim tool tb_dut = self.tb_dut.replace(".", "/") + # Fixes issues seen with several different reporting commands + self.block_append("read_db pre_report_power") + power_report_configs = [] # create power report config for each waveform for waveform in self.waveforms: @@ -263,7 +267,7 @@ def report_power(self) -> bool: if report.end_time: read_stim_cmd += " -end {ETIME}ns".format(ETIME=report.end_time.value_in_units("ns")) - frame_based_analysis = (report.interval_size or (report.toggle_signal and report.num_toggles)) + time_based_analysis = (report.interval_size or (report.toggle_signal and report.num_toggles)) if report.interval_size: read_stim_cmd += " -interval_size {INTERVAL}ns".format(INTERVAL=report.interval_size.value_in_units("ns")) if report.toggle_signal: @@ -280,16 +284,11 @@ def report_power(self) -> bool: stim_alias, new_stim = self.get_alias_name(read_stim_cmd) - # if new_stim: - # NOTE: only reading new stimuli with -append mode breaks frame-based power analysis - # with error message: "Invalid frame name /stim#2/frame#3. No stimulus read. Using vectorless power computation" - # Interestingly, this does not happen when starting from a database checkpoint (i.e. after read_db pre_report_power) - # For now, re-run read_stimulus for each power report config, even if it's an identical stimulus - block_append(f"{read_stim_cmd} -alias {stim_alias}") - # block_append(f"write_sdb -out {alias}.sdb") # NOTE: subsequent read_sdb command errors when reading this file back in, so don't cache for now - # TODO: avg mode saves time, run this based on output_formats mode? - # block_append(f"compute_power -mode average -stim {stim_alias} -append") - block_append(f"compute_power -mode time_based -stim {stim_alias} -append") + if new_stim: + block_append(f"{read_stim_cmd} -alias {stim_alias} -append") + # block_append(f"write_sdb -out {alias}.sdb") # NOTE: subsequent read_sdb command errors when reading this file back in, so don't cache for now + mode = "time_based" if time_based_analysis else "average" + block_append(f"compute_power -mode {mode} -stim {stim_alias} -append") # remove only file extension (last .*) in filename waveform_name = '.'.join(os.path.basename(report.waveform_path).split('.')[0:-1]) @@ -297,7 +296,7 @@ def report_power(self) -> bool: inst_str = f"-inst {report.inst}" if report.inst else "" module_str = f"-module {report.module}" if report.module else "" levels_str = f"-levels {report.levels}" if report.levels else "" - m_levels_str = levels_str if report.module else "" + m_levels_str = levels_str if (report.module or report.inst) else "" output_formats = set(report.output_formats) if report.output_formats else {'report'} report_path = report.report_name if report.report_name else waveform_name @@ -313,22 +312,25 @@ def report_power(self) -> bool: # use set intersection to determine whether two lists have at least one element in common if {'report','all'} & output_formats: # -frames $frames explodes the runtime & doesn't seem to change result - self.block_append(f"report_power -stims {stim_alias} {inst_str} {module_str} {levels_str} -unit mW -out {report_path}.power.rpt") - self.block_append(f"report_power -stims {stim_alias} -by_hierarchy {levels_str} -unit mW -out {report_path}.hier.power.rpt") + h_levels_str = "-levels all" if levels_str == "" else levels_str + self.block_append(f"report_power -stims {stim_alias} {inst_str} {module_str} {m_levels_str} -unit mW -out {report_path}.power.rpt") + self.block_append(f"report_power -stims {stim_alias} {inst_str} {module_str} {m_levels_str} -by_hierarchy {h_levels_str} -unit mW -out {report_path}.hier.power.rpt") if {'activity','all'} & output_formats: self.block_append(f"report_activity -stims {stim_alias} {inst_str} {module_str} {levels_str} -out {report_path}.activity.rpt") self.block_append(f"report_activity -stims {stim_alias} -by_hierarchy {levels_str} -out {report_path}.hier.activity.rpt") if {'ppa','all'} & output_formats: root_str = inst_str.replace('-inst','-root') - self.block_append(f"report_ppa {root_str} {module_str} -out {report_path}.ppa.rpt") + self.block_append(f"report_ppa {root_str} {module_str} > {report_path}.ppa.rpt") + if {'area','all'} & output_formats: + self.block_append(f"report_area > {report_path}.area.rpt") if {'plot_profile','profile','all'} & output_formats: - if not frame_based_analysis: + if not time_based_analysis: self.logger.error("Must specify either interval_size or toggle_signal+num_toggles in power.inputs.report_configs to generate plot_profile report (frame-based analysis).") return False # NOTE: we don't include levels_str here bc category is total power anyways self.block_append(f"plot_power_profile -stims {stim_alias} {inst_str} {module_str} {m_levels_str} -by_category {{total}} -types {{total}} -unit mW -format png -out {report_path}.profile.png") if {'write_profile','profile','all'} & output_formats: - if not frame_based_analysis: + if not time_based_analysis: self.logger.error("Must specify either interval_size or toggle_signal+num_toggles in power.inputs.report_configs to generate write_profile report (frame-based analysis).") return False block_append(f"write_power_profile -stims {stim_alias} -root [get_insts -rtl_type hier] {levels_str} -unit mW -format fsdb -out {report_path}.profile.fsdb") @@ -350,11 +352,8 @@ def run_joules(self) -> bool: # Create power analysis script # with unique filename so that multiple runs don't overwrite each others' TCL scripts - i = 0 - joules_tcl_filename = os.path.join(self.run_dir, f"joules.{i}.tcl") - while os.path.exists(joules_tcl_filename): - i += 1 - joules_tcl_filename = os.path.join(self.run_dir, f"joules.{i}.tcl") + now = datetime.now().strftime("%Y%m%d-%H%M%S") + joules_tcl_filename = os.path.join(self.run_dir, f"joules-{now}.tcl") self.write_contents_to_path("\n".join(self.output), joules_tcl_filename) # Make sure that generated-scripts exists. @@ -390,8 +389,6 @@ def run_joules(self) -> bool: self.run_executable(args, cwd=self.run_dir) - shutil.copy2(joules_tcl_filename, os.path.join(self.run_dir, f"joules.tcl")) - HammerVLSILogging.enable_colour = True HammerVLSILogging.enable_tag = True diff --git a/hammer/technology/sky130/extra/sram22/sram-cache-gen.py b/hammer/technology/sky130/extra/sram22/sram-cache-gen.py index d494fcb48..0b14da455 100755 --- a/hammer/technology/sky130/extra/sram22/sram-cache-gen.py +++ b/hammer/technology/sky130/extra/sram22/sram-cache-gen.py @@ -61,10 +61,10 @@ def main(args: List[str]) -> int: port_dict['input port name'] = "din" port_dict['input port polarity'] = "active high" - if mask_gran != width: - port_dict['mask port name'] = "wmask" - port_dict['mask granularity'] = mask_gran - port_dict['mask port polarity'] = "active high" # ??? + # if mask_gran != width: + port_dict['mask port name'] = "wmask" + port_dict['mask granularity'] = mask_gran + port_dict['mask port polarity'] = "active high" # ??? sram_dict['ports'].append(port_dict.copy()) diff --git a/hammer/technology/sky130/extra/sram22/sram-cache.json b/hammer/technology/sky130/extra/sram22/sram-cache.json index 0738db46e..e49b2ee10 100644 --- a/hammer/technology/sky130/extra/sram22/sram-cache.json +++ b/hammer/technology/sky130/extra/sram22/sram-cache.json @@ -1,10 +1,10 @@ [ { "type": "sram", - "name": "sram22_1024x32m8w8", + "name": "sram22_4096x8m8w8", "source": "sram22", - "depth": "1024", - "width": 32, + "depth": "4096", + "width": 8, "family": "1rw", "mask": "true", "vt": "svt", @@ -29,9 +29,9 @@ }, { "type": "sram", - "name": "sram22_64x32m4w32", + "name": "sram22_512x32m4w32", "source": "sram22", - "depth": "64", + "depth": "512", "width": 32, "family": "1rw", "mask": "true", @@ -48,20 +48,23 @@ "output port name": "dout", "output port polarity": "active high", "input port name": "din", - "input port polarity": "active high" + "input port polarity": "active high", + "mask port name": "wmask", + "mask granularity": 32, + "mask port polarity": "active high" } ] }, { "type": "sram", - "name": "sram22_1024x32m8w32", + "name": "sram22_64x32m4w32", "source": "sram22", - "depth": "1024", + "depth": "64", "width": 32, "family": "1rw", "mask": "true", "vt": "svt", - "mux": 8, + "mux": 4, "ports": [ { "address port name": "addr", @@ -73,16 +76,19 @@ "output port name": "dout", "output port polarity": "active high", "input port name": "din", - "input port polarity": "active high" + "input port polarity": "active high", + "mask port name": "wmask", + "mask granularity": 32, + "mask port polarity": "active high" } ] }, { "type": "sram", - "name": "sram22_512x32m4w32", + "name": "sram22_512x64m4w8", "source": "sram22", "depth": "512", - "width": 32, + "width": 64, "family": "1rw", "mask": "true", "vt": "svt", @@ -98,20 +104,23 @@ "output port name": "dout", "output port polarity": "active high", "input port name": "din", - "input port polarity": "active high" + "input port polarity": "active high", + "mask port name": "wmask", + "mask granularity": 8, + "mask port polarity": "active high" } ] }, { "type": "sram", - "name": "sram22_2048x32m8w8", + "name": "sram22_512x32m4w8", "source": "sram22", - "depth": "2048", + "depth": "512", "width": 32, "family": "1rw", "mask": "true", "vt": "svt", - "mux": 8, + "mux": 4, "ports": [ { "address port name": "addr", @@ -132,10 +141,10 @@ }, { "type": "sram", - "name": "sram22_512x32m4w8", + "name": "sram22_64x24m4w24", "source": "sram22", - "depth": "512", - "width": 32, + "depth": "64", + "width": 24, "family": "1rw", "mask": "true", "vt": "svt", @@ -153,7 +162,7 @@ "input port name": "din", "input port polarity": "active high", "mask port name": "wmask", - "mask granularity": 8, + "mask granularity": 24, "mask port polarity": "active high" } ] @@ -188,10 +197,10 @@ }, { "type": "sram", - "name": "sram22_64x4m4w2", + "name": "sram22_256x32m4w8", "source": "sram22", - "depth": "64", - "width": 4, + "depth": "256", + "width": 32, "family": "1rw", "mask": "true", "vt": "svt", @@ -209,17 +218,17 @@ "input port name": "din", "input port polarity": "active high", "mask port name": "wmask", - "mask granularity": 2, + "mask granularity": 8, "mask port polarity": "active high" } ] }, { "type": "sram", - "name": "sram22_256x32m4w8", + "name": "sram22_64x4m4w2", "source": "sram22", - "depth": "256", - "width": 32, + "depth": "64", + "width": 4, "family": "1rw", "mask": "true", "vt": "svt", @@ -237,17 +246,17 @@ "input port name": "din", "input port polarity": "active high", "mask port name": "wmask", - "mask granularity": 8, + "mask granularity": 2, "mask port polarity": "active high" } ] }, { "type": "sram", - "name": "sram22_4096x8m8w8", + "name": "sram22_2048x32m8w8", "source": "sram22", - "depth": "4096", - "width": 8, + "depth": "2048", + "width": 32, "family": "1rw", "mask": "true", "vt": "svt", @@ -263,20 +272,23 @@ "output port name": "dout", "output port polarity": "active high", "input port name": "din", - "input port polarity": "active high" + "input port polarity": "active high", + "mask port name": "wmask", + "mask granularity": 8, + "mask port polarity": "active high" } ] }, { "type": "sram", - "name": "sram22_64x32m4w8", + "name": "sram22_1024x32m8w32", "source": "sram22", - "depth": "64", + "depth": "1024", "width": 32, "family": "1rw", "mask": "true", "vt": "svt", - "mux": 4, + "mux": 8, "ports": [ { "address port name": "addr", @@ -290,21 +302,21 @@ "input port name": "din", "input port polarity": "active high", "mask port name": "wmask", - "mask granularity": 8, + "mask granularity": 32, "mask port polarity": "active high" } ] }, { "type": "sram", - "name": "sram22_64x24m4w24", + "name": "sram22_1024x32m8w8", "source": "sram22", - "depth": "64", - "width": 24, + "depth": "1024", + "width": 32, "family": "1rw", "mask": "true", "vt": "svt", - "mux": 4, + "mux": 8, "ports": [ { "address port name": "addr", @@ -316,16 +328,19 @@ "output port name": "dout", "output port polarity": "active high", "input port name": "din", - "input port polarity": "active high" + "input port polarity": "active high", + "mask port name": "wmask", + "mask granularity": 8, + "mask port polarity": "active high" } ] }, { "type": "sram", - "name": "sram22_512x64m4w8", + "name": "sram22_64x32m4w8", "source": "sram22", - "depth": "512", - "width": 64, + "depth": "64", + "width": 32, "family": "1rw", "mask": "true", "vt": "svt", diff --git a/hammer/technology/sky130/sram-cache.json b/hammer/technology/sky130/sram-cache.json index aa288f5cc..e49b2ee10 100644 --- a/hammer/technology/sky130/sram-cache.json +++ b/hammer/technology/sky130/sram-cache.json @@ -1,14 +1,14 @@ [ { "type": "sram", - "name": "sramgen_sram_32x32m2w8_replica_v1", + "name": "sram22_4096x8m8w8", "source": "sram22", - "depth": "32", - "width": 32, + "depth": "4096", + "width": 8, "family": "1rw", "mask": "true", "vt": "svt", - "mux": 2, + "mux": 8, "ports": [ { "address port name": "addr", @@ -29,7 +29,35 @@ }, { "type": "sram", - "name": "sramgen_sram_64x32m4w32_replica_v1", + "name": "sram22_512x32m4w32", + "source": "sram22", + "depth": "512", + "width": 32, + "family": "1rw", + "mask": "true", + "vt": "svt", + "mux": 4, + "ports": [ + { + "address port name": "addr", + "address port polarity": "active high", + "clock port name": "clk", + "clock port polarity": "active high", + "write enable port name": "we", + "write enable port polarity": "active high", + "output port name": "dout", + "output port polarity": "active high", + "input port name": "din", + "input port polarity": "active high", + "mask port name": "wmask", + "mask granularity": 32, + "mask port polarity": "active high" + } + ] + }, + { + "type": "sram", + "name": "sram22_64x32m4w32", "source": "sram22", "depth": "64", "width": 32, @@ -48,13 +76,44 @@ "output port name": "dout", "output port polarity": "active high", "input port name": "din", - "input port polarity": "active high" + "input port polarity": "active high", + "mask port name": "wmask", + "mask granularity": 32, + "mask port polarity": "active high" + } + ] + }, + { + "type": "sram", + "name": "sram22_512x64m4w8", + "source": "sram22", + "depth": "512", + "width": 64, + "family": "1rw", + "mask": "true", + "vt": "svt", + "mux": 4, + "ports": [ + { + "address port name": "addr", + "address port polarity": "active high", + "clock port name": "clk", + "clock port polarity": "active high", + "write enable port name": "we", + "write enable port polarity": "active high", + "output port name": "dout", + "output port polarity": "active high", + "input port name": "din", + "input port polarity": "active high", + "mask port name": "wmask", + "mask granularity": 8, + "mask port polarity": "active high" } ] }, { "type": "sram", - "name": "sramgen_sram_512x32m4w8_replica_v1", + "name": "sram22_512x32m4w8", "source": "sram22", "depth": "512", "width": 32, @@ -82,9 +141,37 @@ }, { "type": "sram", - "name": "sramgen_sram_1024x32m8w8_replica_v1", + "name": "sram22_64x24m4w24", "source": "sram22", - "depth": "1024", + "depth": "64", + "width": 24, + "family": "1rw", + "mask": "true", + "vt": "svt", + "mux": 4, + "ports": [ + { + "address port name": "addr", + "address port polarity": "active high", + "clock port name": "clk", + "clock port polarity": "active high", + "write enable port name": "we", + "write enable port polarity": "active high", + "output port name": "dout", + "output port polarity": "active high", + "input port name": "din", + "input port polarity": "active high", + "mask port name": "wmask", + "mask granularity": 24, + "mask port polarity": "active high" + } + ] + }, + { + "type": "sram", + "name": "sram22_4096x32m8w8", + "source": "sram22", + "depth": "4096", "width": 32, "family": "1rw", "mask": "true", @@ -110,14 +197,14 @@ }, { "type": "sram", - "name": "sramgen_sram_1024x32m8w32_replica_v1", + "name": "sram22_256x32m4w8", "source": "sram22", - "depth": "1024", + "depth": "256", "width": 32, "family": "1rw", "mask": "true", "vt": "svt", - "mux": 8, + "mux": 4, "ports": [ { "address port name": "addr", @@ -129,20 +216,23 @@ "output port name": "dout", "output port polarity": "active high", "input port name": "din", - "input port polarity": "active high" + "input port polarity": "active high", + "mask port name": "wmask", + "mask granularity": 8, + "mask port polarity": "active high" } ] }, { "type": "sram", - "name": "sramgen_sram_1024x64m8w32_replica_v1", + "name": "sram22_64x4m4w2", "source": "sram22", - "depth": "1024", - "width": 64, + "depth": "64", + "width": 4, "family": "1rw", "mask": "true", "vt": "svt", - "mux": 8, + "mux": 4, "ports": [ { "address port name": "addr", @@ -156,14 +246,14 @@ "input port name": "din", "input port polarity": "active high", "mask port name": "wmask", - "mask granularity": 32, + "mask granularity": 2, "mask port polarity": "active high" } ] }, { "type": "sram", - "name": "sramgen_sram_2048x32m8w8_replica_v1", + "name": "sram22_2048x32m8w8", "source": "sram22", "depth": "2048", "width": 32, @@ -191,10 +281,10 @@ }, { "type": "sram", - "name": "sramgen_sram_4096x8m8w8_replica_v1", + "name": "sram22_1024x32m8w32", "source": "sram22", - "depth": "4096", - "width": 8, + "depth": "1024", + "width": 32, "family": "1rw", "mask": "true", "vt": "svt", @@ -210,15 +300,18 @@ "output port name": "dout", "output port polarity": "active high", "input port name": "din", - "input port polarity": "active high" + "input port polarity": "active high", + "mask port name": "wmask", + "mask granularity": 32, + "mask port polarity": "active high" } ] }, { "type": "sram", - "name": "sramgen_sram_4096x32m8w8_replica_v1", + "name": "sram22_1024x32m8w8", "source": "sram22", - "depth": "4096", + "depth": "1024", "width": 32, "family": "1rw", "mask": "true", @@ -241,5 +334,33 @@ "mask port polarity": "active high" } ] + }, + { + "type": "sram", + "name": "sram22_64x32m4w8", + "source": "sram22", + "depth": "64", + "width": 32, + "family": "1rw", + "mask": "true", + "vt": "svt", + "mux": 4, + "ports": [ + { + "address port name": "addr", + "address port polarity": "active high", + "clock port name": "clk", + "clock port polarity": "active high", + "write enable port name": "we", + "write enable port polarity": "active high", + "output port name": "dout", + "output port polarity": "active high", + "input port name": "din", + "input port polarity": "active high", + "mask port name": "wmask", + "mask granularity": 8, + "mask port polarity": "active high" + } + ] } ] \ No newline at end of file