blob: d0d2519125907fe69dc665182f47f92f6cc654ea [file] [log] [blame]
# 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
o = sky130.tech.on_grid(_frm.boundary.center - _sram_bb.center)
layouter.place(_sram_lay, origin=o)
layout.boundary = _frm.boundary