First version with unconnected SRAM block
diff --git a/doitcode/generate.py b/doitcode/generate.py index 05075ea..4c677a4 100644 --- a/doitcode/generate.py +++ b/doitcode/generate.py
@@ -2,18 +2,19 @@ # PDKMaster & co. don't put a license requirement on the generated files. # The generated gds files in this project are released under the LGPL 2.0 or later license. from pathlib import Path -from typing import Dict, Any, cast +from typing import Any, cast import pya as _pya # Disable type checking pya = cast(Any, _pya) +from pdkmaster.technology import geometry as _geo from pdkmaster.design import library as _lib from pdkmaster.io.klayout import export as _klexp from c4m.pdk import sky130 -from . import frame as _frm +from . import frame as _frm, sram as _ram __all__ = ["gen_gds"] @@ -64,6 +65,11 @@ ckt = top.new_circuit() layouter = top.new_circuitlayouter() + # Add the SRAM + sram_cell = _ram.ConnectedSRAM(lib=lib) + sram_inst = ckt.instantiate(sram_cell, name="sramtop") + layouter.place(sram_inst, origin=_geo.origin) + # Add circuit and layouter.layout.boundary = _frm.boundary
diff --git a/doitcode/sram.py b/doitcode/sram.py new file mode 100644 index 0000000..83dd44f --- /dev/null +++ b/doitcode/sram.py
@@ -0,0 +1,63 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +from pdkmaster.design import circuit as _ckt, library as _lbry + +from c4m.pdk import sky130 + +from . import frame as _frm + + +__all__ = ["ConnectedSRAM"] + + +class _io_spec: + def __init__(self, *, io_number: int, sram_signal: str): + self.io_number = io_number + self.sram_signal = sram_signal + + +io_specs = ( + _io_spec(sram_signal="a[8]", io_number=14), + _io_spec(sram_signal="a[7]", io_number=15), + _io_spec(sram_signal="a[6]", io_number=16), + _io_spec(sram_signal="a[5]", io_number=17), + _io_spec(sram_signal="a[4]", io_number=18), + _io_spec(sram_signal="a[3]", io_number=19), + _io_spec(sram_signal="a[2]", io_number=20), + _io_spec(sram_signal="a[1]", io_number=21), + _io_spec(sram_signal="a[0]", io_number=22), +) +io_sig2spec = { + spec.sram_signal: spec + for spec in io_specs +} + +class ConnectedSRAM(_lbry._OnDemandCell[_lbry.Library]): + def __init__(self, *, lib: _lbry.Library): + super().__init__(lib=lib, name="ConnectedSRAM") + + def _create_circuit(self): + stdcells = sky130.stdcelllib.cells + + mem_factory = sky130.Sky130SP6TFactory(lib=self.lib) + + sram_cell = mem_factory.block(words=512, word_size=8, we_size=1) + + ckt = self.new_circuit() + + ckt.instantiate(sram_cell, name="sram") + + def _create_layout(self): + ckt = self.circuit + nets = ckt.nets + insts = ckt.instances + + layouter = self.new_circuitlayouter() + layout = layouter.layout + + _sram_lay = layouter.inst_layout(inst=insts.sram) + _sram_bb = _sram_lay.boundary + assert _sram_bb is not None + + layouter.place(_sram_lay, origin=(_frm.boundary.center - _sram_bb.center)) + + layout.boundary = _frm.boundary
diff --git a/gds/user_analog_project_wrapper.gds.gz b/gds/user_analog_project_wrapper.gds.gz index f4c3333..87aa811 100644 --- a/gds/user_analog_project_wrapper.gds.gz +++ b/gds/user_analog_project_wrapper.gds.gz Binary files differ