diff --git a/lambdalib/iolib/rtl/la_iocut.v b/lambdalib/iolib/rtl/la_iocut.v index 1630c2b..d4b26e6 100644 --- a/lambdalib/iolib/rtl/la_iocut.v +++ b/lambdalib/iolib/rtl/la_iocut.v @@ -16,9 +16,16 @@ module la_iocut ) ( // ground never cut - inout vss + inout vss, // core ground + // cut these + inout vdd0, // core supply from section before + inout vdd1, // core supply from next section + inout vddio0, // io supply from section before + inout vddio1, // io supply from next section + inout vssio0, // io ground from section before + inout vssio1, // io ground from next section + inout [RINGW-1:0] ioring0,// generic ioring interface from section before + inout [RINGW-1:0] ioring1 // generic ioring interface from next section ); - // TODO: interface? - endmodule diff --git a/lambdalib/padring/rtl/la_ioside.v b/lambdalib/padring/rtl/la_ioside.v index d0ded5a..2173e41 100644 --- a/lambdalib/padring/rtl/la_ioside.v +++ b/lambdalib/padring/rtl/la_ioside.v @@ -60,6 +60,8 @@ module la_ioside `include "la_iopadring.vh" genvar i; + integer next; + integer last; for (i = 0; i < NCELLS; i = i + 1) begin : ipad @@ -207,10 +209,56 @@ module la_ioside // LA_CUT if (CELLMAP[(i*40+16)+:8] == LA_CUT) begin : icut - la_iocut #(.SIDE (SIDE), - .PROP (CELLMAP[(i*40+32)+:8]), - .RINGW(RINGW)) - i0 (.vss(vss)); + last = i - 1; + next = i + 1; + if (last < 0 && next == NCELLS) + begin: icut_invalid + end + if (last < 0 && next <= NCELLS - 1) + begin: icut_start + la_iocut #(.SIDE(SIDE), + .PROP(CELLMAP[(i*40+32)+:8]), + .RINGW(RINGW)) + i0 (.vss(vss), + .vdd0(), + .vdd1(vdd[CELLMAP[(next*40+24)+:8]]), + .vddio0(), + .vddio1(vddio[CELLMAP[(next*40+24)+:8]]), + .vssio0(), + .vssio1(vssio[CELLMAP[(next*40+24)+:8]]), + .ioring0(), + .ioring1(ioring[CELLMAP[(next*40+24)+:8]*RINGW+:RINGW])); + end + if (last >= 0 && next <= NCELLS - 1) + begin: icut_middle + la_iocut #(.SIDE(SIDE), + .PROP(CELLMAP[(i*40+32)+:8]), + .RINGW(RINGW)) + i0 (.vss(vss), + .vdd0(vdd[CELLMAP[(last*40+24)+:8]]), + .vdd1(vdd[CELLMAP[(next*40+24)+:8]]), + .vddio0(vddio[CELLMAP[(last*40+24)+:8]]), + .vddio1(vddio[CELLMAP[(next*40+24)+:8]]), + .vssio0(vssio[CELLMAP[(last*40+24)+:8]]), + .vssio1(vssio[CELLMAP[(next*40+24)+:8]]), + .ioring0(ioring[CELLMAP[(last*40+24)+:8]*RINGW+:RINGW]), + .ioring1(ioring[CELLMAP[(next*40+24)+:8]*RINGW+:RINGW])); + end + if (last >= 0 && next == NCELLS) + begin: icut_end + la_iocut #(.SIDE(SIDE), + .PROP(CELLMAP[(i*40+32)+:8]), + .RINGW(RINGW)) + i0 (.vss(vss), + .vdd0(vdd[CELLMAP[(last*40+24)+:8]]), + .vdd1(), + .vddio0(vddio[CELLMAP[(last*40+24)+:8]]), + .vddio1(), + .vssio0(vssio[CELLMAP[(last*40+24)+:8]]), + .vssio1(), + .ioring0(ioring[CELLMAP[(last*40+24)+:8]*RINGW+:RINGW]), + .ioring1()); + end end // LA_VDDIO if (CELLMAP[(i*40+16)+:8] == LA_VDDIO)