From 944027bcfebe1e29d50fd40fb0bdead31b3e217e Mon Sep 17 00:00:00 2001 From: Peter Gadfort Date: Fri, 2 Aug 2024 13:35:53 -0400 Subject: [PATCH 1/4] add make_blackbox script to help --- .../sky130/libs/sky130io/lambda/la_ioanalog.v | 3 - pyproject.toml | 3 +- scripts/make_blackbox.py | 56 +++++++++++++++++++ 3 files changed, 58 insertions(+), 4 deletions(-) create mode 100755 scripts/make_blackbox.py diff --git a/lambdapdk/sky130/libs/sky130io/lambda/la_ioanalog.v b/lambdapdk/sky130/libs/sky130io/lambda/la_ioanalog.v index 4d3b7179..65bad680 100644 --- a/lambdapdk/sky130/libs/sky130io/lambda/la_ioanalog.v +++ b/lambdapdk/sky130/libs/sky130io/lambda/la_ioanalog.v @@ -33,9 +33,6 @@ module la_ioanalog #( assign aio[2] = pad; `else - tran t0 (pad, aio[0]); - tran t1 (pad, aio[1]); - tran t2 (pad, aio[2]); `endif endmodule diff --git a/pyproject.toml b/pyproject.toml index a6d2da63..d1679fa0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,8 @@ dev = [ "pytest == 8.3.2", "pytest-timeout == 2.3.1", "tclint == 0.3.2", - "lambdalib == 0.2.7" + "lambdalib == 0.2.7", + "sc-leflib == 0.3.0" ] [tool.tclint] diff --git a/scripts/make_blackbox.py b/scripts/make_blackbox.py new file mode 100755 index 00000000..f724bbe1 --- /dev/null +++ b/scripts/make_blackbox.py @@ -0,0 +1,56 @@ +#!/usr/bin/env python3 + +import sc_leflib +import argparse +import os + + +def get_cells(path): + lef = sc_leflib.parse(path) + + cells = {} + for cell, info in lef['macros'].items(): + cells[cell] = {} + multipins = {} + for pin in info['pins']: + if "[" in pin: + pin = pin[:pin.find("[")] + if pin not in multipins: + multipins[pin] = 0 + multipins[pin] += 1 + continue + + cells[cell][pin] = "inout" + + for pin, width in multipins.items(): + cells[cell][f"[{width-1}:0] {pin}"] = "inout" + + return cells + + +def write_blackbox(lef_file, filename): + with open(filename, 'w') as f: + f.write(f"// Source {os.path.relpath(lef_file, os.getcwd())}\n") + + for cell, pins in get_cells(lef_file).items(): + f.write("\n(* blackbox *)\n") + f.write(f"module {cell} (\n") + first_pin = True + for pin, direction in pins.items(): + if not first_pin: + f.write(",\n") + f.write(f" {direction} {pin}") + first_pin = False + f.write("\n);\n") + f.write("endmodule\n") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description='Create blackbox verilog model file from lef file') + parser.add_argument('--lef', required=True, help='Liberty file', metavar='') + parser.add_argument('--output', required=True, help='Output file', metavar='') + + args = parser.parse_args() + + write_blackbox(args.lef, args.output) From a471237c3b5074f62a3bc746acc00a43b140e0d0 Mon Sep 17 00:00:00 2001 From: Peter Gadfort Date: Fri, 2 Aug 2024 13:36:59 -0400 Subject: [PATCH 2/4] update sky130io lambdalib --- .../lambda/la_iopadring_config.vh | 9 + lambdapdk/sky130/libs/sky130io.py | 3 +- .../sky130/libs/sky130io/bb/sky130_ef_io.v | 624 ++++++++++++++++++ .../sky130/libs/sky130io/bb/sky130_fd_io.v | 451 +++++++++++++ .../libs/sky130io/bb/sky130_io.blackbox.v | 365 ---------- .../sky130/libs/sky130io/lambda/la_ioanalog.v | 37 +- .../sky130/libs/sky130io/lambda/la_iobidir.v | 126 ++-- .../sky130/libs/sky130io/lambda/la_ioclamp.v | 25 +- .../sky130/libs/sky130io/lambda/la_iocorner.v | 29 +- .../sky130/libs/sky130io/lambda/la_iocut.v | 2 + .../sky130/libs/sky130io/lambda/la_ioinput.v | 14 +- .../sky130io/lambda/la_iopadring_config.vh | 9 + .../sky130/libs/sky130io/lambda/la_iorxdiff.v | 26 + .../sky130/libs/sky130io/lambda/la_iotxdiff.v | 26 + .../sky130/libs/sky130io/lambda/la_iovdda.v | 15 + .../sky130/libs/sky130io/lambda/la_iovssa.v | 15 + 16 files changed, 1301 insertions(+), 475 deletions(-) create mode 100644 lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iopadring_config.vh create mode 100644 lambdapdk/sky130/libs/sky130io/bb/sky130_ef_io.v create mode 100644 lambdapdk/sky130/libs/sky130io/bb/sky130_fd_io.v delete mode 100644 lambdapdk/sky130/libs/sky130io/bb/sky130_io.blackbox.v create mode 100644 lambdapdk/sky130/libs/sky130io/lambda/la_iopadring_config.vh diff --git a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iopadring_config.vh b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iopadring_config.vh new file mode 100644 index 00000000..c041418f --- /dev/null +++ b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iopadring_config.vh @@ -0,0 +1,9 @@ +// Width of padring configuration bus with values +// such as drive strength. + +`define LA_PADRING_CFGW 6 + +// Width of ring bus with power, ground, vref signals usually +// connected by abutment in the padring. + +`define LA_PADRING_RINGW 3 diff --git a/lambdapdk/sky130/libs/sky130io.py b/lambdapdk/sky130/libs/sky130io.py index 7215e971..ec8827b3 100644 --- a/lambdapdk/sky130/libs/sky130io.py +++ b/lambdapdk/sky130/libs/sky130io.py @@ -35,7 +35,8 @@ def setup(chip): 'sky130_ef_io__com_bus_slice_10um', 'sky130_ef_io__com_bus_slice_20um']) - lib.set('output', 'blackbox', 'verilog', os.path.join(libdir, 'bb', 'sky130_io.blackbox.v')) + lib.set('output', 'blackbox', 'verilog', os.path.join(libdir, 'bb', 'sky130_ef_io.v')) + lib.add('output', 'blackbox', 'verilog', os.path.join(libdir, 'bb', 'sky130_fd_io.v')) lambda_lib = siliconcompiler.Library(chip, f'lambdalib_{libname}', package='lambdapdk') register_data_source(lambda_lib) diff --git a/lambdapdk/sky130/libs/sky130io/bb/sky130_ef_io.v b/lambdapdk/sky130/libs/sky130io/bb/sky130_ef_io.v new file mode 100644 index 00000000..c4bc5a71 --- /dev/null +++ b/lambdapdk/sky130/libs/sky130io/bb/sky130_ef_io.v @@ -0,0 +1,624 @@ +// Source lambdapdk/sky130/libs/sky130io/lef/sky130_ef_io.lef + +(* blackbox *) +module sky130_ef_io__analog_pad ( + inout P_CORE, + inout VSSA, + inout VSSD, + inout AMUXBUS_B, + inout AMUXBUS_A, + inout VDDIO_Q, + inout VDDIO, + inout VSWITCH, + inout VSSIO, + inout VDDA, + inout VCCD, + inout VCCHIB, + inout VSSIO_Q, + inout P_PAD +); +endmodule + +(* blackbox *) +module sky130_ef_io__bare_pad ( + inout PAD +); +endmodule + +(* blackbox *) +module sky130_ef_io__com_bus_slice_1um ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__com_bus_slice_5um ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__com_bus_slice_10um ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__com_bus_slice_20um ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__connect_vcchib_vccd_and_vswitch_vddio_slice_20um ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__corner_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__disconnect_vccd_slice_5um ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VSSIO, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__disconnect_vdda_slice_5um ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__gpiov2_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout ANALOG_EN, + inout ANALOG_POL, + inout ANALOG_SEL, + inout ENABLE_H, + inout ENABLE_INP_H, + inout ENABLE_VDDA_H, + inout ENABLE_VDDIO, + inout ENABLE_VSWITCH_H, + inout HLD_H_N, + inout HLD_OVR, + inout IB_MODE_SEL, + inout IN, + inout IN_H, + inout INP_DIS, + inout OE_N, + inout OUT, + inout PAD, + inout PAD_A_ESD_0_H, + inout PAD_A_ESD_1_H, + inout PAD_A_NOESD_H, + inout SLOW, + inout TIE_HI_ESD, + inout TIE_LO_ESD, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH, + inout VTRIP_SEL, + inout [2:0] DM +); +endmodule + +(* blackbox *) +module sky130_ef_io__gpiov2_pad_wrapped ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout ANALOG_EN, + inout ANALOG_POL, + inout ANALOG_SEL, + inout ENABLE_H, + inout ENABLE_INP_H, + inout ENABLE_VDDA_H, + inout ENABLE_VDDIO, + inout ENABLE_VSWITCH_H, + inout HLD_H_N, + inout HLD_OVR, + inout IB_MODE_SEL, + inout IN, + inout IN_H, + inout INP_DIS, + inout OE_N, + inout OUT, + inout PAD, + inout PAD_A_ESD_0_H, + inout PAD_A_ESD_1_H, + inout PAD_A_NOESD_H, + inout SLOW, + inout TIE_HI_ESD, + inout TIE_LO_ESD, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH, + inout VTRIP_SEL, + inout [2:0] DM +); +endmodule + +(* blackbox *) +module sky130_ef_io__vccd_hvc_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DRN_HVC, + inout SRC_BDY_HVC, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vccd_lvc_clamped2_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vccd_lvc_clamped_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vccd_lvc_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DRN_LVC1, + inout DRN_LVC2, + inout SRC_BDY_LVC1, + inout SRC_BDY_LVC2, + inout BDY2_B2B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vdda_hvc_clamped_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vdda_hvc_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DRN_HVC, + inout SRC_BDY_HVC, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vdda_lvc_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DRN_LVC1, + inout DRN_LVC2, + inout SRC_BDY_LVC1, + inout SRC_BDY_LVC2, + inout BDY2_B2B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vddio_hvc_clamped_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vddio_hvc_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DRN_HVC, + inout SRC_BDY_HVC, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vddio_lvc_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DRN_LVC1, + inout DRN_LVC2, + inout SRC_BDY_LVC1, + inout SRC_BDY_LVC2, + inout BDY2_B2B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vssa_hvc_clamped_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vssa_hvc_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DRN_HVC, + inout SRC_BDY_HVC, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vssa_lvc_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DRN_LVC1, + inout DRN_LVC2, + inout SRC_BDY_LVC1, + inout SRC_BDY_LVC2, + inout BDY2_B2B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vssd_hvc_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DRN_HVC, + inout SRC_BDY_HVC, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vssd_lvc_clamped2_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vssd_lvc_clamped_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vssd_lvc_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DRN_LVC1, + inout DRN_LVC2, + inout SRC_BDY_LVC1, + inout SRC_BDY_LVC2, + inout BDY2_B2B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vssio_hvc_clamped_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vssio_hvc_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DRN_HVC, + inout SRC_BDY_HVC, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule + +(* blackbox *) +module sky130_ef_io__vssio_lvc_pad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DRN_LVC1, + inout DRN_LVC2, + inout SRC_BDY_LVC1, + inout SRC_BDY_LVC2, + inout BDY2_B2B, + inout VSSA, + inout VDDA, + inout VSWITCH, + inout VDDIO_Q, + inout VCCHIB, + inout VDDIO, + inout VCCD, + inout VSSIO, + inout VSSD, + inout VSSIO_Q +); +endmodule diff --git a/lambdapdk/sky130/libs/sky130io/bb/sky130_fd_io.v b/lambdapdk/sky130/libs/sky130io/bb/sky130_fd_io.v new file mode 100644 index 00000000..297d3f4d --- /dev/null +++ b/lambdapdk/sky130/libs/sky130io/bb/sky130_fd_io.v @@ -0,0 +1,451 @@ +// Source lambdapdk/sky130/libs/sky130io/lef/sky130_fd_io.lef + +(* blackbox *) +module sky130_fd_io__overlay_vssd_lvc ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__overlay_vdda_hvc ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__overlay_vccd_hvc ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__corner_bus_overlay ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__top_ground_lvc_wpad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout G_PAD, + inout BDY2_B2B, + inout DRN_LVC1, + inout DRN_LVC2, + inout G_CORE, + inout OGC_LVC, + inout SRC_BDY_LVC1, + inout SRC_BDY_LVC2, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__overlay_vssa_hvc ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__top_power_hvc_wpadv2 ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DRN_HVC, + inout OGC_HVC, + inout P_CORE, + inout P_PAD, + inout SRC_BDY_HVC, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__overlay_vccd_lvc ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__overlay_vssa_lvc ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__overlay_gpiov2 ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout PAD, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__overlay_vssio_lvc ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__overlay_vssio_hvc ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__overlay_vddio_lvc ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__top_power_lvc_wpad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout P_PAD, + inout BDY2_B2B, + inout DRN_LVC1, + inout DRN_LVC2, + inout OGC_LVC, + inout P_CORE, + inout SRC_BDY_LVC1, + inout SRC_BDY_LVC2, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__overlay_vddio_hvc ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__top_xres4v2 ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout DISABLE_PULLUP_H, + inout ENABLE_H, + inout ENABLE_VDDIO, + inout EN_VDDIO_SIG_H, + inout FILT_IN_H, + inout INP_SEL_H, + inout PAD, + inout PAD_A_ESD_H, + inout PULLUP_H, + inout TIE_HI_ESD, + inout TIE_LO_ESD, + inout TIE_WEAK_HI_H, + inout XRES_H_N, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__top_gpio_ovtv2 ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout ANALOG_EN, + inout ANALOG_POL, + inout ANALOG_SEL, + inout ENABLE_H, + inout ENABLE_INP_H, + inout ENABLE_VDDA_H, + inout ENABLE_VDDIO, + inout ENABLE_VSWITCH_H, + inout HLD_H_N, + inout HLD_OVR, + inout HYS_TRIM, + inout IN, + inout INP_DIS, + inout IN_H, + inout OE_N, + inout OUT, + inout PAD, + inout PAD_A_ESD_0_H, + inout PAD_A_ESD_1_H, + inout PAD_A_NOESD_H, + inout SLOW, + inout TIE_HI_ESD, + inout TIE_LO_ESD, + inout VINREF, + inout VTRIP_SEL, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH, + inout [2:0] DM, + inout [1:0] IB_MODE_SEL, + inout [1:0] SLEW_CTL +); +endmodule + +(* blackbox *) +module sky130_fd_io__overlay_vdda_lvc ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__overlay_vssd_hvc ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule + +(* blackbox *) +module sky130_fd_io__top_gpiov2 ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout ANALOG_EN, + inout ANALOG_POL, + inout ANALOG_SEL, + inout ENABLE_H, + inout ENABLE_INP_H, + inout ENABLE_VDDA_H, + inout ENABLE_VDDIO, + inout ENABLE_VSWITCH_H, + inout HLD_H_N, + inout HLD_OVR, + inout IB_MODE_SEL, + inout IN, + inout INP_DIS, + inout IN_H, + inout OE_N, + inout OUT, + inout PAD, + inout PAD_A_ESD_0_H, + inout PAD_A_ESD_1_H, + inout PAD_A_NOESD_H, + inout SLOW, + inout TIE_HI_ESD, + inout TIE_LO_ESD, + inout VTRIP_SEL, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH, + inout [2:0] DM +); +endmodule + +(* blackbox *) +module sky130_fd_io__top_ground_hvc_wpad ( + inout AMUXBUS_A, + inout AMUXBUS_B, + inout G_PAD, + inout DRN_HVC, + inout G_CORE, + inout OGC_HVC, + inout SRC_BDY_HVC, + inout VCCD, + inout VCCHIB, + inout VDDA, + inout VDDIO, + inout VDDIO_Q, + inout VSSA, + inout VSSD, + inout VSSIO, + inout VSSIO_Q, + inout VSWITCH +); +endmodule diff --git a/lambdapdk/sky130/libs/sky130io/bb/sky130_io.blackbox.v b/lambdapdk/sky130/libs/sky130io/bb/sky130_io.blackbox.v deleted file mode 100644 index e9e9ff04..00000000 --- a/lambdapdk/sky130/libs/sky130io/bb/sky130_io.blackbox.v +++ /dev/null @@ -1,365 +0,0 @@ -module sky130_ef_io__gpiov2_pad (IN_H, PAD_A_NOESD_H, PAD_A_ESD_0_H, PAD_A_ESD_1_H, - PAD, DM, HLD_H_N, IN, INP_DIS, IB_MODE_SEL, ENABLE_H, ENABLE_VDDA_H, - ENABLE_INP_H, OE_N, TIE_HI_ESD, TIE_LO_ESD, SLOW, VTRIP_SEL, HLD_OVR, - ANALOG_EN, ANALOG_SEL, ENABLE_VDDIO, ENABLE_VSWITCH_H, ANALOG_POL, OUT, - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -input OUT; -input OE_N; -input HLD_H_N; -input ENABLE_H; -input ENABLE_INP_H; -input ENABLE_VDDA_H; -input ENABLE_VSWITCH_H; -input ENABLE_VDDIO; -input INP_DIS; -input IB_MODE_SEL; -input VTRIP_SEL; -input SLOW; -input HLD_OVR; -input ANALOG_EN; -input ANALOG_SEL; -input ANALOG_POL; -input [2:0] DM; - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout PAD; -inout PAD_A_NOESD_H,PAD_A_ESD_0_H,PAD_A_ESD_1_H; -inout AMUXBUS_A; -inout AMUXBUS_B; - -output IN; -output IN_H; -output TIE_HI_ESD, TIE_LO_ESD; -endmodule - -module sky130_ef_io__gpiov2_pad_wrapped (IN_H, PAD_A_NOESD_H, PAD_A_ESD_0_H, PAD_A_ESD_1_H, - PAD, DM, HLD_H_N, IN, INP_DIS, IB_MODE_SEL, ENABLE_H, ENABLE_VDDA_H, - ENABLE_INP_H, OE_N, TIE_HI_ESD, TIE_LO_ESD, SLOW, VTRIP_SEL, HLD_OVR, - ANALOG_EN, ANALOG_SEL, ENABLE_VDDIO, ENABLE_VSWITCH_H, ANALOG_POL, OUT, - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -input OUT; -input OE_N; -input HLD_H_N; -input ENABLE_H; -input ENABLE_INP_H; -input ENABLE_VDDA_H; -input ENABLE_VSWITCH_H; -input ENABLE_VDDIO; -input INP_DIS; -input IB_MODE_SEL; -input VTRIP_SEL; -input SLOW; -input HLD_OVR; -input ANALOG_EN; -input ANALOG_SEL; -input ANALOG_POL; -input [2:0] DM; - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout PAD; -inout PAD_A_NOESD_H,PAD_A_ESD_0_H,PAD_A_ESD_1_H; -inout AMUXBUS_A; -inout AMUXBUS_B; - -output IN; -output IN_H; -output TIE_HI_ESD, TIE_LO_ESD; -endmodule - -module sky130_ef_io__vccd_hvc_pad ( - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout AMUXBUS_A; -inout AMUXBUS_B; - -endmodule - -module sky130_ef_io__vccd_lvc_pad ( - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout AMUXBUS_A; -inout AMUXBUS_B; - -endmodule - -module sky130_ef_io__vssd_hvc_pad ( - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout AMUXBUS_A; -inout AMUXBUS_B; - -endmodule - -module sky130_ef_io__vssd_lvc_pad ( - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout AMUXBUS_A; -inout AMUXBUS_B; - -endmodule - -module sky130_ef_io__vddio_hvc_pad ( - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout AMUXBUS_A; -inout AMUXBUS_B; - -endmodule - -module sky130_ef_io__vddio_lvc_pad ( - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout AMUXBUS_A; -inout AMUXBUS_B; - -endmodule - -module sky130_ef_io__vssio_hvc_pad ( - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout AMUXBUS_A; -inout AMUXBUS_B; - -endmodule - -module sky130_ef_io__vssio_lvc_pad ( - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout AMUXBUS_A; -inout AMUXBUS_B; - -endmodule - -module sky130_ef_io__vdda_hvc_pad ( - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout AMUXBUS_A; -inout AMUXBUS_B; - -endmodule - -module sky130_ef_io__vdda_lvc_pad ( - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout AMUXBUS_A; -inout AMUXBUS_B; - -endmodule - -module sky130_ef_io__vssa_hvc_pad ( - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout AMUXBUS_A; -inout AMUXBUS_B; - -endmodule - -module sky130_ef_io__vssa_lvc_pad ( - AMUXBUS_A, AMUXBUS_B, VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q - ); - -inout VDDIO; -inout VDDIO_Q; -inout VDDA; -inout VCCD; -inout VSWITCH; -inout VCCHIB; -inout VSSA; -inout VSSD; -inout VSSIO_Q; -inout VSSIO; - -inout AMUXBUS_A; -inout AMUXBUS_B; - -endmodule - -module sky130_ef_io__corner_pad (AMUXBUS_A, AMUXBUS_B, - VSSA, VDDA, VSWITCH, VDDIO_Q, VCCHIB, VDDIO, VCCD, - VSSIO, VSSD, VSSIO_Q -); - inout AMUXBUS_A; - inout AMUXBUS_B; - - inout VDDIO; - inout VDDIO_Q; - inout VDDA; - inout VCCD; - inout VSWITCH; - inout VCCHIB; - inout VSSA; - inout VSSD; - inout VSSIO_Q; - inout VSSIO; - -endmodule diff --git a/lambdapdk/sky130/libs/sky130io/lambda/la_ioanalog.v b/lambdapdk/sky130/libs/sky130io/lambda/la_ioanalog.v index 65bad680..2f2faea0 100644 --- a/lambdapdk/sky130/libs/sky130io/lambda/la_ioanalog.v +++ b/lambdapdk/sky130/libs/sky130io/lambda/la_ioanalog.v @@ -15,24 +15,33 @@ module la_ioanalog #( parameter SIDE = "NO", // "NO", "SO", "EA", "WE" parameter RINGW = 8 // width of io ring ) ( // io pad signals - inout pad, // bidirectional pad signal - inout vdd, // core supply - inout vss, // core ground - inout vddio, // io supply - inout vssio, // io ground - inout [RINGW-1:0] ioring, // generic io-ring interface + inout pad, // bidirectional pad signal + inout vdd, // core supply + inout vss, // core ground + inout vddio, // io supply + inout vssio, // io ground + inout [RINGW-1:0] ioring, // generic ioring // core interface - inout [ 2:0] aio // analog core signal + inout [2:0] aio // analog core signals ); + sky130_ef_io__analog_pad i0 ( + .VDDIO(vddio), + .VCCD(vdd), + .VSSD(vss), + .VSSIO(vssio), + .VDDIO_Q(ioring[0]), + .VSWITCH(ioring[1]), + .VCCHIB(ioring[2]), + .VSSIO_Q(ioring[3]), + .AMUXBUS_A(ioring[4]), + .AMUXBUS_B(ioring[5]), + .VDDA(ioring[6]), + .VSSA(ioring[7]), -`ifdef VERILATOR - // TODO!: input only for verilator bases simulation - assign aio[0] = pad; - assign aio[1] = pad; - assign aio[2] = pad; + .P_PAD(pad), + .P_CORE(aio[0]) + ); -`else -`endif endmodule diff --git a/lambdapdk/sky130/libs/sky130io/lambda/la_iobidir.v b/lambdapdk/sky130/libs/sky130io/lambda/la_iobidir.v index 3bca9456..9b7c50eb 100644 --- a/lambdapdk/sky130/libs/sky130io/lambda/la_iobidir.v +++ b/lambdapdk/sky130/libs/sky130io/lambda/la_iobidir.v @@ -6,85 +6,63 @@ module la_iobidir parameter RINGW = 8 // width of io ring ) (// io pad signals - inout pad, // bidirectional pad signal - inout vdd, // core supply - inout vss, // core ground - inout vddio, // io supply - inout vssio, // io ground + inout pad, // bidirectional pad signal + inout vdd, // core supply + inout vss, // core ground + inout vddio, // io supply + inout vssio, // io ground // core facing signals - input a, // input from core - output z, // output to core - input ie, // input enable, 1 = active - input oe, // output enable, 1 = active - input pe, // weak pull enable, 1 = active - input ps,// pull select, 1 = pull-up, 0 = pull-down - input sr, // slewrate enable 1 = fast, 0 = slow - input [2:0] ds, // drive strength, 3'b0 = weakest - input st, // schmitt trigger, 1 = enable - inout [RINGW-1:0] ioring, // generic io-ring interface - input [CFGW-1:0] cfg // generic config interface inout [RINGW-1:0] ioring, + input a, // input from core + output z, // output to core + input ie, // input enable, 1 = active + input oe, // output enable, 1 = active + inout [RINGW-1:0] ioring, // generic io ring + input [CFGW-1:0] cfg // generic config interface ); - // TODO: hook up IO buffer config - //# 0 = pull_enable (1=enable) - //# 1 = pull_select (1=pull up) - //# 2 = slew limiter - //# 3 = shmitt trigger enable - //# 4 = ds[0] - //# 5 = ds[1] - //# 6 = ds[2] - //# 7 = ds[3] + sky130_ef_io__gpiov2_pad_wrapped + gpio ( + .VDDIO(vddio), + .VCCD(vdd), + .VSSD(vss), + .VSSIO(vssio), + .VDDIO_Q(ioring[0]), + .VSWITCH(ioring[1]), + .VCCHIB(ioring[2]), + .VSSIO_Q(ioring[3]), + .AMUXBUS_A(ioring[4]), + .AMUXBUS_B(ioring[5]), + .VDDA(ioring[6]), + .VSSA(ioring[7]), - // TODO: should do something with poc signal? maybe this has to do with - // power-on ramp pins such as enable_h + .IN(z), + .OUT(a), + .OE_N(~oe), + .INP_DIS(ie), // disable input when ie low + .PAD(pad), - // TODO: might need to use "tielo"/"tiehi" signals for some of these instead of - // 0/1 constants -- see https://github.com/The-OpenROAD-Project/OpenROAD-flow-scripts/blob/master/flow/designs/sky130hd/coyote_tc/ios.v + .HLD_H_N(cfg[0]), // if 0, hold outputs at current state + .ENABLE_H(cfg[1]), // if 0, hold outputs at hi-z (used on power-up) + .ENABLE_INP_H(cfg[2]), // val doesn't matter when enable_h = 1 + .ENABLE_VDDA_H(cfg[3]), + .ENABLE_VSWITCH_H(cfg[4]), + .ENABLE_VDDIO(cfg[5]), + .IB_MODE_SEL(cfg[6]), // use vddio based threshold + .VTRIP_SEL(cfg[7]), // use cmos threshold + .SLOW(cfg[8]), + .HLD_OVR(cfg[9]), // don't care when hld_h_n = 1 + .ANALOG_EN(cfg[10]), // disable analog functionality + .ANALOG_SEL(cfg[11]), // don't care + .ANALOG_POL(cfg[12]), // don't care + .DM(cfg[15:13]), // strong pull-up, strong pull-down - sky130_ef_io__gpiov2_pad_wrapped - gpio ( - .IN(z), - .OUT(a), - .OE_N(oe), - .INP_DIS(ie), // disable input when ie low - .PAD(pad), - .HLD_H_N(cfg[0]), // if 0, hold outputs at current state - .ENABLE_H(cfg[1]), // if 0, hold outputs at hi-z (used on power-up) - .ENABLE_INP_H(cfg[2]), // val doesn't matter when enable_h = 1 - .ENABLE_VDDA_H(cfg[3]), - .ENABLE_VSWITCH_H(cfg[4]), - .ENABLE_VDDIO(cfg[5]), - .IB_MODE_SEL(cfg[6]), // use vddio based threshold - .VTRIP_SEL(cfg[7]), // use cmos threshold - .SLOW(cfg[8]), - .HLD_OVR(cfg[9]), // don't care when hld_h_n = 1 - .ANALOG_EN(cfg[10]), // disable analog functionality - .ANALOG_SEL(cfg[11]), // don't care - .ANALOG_POL(cfg[12]), // don't care - .DM(cfg[15:13]), // strong pull-up, strong pull-down - .VDDIO(vddio), - .VDDIO_Q(ioring[0]), // level-shift reference for high-voltage output - .VDDA(ioring[6]), - .VCCD(vdd), // core supply as level-shift reference - .VSWITCH(ioring[1]), // not sure what this is for, but seems like vdda = vddio - .VCCHIB(ioring[2]), - .VSSA(ioring[7]), - .VSSD(vss), - .VSSIO_Q(ioring[3]), - .VSSIO(vssio), - // Direction connection from pad to core (unused) - .PAD_A_NOESD_H(), - .PAD_A_ESD_0_H(), - .PAD_A_ESD_1_H(), - // Analog stuff (unused) - .AMUXBUS_A(ioring[4]), - .AMUXBUS_B(ioring[5]), - // not sure what this output does, so leave disconnected - .IN_H(), - // these are used to control enable_inp_h, but we don't care about its val - // so leave disconnected - .TIE_HI_ESD(), - .TIE_LO_ESD() - ); + // unused + .PAD_A_NOESD_H(), + .PAD_A_ESD_0_H(), + .PAD_A_ESD_1_H(), + .IN_H(), + .TIE_HI_ESD(), + .TIE_LO_ESD() + ); endmodule diff --git a/lambdapdk/sky130/libs/sky130io/lambda/la_ioclamp.v b/lambdapdk/sky130/libs/sky130io/lambda/la_ioclamp.v index 54f2828e..62ae361a 100644 --- a/lambdapdk/sky130/libs/sky130io/lambda/la_ioclamp.v +++ b/lambdapdk/sky130/libs/sky130io/lambda/la_ioclamp.v @@ -11,11 +11,26 @@ module la_ioclamp #( parameter SIDE = "NO", // "NO", "SO", "EA", "WE" parameter RINGW = 8 // width of io ring ) ( // io pad signals - inout vdd, // core supply - inout vss, // core ground - inout vddio, // io supply - inout vssio, // io ground - inout [RINGW-1:0] ioring // generic io-ring interface + inout vdd, // core supply + inout vss, // core ground + inout vddio, // io supply + inout vssio, // io ground + inout [RINGW-1:0] ioring // generic io ring interface +); + +sky130_ef_io__vddio_hvc_clamped_pad clamp ( + .VDDIO(vddio), + .VCCD(vdd), + .VSSD(vss), + .VSSIO(vssio), + .VDDIO_Q(ioring[0]), + .VSWITCH(ioring[1]), + .VCCHIB(ioring[2]), + .VSSIO_Q(ioring[3]), + .AMUXBUS_A(ioring[4]), + .AMUXBUS_B(ioring[5]), + .VDDA(ioring[6]), + .VSSA(ioring[7]) ); endmodule diff --git a/lambdapdk/sky130/libs/sky130io/lambda/la_iocorner.v b/lambdapdk/sky130/libs/sky130io/lambda/la_iocorner.v index cda2b34d..e0d665e8 100644 --- a/lambdapdk/sky130/libs/sky130io/lambda/la_iocorner.v +++ b/lambdapdk/sky130/libs/sky130io/lambda/la_iocorner.v @@ -11,19 +11,20 @@ module la_iocorner inout [RINGW-1:0] ioring // generic io-ring interface ); - sky130_ef_io__corner_pad - corner ( - .VDDIO(vddio), - .VDDIO_Q(ioring[0]), - .VDDA(ioring[6]), - .VCCD(vdd), - .VSWITCH(ioring[1]), - .VCCHIB(ioring[2]), - .VSSA(ioring[7]), - .VSSD(vss), - .VSSIO_Q(ioring[3]), - .VSSIO(vssio), - .AMUXBUS_A(ioring[4]), - .AMUXBUS_B(ioring[5])); + sky130_ef_io__corner_pad + corner ( + .VDDIO(vddio), + .VCCD(vdd), + .VSSD(vss), + .VSSIO(vssio), + .VDDIO_Q(ioring[0]), + .VSWITCH(ioring[1]), + .VCCHIB(ioring[2]), + .VSSIO_Q(ioring[3]), + .AMUXBUS_A(ioring[4]), + .AMUXBUS_B(ioring[5]), + .VDDA(ioring[6]), + .VSSA(ioring[7]) + ); endmodule diff --git a/lambdapdk/sky130/libs/sky130io/lambda/la_iocut.v b/lambdapdk/sky130/libs/sky130io/lambda/la_iocut.v index ba3ea9c6..552725c4 100644 --- a/lambdapdk/sky130/libs/sky130io/lambda/la_iocut.v +++ b/lambdapdk/sky130/libs/sky130io/lambda/la_iocut.v @@ -19,4 +19,6 @@ module la_iocut inout [RINGW-1:0] ioringr // left ioring ); + // TODO: figure out this cut + endmodule diff --git a/lambdapdk/sky130/libs/sky130io/lambda/la_ioinput.v b/lambdapdk/sky130/libs/sky130io/lambda/la_ioinput.v index e6cdf2ef..6d099cee 100644 --- a/lambdapdk/sky130/libs/sky130io/lambda/la_ioinput.v +++ b/lambdapdk/sky130/libs/sky130io/lambda/la_ioinput.v @@ -32,7 +32,17 @@ module la_ioinput #( input [ CFGW-1:0] cfg // generic config interface ); - // to core - assign z = ie ? pad : 1'b0; + la_iobidir #(.PROP(PROP), .SIDE(SIDE), .CFGW(CFGW), .RINGW(RINGW)) i0 ( + .pad(pad), + .vdd(vdd), + .vss(vss), + .vddio(vddio), + .vssio(vssio), + .z(z), + .ie(ie), + .oe(1'b0), + .ioring(ioring), + .cfg(cfg) + ); endmodule diff --git a/lambdapdk/sky130/libs/sky130io/lambda/la_iopadring_config.vh b/lambdapdk/sky130/libs/sky130io/lambda/la_iopadring_config.vh new file mode 100644 index 00000000..74278cec --- /dev/null +++ b/lambdapdk/sky130/libs/sky130io/lambda/la_iopadring_config.vh @@ -0,0 +1,9 @@ +// Width of padring configuration bus with values +// such as drive strength. + +`define LA_PADRING_CFGW n + +// Width of ring bus with power, ground, vref signals usually +// connected by abutment in the padring. + +`define LA_PADRING_RINGW 8 diff --git a/lambdapdk/sky130/libs/sky130io/lambda/la_iorxdiff.v b/lambdapdk/sky130/libs/sky130io/lambda/la_iorxdiff.v index f94e9a2e..a75d69a1 100644 --- a/lambdapdk/sky130/libs/sky130io/lambda/la_iorxdiff.v +++ b/lambdapdk/sky130/libs/sky130io/lambda/la_iorxdiff.v @@ -30,4 +30,30 @@ module la_iorxdiff input [CFGW-1:0] cfg // generic config interface ); + la_iobidir #(.PROP(PROP), .SIDE(SIDE), .CFGW(CFGW), .RINGW(RINGW)) ip ( + .pad(padp), + .vdd(vdd), + .vss(vss), + .vddio(vddio), + .vssio(vssio), + .z(zp), + .ie(ie), + .oe(1'b0), + .ioring(ioring), + .cfg(cfg) + ); + + la_iobidir #(.PROP(PROP), .SIDE(SIDE), .CFGW(CFGW), .RINGW(RINGW)) in ( + .pad(padn), + .vdd(vdd), + .vss(vss), + .vddio(vddio), + .vssio(vssio), + .z(zn), + .ie(ie), + .oe(1'b0), + .ioring(ioring), + .cfg(cfg) + ); + endmodule diff --git a/lambdapdk/sky130/libs/sky130io/lambda/la_iotxdiff.v b/lambdapdk/sky130/libs/sky130io/lambda/la_iotxdiff.v index 7645b4b8..78ce68e9 100644 --- a/lambdapdk/sky130/libs/sky130io/lambda/la_iotxdiff.v +++ b/lambdapdk/sky130/libs/sky130io/lambda/la_iotxdiff.v @@ -29,4 +29,30 @@ module la_iotxdiff input [CFGW-1:0] cfg // generic config interface ); + la_iobidir #(.PROP(PROP), .SIDE(SIDE), .CFGW(CFGW), .RINGW(RINGW)) ip ( + .pad(padp), + .vdd(vdd), + .vss(vss), + .vddio(vddio), + .vssio(vssio), + .a(a), + .ie(1'b0), + .oe(oe), + .ioring(ioring), + .cfg(cfg) + ); + + la_iobidir #(.PROP(PROP), .SIDE(SIDE), .CFGW(CFGW), .RINGW(RINGW)) in ( + .pad(padn), + .vdd(vdd), + .vss(vss), + .vddio(vddio), + .vssio(vssio), + .a(~a), + .ie(1'b0), + .oe(oe), + .ioring(ioring), + .cfg(cfg) + ); + endmodule diff --git a/lambdapdk/sky130/libs/sky130io/lambda/la_iovdda.v b/lambdapdk/sky130/libs/sky130io/lambda/la_iovdda.v index a94ec321..ace2701c 100644 --- a/lambdapdk/sky130/libs/sky130io/lambda/la_iovdda.v +++ b/lambdapdk/sky130/libs/sky130io/lambda/la_iovdda.v @@ -19,4 +19,19 @@ module la_iovdda #( inout [RINGW-1:0] ioring // generic io-ring interface ); + sky130_ef_io__vdda_hvc_pad + iovdd ( + .VDDIO(vddio), + .VDDIO_Q(ioring[0]), + .VDDA(ioring[6]), + .VCCD(vdd), + .VSWITCH(ioring[1]), + .VCCHIB(ioring[2]), + .VSSA(ioring[7]), + .VSSD(vss), + .VSSIO_Q(ioring[3]), + .VSSIO(vssio), + .AMUXBUS_A(ioring[4]), + .AMUXBUS_B(ioring[5])); + endmodule diff --git a/lambdapdk/sky130/libs/sky130io/lambda/la_iovssa.v b/lambdapdk/sky130/libs/sky130io/lambda/la_iovssa.v index 530a917f..859dd57d 100644 --- a/lambdapdk/sky130/libs/sky130io/lambda/la_iovssa.v +++ b/lambdapdk/sky130/libs/sky130io/lambda/la_iovssa.v @@ -19,4 +19,19 @@ module la_iovssa #( inout [RINGW-1:0] ioring // generic io-ring interface ); + sky130_ef_io__vssa_hvc_pad + iovssio ( + .VDDIO(vddio), + .VDDIO_Q(ioring[0]), + .VDDA(ioring[6]), + .VCCD(vdd), + .VSWITCH(ioring[1]), + .VCCHIB(ioring[2]), + .VSSA(ioring[7]), + .VSSD(vss), + .VSSIO_Q(ioring[3]), + .VSSIO(vssio), + .AMUXBUS_A(ioring[4]), + .AMUXBUS_B(ioring[5])); + endmodule From 77645607d33a05e5e2c8f56594a17a9bc22e81c9 Mon Sep 17 00:00:00 2001 From: Peter Gadfort Date: Fri, 2 Aug 2024 13:46:22 -0400 Subject: [PATCH 3/4] rename to blackbox --- lambdapdk/sky130/libs/sky130io.py | 4 ++-- .../sky130/libs/sky130io/{bb => blackbox}/sky130_ef_io.v | 0 .../sky130/libs/sky130io/{bb => blackbox}/sky130_fd_io.v | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename lambdapdk/sky130/libs/sky130io/{bb => blackbox}/sky130_ef_io.v (100%) rename lambdapdk/sky130/libs/sky130io/{bb => blackbox}/sky130_fd_io.v (100%) diff --git a/lambdapdk/sky130/libs/sky130io.py b/lambdapdk/sky130/libs/sky130io.py index ec8827b3..0295944c 100644 --- a/lambdapdk/sky130/libs/sky130io.py +++ b/lambdapdk/sky130/libs/sky130io.py @@ -35,8 +35,8 @@ def setup(chip): 'sky130_ef_io__com_bus_slice_10um', 'sky130_ef_io__com_bus_slice_20um']) - lib.set('output', 'blackbox', 'verilog', os.path.join(libdir, 'bb', 'sky130_ef_io.v')) - lib.add('output', 'blackbox', 'verilog', os.path.join(libdir, 'bb', 'sky130_fd_io.v')) + lib.set('output', 'blackbox', 'verilog', os.path.join(libdir, 'blackbox', 'sky130_ef_io.v')) + lib.add('output', 'blackbox', 'verilog', os.path.join(libdir, 'blackbox', 'sky130_fd_io.v')) lambda_lib = siliconcompiler.Library(chip, f'lambdalib_{libname}', package='lambdapdk') register_data_source(lambda_lib) diff --git a/lambdapdk/sky130/libs/sky130io/bb/sky130_ef_io.v b/lambdapdk/sky130/libs/sky130io/blackbox/sky130_ef_io.v similarity index 100% rename from lambdapdk/sky130/libs/sky130io/bb/sky130_ef_io.v rename to lambdapdk/sky130/libs/sky130io/blackbox/sky130_ef_io.v diff --git a/lambdapdk/sky130/libs/sky130io/bb/sky130_fd_io.v b/lambdapdk/sky130/libs/sky130io/blackbox/sky130_fd_io.v similarity index 100% rename from lambdapdk/sky130/libs/sky130io/bb/sky130_fd_io.v rename to lambdapdk/sky130/libs/sky130io/blackbox/sky130_fd_io.v From 2ad0ebdfcd7629c6390548628c79a450701bff55 Mon Sep 17 00:00:00 2001 From: Peter Gadfort Date: Fri, 2 Aug 2024 13:46:54 -0400 Subject: [PATCH 4/4] update gf180 lambda iolib --- lambdapdk/gf180/libs/gf180io.py | 4 + .../gf180/libs/gf180mcu_fd_io/blackbox/3LM.v | 148 ++++++++++++++++++ .../gf180/libs/gf180mcu_fd_io/blackbox/4LM.v | 148 ++++++++++++++++++ .../gf180/libs/gf180mcu_fd_io/blackbox/5LM.v | 148 ++++++++++++++++++ .../libs/gf180mcu_fd_io/lambda/la_ioanalog.v | 2 +- .../libs/gf180mcu_fd_io/lambda/la_iobidir.v | 29 ++-- .../libs/gf180mcu_fd_io/lambda/la_ioinput.v | 12 +- .../lambda/la_iopadring_config.vh | 2 +- .../libs/gf180mcu_fd_io/lambda/la_iorxdiff.v | 26 +++ .../libs/gf180mcu_fd_io/lambda/la_iotxdiff.v | 26 +++ .../libs/gf180mcu_fd_io/lambda/la_iovdda.v | 5 + .../libs/gf180mcu_fd_io/lambda/la_iovssa.v | 5 + 12 files changed, 534 insertions(+), 21 deletions(-) create mode 100644 lambdapdk/gf180/libs/gf180mcu_fd_io/blackbox/3LM.v create mode 100644 lambdapdk/gf180/libs/gf180mcu_fd_io/blackbox/4LM.v create mode 100644 lambdapdk/gf180/libs/gf180mcu_fd_io/blackbox/5LM.v diff --git a/lambdapdk/gf180/libs/gf180io.py b/lambdapdk/gf180/libs/gf180io.py index d3cfd1dc..036bc6bc 100644 --- a/lambdapdk/gf180/libs/gf180io.py +++ b/lambdapdk/gf180/libs/gf180io.py @@ -52,6 +52,10 @@ def setup(chip): 'gf180mcu_fd_io__fill5', 'gf180mcu_fd_io__fill10', 'gf180mcu_fd_io__fillnc']) + + lib.set('output', 'blackbox', 'verilog', + os.path.join(libdir, 'blackbox', f'{stackup_start}.v')) + libs.append(lib) lambda_lib = siliconcompiler.Library(chip, 'lambdalib_gf180mcu_fd_io', package='lambdapdk') diff --git a/lambdapdk/gf180/libs/gf180mcu_fd_io/blackbox/3LM.v b/lambdapdk/gf180/libs/gf180mcu_fd_io/blackbox/3LM.v new file mode 100644 index 00000000..ceaf7d75 --- /dev/null +++ b/lambdapdk/gf180/libs/gf180mcu_fd_io/blackbox/3LM.v @@ -0,0 +1,148 @@ +// Source lambdapdk/gf180/libs/gf180mcu_fd_io/lef/3LM/gf180mcu_fd_io.lef + +(* blackbox *) +module gf180mcu_fd_io__asig_5p0 ( + inout ASIG5V, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__bi_24t ( + inout PAD, + inout A, + inout CS, + inout IE, + inout OE, + inout PD, + inout PU, + inout SL, + inout Y, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__bi_t ( + inout PAD, + inout A, + inout CS, + inout IE, + inout OE, + inout PD, + inout PDRV0, + inout PDRV1, + inout PU, + inout SL, + inout Y, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__brk2 ( + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__brk5 ( + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__cor ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__dvdd ( + inout DVDD, + inout DVSS, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__dvss ( + inout DVSS, + inout DVDD, + inout VDD +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__fill1 ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__fill5 ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__fill10 ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__fillnc ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__in_c ( + inout PAD, + inout PD, + inout PU, + inout Y, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__in_s ( + inout PAD, + inout PD, + inout PU, + inout Y, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule diff --git a/lambdapdk/gf180/libs/gf180mcu_fd_io/blackbox/4LM.v b/lambdapdk/gf180/libs/gf180mcu_fd_io/blackbox/4LM.v new file mode 100644 index 00000000..9f6a29f1 --- /dev/null +++ b/lambdapdk/gf180/libs/gf180mcu_fd_io/blackbox/4LM.v @@ -0,0 +1,148 @@ +// Source lambdapdk/gf180/libs/gf180mcu_fd_io/lef/4LM/gf180mcu_fd_io.lef + +(* blackbox *) +module gf180mcu_fd_io__asig_5p0 ( + inout ASIG5V, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__bi_24t ( + inout PAD, + inout A, + inout CS, + inout IE, + inout OE, + inout PD, + inout PU, + inout SL, + inout Y, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__bi_t ( + inout PAD, + inout A, + inout CS, + inout IE, + inout OE, + inout PD, + inout PDRV0, + inout PDRV1, + inout PU, + inout SL, + inout Y, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__brk2 ( + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__brk5 ( + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__cor ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__dvdd ( + inout DVDD, + inout DVSS, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__dvss ( + inout DVSS, + inout DVDD, + inout VDD +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__fill1 ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__fill5 ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__fill10 ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__fillnc ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__in_c ( + inout PAD, + inout PD, + inout PU, + inout Y, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__in_s ( + inout PAD, + inout PD, + inout PU, + inout Y, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule diff --git a/lambdapdk/gf180/libs/gf180mcu_fd_io/blackbox/5LM.v b/lambdapdk/gf180/libs/gf180mcu_fd_io/blackbox/5LM.v new file mode 100644 index 00000000..85a70221 --- /dev/null +++ b/lambdapdk/gf180/libs/gf180mcu_fd_io/blackbox/5LM.v @@ -0,0 +1,148 @@ +// Source lambdapdk/gf180/libs/gf180mcu_fd_io/lef/5LM/gf180mcu_fd_io.lef + +(* blackbox *) +module gf180mcu_fd_io__asig_5p0 ( + inout ASIG5V, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__bi_24t ( + inout PAD, + inout A, + inout CS, + inout IE, + inout OE, + inout PD, + inout PU, + inout SL, + inout Y, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__bi_t ( + inout PAD, + inout A, + inout CS, + inout IE, + inout OE, + inout PD, + inout PDRV0, + inout PDRV1, + inout PU, + inout SL, + inout Y, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__brk2 ( + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__brk5 ( + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__cor ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__dvdd ( + inout DVDD, + inout DVSS, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__dvss ( + inout DVSS, + inout DVDD, + inout VDD +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__fill1 ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__fill5 ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__fill10 ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__fillnc ( + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__in_c ( + inout PAD, + inout PD, + inout PU, + inout Y, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule + +(* blackbox *) +module gf180mcu_fd_io__in_s ( + inout PAD, + inout PD, + inout PU, + inout Y, + inout DVDD, + inout DVSS, + inout VDD, + inout VSS +); +endmodule diff --git a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_ioanalog.v b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_ioanalog.v index 5da58877..2b9cdfee 100644 --- a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_ioanalog.v +++ b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_ioanalog.v @@ -16,7 +16,7 @@ module la_ioanalog ); gf180mcu_fd_io__asig_5p0 - ioanalog (.ASIG5V(pad), + ioanalog (.ASIG5V(aio[0]), .DVDD(vddio), .DVSS(vssio), .VDD(vdd), diff --git a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iobidir.v b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iobidir.v index 62e9a0a9..7c6140c9 100644 --- a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iobidir.v +++ b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iobidir.v @@ -12,17 +12,12 @@ module la_iobidir inout vddio, // io supply inout vssio, // io ground // core facing signals - input a, // input from core - output z, // output to core - input ie, // input enable, 1 = active - input oe, // output enable, 1 = active - input pe, // weak pull enable, 1 = active - input ps,// pull select, 1 = pull-up, 0 = pull-down - input sr, // slewrate enable 1 = fast, 0 = slow - input [2:0] ds, // drive strength, 3'b0 = weakest - input st, // schmitt trigger, 1 = enable - inout [RINGW-1:0] ioring, // generic io-ring interface - input [CFGW-1:0] cfg // generic config interface + input a, // input from core + output z, // output to core + input ie, // input enable, 1 = active + input oe, // output enable, 1 = active + inout [RINGW-1:0] ioring, // generic io ring + input [CFGW-1:0] cfg // generic config interface ); //TODO: implement cell type (with and without drive) @@ -39,12 +34,12 @@ module la_iobidir .Y(z), .IE(ie), .OE(oe), - .CS(st), - .PDRV0(ds[0]), - .PDRV1(ds[1]), - .PD(ioring[0]), - .PU(ioring[1]), - .SL(ioring[2]), + .CS(cfg[2]), + .PDRV0(cfg[0]), + .PDRV1(cfg[1]), + .PD(cfg[3]), + .PU(cfg[4]), + .SL(cfg[5]), .DVDD(vddio), .DVSS(vssio), .VDD(vdd), diff --git a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_ioinput.v b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_ioinput.v index e6cdf2ef..010bdd82 100644 --- a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_ioinput.v +++ b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_ioinput.v @@ -32,7 +32,15 @@ module la_ioinput #( input [ CFGW-1:0] cfg // generic config interface ); - // to core - assign z = ie ? pad : 1'b0; + gf180mcu_fd_io__in_s i0 ( + .PAD(pad), + .Y(z), + .PD(cfg[3]), + .PU(cfg[4]), + .DVDD(vddio), + .DVSS(vssio), + .VDD(vdd), + .VSS(vss)); + ); endmodule diff --git a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iopadring_config.vh b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iopadring_config.vh index c041418f..d4e3dcd1 100644 --- a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iopadring_config.vh +++ b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iopadring_config.vh @@ -6,4 +6,4 @@ // Width of ring bus with power, ground, vref signals usually // connected by abutment in the padring. -`define LA_PADRING_RINGW 3 +`define LA_PADRING_RINGW 0 diff --git a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iorxdiff.v b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iorxdiff.v index f94e9a2e..a75d69a1 100644 --- a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iorxdiff.v +++ b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iorxdiff.v @@ -30,4 +30,30 @@ module la_iorxdiff input [CFGW-1:0] cfg // generic config interface ); + la_iobidir #(.PROP(PROP), .SIDE(SIDE), .CFGW(CFGW), .RINGW(RINGW)) ip ( + .pad(padp), + .vdd(vdd), + .vss(vss), + .vddio(vddio), + .vssio(vssio), + .z(zp), + .ie(ie), + .oe(1'b0), + .ioring(ioring), + .cfg(cfg) + ); + + la_iobidir #(.PROP(PROP), .SIDE(SIDE), .CFGW(CFGW), .RINGW(RINGW)) in ( + .pad(padn), + .vdd(vdd), + .vss(vss), + .vddio(vddio), + .vssio(vssio), + .z(zn), + .ie(ie), + .oe(1'b0), + .ioring(ioring), + .cfg(cfg) + ); + endmodule diff --git a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iotxdiff.v b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iotxdiff.v index 7645b4b8..78ce68e9 100644 --- a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iotxdiff.v +++ b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iotxdiff.v @@ -29,4 +29,30 @@ module la_iotxdiff input [CFGW-1:0] cfg // generic config interface ); + la_iobidir #(.PROP(PROP), .SIDE(SIDE), .CFGW(CFGW), .RINGW(RINGW)) ip ( + .pad(padp), + .vdd(vdd), + .vss(vss), + .vddio(vddio), + .vssio(vssio), + .a(a), + .ie(1'b0), + .oe(oe), + .ioring(ioring), + .cfg(cfg) + ); + + la_iobidir #(.PROP(PROP), .SIDE(SIDE), .CFGW(CFGW), .RINGW(RINGW)) in ( + .pad(padn), + .vdd(vdd), + .vss(vss), + .vddio(vddio), + .vssio(vssio), + .a(~a), + .ie(1'b0), + .oe(oe), + .ioring(ioring), + .cfg(cfg) + ); + endmodule diff --git a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iovdda.v b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iovdda.v index a94ec321..0dd920a4 100644 --- a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iovdda.v +++ b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iovdda.v @@ -19,4 +19,9 @@ module la_iovdda #( inout [RINGW-1:0] ioring // generic io-ring interface ); + gf180mcu_fd_io__dvdd + iovdd (.DVDD(vddio), + .DVSS(vssio), + .VSS(vss)); + endmodule diff --git a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iovssa.v b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iovssa.v index 530a917f..1008433d 100644 --- a/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iovssa.v +++ b/lambdapdk/gf180/libs/gf180mcu_fd_io/lambda/la_iovssa.v @@ -19,4 +19,9 @@ module la_iovssa #( inout [RINGW-1:0] ioring // generic io-ring interface ); + gf180mcu_fd_io__dvdd + iovdd (.DVDD(vddio), + .DVSS(vssio), + .VSS(vss)); + endmodule