mirror of https://github.com/VLSIDA/OpenRAM.git
Merge remote-tracking branch 'private/dev' into dev
This commit is contained in:
commit
6e81ecde54
|
|
@ -6,6 +6,9 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@v1
|
uses: actions/checkout@v1
|
||||||
|
- name: Library build
|
||||||
|
run: |
|
||||||
|
make library
|
||||||
- name: Docker build
|
- name: Docker build
|
||||||
run: |
|
run: |
|
||||||
cd ${{ github.workspace }}/docker
|
cd ${{ github.workspace }}/docker
|
||||||
|
|
|
||||||
|
|
@ -15,3 +15,9 @@ technology/sky130/tech/.magicrc
|
||||||
.idea
|
.idea
|
||||||
compiler/tests/results/
|
compiler/tests/results/
|
||||||
open_pdks/
|
open_pdks/
|
||||||
|
dist/
|
||||||
|
openram.egg-info/
|
||||||
|
sky130A/
|
||||||
|
sky130B/
|
||||||
|
skywater-pdk/
|
||||||
|
sky130_fd_bd_sram/
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
include Makefile
|
||||||
|
include openram.mk
|
||||||
|
include setpaths.sh
|
||||||
|
include requirements.txt
|
||||||
|
include docker/*
|
||||||
|
recursive-include compiler *
|
||||||
|
recursive-include technology *
|
||||||
|
exclude .DS_Store
|
||||||
|
exclude .idea
|
||||||
|
exclude **/model_data
|
||||||
|
exclude technology/sky130/*_lib
|
||||||
|
exclude technology/sky130/tech/.magicrc
|
||||||
|
exclude compiler/gen_stimulus.py
|
||||||
|
exclude compiler/model_data_util.py
|
||||||
|
exclude compiler/printGDS.py
|
||||||
|
exclude compiler/processGDS.py
|
||||||
|
exclude compiler/uniquifyGDS.py
|
||||||
|
exclude compiler/view_profile.py
|
||||||
|
exclude compiler/run_profile.sh
|
||||||
|
recursive-exclude open_pdks *
|
||||||
|
recursive-exclude compiler/tests/results *
|
||||||
|
recursive-exclude technology/freepdk45/ncsu_basekit *
|
||||||
|
recursive-exclude outputs *
|
||||||
|
global-exclude *.pyc *~ *.orig *.rej *.aux *.out *.toc *.synctex.gz
|
||||||
13
Makefile
13
Makefile
|
|
@ -215,3 +215,16 @@ wipe: uninstall
|
||||||
@rm -rf $(OPEN_PDKS_DIR)
|
@rm -rf $(OPEN_PDKS_DIR)
|
||||||
@rm -rf $(SKY130_PDKS_DIR)
|
@rm -rf $(SKY130_PDKS_DIR)
|
||||||
.PHONY: wipe
|
.PHONY: wipe
|
||||||
|
|
||||||
|
# Build the openram library
|
||||||
|
build-library:
|
||||||
|
@rm -rf dist
|
||||||
|
@rm -rf openram.egg-info
|
||||||
|
@python3 -m pip install --upgrade build
|
||||||
|
@python3 -m build
|
||||||
|
.PHONY: build-library
|
||||||
|
|
||||||
|
# Build and install the openram library
|
||||||
|
library: build-library
|
||||||
|
@python3 -m pip install --find-links=dist openram --force
|
||||||
|
.PHONY: library
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
# See LICENSE for licensing information.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016-2021 Regents of the University of California and The Board
|
||||||
|
# of Regents for the Oklahoma Agricultural and Mechanical College
|
||||||
|
# (acting for and on behalf of Oklahoma State University)
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Attempt to add the source code to the PYTHONPATH here before running globals.init_openram().
|
||||||
|
try:
|
||||||
|
OPENRAM_HOME = os.path.abspath(os.environ.get("OPENRAM_HOME"))
|
||||||
|
except:
|
||||||
|
import openram
|
||||||
|
OPENRAM_HOME = os.path.dirname(openram.__file__) + "/compiler"
|
||||||
|
|
||||||
|
if not os.path.isdir(OPENRAM_HOME):
|
||||||
|
assert False
|
||||||
|
|
||||||
|
if OPENRAM_HOME not in sys.path:
|
||||||
|
sys.path.insert(0, OPENRAM_HOME)
|
||||||
|
|
@ -95,7 +95,7 @@ model: $(STAMPS)
|
||||||
$(eval bname=$(basename $(notdir $@)))
|
$(eval bname=$(basename $(notdir $@)))
|
||||||
$(eval config_path=$(CONFIG_DIR)/$(addsuffix .py, $(notdir $(basename $@))))
|
$(eval config_path=$(CONFIG_DIR)/$(addsuffix .py, $(notdir $(basename $@))))
|
||||||
mkdir -p $(SIM_DIR)/$(bname)
|
mkdir -p $(SIM_DIR)/$(bname)
|
||||||
-python3 $(OPENRAM_HOME)/openram.py $(OPTS) -p $(SIM_DIR)/$(bname) -o $(bname) -t $(TECH) $(config_path) 2>&1 > /dev/null
|
-python3 $(OPENRAM_HOME)/../sram_compiler.py $(OPTS) -p $(SIM_DIR)/$(bname) -o $(bname) -t $(TECH) $(config_path) 2>&1 > /dev/null
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
clean_model:
|
clean_model:
|
||||||
|
|
|
||||||
|
|
@ -131,7 +131,7 @@ def bp():
|
||||||
An empty function so you can set soft breakpoints in pdb.
|
An empty function so you can set soft breakpoints in pdb.
|
||||||
Usage:
|
Usage:
|
||||||
1) Add a breakpoint anywhere in your code with "import debug; debug.bp()".
|
1) Add a breakpoint anywhere in your code with "import debug; debug.bp()".
|
||||||
2) Run "python3 -m pdb openram.py config.py" or "python3 -m pdb 05_bitcell_array.test" (for example)
|
2) Run "python3 -m pdb sram_compiler.py config.py" or "python3 -m pdb 05_bitcell_array.test" (for example)
|
||||||
3) When pdb starts, run "break debug.bp" to set a SOFT breakpoint. (Or you can add this to your ~/.pdbrc)
|
3) When pdb starts, run "break debug.bp" to set a SOFT breakpoint. (Or you can add this to your ~/.pdbrc)
|
||||||
4) Then run "cont" to continue.
|
4) Then run "cont" to continue.
|
||||||
5) You can now set additional breakpoints or display commands
|
5) You can now set additional breakpoints or display commands
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ import subprocess
|
||||||
|
|
||||||
VERSION = "1.2.0"
|
VERSION = "1.2.0"
|
||||||
NAME = "OpenRAM v{}".format(VERSION)
|
NAME = "OpenRAM v{}".format(VERSION)
|
||||||
USAGE = "openram.py [options] <config file>\nUse -h for help.\n"
|
USAGE = "sram_compiler.py [options] <config file>\nUse -h for help.\n"
|
||||||
|
|
||||||
OPTS = options.options()
|
OPTS = options.options()
|
||||||
CHECKPOINT_OPTS = None
|
CHECKPOINT_OPTS = None
|
||||||
|
|
@ -141,9 +141,6 @@ def print_banner():
|
||||||
debug.print_raw("|=========" + user_info.center(60) + "=========|")
|
debug.print_raw("|=========" + user_info.center(60) + "=========|")
|
||||||
dev_info = "Development help: openram-dev-group@ucsc.edu"
|
dev_info = "Development help: openram-dev-group@ucsc.edu"
|
||||||
debug.print_raw("|=========" + dev_info.center(60) + "=========|")
|
debug.print_raw("|=========" + dev_info.center(60) + "=========|")
|
||||||
if OPTS.openram_temp:
|
|
||||||
temp_info = "Temp dir: {}".format(OPTS.openram_temp)
|
|
||||||
debug.print_raw("|=========" + temp_info.center(60) + "=========|")
|
|
||||||
debug.print_raw("|=========" + "See LICENSE for license info".center(60) + "=========|")
|
debug.print_raw("|=========" + "See LICENSE for license info".center(60) + "=========|")
|
||||||
debug.print_raw("|==============================================================================|")
|
debug.print_raw("|==============================================================================|")
|
||||||
|
|
||||||
|
|
@ -432,16 +429,23 @@ def setup_paths():
|
||||||
|
|
||||||
global OPTS
|
global OPTS
|
||||||
|
|
||||||
|
# If $OPENRAM_HOME is defined, use that path for the source code.
|
||||||
|
# Otherwise, use the openram package.
|
||||||
try:
|
try:
|
||||||
OPENRAM_HOME = os.path.abspath(os.environ.get("OPENRAM_HOME"))
|
OPENRAM_HOME = os.path.abspath(os.environ.get("OPENRAM_HOME"))
|
||||||
except:
|
except:
|
||||||
debug.error("$OPENRAM_HOME is not properly defined.", 1)
|
import openram
|
||||||
|
OPENRAM_HOME = os.path.dirname(openram.__file__) + "/compiler"
|
||||||
|
# Add this directory to os.environ here
|
||||||
|
os.environ["OPENRAM_HOME"] = OPENRAM_HOME
|
||||||
|
|
||||||
debug.check(os.path.isdir(OPENRAM_HOME),
|
debug.check(os.path.isdir(OPENRAM_HOME),
|
||||||
"$OPENRAM_HOME does not exist: {0}".format(OPENRAM_HOME))
|
"$OPENRAM_HOME does not exist: {0}".format(OPENRAM_HOME))
|
||||||
|
debug.info(1, "OpenRAM source code found in {}".format(OPENRAM_HOME))
|
||||||
|
|
||||||
if OPENRAM_HOME not in sys.path:
|
if OPENRAM_HOME not in sys.path:
|
||||||
debug.error("Please add OPENRAM_HOME to the PYTHONPATH.", -1)
|
sys.path.insert(0, OPENRAM_HOME)
|
||||||
|
debug.info(2, "Adding source code to PYTHONPATH.")
|
||||||
|
|
||||||
# Use a unique temp subdirectory if multithreaded
|
# Use a unique temp subdirectory if multithreaded
|
||||||
if OPTS.num_threads > 1 or OPTS.openram_temp == "/tmp":
|
if OPTS.num_threads > 1 or OPTS.openram_temp == "/tmp":
|
||||||
|
|
@ -547,11 +551,30 @@ def import_tech():
|
||||||
debug.info(2,
|
debug.info(2,
|
||||||
"Importing technology: " + OPTS.tech_name)
|
"Importing technology: " + OPTS.tech_name)
|
||||||
|
|
||||||
# environment variable should point to the technology dir
|
OPENRAM_TECH = ""
|
||||||
|
|
||||||
|
# Check if $OPENRAM_TECH is defined
|
||||||
try:
|
try:
|
||||||
OPENRAM_TECH = os.path.abspath(os.environ.get("OPENRAM_TECH"))
|
OPENRAM_TECH = os.path.abspath(os.environ.get("OPENRAM_TECH"))
|
||||||
except:
|
except:
|
||||||
debug.error("$OPENRAM_TECH environment variable is not defined.", 1)
|
debug.info(2,
|
||||||
|
"$OPENRAM_TECH environment variable is not defined. "
|
||||||
|
"Only the default technology modules will be considered if installed.")
|
||||||
|
# Point to the default technology modules that are part of the openram package
|
||||||
|
try:
|
||||||
|
import openram
|
||||||
|
if OPENRAM_TECH != "":
|
||||||
|
OPENRAM_TECH += ":"
|
||||||
|
OPENRAM_TECH += os.path.dirname(openram.__file__) + "/technology"
|
||||||
|
except:
|
||||||
|
if OPENRAM_TECH == "":
|
||||||
|
debug.warning("Couldn't find a tech directory. "
|
||||||
|
"Install openram library or set $OPENRAM_TECH.")
|
||||||
|
|
||||||
|
debug.info(1, "Tech directory found in {}".format(OPENRAM_TECH))
|
||||||
|
|
||||||
|
# Add this environment variable to os.environ
|
||||||
|
os.environ["OPENRAM_TECH"] = OPENRAM_TECH
|
||||||
|
|
||||||
# Add all of the paths
|
# Add all of the paths
|
||||||
for tech_path in OPENRAM_TECH.split(":"):
|
for tech_path in OPENRAM_TECH.split(":"):
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ class options(optparse.Values):
|
||||||
"""
|
"""
|
||||||
Class for holding all of the OpenRAM options. All
|
Class for holding all of the OpenRAM options. All
|
||||||
of these options can be over-riden in a configuration file
|
of these options can be over-riden in a configuration file
|
||||||
that is the sole required command-line positional argument for openram.py.
|
that is the sole required command-line positional argument for sram_compiler.py.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
###################
|
###################
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ class code_format_test(openram_test):
|
||||||
continue
|
continue
|
||||||
if re.search("debug.py$", code):
|
if re.search("debug.py$", code):
|
||||||
continue
|
continue
|
||||||
if re.search("openram.py$", code):
|
if re.search("sram_compiler.py$", code):
|
||||||
continue
|
continue
|
||||||
if re.search("testutils.py$", code):
|
if re.search("testutils.py$", code):
|
||||||
continue
|
continue
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ class openram_back_end_test(openram_test):
|
||||||
config_file = "{}/tests/configs/config_back_end".format(os.getenv("OPENRAM_HOME"))
|
config_file = "{}/tests/configs/config_back_end".format(os.getenv("OPENRAM_HOME"))
|
||||||
globals.init_openram(config_file)
|
globals.init_openram(config_file)
|
||||||
|
|
||||||
debug.info(1, "Testing top-level back-end openram.py with 2-bit, 16 word SRAM.")
|
debug.info(1, "Testing top-level back-end sram_compiler.py with 2-bit, 16 word SRAM.")
|
||||||
out_file = "testsram"
|
out_file = "testsram"
|
||||||
out_path = "/tmp/testsram_{0}_{1}_{2}/".format(OPTS.tech_name, getpass.getuser(), os.getpid())
|
out_path = "/tmp/testsram_{0}_{1}_{2}/".format(OPTS.tech_name, getpass.getuser(), os.getpid())
|
||||||
|
|
||||||
|
|
@ -54,9 +54,9 @@ class openram_back_end_test(openram_test):
|
||||||
# Always perform code coverage
|
# Always perform code coverage
|
||||||
if OPTS.coverage == 0:
|
if OPTS.coverage == 0:
|
||||||
debug.warning("Failed to find coverage installation. This can be installed with pip3 install coverage")
|
debug.warning("Failed to find coverage installation. This can be installed with pip3 install coverage")
|
||||||
exe_name = "{0}/openram.py ".format(OPENRAM_HOME)
|
exe_name = "{0}/../sram_compiler.py ".format(OPENRAM_HOME)
|
||||||
else:
|
else:
|
||||||
exe_name = "{0}{1}/openram.py ".format(OPTS.coverage_exe, OPENRAM_HOME)
|
exe_name = "{0}{1}/../sram_compiler.py ".format(OPTS.coverage_exe, OPENRAM_HOME)
|
||||||
config_name = "{0}/tests/configs/config_back_end.py".format(OPENRAM_HOME)
|
config_name = "{0}/tests/configs/config_back_end.py".format(OPENRAM_HOME)
|
||||||
cmd = "{0} -o {1} -p {2} {3} {4} 2>&1 > {5}/output.log".format(exe_name,
|
cmd = "{0} -o {1} -p {2} {3} {4} 2>&1 > {5}/output.log".format(exe_name,
|
||||||
out_file,
|
out_file,
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ class openram_front_end_test(openram_test):
|
||||||
config_file = "{}/tests/configs/config_front_end".format(os.getenv("OPENRAM_HOME"))
|
config_file = "{}/tests/configs/config_front_end".format(os.getenv("OPENRAM_HOME"))
|
||||||
globals.init_openram(config_file)
|
globals.init_openram(config_file)
|
||||||
|
|
||||||
debug.info(1, "Testing top-level front-end openram.py with 2-bit, 16 word SRAM.")
|
debug.info(1, "Testing top-level front-end sram_compiler.py with 2-bit, 16 word SRAM.")
|
||||||
out_file = "testsram"
|
out_file = "testsram"
|
||||||
out_path = "/tmp/testsram_{0}_{1}_{2}".format(OPTS.tech_name, getpass.getuser(), os.getpid())
|
out_path = "/tmp/testsram_{0}_{1}_{2}".format(OPTS.tech_name, getpass.getuser(), os.getpid())
|
||||||
|
|
||||||
|
|
@ -54,9 +54,9 @@ class openram_front_end_test(openram_test):
|
||||||
# Always perform code coverage
|
# Always perform code coverage
|
||||||
if OPTS.coverage == 0:
|
if OPTS.coverage == 0:
|
||||||
debug.warning("Failed to find coverage installation. This can be installed with pip3 install coverage")
|
debug.warning("Failed to find coverage installation. This can be installed with pip3 install coverage")
|
||||||
exe_name = "{0}/openram.py ".format(OPENRAM_HOME)
|
exe_name = "{0}/../sram_compiler.py ".format(OPENRAM_HOME)
|
||||||
else:
|
else:
|
||||||
exe_name = "{0}{1}/openram.py ".format(OPTS.coverage_exe, OPENRAM_HOME)
|
exe_name = "{0}{1}/../sram_compiler.py ".format(OPTS.coverage_exe, OPENRAM_HOME)
|
||||||
config_name = "{0}/tests/configs/config_front_end.py".format(OPENRAM_HOME)
|
config_name = "{0}/tests/configs/config_front_end.py".format(OPENRAM_HOME)
|
||||||
cmd = "{0} -n -o {1} -p {2} {3} {4} 2>&1 > {5}/output.log".format(exe_name,
|
cmd = "{0} -n -o {1} -p {2} {3} {4} 2>&1 > {5}/output.log".format(exe_name,
|
||||||
out_file,
|
out_file,
|
||||||
|
|
|
||||||
|
|
@ -121,7 +121,7 @@ $(TEST_BASES):
|
||||||
@mkdir -p results/$*/tmp
|
@mkdir -p results/$*/tmp
|
||||||
@$(DOCKER_CMD) sh -c ". /home/cad-user/.bashrc && sleep 1 && python3 -u $(OPENRAM_DIR)/$(getfile).py \
|
@$(DOCKER_CMD) sh -c ". /home/cad-user/.bashrc && sleep 1 && python3 -u $(OPENRAM_DIR)/$(getfile).py \
|
||||||
-t $(gettech) -k -v $(ARGS) -p $(OPENRAM_DIR)/results/$* > $(OPENRAM_DIR)/results/$*.out 2>&1 && touch $(OPENRAM_DIR)/results/$*.ok || touch $(OPENRAM_DIR)/results/$*.bad"
|
-t $(gettech) -k -v $(ARGS) -p $(OPENRAM_DIR)/results/$* > $(OPENRAM_DIR)/results/$*.out 2>&1 && touch $(OPENRAM_DIR)/results/$*.ok || touch $(OPENRAM_DIR)/results/$*.bad"
|
||||||
ifdef $(KEEP)
|
ifdef KEEP
|
||||||
@test -f $(TOP_DIR)/compiler/tests/results/$*.ok && echo "$* ... PASS!" || echo "$* ... FAIL!"
|
@test -f $(TOP_DIR)/compiler/tests/results/$*.ok && echo "$* ... PASS!" || echo "$* ... FAIL!"
|
||||||
else
|
else
|
||||||
@test -f $(TOP_DIR)/compiler/tests/results/$*.ok && echo "$* ... PASS!" && rm -rf $(TOP_DIR)/compiler/tests/results/$* || echo "$* ... FAIL!"
|
@test -f $(TOP_DIR)/compiler/tests/results/$*.ok && echo "$* ... PASS!" && rm -rf $(TOP_DIR)/compiler/tests/results/$* || echo "$* ... FAIL!"
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
# Frequently Asked Questions
|
# Frequently Asked Questions
|
||||||
|
|
||||||
|
## What to do if OpenRAM encounters an error?
|
||||||
|
|
||||||
When OpenRAM runs, it puts files in a temporary directory that is
|
When OpenRAM runs, it puts files in a temporary directory that is
|
||||||
shown in the banner at the top. Like:
|
shown in the banner at the top. Like:
|
||||||
```
|
```
|
||||||
|
|
@ -11,109 +13,26 @@ This is where simulations and DRC/LVS get run so there is no network
|
||||||
traffic. The directory name is unique for each person and run of
|
traffic. The directory name is unique for each person and run of
|
||||||
OpenRAM to not clobber any files and allow simultaneous runs. If it
|
OpenRAM to not clobber any files and allow simultaneous runs. If it
|
||||||
passes, the files are deleted. If it fails, you will see these files:
|
passes, the files are deleted. If it fails, you will see these files:
|
||||||
+ temp.gds is the layout (.mag files too if using SCMOS)
|
+ `temp.gds` is the layout (.mag files too if using SCMOS)
|
||||||
+ temp.sp is the netlist
|
+ `temp.sp` is the netlist
|
||||||
+ test1.drc.err is the std err output of the DRC command
|
+ `test1.drc.err` is the std err output of the DRC command
|
||||||
+ test1.drc.out is the standard output of the DRC command
|
+ `test1.drc.out` is the standard output of the DRC command
|
||||||
+ test1.drc.results is the DRC results file
|
+ `test1.drc.results` is the DRC results file
|
||||||
+ test1.lvs.err is the std err output of the LVS command
|
+ `test1.lvs.err` is the std err output of the LVS command
|
||||||
+ test1.lvs.out is the standard output of the LVS command
|
+ `test1.lvs.out` is the standard output of the LVS command
|
||||||
+ test1.lvs.results is the DRC results file
|
+ `test1.lvs.results` is the DRC results file
|
||||||
|
|
||||||
Depending on your DRC/LVS tools, there will also be:
|
Depending on your DRC/LVS tools, there will also be:
|
||||||
+ \_calibreDRC.rul\_ is the DRC rule file (Calibre)
|
+ `run\_drc.sh` is a script to run DRC
|
||||||
+ dc_runset is the command file (Calibre)
|
+ `run\_ext.sh` is a script to run extraction
|
||||||
+ extracted.sp (Calibre)
|
+ `run\_lvs.sh` is a script to run LVS
|
||||||
+ run_lvs.sh is a Netgen script for LVS (Netgen)
|
|
||||||
+ run_drc.sh is a Magic script for DRC (Magic)
|
|
||||||
+ <topcell>.spice (Magic)
|
|
||||||
|
|
||||||
If DRC/LVS fails, the first thing is to check if it ran in the .out and
|
If DRC/LVS fails, the first thing is to check if it ran in the `.out` and
|
||||||
.err file. This shows the standard output and error output from
|
`.err` file. This shows the standard output and error output from
|
||||||
running DRC/LVS. If there is a setup problem it will be shown here.
|
running DRC/LVS. If there is a setup problem it will be shown here.
|
||||||
|
|
||||||
If DRC/LVS runs, but doesn't pass, you then should look at the .results
|
If DRC/LVS runs, but doesn't pass, you then should look at the `.results`
|
||||||
file. If the DRC fails, it will typically show you the command that was used
|
file. If the DRC fails, it will typically show you the command that was used
|
||||||
to run Calibre or Magic+Netgen.
|
to run Calibre or Magic+Netgen.
|
||||||
|
|
||||||
To debug, you will need a layout viewer. I prefer to use Glade
|
|
||||||
on my Mac, but you can also use Calibre, Magic, etc.
|
|
||||||
|
|
||||||
1. Klayout
|
|
||||||
|
|
||||||
You can view the designs in [Klayout](https://www.klayout.de/) with the configuration
|
|
||||||
file provided in the tech directories. For example,
|
|
||||||
```
|
|
||||||
klayout temp.gds -l /home/vagrant/openram/technology/freepdk45/tf/FreePDK45.lyp
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Calibre
|
|
||||||
|
|
||||||
Start the Calibre DESIGNrev viewer in the temp directory and load your GDS file:
|
|
||||||
```
|
|
||||||
calibredrv temp.gds
|
|
||||||
```
|
|
||||||
Select Verification->Start RVE and select the results database file in
|
|
||||||
the new form (e.g., test1.drc.db). This will start the RVE (results
|
|
||||||
viewer). Scroll through the check pane and find the DRC check with an
|
|
||||||
error. Select it and it will open some numbers to the right. Double
|
|
||||||
click on any of the errors in the result browser. These will be
|
|
||||||
labelled as numbers "1 2 3 4" for example will be 4 DRC errors.
|
|
||||||
|
|
||||||
In the viewer ">" opens the layout down a level.
|
|
||||||
|
|
||||||
3. Glade
|
|
||||||
|
|
||||||
You can view errors in [Glade](http://www.peardrop.co.uk/glade/) as well.
|
|
||||||
|
|
||||||
To remote display over X windows, you need to disable OpenGL acceleration or use vnc
|
|
||||||
or something. You can disable by adding this to your .bashrc in bash:
|
|
||||||
```
|
|
||||||
export GLADE_USE_OPENGL=no
|
|
||||||
```
|
|
||||||
or in .cshrc/.tcshrc in csh/tcsh:
|
|
||||||
```
|
|
||||||
setenv GLADE_USE_OPENGAL no
|
|
||||||
```
|
|
||||||
To use this with the FreePDK45 or SCMOS layer views you should use the
|
|
||||||
tech files. Then create a .glade.py file in your user directory with
|
|
||||||
these commands to load the technology layers:
|
|
||||||
```
|
|
||||||
ui().importCds("default",
|
|
||||||
"/Users/mrg/techfiles/freepdk45/display.drf",
|
|
||||||
"/Users/mrg/techfiles/freepdk45/FreePDK45.tf", 1000, 1,
|
|
||||||
"/Users/mrg/techfiles/freepdk45/layers.map")
|
|
||||||
```
|
|
||||||
Obviously, edit the paths to point to your directory. To switch
|
|
||||||
between processes, you have to change the importCds command (or you
|
|
||||||
can manually run the command each time you start glade).
|
|
||||||
|
|
||||||
To load the errors, you simply do Verify->Import Calibre Errors select
|
|
||||||
the .results file from Calibre.
|
|
||||||
|
|
||||||
4. Magic
|
|
||||||
|
|
||||||
Magic is only supported in SCMOS. You will need to install the MOSIS SCMOS rules
|
|
||||||
and [Magic](http://opencircuitdesign.com/)
|
|
||||||
|
|
||||||
When running DRC or extraction, OpenRAM will load the GDS file, save
|
|
||||||
the .ext/.mag files, and export an extracted netlist (.spice).
|
|
||||||
|
|
||||||
5. It is possible to use other viewers as well, such as:
|
|
||||||
* [LayoutEditor](http://www.layouteditor.net/)
|
|
||||||
|
|
||||||
|
|
||||||
# Example to output/input .gds layout files from/to Cadence
|
|
||||||
|
|
||||||
1. To create your component layouts, you should stream them to
|
|
||||||
individual gds files using our provided layermap and flatten
|
|
||||||
cells. For example,
|
|
||||||
```
|
|
||||||
strmout -layerMap layers.map -library sram -topCell $i -view layout -flattenVias -flattenPcells -strmFile ../gds_lib/$i.gds
|
|
||||||
```
|
|
||||||
2. To stream a layout back into Cadence, do this:
|
|
||||||
```
|
|
||||||
strmin -layerMap layers.map -attachTechFileOfLib NCSU\_TechLib\_FreePDK45 -library sram_4_32 -strmFile sram_4_32.gds
|
|
||||||
```
|
|
||||||
When you import a gds file, make sure to attach the correct tech lib
|
|
||||||
or you will get incorrect layers in the resulting library.
|
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,9 @@ This page of the documentation explains the base data structures of OpenRAM.
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
1. [Design Classes](#design-classes)
|
1. [Design Classes](#design-classes)
|
||||||
2. [Base Class Inheritance](#base-class-inheritance)
|
1. [Base Class Inheritance](#base-class-inheritance)
|
||||||
3. [Parameterized Transistor](#parameterized-transistor-ptx-or-pfinfet)
|
1. [Parameterized Transistor](#parameterized-transistor-ptx-or-pfinfet)
|
||||||
4. [Parameterized Cells](#parameterized-cells)
|
1. [Parameterized Cells](#parameterized-cells)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,35 +13,55 @@ In general, the OpenRAM compiler has very few dependencies:
|
||||||
+ Make
|
+ Make
|
||||||
+ Python 3.6 or higher
|
+ Python 3.6 or higher
|
||||||
+ Various Python packages (pip install -r requirements.txt)
|
+ Various Python packages (pip install -r requirements.txt)
|
||||||
+ [Git]
|
+ Git
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## OpenRAM Library
|
||||||
|
OpenRAM is available as a Python library. There are a few ways to install it:
|
||||||
|
|
||||||
|
+ Install using Makefile (you need to clone the repo):
|
||||||
|
```
|
||||||
|
git clone git@github.com:VLSIDA/OpenRAM.git
|
||||||
|
cd OpenRAM
|
||||||
|
make library
|
||||||
|
```
|
||||||
|
+ Install the latest _dev_ version:
|
||||||
|
```
|
||||||
|
pip3 install git+ssh://git@github.com/VLSIDA/OpenramRAM.git@dev
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## Docker
|
## Docker
|
||||||
|
|
||||||
We have a [docker setup](./docker) to run OpenRAM. To use this, you should run:
|
We have a [docker setup](../../docker) to run OpenRAM. To use this, you should run:
|
||||||
```
|
```
|
||||||
cd OpenRAM/docker
|
cd OpenRAM/docker
|
||||||
make build
|
make build
|
||||||
```
|
```
|
||||||
This must be run once and will take a while to build all the tools.
|
This must be run once and will take a while to build all the tools. If you have the
|
||||||
|
OpenRAM library installed, you can also run the docker setup from the package
|
||||||
|
installation directory.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Environment
|
## Environment
|
||||||
|
|
||||||
You must set two environment variables:
|
If you haven't installed the OpenRAM library or you want to use a different OpenRAM installation,
|
||||||
|
you can set two environment variables:
|
||||||
+ OPENRAM\_HOME should point to the compiler source directory.
|
+ OPENRAM\_HOME should point to the compiler source directory.
|
||||||
+ OPENERAM\_TECH should point to one or more root technology directories (colon separated).
|
+ OPENRAM\_TECH should point to one or more root technology directories (colon separated).
|
||||||
|
|
||||||
You should also add OPENRAM\_HOME to your PYTHONPATH.
|
If you have the library installed and OPENRAM\_HOME set, the library will use the installation on
|
||||||
|
the OPENRAM\_HOME path.
|
||||||
|
|
||||||
For example add this to your .bashrc:
|
If you don't have the library, you should also add OPENRAM\_HOME to your PYTHONPATH. This is not
|
||||||
|
needed if you have the library.
|
||||||
|
|
||||||
|
You can add these environment variables to your `.bashrc`:
|
||||||
```
|
```
|
||||||
export OPENRAM_HOME="$HOME/OpenRAM/compiler"
|
export OPENRAM_HOME="$HOME/OpenRAM/compiler"
|
||||||
export OPENRAM_TECH="$HOME/OpenRAM/technology"
|
export OPENRAM_TECH="$HOME/OpenRAM/technology"
|
||||||
```
|
|
||||||
|
|
||||||
You should also add OPENRAM\_HOME to your PYTHONPATH:
|
|
||||||
```
|
|
||||||
export PYTHONPATH=$OPENRAM_HOME
|
export PYTHONPATH=$OPENRAM_HOME
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -51,17 +71,17 @@ directory that you use and any custom technology modules as well. For example:
|
||||||
export PYTHONPATH="$OPENRAM_HOME:$OPENRAM_TECH/sky130:$OPENRAM_TECH/sky130/custom"
|
export PYTHONPATH="$OPENRAM_HOME:$OPENRAM_TECH/sky130:$OPENRAM_TECH/sky130/custom"
|
||||||
```
|
```
|
||||||
|
|
||||||
We include the tech files necessary for [SCMOS] SCN4M_SUBM,
|
We include the tech files necessary for [SCMOS] SCN4M\_SUBM,
|
||||||
[FreePDK45]. The [SCMOS] spice models, however, are
|
[FreePDK45]. The [SCMOS] spice models, however, are
|
||||||
generic and should be replaced with foundry models. You may get the
|
generic and should be replaced with foundry models. You may get the
|
||||||
entire [FreePDK45 PDK here][FreePDK45].
|
entire [FreePDK45 PDK here][FreePDK45].
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Sky130 Setup
|
### Sky130 Setup
|
||||||
|
|
||||||
To install [Sky130], you must have the open_pdks files installed in $PDK_ROOT.
|
To install [Sky130], you must have the open\_pdks files installed in $PDK\_ROOT.
|
||||||
To install this automatically, you can run:
|
To install this automatically, you can run:
|
||||||
|
|
||||||
```
|
```
|
||||||
cd $HOME/OpenRAM
|
cd $HOME/OpenRAM
|
||||||
make pdk
|
make pdk
|
||||||
|
|
@ -69,8 +89,15 @@ make pdk
|
||||||
|
|
||||||
Then you must also install the [Sky130] SRAM build space and the appropriate cell views
|
Then you must also install the [Sky130] SRAM build space and the appropriate cell views
|
||||||
by running:
|
by running:
|
||||||
|
|
||||||
```
|
```
|
||||||
cd $HOME/OpenRAM
|
cd $HOME/OpenRAM
|
||||||
make install
|
make install
|
||||||
```
|
```
|
||||||
|
|
||||||
|
You can also run these from the package installation directory if you have the OpenRAM library.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[SCMOS]: https://www.mosis.com/files/scmos/scmos.pdf
|
||||||
|
[FreePDK45]: https://www.eda.ncsu.edu/wiki/FreePDK45:Contents
|
||||||
|
[Sky130]: https://github.com/google/skywater-pdk-libs-sky130_fd_bd_sram.git
|
||||||
|
|
|
||||||
|
|
@ -7,16 +7,19 @@ This page of the documentation explains the basic usage of OpenRAM.
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
1. [Environment Variable Setup](#environment-variable-setup-assuming-bash)
|
1. [Environment Variable Setup](#environment-variable-setup-assuming-bash)
|
||||||
2. [Command Line Usage](#command-line-usage)
|
1. [Script Usage (with library)](#script-usage-with-library)
|
||||||
3. [Configuration Files](#configuration-files)
|
1. [Command Line Usage (with library)](#command-line-usage-with-library)
|
||||||
4. [Common Configuration File Options](#common-configuration-file-options)
|
1. [Command Line Usage (without library)](#command-line-usage-without-library)
|
||||||
5. [Output Files](#output-files)
|
1. [Configuration Files](#configuration-files)
|
||||||
6. [Data Sheets](#data-sheets)
|
1. [Common Configuration File Options](#common-configuration-file-options)
|
||||||
|
1. [Output Files](#output-files)
|
||||||
|
1. [Data Sheets](#data-sheets)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Environment Variable Setup (assuming bash)
|
## Environment Variable Setup (assuming bash)
|
||||||
* OPENRAM_HOME defines where the compiler directory is
|
> **Note**: This is optional if you have the OpenRAM library. See [basic setup](./basic_setup.md#go-back) for details.
|
||||||
|
* OPENRAM\_HOME defines where the compiler directory is
|
||||||
* ```export OPENRAM_HOME="$HOME/openram/compiler"```
|
* ```export OPENRAM_HOME="$HOME/openram/compiler"```
|
||||||
* OPENRAM_TECH defines list of paths where the technologies exist
|
* OPENRAM_TECH defines list of paths where the technologies exist
|
||||||
* `export OPENRAM_TECH="$HOME/openram/technology"`
|
* `export OPENRAM_TECH="$HOME/openram/technology"`
|
||||||
|
|
@ -27,14 +30,41 @@ This page of the documentation explains the basic usage of OpenRAM.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Command Line Usage
|
## Script Usage (with library)
|
||||||
|
If you have the library installed, you can use OpenRAM in any Python script. You can import "openram" as follows:
|
||||||
|
```python
|
||||||
|
import openram
|
||||||
|
import globals
|
||||||
|
globals.init_openram("myconfig.py") # Config files are explained on this page
|
||||||
|
```
|
||||||
|
Note that you should import "openram" in this order so that the modules are imported properly. You can also look
|
||||||
|
at `sram_compiler.py` as an example on how to use "openram."
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Command Line Usage (with library)
|
||||||
|
You can run OpenRAM from the command line using the `sram_compiler.py` script that is included in the
|
||||||
|
library's installation. You can the package directory on a path like:
|
||||||
|
```
|
||||||
|
/home/mrg/.local/lib/python3.8/site-packages/openram
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, you can run the following command to find that path:
|
||||||
|
```
|
||||||
|
echo -e "import os\nimport openram\nprint(os.path.dirname(openram.__file__))" | python3 -
|
||||||
|
```
|
||||||
|
|
||||||
|
You can continue with following section for more details.
|
||||||
|
|
||||||
|
|
||||||
|
## Command Line Usage (without library)
|
||||||
|
|
||||||
Once you have defined the environment, you can run OpenRAM from the command line
|
Once you have defined the environment, you can run OpenRAM from the command line
|
||||||
using a single configuration file written in Python.
|
using a single configuration file written in Python.
|
||||||
|
|
||||||
For example, create a file called *myconfig.py* specifying the following
|
For example, create a file called *myconfig.py* specifying the following
|
||||||
parameters for your memory:
|
parameters for your memory:
|
||||||
```
|
```python
|
||||||
# Data word size
|
# Data word size
|
||||||
word_size = 2
|
word_size = 2
|
||||||
# Number of words in the memory
|
# Number of words in the memory
|
||||||
|
|
@ -65,7 +95,7 @@ output_name = "sram_{0}_{1}_{2}".format(word_size,num_words,tech_name)
|
||||||
|
|
||||||
You can then run OpenRAM by executing:
|
You can then run OpenRAM by executing:
|
||||||
```
|
```
|
||||||
python3 $OPENRAM_HOME/openram.py myconfig
|
python3 $OPENRAM_HOME/../sram_compiler.py myconfig
|
||||||
```
|
```
|
||||||
You can see all of the options for the configuration file in
|
You can see all of the options for the configuration file in
|
||||||
$OPENRAM\_HOME/options.py
|
$OPENRAM\_HOME/options.py
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ This page of the documentation explains the bitcells supported by OpenRAM.
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
1. [Multiport Bitcells](#multiport-bitcells)
|
1. [Multiport Bitcells](#multiport-bitcells)
|
||||||
2. [Relative Bitcell Sizes](#relative-bitcell-sizes-035um-scmos)
|
1. [Relative Bitcell Sizes](#relative-bitcell-sizes-035um-scmos)
|
||||||
3. [Thin SRAM Bitcells](#thin-sram-bitcells-130nm)
|
1. [Thin SRAM Bitcells](#thin-sram-bitcells-130nm)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,19 +6,19 @@ This page of the documentation explains the characterization of OpenRAM.
|
||||||
|
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
1. [Characterization Overview](#characterization-overview)
|
1. [Characterization Overview](#characterization-overview)
|
||||||
2. [Characterizer Organization](#characterizer-organization)
|
1. [Characterizer Organization](#characterizer-organization)
|
||||||
3. [Characterization Options](#characterization-options)
|
1. [Characterization Options](#characterization-options)
|
||||||
4. [Characterization Measurements](#characterization-measurements)
|
1. [Characterization Measurements](#characterization-measurements)
|
||||||
5. [Analytical Characterization](#analytical-characterization)
|
1. [Analytical Characterization](#analytical-characterization)
|
||||||
6. [Multiport Characterization](#multiport-characterization)
|
1. [Multiport Characterization](#multiport-characterization)
|
||||||
7. [Characterizer Unit Test Use](#characterizer-unit-test-use)
|
1. [Characterizer Unit Test Use](#characterizer-unit-test-use)
|
||||||
8. [Functional Simulation](#functional-simulation)
|
1. [Functional Simulation](#functional-simulation)
|
||||||
9. [Power/Delay Characterization](#powerdelay-characterization)
|
1. [Power/Delay Characterization](#powerdelay-characterization)
|
||||||
10. [Timing Graph](#timing-graph)
|
1. [Timing Graph](#timing-graph)
|
||||||
11. [Graph Creation Example: Buffer](#graph-creation-example-buffer)
|
1. [Graph Creation Example: Buffer](#graph-creation-example-buffer)
|
||||||
12. [Graph Module Exclusion](#graph-module-exclusion)
|
1. [Graph Module Exclusion](#graph-module-exclusion)
|
||||||
13. [Timing Measurement Checks](#timing-measurement-checks)
|
1. [Timing Measurement Checks](#timing-measurement-checks)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -62,9 +62,9 @@ Measures the timing/power through SPICE simulation:
|
||||||
|
|
||||||
## Characterization Measurements
|
## Characterization Measurements
|
||||||
* Characterization is performed primarily to generate tables in .lib file
|
* Characterization is performed primarily to generate tables in .lib file
|
||||||
* cell_rise/cell_fall - Delay of from negative clock edge to DOUT when reading a 1 or 0 respectively
|
* cell\_rise/cell\_fall - Delay of from negative clock edge to DOUT when reading a 1 or 0 respectively
|
||||||
* rise_transition/fall_transition - Slew of DOUT when read 1 or 0 respectively
|
* rise\_transition/fall\_transition - Slew of DOUT when read 1 or 0 respectively
|
||||||
* Setup and hold time for inputs (setup_rising, hold_rising)
|
* Setup and hold time for inputs (setup\_rising, hold\_rising)
|
||||||
* Total power and leakage power
|
* Total power and leakage power
|
||||||
* Delays and slews and intended to be independent of clock period.
|
* Delays and slews and intended to be independent of clock period.
|
||||||
* Fall delays are copied to rise delays after characterization*
|
* Fall delays are copied to rise delays after characterization*
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,13 @@ This page of the documentation explains the control logic and timing of OpenRAM.
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
1. [Read Timing](#read-timing)
|
1. [Read Timing](#read-timing)
|
||||||
2. [Write Timing](#write-timing)
|
1. [Write Timing](#write-timing)
|
||||||
3. [External Control Signals](#external-control-signals)
|
1. [External Control Signals](#external-control-signals)
|
||||||
4. [Internal Control Signals](#internal-control-signals)
|
1. [Internal Control Signals](#internal-control-signals)
|
||||||
5. [Replica Bitline (RBL)](#replica-bitline-rbl)
|
1. [Replica Bitline (RBL)](#replica-bitline-rbl)
|
||||||
6. [Internal Control Signals Diagram (Read)](#internal-control-signals-diagram-read)
|
1. [Internal Control Signals Diagram (Read)](#internal-control-signals-diagram-read)
|
||||||
7. [Internal Control Signals Diagram (Write)](#internal-control-signals-diagram-write)
|
1. [Internal Control Signals Diagram (Write)](#internal-control-signals-diagram-write)
|
||||||
8. [Clock Distribution](#clock-distribution)
|
1. [Clock Distribution](#clock-distribution)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,11 +7,11 @@ This page of the documentation explains the debugging and unit testing of OpenRA
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
1. [Unit Tests](#unit-tests)
|
1. [Unit Tests](#unit-tests)
|
||||||
2. [Unit Test Organization](#unit-test-organization)
|
1. [Unit Test Organization](#unit-test-organization)
|
||||||
3. [Running Unit Tests](#running-unit-tests)
|
1. [Running Unit Tests](#running-unit-tests)
|
||||||
4. [Successful Unit Tests](#successful-unit-tests)
|
1. [Successful Unit Tests](#successful-unit-tests)
|
||||||
5. [Debugging Unsuccessful Unit Tests](#debugging-unsuccessful-unit-tests-or-openrampy)
|
1. [Debugging Unsuccessful Unit Tests](#debugging-unsuccessful-unit-tests-or-sram_compilerpy)
|
||||||
6. [Temporary Output Files](#temporary-output-files)
|
1. [Temporary Output Files](#temporary-output-files)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -124,7 +124,7 @@ OK
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Debugging Unsuccessful Unit Tests (or openram.py)
|
## Debugging Unsuccessful Unit Tests (or sram\_compiler.py)
|
||||||
* You will get an ERROR during unit test and see a stack trace
|
* You will get an ERROR during unit test and see a stack trace
|
||||||
* Examine the temporary output files in the temp directory (/tmp/mydir)
|
* Examine the temporary output files in the temp directory (/tmp/mydir)
|
||||||
```console
|
```console
|
||||||
|
|
|
||||||
|
|
@ -6,17 +6,17 @@ This page of the documentation explains the hierarchical design modules of OpenR
|
||||||
|
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
1. [Hierarchical Design Modules](#hierarchical-design-modules-1)
|
1. [Hierarchical Design Modules](#hierarchical-design-modules-1)
|
||||||
2. [Bank](#bank)
|
1. [Bank](#bank)
|
||||||
3. [Port Data](#port-data)
|
1. [Port Data](#port-data)
|
||||||
4. [Port Address](#port-address)
|
1. [Port Address](#port-address)
|
||||||
5. [Plain Bitcell Array](#plain-bitcell-array)
|
1. [Plain Bitcell Array](#plain-bitcell-array)
|
||||||
6. [Variations of Bitcells Needed](#variations-of-bitcells-needed)
|
1. [Variations of Bitcells Needed](#variations-of-bitcells-needed)
|
||||||
7. [Replica Bitcell Array](#replica-bitcell-array)
|
1. [Replica Bitcell Array](#replica-bitcell-array)
|
||||||
8. [1D Arrays](#1d-arrays)
|
1. [1D Arrays](#1d-arrays)
|
||||||
9. [2D Arrays](#2d-arrays)
|
1. [2D Arrays](#2d-arrays)
|
||||||
10. [Delay Line](#delay-line)
|
1. [Delay Line](#delay-line)
|
||||||
11. [Hierarchical (Address) Decoder](#hierarchical-address-decoder)
|
1. [Hierarchical (Address) Decoder](#hierarchical-address-decoder)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -61,7 +61,7 @@ This page of the documentation explains the hierarchical design modules of OpenR
|
||||||
|
|
||||||
## Port Address
|
## Port Address
|
||||||
* Encapsulates the row decoder and wordline driver for easier placement next to a bank
|
* Encapsulates the row decoder and wordline driver for easier placement next to a bank
|
||||||
* Each port will have its own port_address module
|
* Each port will have its own port\_address module
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,14 +6,15 @@ These pages provide the documentation of OpenRAM. You can use the links below to
|
||||||
|
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
1. [OpenRAM Dependencies](#openram-dependencies)
|
1. [OpenRAM Dependencies](#openram-dependencies)
|
||||||
1. [Supported Technologies](#supported-technologies)
|
1. [Supported Technologies](#supported-technologies)
|
||||||
1. [Bitcells](./bitcells.md#go-back)
|
1. [Basic Setup](./basic_setup.md#go-back)
|
||||||
1. [Architecture](./architecture.md#go-back)
|
1. [Basic Usage](./basic_usage.md#go-back)
|
||||||
1. [Implementation](#implementation)
|
1. [Bitcells](./bitcells.md#go-back)
|
||||||
1. [Technology and Tool Portability](#technology-and-tool-portability)
|
1. [Architecture](./architecture.md#go-back)
|
||||||
1. [Basic Usage](./basic_usage.md#go-back)
|
1. [Implementation](#implementation)
|
||||||
1. [Tutorials](./tutorials.md#go-back)
|
1. [Technology and Tool Portability](#technology-and-tool-portability)
|
||||||
|
1. [Tutorials](./tutorials.md#go-back)
|
||||||
1. [Debugging and Unit Testing](./debug.md#go-back)
|
1. [Debugging and Unit Testing](./debug.md#go-back)
|
||||||
1. [Technology Setup](./technology_setup.md#go-back)
|
1. [Technology Setup](./technology_setup.md#go-back)
|
||||||
1. [Library Cells](./library_cells.md#go-back)
|
1. [Library Cells](./library_cells.md#go-back)
|
||||||
|
|
@ -24,13 +25,12 @@ These pages provide the documentation of OpenRAM. You can use the links below to
|
||||||
1. [Characterization](./characterization.md#go-back)
|
1. [Characterization](./characterization.md#go-back)
|
||||||
1. [Results](./results.md#go-back)
|
1. [Results](./results.md#go-back)
|
||||||
1. [FAQ](./FAQ.md#go-back)
|
1. [FAQ](./FAQ.md#go-back)
|
||||||
1. [Contributors/Collaborators](#contributorscollaborators)
|
1. [Contributors/Collaborators](#contributorscollaborators)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## OpenRAM Dependencies
|
## OpenRAM Dependencies
|
||||||
|
|
||||||
Please see the Dockerfile for the required versions of tools.
|
Please see the Dockerfile for the required versions of tools.
|
||||||
|
|
||||||
In general, the OpenRAM compiler has very few dependencies:
|
In general, the OpenRAM compiler has very few dependencies:
|
||||||
|
|
@ -38,16 +38,16 @@ In general, the OpenRAM compiler has very few dependencies:
|
||||||
+ Make
|
+ Make
|
||||||
+ Python 3.6 or higher
|
+ Python 3.6 or higher
|
||||||
+ Various Python packages (pip install -r requirements.txt)
|
+ Various Python packages (pip install -r requirements.txt)
|
||||||
+ [Git]
|
+ Git
|
||||||
|
|
||||||
Commercial tools (optional):
|
Commercial tools (optional):
|
||||||
* Spice Simulator
|
* Spice Simulator
|
||||||
* Hspice I-2013.12-1 (or later)
|
* Hspice I-2013.12-1 (or later)
|
||||||
* CustomSim 2017 (or later)
|
* CustomSim 2017 (or later)
|
||||||
* DRC
|
* DRC
|
||||||
* Calibre 2017.3_29.23
|
* Calibre 2017.3\_29.23
|
||||||
* LVS
|
* LVS
|
||||||
* Calibre 2017.3_29.23
|
* Calibre 2017.3\_29.23
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -55,7 +55,7 @@ Commercial tools (optional):
|
||||||
* NCSU FreePDK 45nm
|
* NCSU FreePDK 45nm
|
||||||
* Non-fabricable but contains DSM rules
|
* Non-fabricable but contains DSM rules
|
||||||
* Calibre or klayout for DRC/LVS
|
* Calibre or klayout for DRC/LVS
|
||||||
* MOSIS 0.35um (SCN4M_SUBM)
|
* MOSIS 0.35um (SCN4M\_SUBM)
|
||||||
* Fabricable technology
|
* Fabricable technology
|
||||||
* Magic/Netgen or Calibre for DRC/LVS
|
* Magic/Netgen or Calibre for DRC/LVS
|
||||||
* Skywater 130nm (sky130)
|
* Skywater 130nm (sky130)
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,12 @@ This page of the documentation explains the library cells of OpenRAM.
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
1. [Required Hard/Custom Cells](#required-hardcustom-cells)
|
1. [Required Hard/Custom Cells](#required-hardcustom-cells)
|
||||||
2. [Bitcell(s)](#bitcells)
|
1. [Bitcell(s)](#bitcells)
|
||||||
3. [Multiport Bitcells](#multiport-bitcells)
|
1. [Multiport Bitcells](#multiport-bitcells)
|
||||||
4. [Parameterized Bitcell](#parameterized-bitcell)
|
1. [Parameterized Bitcell](#parameterized-bitcell)
|
||||||
5. [Sense Amplifier](#sense-amplifier)
|
1. [Sense Amplifier](#sense-amplifier)
|
||||||
6. [DFF](#dff)
|
1. [DFF](#dff)
|
||||||
7. [Tristate/Write Driver](#tristatewrite-driver)
|
1. [Tristate/Write Driver](#tristatewrite-driver)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,13 @@ This page of the documentation explains the results of OpenRAM.
|
||||||
|
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
1. [Small Layouts](#small-layouts)
|
1. [Small Layouts](#small-layouts)
|
||||||
2. [Relative Planar Bitcells](#relative-planar-bitcells-035um-scmos)
|
1. [Relative Planar Bitcells](#relative-planar-bitcells-035um-scmos)
|
||||||
3. [SRAM Area](#sram-area)
|
1. [SRAM Area](#sram-area)
|
||||||
4. [Generated Layout by OpenRAM](#generated-layout-by-openram-for-a-multiport-6r2w-sram-in-32-nm-soi-cmos-technology)
|
1. [Generated Layout by OpenRAM](#generated-layout-by-openram-for-a-multiport-6r2w-sram-in-32-nm-soi-cmos-technology)
|
||||||
5. [Timing and Density Results for Generated SRAMs](#timing-and-density-results-for-generated-srams)
|
1. [Timing and Density Results for Generated SRAMs](#timing-and-density-results-for-generated-srams)
|
||||||
6. [Comparison with Fabricated SRAMs](#comparison-with-fabricated-srams)
|
1. [Comparison with Fabricated SRAMs](#comparison-with-fabricated-srams)
|
||||||
7. [Conclusions](#conclusions)
|
1. [Conclusions](#conclusions)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,9 @@ This page of the documentation explains the routing of OpenRAM.
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
1. [Power Supply Options](#power-supply-options)
|
1. [Power Supply Options](#power-supply-options)
|
||||||
2. [Power Routing](#power-routing)
|
1. [Power Routing](#power-routing)
|
||||||
3. [Power Supply Algorithm](#power-supply-algorithm)
|
1. [Power Supply Algorithm](#power-supply-algorithm)
|
||||||
4. [Channel Router](#channel-router)
|
1. [Channel Router](#channel-router)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,17 +7,17 @@ This page of the documentation explains the technology setup of OpenRAM.
|
||||||
|
|
||||||
## Table of Contents
|
## Table of Contents
|
||||||
1. [Technology Directories](#technology-directories)
|
1. [Technology Directories](#technology-directories)
|
||||||
2. Technology Configuration:
|
1. Technology Configuration:
|
||||||
1. [Layer Map](#technology-configuration-layer-map)
|
1. [Layer Map](#technology-configuration-layer-map)
|
||||||
2. [GDS](#technology-configuration-gds)
|
1. [GDS](#technology-configuration-gds)
|
||||||
3. [DRC](#technology-configuration-drc)
|
1. [DRC](#technology-configuration-drc)
|
||||||
4. [SPICE](#technology-configuration-spice)
|
1. [SPICE](#technology-configuration-spice)
|
||||||
5. [Parameters](#technology-configuration-parameters)
|
1. [Parameters](#technology-configuration-parameters)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Technology Directories
|
## Technology Directories
|
||||||
* Environment variable OPENRAM_TECH specifies list of technology directories
|
* Environment variable OPENRAM\_TECH specifies list of technology directories
|
||||||
* Similar to `*nix $PATH`
|
* Similar to `*nix $PATH`
|
||||||
* Directory structure:
|
* Directory structure:
|
||||||
```
|
```
|
||||||
|
|
@ -73,7 +73,7 @@ This page of the documentation explains the technology setup of OpenRAM.
|
||||||
|
|
||||||
|
|
||||||
## Technology Configuration: DRC
|
## Technology Configuration: DRC
|
||||||
* Creates the design_rule class with several parts:
|
* Creates the design\_rule class with several parts:
|
||||||
* Grid size
|
* Grid size
|
||||||
* Location of DRC, LVS, PEX rules and layer map
|
* Location of DRC, LVS, PEX rules and layer map
|
||||||
* Subset of design rules for FEOL and BEOL
|
* Subset of design rules for FEOL and BEOL
|
||||||
|
|
|
||||||
|
|
@ -65,7 +65,7 @@ OPENRAM_TMP=/openram/macros/$*/tmp
|
||||||
%.ok: configs/%.py
|
%.ok: configs/%.py
|
||||||
@echo "Building $*"
|
@echo "Building $*"
|
||||||
@mkdir -p $*
|
@mkdir -p $*
|
||||||
@$(DOCKER_CMD) python3 -u /openram/compiler/openram.py $(OPENRAM_OPTS) -o $* -p /openram/macros/$* /openram/macros/$< && touch $@
|
@$(DOCKER_CMD) python3 -u /openram/sram_compiler.py $(OPENRAM_OPTS) -o $* -p /openram/macros/$* /openram/macros/$< && touch $@
|
||||||
|
|
||||||
.DELETE_ON_ERROR: $(STAMPS)
|
.DELETE_ON_ERROR: $(STAMPS)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
OPENRAM_HOME := $(abspath $(TOP_DIR)/compiler)
|
OPENRAM_HOME := $(abspath $(TOP_DIR)/compiler)
|
||||||
OPENRAM_TECH := $(abspath $(TOP_DIR)/technology)
|
OPENRAM_TECH := $(abspath $(TOP_DIR)/technology)
|
||||||
OPENRAM_COMPILER := $(OPENRAM_HOME)/openram.py
|
OPENRAM_COMPILER := $(abspath $(TOP_DIR)/sram_compiler.py)
|
||||||
|
|
||||||
PDK_ROOT ?= $(TOP_DIR)
|
PDK_ROOT ?= $(TOP_DIR)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
|
[project]
|
||||||
|
name = "openram"
|
||||||
|
version = "1.2.0"
|
||||||
|
description = "An open-source static random access memory (SRAM) compiler"
|
||||||
|
authors = [
|
||||||
|
{ name="Matthew Guthaus", email="mrg@ucsc.edu" },
|
||||||
|
]
|
||||||
|
keywords = [ "sram", "magic", "gds", "netgen", "ngspice", "netlist" ]
|
||||||
|
readme = "README.md"
|
||||||
|
license = { text = "BSD-3-Clause License" }
|
||||||
|
requires-python = ">=3.6"
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
# See LICENSE for licensing information.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2016-2021 Regents of the University of California and The Board
|
||||||
|
# of Regents for the Oklahoma Agricultural and Mechanical College
|
||||||
|
# (acting for and on behalf of Oklahoma State University)
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
from setuptools import setup, find_namespace_packages
|
||||||
|
|
||||||
|
|
||||||
|
# Include these folder from the root of repo as submodules
|
||||||
|
include = ["compiler", "docker", "technology", "macros"]
|
||||||
|
# Exclude files/folders with these words
|
||||||
|
exclude = ["docs", "images"]
|
||||||
|
|
||||||
|
|
||||||
|
# Find all modules inside the 'compiler' folder
|
||||||
|
dirs = []
|
||||||
|
for dir in find_namespace_packages():
|
||||||
|
if any(x in dir for x in exclude):
|
||||||
|
continue
|
||||||
|
dirs.append(dir)
|
||||||
|
|
||||||
|
# Replace 'compiler' with 'openram' for package names
|
||||||
|
packages = []
|
||||||
|
for dir in dirs:
|
||||||
|
packages.append(dir)
|
||||||
|
|
||||||
|
# Make the included folders submodules of openram package
|
||||||
|
for i in range(len(packages)):
|
||||||
|
if any(x in packages[i] for x in include):
|
||||||
|
packages[i] = "openram." + packages[i]
|
||||||
|
|
||||||
|
# Fix directory paths
|
||||||
|
for i in range(len(dirs)):
|
||||||
|
dirs[i] = dirs[i].replace(".", "/")
|
||||||
|
|
||||||
|
# Insert the root as the openram module
|
||||||
|
packages.insert(0, "openram")
|
||||||
|
dirs.insert(0, "")
|
||||||
|
|
||||||
|
# Zip package names and their paths
|
||||||
|
package_dir = {k: v for k, v in zip(packages, dirs)}
|
||||||
|
|
||||||
|
|
||||||
|
# Create a list of required packages
|
||||||
|
with open("requirements.txt") as f:
|
||||||
|
reqs = f.read().splitlines()
|
||||||
|
|
||||||
|
|
||||||
|
# Call the setup to create the package
|
||||||
|
setup(
|
||||||
|
packages=packages,
|
||||||
|
package_dir=package_dir,
|
||||||
|
include_package_data=True,
|
||||||
|
install_requires=reqs,
|
||||||
|
)
|
||||||
|
|
@ -16,8 +16,13 @@ a LEF (.lef) file for preliminary P&R (real one should be from layout)
|
||||||
a Liberty (.lib) file for timing analysis/optimization
|
a Liberty (.lib) file for timing analysis/optimization
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
import sys
|
import sys
|
||||||
import datetime
|
import datetime
|
||||||
|
try:
|
||||||
|
import openram
|
||||||
|
except:
|
||||||
|
sys.path.append(os.getenv("OPENRAM_HOME"))
|
||||||
import globals as g
|
import globals as g
|
||||||
|
|
||||||
(OPTS, args) = g.parse_args()
|
(OPTS, args) = g.parse_args()
|
||||||
|
|
@ -1,3 +1,12 @@
|
||||||
|
# Check if the openram package is installed. If so, append that path to $OPENRAM_TECH.
|
||||||
|
# If $OPENRAM_TECH isn't defined and the package is installed, use the package directory.
|
||||||
|
set openramhome [exec echo -e "import os\ntry:\n import openram\n print(os.path.dirname(openram.__file__))\nexcept:\n print(\"notinstalled\")" | python3 -]
|
||||||
|
set openramtech "${openramhome}/technology/scn4m_subm/tech"
|
||||||
|
if { [info exists ::env(OPENRAM_TECH)] && ($openramhome != "notinstalled") } {
|
||||||
|
set ::env(OPENRAM_TECH) $env(OPENRAM_TECH):$openramtech
|
||||||
|
} elseif { $openramhome != "notinstalled" } {
|
||||||
|
set ::env(OPENRAM_TECH) $openramtech
|
||||||
|
}
|
||||||
set openram_paths [split $::env(OPENRAM_TECH) ":"]
|
set openram_paths [split $::env(OPENRAM_TECH) ":"]
|
||||||
foreach p $openram_paths {
|
foreach p $openram_paths {
|
||||||
path sys +$p/scn4m_subm/tech
|
path sys +$p/scn4m_subm/tech
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue