diff --git a/src/glayout/primitives/resistor.py b/src/glayout/primitives/resistor.py index 2bcd85a5..84c52401 100644 --- a/src/glayout/primitives/resistor.py +++ b/src/glayout/primitives/resistor.py @@ -9,6 +9,54 @@ from gdsfactory.component import Component from gdsfactory.cell import cell from typing import Optional +from glayout import sky130 +from glayout.spice import Netlist + +def resistor_netlist( + pdk: MappedPDK, + width: float, + length: float, + num_series: int, + multipliers: int, +) -> Netlist: + + netlist = Netlist( + circuit_name="PMOS_RES", + nodes=["P", "N", "B"], + ) + + # Base PMOS subcircuit + pmos_unit = Netlist( + circuit_name="PMOS_UNIT", + nodes=["D", "G", "S", "B"], + source_netlist=""".subckt {circuit_name} D G S B +X1 D G S B {model} l={length} w={width} m={m} +.ends {circuit_name}""", + parameters={ + "model": pdk.models["pfet"], + "length": length, + "width": width, + "m": multipliers, + }, + ) + + prev = "P" + for i in range(num_series): + nxt = f"INT{i}" if i < num_series - 1 else "N" + + netlist.connect_netlist( + pmos_unit, + [ + ("D", prev), + ("G", prev), + ("S", nxt), + ("B", "B"), + ], + ) + + prev = nxt + + return netlist @cell def resistor( @@ -135,5 +183,43 @@ def resistor( toplvl.add_ports(pfet_references[0].get_ports_list(), prefix='port1_') toplvl.add_ports(pfet_references[-1].get_ports_list(), prefix='port2_') + + toplvl.info["netlist"] = resistor_netlist( + pdk=pdk, + width=width, + length=length, + num_series=num_series, + multipliers=multipliers, + ) - return toplvl \ No newline at end of file + return toplvl + +if __name__ == "__main__": + + # Create layout + res = resistor( + pdk=sky130, + width=5, + length=1, + num_series=3, + multipliers=2, + with_tie=True, + ) + + res.name = "PMOS_RES" + res.show() + + # Write GDS + res_gds = res.write_gds("PMOS_RES.gds") + print(f"GDS written to {res_gds}") + + # Run DRC + print("Running Magic DRC...") + drc_result = sky130.drc_magic(res, res.name) + print("DRC result:", drc_result) + + # Run LVS (AUTO netlist picked from component.info) + print("Running LVS...") + lvs_result = sky130.lvs_netgen(res, res.name) + + print("LVS result:", lvs_result)