RTimothyEdwards / magic

Magic VLSI Layout Tool
Other
447 stars 100 forks source link

Missing Ports in Extracted Spice #286

Open d-m-bailey opened 5 months ago

d-m-bailey commented 5 months ago

Using magic version 8.3.456

When extracting user_analog_project_wrapper of sky130 mpw-7 slot-013, some of the power ports do not appear in the top level of the final netlist.

Ports in the final netlist vssd1, vssd2, vccd2.

No shorts are reported. The ext file has all expected 8 ports.

$ grep port ext/HG_user_analog_project_wrapper.ext | grep '"v'
port "vssa1" 515 582340 136830 584800 141630 m3
port "vssa1" 515 582340 146830 584800 151630 m3
port "vssd2" 584 0 162888 1660 167688 m3
port "vssd2" 584 0 172888 1660 177688 m3
port "vssd1" 645 582340 181430 584800 186230 m3
port "vssd1" 645 582340 191430 584800 196230 m3
port "vdda2" 590 0 204888 1660 209688 m3
port "vdda2" 590 0 214888 1660 219688 m3
port "vdda1" 498 582340 225230 584800 230030 m3
port "vdda1" 498 582340 235230 584800 240030 m3
port "vdda1" 498 582340 540562 584800 545362 m3
port "vdda1" 498 582340 550562 584800 555362 m3
port "vssa2" 566 0 549442 1660 554242 m3
port "vssa2" 566 0 559442 1660 564242 m3
port "vccd1" 506 582340 629784 584800 634584 m3
port "vccd2" 560 0 633842 1660 638642 m3
port "vccd1" 506 582340 639784 584800 644584 m3
port "vccd2" 560 0 643842 1660 648642 m3
port "vssa1" 515 520594 702340 525394 704800 m3
port "vssa1" 515 510594 702340 515394 704800 m3

These ports maybe unconnected, but they still should show up in the final netlist, right?

To duplicate, download test-ext2spice.tgz

$ tar xzf test-ext2spice.tgz
$ cd test-ext2spice
$ ./run_extract

This uses a slightly modified version 1.0.446-0-gdd7771c of the sky130B.tech file

Final spice netlist will be at ext/HG_user_analog_project_wrapper.gds.spice.

RTimothyEdwards commented 5 months ago

I see all eight power supplies in the pin list for the top level cell in the layout-extracted .spice file. What I don't see is any connections to the subcircuits. The HG_KV_top.ext file contains no connection information to either the core or interconnect subcircuits.

d-m-bailey commented 5 months ago

@RTimothyEdwards Thanks for the quick response.

This is the top level subckt that I get. Is it the same for you?

If you're using a different setup to extract, could you share that?

.subckt HG_user_analog_project_wrapper wbs_adr_i[10] wbs_dat_i[8] wbs_dat_i[4] wbs_dat_i[11]
+ wbs_dat_i[6] wbs_dat_i[16] wbs_dat_i[1] wbs_sel_i[2] wbs_dat_o[8] wbs_dat_o[13]
+ wbs_dat_o[14] wbs_dat_i[3] wbs_dat_i[10] wbs_dat_i[2] wbs_dat_i[0] wbs_dat_i[12]
+ wbs_adr_i[13] wbs_dat_i[9] wb_rst_i wbs_adr_i[12] wbs_adr_i[0] wbs_dat_o[7] wbs_dat_i[15]
+ wbs_ack_o wbs_adr_i[4] wbs_dat_o[15] wbs_dat_i[14] wbs_adr_i[16] wbs_stb_i wbs_dat_o[0]
+ wbs_adr_i[7] wbs_adr_i[1] wbs_dat_o[3] wbs_adr_i[17] wb_clk_i wbs_cyc_i wbs_dat_o[12]
+ wbs_adr_i[8] wbs_adr_i[11] wbs_dat_i[7] wbs_dat_o[5] wbs_dat_o[9] wbs_dat_o[11]
+ wbs_dat_i[5] wbs_sel_i[1] wbs_sel_i[3] wbs_sel_i[0] wbs_adr_i[9] wbs_adr_i[5] wbs_adr_i[15]
+ wbs_dat_o[6] wbs_adr_i[3] wbs_adr_i[14] wbs_dat_i[13] wbs_dat_o[2] wbs_dat_o[4]
+ wbs_dat_o[1] wbs_dat_o[10] wbs_dat_o[16] wbs_adr_i[2] wbs_adr_i[6] wbs_we_i la_data_in[5]
+ wbs_dat_o[25] wbs_adr_i[20] wbs_dat_o[27] wbs_dat_o[31] la_data_in[2] la_data_out[2]
+ wbs_adr_i[31] wbs_adr_i[18] la_data_in[1] la_data_in[4] la_data_in[3] wbs_adr_i[29]
+ la_oenb[0] wbs_dat_o[20] wbs_dat_i[17] wbs_dat_i[31] wbs_dat_o[26] wbs_dat_i[19]
+ la_data_out[3] wbs_dat_i[18] la_oenb[1] la_oenb[5] wbs_adr_i[26] wbs_dat_o[23] wbs_dat_i[24]
+ la_oenb[4] wbs_adr_i[19] wbs_dat_i[30] wbs_dat_o[24] wbs_adr_i[21] wbs_dat_o[21]
+ wbs_dat_i[27] wbs_adr_i[22] wbs_adr_i[23] la_data_out[0] wbs_dat_i[20] wbs_dat_o[17]
+ wbs_dat_o[18] wbs_dat_o[19] wbs_dat_o[29] wbs_dat_i[22] wbs_dat_i[21] la_oenb[3]
+ wbs_adr_i[30] wbs_adr_i[28] la_data_out[5] wbs_dat_o[30] wbs_adr_i[25] wbs_dat_i[28]
+ wbs_dat_i[25] wbs_dat_o[22] wbs_dat_o[28] wbs_dat_i[23] la_data_out[4] la_data_out[1]
+ wbs_dat_i[26] wbs_dat_i[29] la_oenb[2] wbs_adr_i[24] la_data_in[0] wbs_adr_i[27]
+ la_data_out[25] la_data_out[20] la_data_out[7] la_data_in[19] la_oenb[6] la_data_in[12]
+ la_data_in[11] la_oenb[9] la_data_out[22] la_oenb[14] la_data_out[19] la_oenb[25]
+ la_data_in[17] la_oenb[15] la_oenb[13] la_data_in[23] la_data_out[17] la_data_in[20]
+ la_data_in[24] la_data_out[16] la_data_in[16] la_oenb[23] la_oenb[20] la_data_out[21]
+ la_data_out[8] la_data_in[13] la_data_out[15] la_data_in[6] la_data_out[11] la_data_out[10]
+ la_data_in[9] la_data_in[8] la_oenb[17] la_data_in[7] la_oenb[8] la_data_in[26]
+ la_oenb[7] la_oenb[16] la_data_in[25] la_oenb[24] la_oenb[21] la_oenb[22] la_data_out[24]
+ la_data_in[14] la_data_out[23] la_data_out[13] la_data_out[6] la_oenb[10] la_data_in[15]
+ la_data_out[18] la_oenb[18] la_data_out[9] la_oenb[11] la_data_in[18] la_oenb[19]
+ la_data_in[21] la_data_out[14] la_oenb[12] la_data_in[22] la_data_in[10] la_data_out[12]
+ la_data_out[42] la_data_out[45] la_data_out[46] la_data_in[43] la_data_in[44] la_data_in[46]
+ la_oenb[38] la_oenb[37] la_oenb[40] la_data_in[31] la_data_out[30] la_oenb[41] la_oenb[42]
+ la_oenb[43] la_data_in[27] la_data_in[28] la_oenb[44] la_data_in[30] la_data_in[32]
+ la_data_in[35] la_data_in[34] la_data_in[39] la_oenb[26] la_oenb[28] la_data_out[43]
+ la_oenb[30] la_oenb[31] la_data_out[40] la_oenb[32] la_data_in[37] la_oenb[39] la_oenb[33]
+ la_oenb[34] la_oenb[35] la_data_in[41] la_oenb[36] la_data_out[29] la_data_out[33]
+ la_data_out[44] la_oenb[45] la_oenb[29] la_data_out[34] la_data_in[45] la_data_out[37]
+ la_oenb[46] la_data_in[29] la_data_out[31] la_data_out[32] la_data_in[40] la_data_in[38]
+ la_data_out[39] la_data_out[26] la_data_out[35] la_data_out[41] la_data_in[42] la_data_out[36]
+ la_data_out[38] la_data_in[33] la_oenb[27] la_data_out[27] la_data_out[28] la_data_in[36]
+ la_data_out[54] la_data_in[58] la_oenb[66] la_data_out[63] la_oenb[61] la_data_out[51]
+ la_oenb[50] la_data_out[64] la_data_in[55] la_data_in[64] la_data_out[55] la_data_in[65]
+ la_oenb[59] la_data_out[67] la_data_in[60] la_data_in[48] la_data_out[59] la_oenb[63]
+ la_data_out[50] la_data_out[49] la_data_in[63] la_data_in[62] la_data_in[51] la_oenb[47]
+ la_oenb[48] la_oenb[49] la_oenb[51] la_oenb[52] la_oenb[60] la_oenb[53] la_data_in[53]
+ la_oenb[55] la_oenb[54] la_data_in[66] la_oenb[58] la_oenb[62] la_oenb[64] la_oenb[65]
+ la_data_in[47] la_data_in[49] la_data_in[54] la_data_in[50] la_data_in[61] la_data_in[52]
+ la_data_out[53] la_data_in[56] la_data_in[57] la_data_in[59] la_data_out[47] la_data_out[56]
+ la_oenb[56] la_data_out[57] la_data_out[52] la_data_out[58] la_data_out[60] la_data_out[61]
+ la_data_out[62] la_data_out[65] la_data_out[48] la_data_out[66] la_data_in[67] la_oenb[57]
+ la_data_out[84] la_data_in[82] la_data_out[78] la_data_in[68] la_oenb[70] la_oenb[78]
+ la_data_out[68] la_oenb[83] la_oenb[81] la_oenb[72] la_data_out[70] la_data_out[69]
+ la_data_in[83] la_oenb[80] la_data_out[85] la_data_out[86] la_data_out[82] la_oenb[87]
+ la_oenb[76] la_oenb[67] la_data_in[72] la_data_out[79] la_data_out[83] la_data_out[74]
+ la_data_in[71] la_oenb[73] la_data_out[87] la_data_in[73] la_data_in[75] la_data_out[80]
+ la_oenb[69] la_data_in[77] la_data_in[74] la_data_in[78] la_data_in[79] la_data_in[81]
+ la_data_in[84] la_data_in[85] la_data_in[86] la_data_in[87] la_data_in[69] la_oenb[68]
+ la_oenb[71] la_oenb[74] la_oenb[75] la_oenb[77] la_oenb[84] la_oenb[85] la_oenb[86]
+ la_data_in[70] la_data_out[71] la_data_out[72] la_data_out[73] la_data_out[75] la_oenb[82]
+ la_data_out[76] la_data_out[77] la_data_out[81] la_data_in[76] la_oenb[79] la_data_in[80]
+ la_oenb[95] la_data_in[105] la_data_out[96] la_data_out[92] la_data_in[97] la_oenb[101]
+ la_data_in[91] la_data_in[88] la_data_in[101] la_data_out[95] la_oenb[89] la_oenb[91]
+ la_data_out[91] la_data_out[89] la_data_out[105] la_data_out[88] la_oenb[88] la_oenb[105]
+ la_data_in[89] la_oenb[93] la_oenb[107] la_oenb[103] la_data_out[98] la_oenb[106]
+ la_data_out[90] la_oenb[104] la_oenb[102] la_data_in[103] la_data_in[95] la_oenb[99]
+ la_data_out[97] la_data_out[108] la_data_out[107] la_data_in[104] la_data_in[107]
+ la_data_out[100] la_data_out[94] la_oenb[100] la_data_in[92] la_data_out[99] la_data_out[106]
+ la_oenb[90] la_oenb[92] la_oenb[94] la_oenb[96] la_oenb[97] la_oenb[98] la_data_in[102]
+ la_data_in[106] la_data_in[108] la_data_in[100] la_data_in[90] la_data_in[93] la_data_in[94]
+ la_data_in[96] la_data_in[98] la_data_in[99] la_data_out[102] la_data_out[101] la_data_out[103]
+ la_data_out[104] la_data_out[93] la_data_out[119] la_data_out[125] user_clock2 la_data_in[115]
+ user_irq[2] la_data_out[117] la_data_in[123] la_data_out[124] la_data_out[115] la_oenb[126]
+ la_data_out[120] la_data_out[114] la_data_in[126] la_data_out[111] user_irq[1] la_oenb[123]
+ la_data_out[123] la_data_in[116] la_data_out[116] la_data_out[122] la_data_out[126]
+ la_data_out[127] la_data_out[109] la_oenb[114] la_oenb[110] la_data_in[111] la_oenb[118]
+ la_oenb[117] la_data_out[121] la_data_out[118] la_data_in[127] user_irq[0] la_data_in[125]
+ la_oenb[127] la_data_in[119] la_data_in[112] la_oenb[111] la_data_in[121] la_data_out[113]
+ la_data_in[120] la_data_in[122] la_data_in[110] la_data_out[110] la_oenb[124] la_oenb[113]
+ la_oenb[116] la_oenb[120] la_oenb[112] la_data_in[109] la_oenb[122] la_data_in[113]
+ la_data_out[112] la_oenb[125] la_data_in[114] la_data_in[124] la_oenb[115] la_oenb[109]
+ la_data_in[118] la_oenb[121] la_oenb[108] la_data_in[117] la_oenb[119] io_analog[1]
+ gpio_analog[2] io_clamp_high[0] io_out[13] io_out[12] io_oeb[13] io_oeb[9] io_out[10]
+ io_in_3v3[9] io_in_3v3[10] vccd2 io_oeb[10] io_in_3v3[12] gpio_noesd[4] io_in_3v3[11]
+ io_analog[2] io_out[9] gpio_analog[6] io_in[13] io_analog[3] gpio_analog[4] gpio_noesd[2]
+ io_oeb[11] gpio_analog[5] io_in[10] gpio_analog[3] io_in_3v3[13] io_analog[0] io_in[9]
+ io_out[11] io_in[11] io_in[12] gpio_noesd[10] io_oeb[12] gpio_noesd[6] io_analog[8]
+ io_in_3v3[15] io_out[14] gpio_analog[10] io_oeb[14] io_analog[9] io_in[17] gpio_analog[9]
+ io_analog[10] io_analog[7] io_in[16] io_in_3v3[16] io_oeb[15] io_oeb[16] io_oeb[17]
+ gpio_noesd[0] io_out[16] io_clamp_low[2] io_in_3v3[17] io_in_3v3[14] gpio_analog[7]
+ io_out[17] gpio_analog[8] io_in[15] io_in[14] io_analog[5] io_out[15] io_out[18]
+ gpio_noesd[15] gpio_noesd[13] io_in[26] gpio_analog[17] io_in[24] io_in[23] io_in_3v3[23]
+ gpio_analog[14] io_in[22] io_oeb[26] io_in[18] io_out[22] vssd2 io_in_3v3[21] io_oeb[23]
+ io_oeb[21] io_oeb[24] io_in_3v3[25] gpio_analog[13] io_in_3v3[26] io_in_3v3[19]
+ io_oeb[20] io_in_3v3[18] gpio_noesd[17] io_in_3v3[20] gpio_noesd[12] gpio_noesd[16]
+ io_out[26] gpio_analog[15] gpio_analog[12] io_out[25] io_out[24] io_in[20] gpio_noesd[11]
+ io_out[23] io_in[25] io_in_3v3[24] gpio_analog[16] gpio_analog[11] io_out[21] io_oeb[18]
+ io_in[19] io_out[20] io_in[21] io_out[19] io_oeb[19] io_in_3v3[22] io_oeb[22] io_oeb[25]
+ io_out[6] io_out[5] io_in_3v3[0] io_oeb[1] io_in[7] io_in[1] io_oeb[3] io_in_3v3[1]
+ io_oeb[7] io_in[5] io_oeb[6] io_in[3] io_out[8] gpio_noesd[14] io_in[2] io_in_3v3[6]
+ io_oeb[0] io_in[0] io_in[6] io_in_3v3[8] io_out[2] io_in_3v3[5] vssd1 io_in[8] io_out[3]
+ io_out[4] io_out[1] io_out[7] io_in_3v3[7] io_oeb[8] io_in_3v3[2] io_in_3v3[3] io_oeb[4]
+ gpio_analog[0] io_in[4] io_oeb[5] io_out[0] io_oeb[2] io_in_3v3[4] gpio_analog[1]
XHG_KV_top_0 la_data_in[30] la_data_in[29] la_data_in[28] la_data_in[27] la_data_in[17]
+ la_data_in[18] la_data_in[23] la_data_in[19] la_data_in[20] la_data_in[31] la_data_in[21]
+ la_data_in[25] la_data_in[22] la_data_in[24] la_data_in[26] la_data_in[68] la_data_out[97]
+ la_data_in[67] la_data_out[102] la_data_in[66] la_data_out[98] la_data_in[65] la_data_in[63]
+ la_data_in[9] la_data_out[99] la_data_in[62] la_data_in[64] la_data_in[8] la_data_out[100]
+ la_data_in[80] la_data_in[81] la_data_in[61] la_data_in[7] la_data_out[101] la_data_in[60]
+ la_data_in[6] la_data_in[59] la_data_in[5] la_data_in[4] la_data_in[58] la_data_in[118]
+ la_data_in[41] la_data_in[3] gpio_analog[17] la_data_in[119] la_data_in[40] la_data_in[57]
+ la_data_in[2] la_data_in[120] la_data_in[39] la_data_in[56] la_data_in[1] la_data_in[38]
+ la_data_in[55] la_data_in[0] la_data_in[37] la_data_in[54] la_data_in[82] la_data_in[16]
+ la_data_in[36] la_data_in[53] gpio_analog[2] la_data_in[35] la_data_in[52] la_data_in[34]
+ la_data_in[51] gpio_analog[16] la_data_in[33] la_data_in[50] la_data_in[32] la_data_in[49]
+ la_data_in[48] la_data_in[47] la_data_in[46] la_data_in[45] la_data_in[44] la_data_in[103]
+ la_data_in[15] la_data_in[43] la_data_in[104] gpio_noesd[6] la_data_in[14] la_data_in[42]
+ la_data_in[105] la_data_in[13] la_data_in[79] la_data_in[78] la_data_in[12] la_data_in[112]
+ la_data_in[11] la_data_in[77] la_data_in[76] la_data_in[10] io_analog[5] gpio_noesd[0]
+ la_data_in[75] gpio_noesd[14] la_data_in[74] la_data_in[73] vccd2 la_data_in[72]
+ la_data_in[71] gpio_noesd[10] la_data_in[70] la_data_in[69] io_clamp_low[2] io_clamp_high[0]
+ HG_KV_top
.ends
RTimothyEdwards commented 5 months ago

@d-m-bailey : No, I got something completely different. And all I did was to use your "run_extract" as stated. Your output looks "more correct" in the sense that there are proper connections from "KV_top" to the wrapper. My KV_top had only a few ports and they were all disconnected from the wrapper. Yet the wrapper had all ports. I think if I could get it into the state you got above, then I could figure out why the other power ports go missing.

d-m-bailey commented 5 months ago

Is the magic version the same? 8.3.456

Does the top of the ext.log file look like this?

BEGIN: Mon Jan  8 02:49:26 2024
Extracting as analog. Top ports connected by name.

Magic 8.3 revision 456 - Compiled on Sat Jan  6 13:53:23 PST 2024.
Starting magic under Tcl interpreter
Using the terminal as the console.
Using NULL graphics device.
Processing system .magicrc file
Sourcing design magicrc.well for technology sky130B ...
2 Magic internal units = 1 Lambda
Input style sky130(): scaleFactor=2, multiplier=2
The following types are not handled by extraction and will be treated as non-electrical types:
    ubm
Scaled tech values by 2 / 1 to match internal grid scaling
Loading "gds.analog.spice.tcl" from command line.
Extracting with top ports connected by name (analog)
CIF input style is now "sky130()"
Flattening {*sky130_fd_pr__*[A-Z]*} *1T1R_backup *1T1R_end *mimcap_stacked *1T1R_2x2_backup *1T1R_2x2_end *mimcap_stacked_57x50 *1T1R_16x16_backup
Extracting HG_user_analog_project_wrapper.gds.gz
Warning: Calma reading is not undoable!  I hope that's OK.
Library written using GDS-II Release 6.0
Library name: LIB
d-m-bailey commented 4 months ago

@RTimothyEdwards possibly related to this discussion, I'm also seeing missing ports on slot-026 of mpw-7. Magic 8.3 revision 460 and version 1.0.446-0-gdd7771c of the tech file. Here's the test case. test-ext.tgz

tar xvf test-ext.tgz
cd test-ext
./run_extract

You should get an ext/XN_user_analog_project_wrapper.gds.spice file that is missing vssa2 and vdda2 at the top level. These ports exist in the ext/XN_user_analog_project_wrapper.ext file

port "vssa1" 1037 520594 702340 525394 704800 m3
port "vssa1" 1037 510594 702340 515394 704800 m3
...
port "vssa2" 1135 0 559442 1660 564242 m3
port "vssa2" 1135 0 549442 1660 554242 m3

but are merged without any warning

merge "XN_TL_reram_1t1r_256x256_complete_0/VSS_B" "vssa2"
merge "vssa2" "vssa1"
merge "vssa1" "VSUBS"

I wonder if it has anything to do with extracting using extract unique notopports.

d-m-bailey commented 4 months ago

@d-m-bailey : No, I got something completely different. And all I did was to use your "run_extract" as stated. Your output looks "more correct" in the sense that there are proper connections from "KV_top" to the wrapper. My KV_top had only a few ports and they were all disconnected from the wrapper. Yet the wrapper had all ports. I think if I could get it into the state you got above, then I could figure out why the other power ports go missing.

The magicrc file inlcuded in the original test case specifies a tech file that may not be visible on your system. This would cause a default tech file to be used, correct? Maybe that's the reason for the discrepancies. I've corrected the scripts and included the results.

test-ext2spice.tgz

$ tar xzf test-ext2spice.tgz
$ cd test-ext2spice
$ ./run_extract

The tech file is probably an older version. Can you check the tech file version in the extract log that show's the pins extracted?