| # 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 |