215
217
num_metal_layers = n;
219
public WizardField getDiffWidth() { return diff_width; }
220
public void setDiffWidth(WizardField v) { diff_width = v; }
221
public WizardField getDiffPolyOverhang() { return diff_poly_overhang; }
222
public void setDiffPolyOverhang(WizardField v) { diff_poly_overhang = v; }
223
public WizardField getDiffContactOverhang() { return diff_contact_overhang; }
224
public void setDiffContactOverhang(WizardField v) { diff_contact_overhang = v; }
225
public WizardField getDiffSpacing() { return diff_spacing; }
226
public void setDiffSpacing(WizardField v) { diff_spacing = v; }
221
boolean getPWellProcess() { return pWellFlag;}
222
void setPWellProcess(boolean b) { pWellFlag = b; }
223
boolean getHorizontalTransistors() { return horizontalFlag;}
224
void setHorizontalTransistors(boolean b) { horizontalFlag = b; }
227
WizardField getDiffWidth() { return diff_width; }
228
void setDiffWidth(WizardField v) { diff_width = v; }
229
WizardField getDiffPolyOverhang() { return diff_poly_overhang; }
230
void setDiffPolyOverhang(WizardField v) { diff_poly_overhang = v; }
231
WizardField getDiffContactOverhang() { return diff_contact_overhang; }
232
void setDiffContactOverhang(WizardField v) { diff_contact_overhang = v; }
233
WizardField getDiffSpacing() { return diff_spacing; }
234
void setDiffSpacing(WizardField v) { diff_spacing = v; }
229
public WizardField getPolyWidth() { return poly_width; }
230
public void setPolyWidth(WizardField v) { poly_width = v; }
231
public WizardField getPolyEndcap() { return poly_endcap; }
232
public void setPolyEndcap(WizardField v) { poly_endcap = v; }
233
public WizardField getPolySpacing() { return poly_spacing; }
234
public void setPolySpacing(WizardField v) { poly_spacing = v; }
235
public WizardField getPolyDiffSpacing() { return poly_diff_spacing; }
236
public void setPolyDiffSpacing(WizardField v) { poly_diff_spacing = v; }
237
WizardField getPolyWidth() { return poly_width; }
238
void setPolyWidth(WizardField v) { poly_width = v; }
239
WizardField getPolyEndcap() { return poly_endcap; }
240
void setPolyEndcap(WizardField v) { poly_endcap = v; }
241
WizardField getPolySpacing() { return poly_spacing; }
242
void setPolySpacing(WizardField v) { poly_spacing = v; }
243
WizardField getPolyDiffSpacing() { return poly_diff_spacing; }
244
void setPolyDiffSpacing(WizardField v) { poly_diff_spacing = v; }
239
public WizardField getGateLength() { return gate_length; }
240
public void setGateLength(WizardField v) { gate_length = v; }
241
public WizardField getGateWidth() { return gate_width; }
242
public void setGateWidth(WizardField v) { gate_width = v; }
243
public WizardField getGateSpacing() { return gate_spacing; }
244
public void setGateSpacing(WizardField v) { gate_spacing = v; }
245
public WizardField getGateContactSpacing() { return gate_contact_spacing; }
246
public void setGateContactSpacing(WizardField v) { gate_contact_spacing = v; }
247
WizardField getGateLength() { return gate_length; }
248
void setGateLength(WizardField v) { gate_length = v; }
249
WizardField getGateWidth() { return gate_width; }
250
void setGateWidth(WizardField v) { gate_width = v; }
251
WizardField getGateSpacing() { return gate_spacing; }
252
void setGateSpacing(WizardField v) { gate_spacing = v; }
253
WizardField getGateContactSpacing() { return gate_contact_spacing; }
254
void setGateContactSpacing(WizardField v) { gate_contact_spacing = v; }
250
public WizardField getContactSize() { return contact_size; }
251
public void setContactSize(WizardField v) { contact_size = v; }
252
public WizardField getContactSpacing() { return contact_spacing; }
253
public void setContactSpacing(WizardField v) { contact_spacing = v; }
254
public WizardField getContactArraySpacing() { return contact_array_spacing; }
255
public void setContactArraySpacing(WizardField v) { contact_array_spacing = v; }
256
public WizardField getContactMetalOverhangInlineOnly() { return contact_metal_overhang_inline_only; }
257
public void setContactMetalOverhangInlineOnly(WizardField v) { contact_metal_overhang_inline_only = v; }
258
public WizardField getContactMetalOverhangAllSides() { return contact_metal_overhang_all_sides; }
259
public void setContactMetalOverhangAllSides(WizardField v) { contact_metal_overhang_all_sides = v; }
260
public WizardField getContactPolyOverhang() { return contact_poly_overhang; }
261
public void setContactPolyOverhang(WizardField v) { contact_poly_overhang = v; }
262
public WizardField getPolyconDiffSpacing() { return polycon_diff_spacing; }
263
public void setPolyconDiffSpacing(WizardField v) { polycon_diff_spacing = v; }
258
WizardField getContactSize() { return contact_size; }
259
void setContactSize(WizardField v) { contact_size = v; }
260
WizardField getContactSpacing() { return contact_spacing; }
261
void setContactSpacing(WizardField v) { contact_spacing = v; }
262
WizardField getContactArraySpacing() { return contact_array_spacing; }
263
void setContactArraySpacing(WizardField v) { contact_array_spacing = v; }
264
WizardField getContactMetalOverhangInlineOnly() { return contact_metal_overhang_inline_only; }
265
void setContactMetalOverhangInlineOnly(WizardField v) { contact_metal_overhang_inline_only = v; }
266
WizardField getContactMetalOverhangAllSides() { return contact_metal_overhang_all_sides; }
267
void setContactMetalOverhangAllSides(WizardField v) { contact_metal_overhang_all_sides = v; }
268
WizardField getContactPolyOverhang() { return contact_poly_overhang; }
269
void setContactPolyOverhang(WizardField v) { contact_poly_overhang = v; }
270
WizardField getPolyconDiffSpacing() { return polycon_diff_spacing; }
271
void setPolyconDiffSpacing(WizardField v) { polycon_diff_spacing = v; }
265
273
// WELL AND IMPLANT RULES
266
public WizardField getNPlusWidth() { return nplus_width; }
267
public void setNPlusWidth(WizardField v) { nplus_width = v; }
268
public WizardField getNPlusOverhangDiff() { return nplus_overhang_diff; }
269
public void setNPlusOverhangDiff(WizardField v) { nplus_overhang_diff = v; }
270
public WizardField getNPlusOverhangPoly() { return nplus_overhang_poly; }
271
public void setNPlusOverhangPoly(WizardField v) { nplus_overhang_poly = v; }
272
public WizardField getNPlusSpacing() { return nplus_spacing; }
273
public void setNPlusSpacing(WizardField v) { nplus_spacing = v; }
275
public WizardField getPPlusWidth() { return pplus_width; }
276
public void setPPlusWidth(WizardField v) { pplus_width = v; }
277
public WizardField getPPlusOverhangDiff() { return pplus_overhang_diff; }
278
public void setPPlusOverhangDiff(WizardField v) { pplus_overhang_diff = v; }
279
public WizardField getPPlusOverhangPoly() { return pplus_overhang_poly; }
280
public void setPPlusOverhangPoly(WizardField v) { pplus_overhang_poly = v; }
281
public WizardField getPPlusSpacing() { return pplus_spacing; }
282
public void setPPlusSpacing(WizardField v) { pplus_spacing = v; }
284
public WizardField getNWellWidth() { return nwell_width; }
285
public void setNWellWidth(WizardField v) { nwell_width = v; }
286
public WizardField getNWellOverhangDiffP() { return nwell_overhang_diff_p; }
287
public void setNWellOverhangDiffP(WizardField v) { nwell_overhang_diff_p = v; }
288
public WizardField getNWellOverhangDiffN() { return nwell_overhang_diff_n; }
289
public void setNWellOverhangDiffN(WizardField v) { nwell_overhang_diff_n = v; }
290
public WizardField getNWellSpacing() { return nwell_spacing; }
291
public void setNWellSpacing(WizardField v) { nwell_spacing = v; }
274
WizardField getNPlusWidth() { return nplus_width; }
275
void setNPlusWidth(WizardField v) { nplus_width = v; }
276
WizardField getNPlusOverhangDiff() { return nplus_overhang_diff; }
277
void setNPlusOverhangDiff(WizardField v) { nplus_overhang_diff = v; }
278
WizardField getNPlusOverhangPoly() { return nplus_overhang_poly; }
279
void setNPlusOverhangPoly(WizardField v) { nplus_overhang_poly = v; }
280
WizardField getNPlusSpacing() { return nplus_spacing; }
281
void setNPlusSpacing(WizardField v) { nplus_spacing = v; }
283
WizardField getPPlusWidth() { return pplus_width; }
284
void setPPlusWidth(WizardField v) { pplus_width = v; }
285
WizardField getPPlusOverhangDiff() { return pplus_overhang_diff; }
286
void setPPlusOverhangDiff(WizardField v) { pplus_overhang_diff = v; }
287
WizardField getPPlusOverhangPoly() { return pplus_overhang_poly; }
288
void setPPlusOverhangPoly(WizardField v) { pplus_overhang_poly = v; }
289
WizardField getPPlusSpacing() { return pplus_spacing; }
290
void setPPlusSpacing(WizardField v) { pplus_spacing = v; }
292
WizardField getNWellWidth() { return nwell_width; }
293
void setNWellWidth(WizardField v) { nwell_width = v; }
294
WizardField getNWellOverhangDiffP() { return nwell_overhang_diff_p; }
295
void setNWellOverhangDiffP(WizardField v) { nwell_overhang_diff_p = v; }
296
WizardField getNWellOverhangDiffN() { return nwell_overhang_diff_n; }
297
void setNWellOverhangDiffN(WizardField v) { nwell_overhang_diff_n = v; }
298
WizardField getNWellSpacing() { return nwell_spacing; }
299
void setNWellSpacing(WizardField v) { nwell_spacing = v; }
294
public WizardField [] getMetalWidth() { return metal_width; }
295
public void setMetalWidth(int met, WizardField value) { metal_width[met] = value; }
296
public WizardField [] getMetalSpacing() { return metal_spacing; }
297
public void setMetalSpacing(int met, WizardField value) { metal_spacing[met] = value; }
302
WizardField [] getMetalWidth() { return metal_width; }
303
void setMetalWidth(int met, WizardField value) { metal_width[met] = value; }
304
WizardField [] getMetalSpacing() { return metal_spacing; }
305
void setMetalSpacing(int met, WizardField value) { metal_spacing[met] = value; }
300
public WizardField [] getViaSize() { return via_size; }
301
public void setViaSize(int via, WizardField value) { via_size[via] = value; }
302
public WizardField [] getViaSpacing() { return via_spacing; }
303
public void setViaSpacing(int via, WizardField value) { via_spacing[via] = value; }
304
public WizardField [] getViaArraySpacing() { return via_array_spacing; }
305
public void setViaArraySpacing(int via, WizardField value) { via_array_spacing[via] = value; }
306
public WizardField [] getViaOverhangInline() { return via_overhang_inline; }
307
public void setViaOverhangInline(int via, WizardField value) { via_overhang_inline[via] = value; }
308
WizardField [] getViaSize() { return via_size; }
309
void setViaSize(int via, WizardField value) { via_size[via] = value; }
310
WizardField [] getViaSpacing() { return via_spacing; }
311
void setViaSpacing(int via, WizardField value) { via_spacing[via] = value; }
312
WizardField [] getViaArraySpacing() { return via_array_spacing; }
313
void setViaArraySpacing(int via, WizardField value) { via_array_spacing[via] = value; }
314
WizardField [] getViaOverhangInline() { return via_overhang_inline; }
315
void setViaOverhangInline(int via, WizardField value) { via_overhang_inline[via] = value; }
310
318
public double getPolyAntennaRatio() { return poly_antenna_ratio; }
311
public void setPolyAntennaRatio(double v) { poly_antenna_ratio = v; }
319
void setPolyAntennaRatio(double v) { poly_antenna_ratio = v; }
312
320
public double [] getMetalAntennaRatio() { return metal_antenna_ratio; }
313
public void setMetalAntennaRatio(int met, double value) { metal_antenna_ratio[met] = value; }
321
void setMetalAntennaRatio(int met, double value) { metal_antenna_ratio[met] = value; }
316
public int getGDSDiff() { return gds_diff_layer; }
317
public void setGDSDiff(int l) { gds_diff_layer = l; }
318
public int getGDSPoly() { return gds_poly_layer; }
319
public void setGDSPoly(int l) { gds_poly_layer = l; }
320
public int getGDSNPlus() { return gds_nplus_layer; }
321
public void setGDSNPlus(int l) { gds_nplus_layer = l; }
322
public int getGDSPPlus() { return gds_pplus_layer; }
323
public void setGDSPPlus(int l) { gds_pplus_layer = l; }
324
public int getGDSNWell() { return gds_nwell_layer; }
325
public void setGDSNWell(int l) { gds_nwell_layer = l; }
326
public int getGDSContact() { return gds_contact_layer; }
327
public void setGDSContact(int l) { gds_contact_layer = l; }
328
public int [] getGDSMetal() { return gds_metal_layer; }
329
public void setGDSMetal(int met, int l) { gds_metal_layer[met] = l; }
330
public int [] getGDSVia() { return gds_via_layer; }
331
public void setGDSVia(int via, int l) { gds_via_layer[via] = l; }
332
public int getGDSMarking() { return gds_marking_layer; }
333
public void setGDSMarking(int l) { gds_marking_layer = l; }
324
int getGDSDiff() { return gds_diff_layer; }
325
void setGDSDiff(int l) { gds_diff_layer = l; }
326
int getGDSPoly() { return gds_poly_layer; }
327
void setGDSPoly(int l) { gds_poly_layer = l; }
328
int getGDSNPlus() { return gds_nplus_layer; }
329
void setGDSNPlus(int l) { gds_nplus_layer = l; }
330
int getGDSPPlus() { return gds_pplus_layer; }
331
void setGDSPPlus(int l) { gds_pplus_layer = l; }
332
int getGDSNWell() { return gds_nwell_layer; }
333
void setGDSNWell(int l) { gds_nwell_layer = l; }
334
int getGDSContact() { return gds_contact_layer; }
335
void setGDSContact(int l) { gds_contact_layer = l; }
336
int [] getGDSMetal() { return gds_metal_layer; }
337
void setGDSMetal(int met, int l) { gds_metal_layer[met] = l; }
338
int [] getGDSVia() { return gds_via_layer; }
339
void setGDSVia(int via, int l) { gds_via_layer[via] = l; }
340
int getGDSMarking() { return gds_marking_layer; }
341
void setGDSMarking(int l) { gds_marking_layer = l; }
335
public String errorInData()
343
private String errorInData()
337
345
// check the General data
338
346
if (tech_name == null || tech_name.length() == 0) return "General panel: No technology name";
1802
// private void dumpTechnology(PrintWriter pw)
1805
// Color [] metal_colour = new Color[]
1807
// new Color(0,150,255), // cyan/blue
1808
// new Color(148,0,211), // purple
1809
// new Color(255,215,0), // yellow
1810
// new Color(132,112,255), // mauve
1811
// new Color(255,160,122), // salmon
1812
// new Color(34,139,34), // dull green
1813
// new Color(178,34,34), // dull red
1814
// new Color(34,34,178), // dull blue
1815
// new Color(153,153,153), // light gray
1816
// new Color(102,102,102) // dark gray
1818
// Color poly_colour = new Color(255,155,192); // pink
1819
// Color diff_colour = new Color(107,226,96); // light green
1820
// Color via_colour = new Color(205,205,205); // lighter gray
1821
// Color contact_colour = new Color(40,40,40); // darker gray
1822
// Color nplus_colour = new Color(224,238,224);
1823
// Color pplus_colour = new Color(224,224,120);
1824
// Color nwell_colour = new Color(140,140,140);
1826
// // write the header
1827
// String foundry_name = "NONE";
1828
// pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
1830
// pw.println("<!--");
1831
// pw.println(" *");
1832
// pw.println(" * Electric technology file for process \"" + tech_name + "\"");
1833
// pw.println(" *");
1834
// pw.println(" * Automatically generated by Electric's technology wizard");
1835
// pw.println(" *");
1836
// pw.println("-->");
1838
// pw.println("<technology name=\"" + tech_name + "\"");
1839
// pw.println(" xmlns=\"http://electric.sun.com/Technology\"");
1840
// pw.println(" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
1841
// pw.println(" xsi:schemaLocation=\"http://electric.sun.com/Technology ../../technology/Technology.xsd\">");
1843
// pw.println(" <shortName>" + tech_name + "</shortName>");
1844
// pw.println(" <description>" + tech_description + "</description>");
1845
// pw.println(" <numMetals min=\"" + num_metal_layers + "\" max=\"" + num_metal_layers + "\" default=\"" + num_metal_layers + "\"/>");
1846
// pw.println(" <scale value=\"" + floaty(stepsize) + "\" relevant=\"true\"/>");
1847
// pw.println(" <defaultFoundry value=\"" + foundry_name + "\"/>");
1848
// pw.println(" <minResistance value=\"1.0\"/>");
1849
// pw.println(" <minCapacitance value=\"0.1\"/>");
1852
// // write the transparent layer colors
1854
// pw.println(" <!-- Transparent layers -->");
1855
// pw.println(" <transparentLayer transparent=\"" + (li++) + "\">");
1856
// pw.println(" <r>" + poly_colour.getRed() + "</r>");
1857
// pw.println(" <g>" + poly_colour.getGreen() + "</g>");
1858
// pw.println(" <b>" + poly_colour.getBlue() + "</b>");
1859
// pw.println(" </transparentLayer>");
1860
// pw.println(" <transparentLayer transparent=\"" + (li++) + "\">");
1861
// pw.println(" <r>" + diff_colour.getRed() + "</r>");
1862
// pw.println(" <g>" + diff_colour.getGreen() + "</g>");
1863
// pw.println(" <b>" + diff_colour.getBlue() + "</b>");
1864
// pw.println(" </transparentLayer>");
1865
// pw.println(" <transparentLayer transparent=\"" + (li++) + "\">");
1866
// pw.println(" <r>" + metal_colour[0].getRed() + "</r>");
1867
// pw.println(" <g>" + metal_colour[0].getGreen() + "</g>");
1868
// pw.println(" <b>" + metal_colour[0].getBlue() + "</b>");
1869
// pw.println(" </transparentLayer>");
1870
// pw.println(" <transparentLayer transparent=\"" + (li++) + "\">");
1871
// pw.println(" <r>" + metal_colour[1].getRed() + "</r>");
1872
// pw.println(" <g>" + metal_colour[1].getGreen() + "</g>");
1873
// pw.println(" <b>" + metal_colour[1].getBlue() + "</b>");
1874
// pw.println(" </transparentLayer>");
1875
// pw.println(" <transparentLayer transparent=\"" + (li++) + "\">");
1876
// pw.println(" <r>" + metal_colour[2].getRed() + "</r>");
1877
// pw.println(" <g>" + metal_colour[2].getGreen() + "</g>");
1878
// pw.println(" <b>" + metal_colour[2].getBlue() + "</b>");
1879
// pw.println(" </transparentLayer>");
1881
// // write the layers
1883
// pw.println("<!-- LAYERS -->");
1884
// List<String> layers = new ArrayList<String>();
1885
// for(int i=1; i<=num_metal_layers; i++)
1886
// layers.add("Metal-"+i);
1887
// for(int i=1; i<=num_metal_layers-1; i++)
1888
// layers.add("Via-"+i);
1889
// layers.add("Poly");
1890
// layers.add("PolyGate");
1891
// layers.add("PolyCon");
1892
// layers.add("DiffCon");
1893
// layers.add("N-Diff");
1894
// layers.add("P-Diff");
1895
// layers.add("NPlus");
1896
// layers.add("PPlus");
1897
// layers.add("N-Well");
1898
// layers.add("DeviceMark");
1899
// for(int i=0; i<layers.size(); i++)
1901
// String l = layers.get(i);
1904
// String extrafun = "";
1908
// double opacity = 0.4;
1910
// String pat = null;
1912
// if (l.startsWith("Metal"))
1914
// int metLay = TextUtils.atoi(l.substring(6));
1915
// int metLayDig = (metLay-1) % 10;
1916
// switch (metLayDig)
1918
// case 0: tcol = 3; break;
1919
// case 1: tcol = 4; break;
1920
// case 2: tcol = 5; break;
1922
// pat=" <pattern>XXXXXXXXXXXXXXXX</pattern>\n" +
1923
// " <pattern> </pattern>\n" +
1924
// " <pattern>XXXXXXXXXXXXXXXX</pattern>\n" +
1925
// " <pattern> </pattern>\n" +
1926
// " <pattern>XXXXXXXXXXXXXXXX</pattern>\n" +
1927
// " <pattern> </pattern>\n" +
1928
// " <pattern>XXXXXXXXXXXXXXXX</pattern>\n" +
1929
// " <pattern> </pattern>\n" +
1930
// " <pattern>XXXXXXXXXXXXXXXX</pattern>\n" +
1931
// " <pattern> </pattern>\n" +
1932
// " <pattern>XXXXXXXXXXXXXXXX</pattern>\n" +
1933
// " <pattern> </pattern>\n" +
1934
// " <pattern>XXXXXXXXXXXXXXXX</pattern>\n" +
1935
// " <pattern> </pattern>\n" +
1936
// " <pattern>XXXXXXXXXXXXXXXX</pattern>\n" +
1937
// " <pattern> </pattern>";
1940
// pat=" <pattern>X X X X </pattern>\n" +
1941
// " <pattern> X X X X</pattern>\n" +
1942
// " <pattern> X X X X </pattern>\n" +
1943
// " <pattern> X X X X </pattern>\n" +
1944
// " <pattern>X X X X </pattern>\n" +
1945
// " <pattern> X X X X</pattern>\n" +
1946
// " <pattern> X X X X </pattern>\n" +
1947
// " <pattern> X X X X </pattern>\n" +
1948
// " <pattern>X X X X </pattern>\n" +
1949
// " <pattern> X X X X</pattern>\n" +
1950
// " <pattern> X X X X </pattern>\n" +
1951
// " <pattern> X X X X </pattern>\n" +
1952
// " <pattern>X X X X </pattern>\n" +
1953
// " <pattern> X X X X</pattern>\n" +
1954
// " <pattern> X X X X </pattern>\n" +
1955
// " <pattern> X X X X </pattern>";
1958
// pat=" <pattern> X X X X</pattern>\n" +
1959
// " <pattern>XXXXXXXXXXXXXXXX</pattern>\n" +
1960
// " <pattern> X X X X</pattern>\n" +
1961
// " <pattern> X X X X X X X X</pattern>\n" +
1962
// " <pattern> X X X X</pattern>\n" +
1963
// " <pattern>XXXXXXXXXXXXXXXX</pattern>\n" +
1964
// " <pattern> X X X X</pattern>\n" +
1965
// " <pattern> X X X X X X X X</pattern>\n" +
1966
// " <pattern> X X X X</pattern>\n" +
1967
// " <pattern>XXXXXXXXXXXXXXXX</pattern>\n" +
1968
// " <pattern> X X X X</pattern>\n" +
1969
// " <pattern> X X X X X X X X</pattern>\n" +
1970
// " <pattern> X X X X</pattern>\n" +
1971
// " <pattern>XXXXXXXXXXXXXXXX</pattern>\n" +
1972
// " <pattern> X X X X</pattern>\n" +
1973
// " <pattern> X X X X X X X X</pattern>";
1976
// pat=" <pattern>X X X X </pattern>\n" +
1977
// " <pattern> X X X X </pattern>\n" +
1978
// " <pattern> X X X X </pattern>\n" +
1979
// " <pattern> X X X X</pattern>\n" +
1980
// " <pattern>X X X X </pattern>\n" +
1981
// " <pattern> X X X X </pattern>\n" +
1982
// " <pattern> X X X X </pattern>\n" +
1983
// " <pattern> X X X X</pattern>\n" +
1984
// " <pattern>X X X X </pattern>\n" +
1985
// " <pattern> X X X X </pattern>\n" +
1986
// " <pattern> X X X X </pattern>\n" +
1987
// " <pattern> X X X X</pattern>\n" +
1988
// " <pattern>X X X X </pattern>\n" +
1989
// " <pattern> X X X X </pattern>\n" +
1990
// " <pattern> X X X X </pattern>\n" +
1991
// " <pattern> X X X X</pattern>";
1994
// pat=" <pattern> X X X X </pattern>\n" +
1995
// " <pattern> </pattern>\n" +
1996
// " <pattern>X X X X </pattern>\n" +
1997
// " <pattern> </pattern>\n" +
1998
// " <pattern> X X X X </pattern>\n" +
1999
// " <pattern> </pattern>\n" +
2000
// " <pattern>X X X X </pattern>\n" +
2001
// " <pattern> </pattern>\n" +
2002
// " <pattern> X X X X </pattern>\n" +
2003
// " <pattern> </pattern>\n" +
2004
// " <pattern>X X X X </pattern>\n" +
2005
// " <pattern> </pattern>\n" +
2006
// " <pattern> X X X X </pattern>\n" +
2007
// " <pattern> </pattern>\n" +
2008
// " <pattern>X X X X </pattern>\n" +
2009
// " <pattern> </pattern>";
2012
// pat=" <pattern> </pattern>\n" +
2013
// " <pattern> X X X X </pattern>\n" +
2014
// " <pattern> </pattern>\n" +
2015
// " <pattern>X X X X </pattern>\n" +
2016
// " <pattern> </pattern>\n" +
2017
// " <pattern> X X X X </pattern>\n" +
2018
// " <pattern> </pattern>\n" +
2019
// " <pattern>X X X X </pattern>\n" +
2020
// " <pattern> </pattern>\n" +
2021
// " <pattern> X X X X </pattern>\n" +
2022
// " <pattern> </pattern>\n" +
2023
// " <pattern>X X X X </pattern>\n" +
2024
// " <pattern> </pattern>\n" +
2025
// " <pattern> X X X X </pattern>\n" +
2026
// " <pattern> </pattern>\n" +
2027
// " <pattern>X X X X </pattern>";
2030
// pat=" <pattern>X X X X X X X X </pattern>\n" +
2031
// " <pattern>X X X X X X X X </pattern>\n" +
2032
// " <pattern>X X X X X X X X </pattern>\n" +
2033
// " <pattern>X X X X X X X X </pattern>\n" +
2034
// " <pattern>X X X X X X X X </pattern>\n" +
2035
// " <pattern>X X X X X X X X </pattern>\n" +
2036
// " <pattern>X X X X X X X X </pattern>\n" +
2037
// " <pattern>X X X X X X X X </pattern>\n" +
2038
// " <pattern>X X X X X X X X </pattern>\n" +
2039
// " <pattern>X X X X X X X X </pattern>\n" +
2040
// " <pattern>X X X X X X X X </pattern>\n" +
2041
// " <pattern>X X X X X X X X </pattern>\n" +
2042
// " <pattern>X X X X X X X X </pattern>\n" +
2043
// " <pattern>X X X X X X X X </pattern>\n" +
2044
// " <pattern>X X X X X X X X </pattern>\n" +
2045
// " <pattern>X X X X X X X X </pattern>";
2048
// fun = "METAL" + metLay;
2049
// int metLayHigh = (metLay-1) / 10;
2050
// r = metal_colour[metLayDig].getRed() * (10-metLayHigh) / 10;
2051
// g = metal_colour[metLayDig].getGreen() * (10-metLayHigh) / 10;
2052
// b = metal_colour[metLayDig].getBlue() * (10-metLayHigh) / 10;
2053
// opacity = (75 - metLay * 5)/100.0;
2054
// la = metal_width[metLay-1].v / stepsize;
2057
// if (l.startsWith("Via"))
2059
// int viaLay = TextUtils.atoi(l.substring(4));
2060
// fun = "CONTACT" + viaLay;
2061
// extrafun = "connects-metal";
2062
// r = via_colour.getRed();
2063
// g = via_colour.getGreen();
2064
// b = via_colour.getBlue();
2066
// la = via_size[viaLay-1].v / stepsize;
2069
// if (l.equals("DeviceMark"))
2072
// la = nplus_width.v / stepsize;
2073
// pat=" <pattern> </pattern>\n" +
2074
// " <pattern> </pattern>\n" +
2075
// " <pattern> </pattern>\n" +
2076
// " <pattern> </pattern>\n" +
2077
// " <pattern> </pattern>\n" +
2078
// " <pattern> </pattern>\n" +
2079
// " <pattern> </pattern>\n" +
2080
// " <pattern> </pattern>\n" +
2081
// " <pattern> </pattern>\n" +
2082
// " <pattern> </pattern>\n" +
2083
// " <pattern> </pattern>\n" +
2084
// " <pattern> </pattern>\n" +
2085
// " <pattern> </pattern>\n" +
2086
// " <pattern> </pattern>\n" +
2087
// " <pattern> </pattern>\n" +
2088
// " <pattern> </pattern>";
2091
// if (l.equals("Poly"))
2096
// la = poly_width.v / stepsize;
2099
// if (l.equals("PolyGate"))
2106
// if (l.equals("P-Diff"))
2111
// la = diff_width.v / stepsize;
2114
// if (l.equals("N-Diff"))
2119
// la = diff_width.v / stepsize;
2122
// if (l.equals("NPlus"))
2124
// fun = "IMPLANTN";
2125
// r = nplus_colour.getRed();
2126
// g = nplus_colour.getGreen();
2127
// b = nplus_colour.getBlue();
2129
// la = nplus_width.v / stepsize;
2130
// pat=" <pattern> X X </pattern>\n" +
2131
// " <pattern> X X </pattern>\n" +
2132
// " <pattern> X X </pattern>\n" +
2133
// " <pattern>X X </pattern>\n" +
2134
// " <pattern> X X</pattern>\n" +
2135
// " <pattern> X X </pattern>\n" +
2136
// " <pattern> X X </pattern>\n" +
2137
// " <pattern> X X </pattern>\n" +
2138
// " <pattern> X X </pattern>\n" +
2139
// " <pattern> X X </pattern>\n" +
2140
// " <pattern> X X </pattern>\n" +
2141
// " <pattern>X X </pattern>\n" +
2142
// " <pattern> X X</pattern>\n" +
2143
// " <pattern> X X </pattern>\n" +
2144
// " <pattern> X X </pattern>\n" +
2145
// " <pattern> X X </pattern>";
2149
// if (l.equals("PPlus"))
2151
// fun = "IMPLANTP";
2152
// r = pplus_colour.getRed();
2153
// g = pplus_colour.getGreen();
2154
// b = pplus_colour.getBlue();
2156
// la = pplus_width.v / stepsize;
2157
// pat=" <pattern> X X </pattern>\n" +
2158
// " <pattern> X X </pattern>\n" +
2159
// " <pattern> X X </pattern>\n" +
2160
// " <pattern>X X </pattern>\n" +
2161
// " <pattern> X X</pattern>\n" +
2162
// " <pattern> X X </pattern>\n" +
2163
// " <pattern> X X </pattern>\n" +
2164
// " <pattern> X X </pattern>\n" +
2165
// " <pattern> X X </pattern>\n" +
2166
// " <pattern> X X </pattern>\n" +
2167
// " <pattern> X X </pattern>\n" +
2168
// " <pattern>X X </pattern>\n" +
2169
// " <pattern> X X</pattern>\n" +
2170
// " <pattern> X X </pattern>\n" +
2171
// " <pattern> X X </pattern>\n" +
2172
// " <pattern> X X </pattern>";
2175
// if (l.equals("N-Well"))
2178
// r = nwell_colour.getRed();
2179
// g = nwell_colour.getGreen();
2180
// b = nwell_colour.getBlue();
2182
// la = nwell_width.v / stepsize;
2183
// pat=" <pattern> X X</pattern>\n" +
2184
// " <pattern>X X </pattern>\n" +
2185
// " <pattern> X X </pattern>\n" +
2186
// " <pattern> X X </pattern>\n" +
2187
// " <pattern> X X </pattern>\n" +
2188
// " <pattern> X X </pattern>\n" +
2189
// " <pattern> X X </pattern>\n" +
2190
// " <pattern> X X </pattern>\n" +
2191
// " <pattern> X X</pattern>\n" +
2192
// " <pattern>X X </pattern>\n" +
2193
// " <pattern> X X </pattern>\n" +
2194
// " <pattern> X X </pattern>\n" +
2195
// " <pattern> X X </pattern>\n" +
2196
// " <pattern> X X </pattern>\n" +
2197
// " <pattern> X X </pattern>\n" +
2198
// " <pattern> X X </pattern>";
2201
// if (l.equals("PolyCon"))
2203
// fun = "CONTACT1";
2204
// extrafun = "connects-poly";
2205
// r = contact_colour.getRed();
2206
// g = contact_colour.getGreen();
2207
// b = contact_colour.getBlue();
2209
// la = contact_size.v / stepsize;
2212
// if (l.equals("DiffCon"))
2214
// fun = "CONTACT1";
2215
// extrafun = "connects-diff";
2216
// r = contact_colour.getRed();
2217
// g = contact_colour.getGreen();
2218
// b = contact_colour.getBlue();
2220
// la = contact_size.v / stepsize;
2224
// pw.println(" <layer name=\"" + l + "\" " + (fun.length() > 0 ? ("fun=\"" + fun + "\"") : "") +
2225
// (extrafun.length() > 0 ? (" extraFun=\"" + extrafun + "\"") : "") + ">");
2228
// pw.println(" <opaqueColor r=\"" + r + "\" g=\"" + g + "\" b=\"" + b + "\"/>");
2231
// pw.println(" <transparentColor transparent=\"" + tcol + "\"/>");
2233
// pw.println(" <patternedOnDisplay>" + (pat == null ? "false" : "true") + "</patternedOnDisplay>");
2234
// pw.println(" <patternedOnPrinter>" + (pat == null ? "false" : "true") + "</patternedOnPrinter>");
2237
// for(int j=0; j<16; j++)
2238
// pw.println(" <pattern> </pattern>");
2243
// pw.println(" <outlined>NOPAT</outlined>");
2244
// pw.println(" <opacity>" + opacity + "</opacity>");
2245
// pw.println(" <foreground>true</foreground>");
2246
// pw.println(" <display3D thick=\"1.0\" height=\"1.0\" mode=\"NONE\" factor=\"1.0\"/>");
2247
// char cifLetter = (char)('A' + i);
2248
// pw.println(" <cifLayer cif=\"C" + cifLetter + cifLetter + "\"/>");
2249
// pw.println(" <skillLayer skill=\"" + l + "\"/>");
2250
// pw.println(" <parasitics resistance=\"1.0\" capacitance=\"0.0\" edgeCapacitance=\"0.0\"/>");
2251
// if (fun.startsWith("METAL") || fun.startsWith("POLY") || fun.startsWith("DIFF"))
2253
// pw.println(" <pureLayerNode name=\"" + l + "-Node\" port=\"Port_" + l + "\">");
2254
// pw.println(" <lambda>" + floaty(la) + "</lambda>");
2255
// pw.println(" <portArc>" + l + "</portArc>");
2256
// pw.println(" </pureLayerNode>");
2258
// pw.println(" </layer>");
2261
// // write the arcs
2262
// List<String> arcs = new ArrayList<String>();
2263
// for(int i=1; i<=num_metal_layers; i++)
2264
// arcs.add("Metal-"+i);
2265
// arcs.add("Poly");
2266
// arcs.add("N-Diff");
2267
// arcs.add("P-Diff");
2269
// pw.println("<!-- ARCS -->");
2270
// for(String l : arcs)
2275
// List<String> h = new ArrayList<String>();
2276
// if (l.startsWith("Metal"))
2278
// int metalLay = TextUtils.atoi(l.substring(6));
2279
// fun = "METAL" + metalLay;
2280
// la = metal_width[metalLay-1].v / stepsize;
2281
// ant = (int)Math.round(metal_antenna_ratio[metalLay-1]) | 200;
2282
// h.add(l + "=" + la);
2285
// if (l.equals("N-Diff"))
2288
// h.add("N-Diff=" + (diff_width.v/stepsize));
2289
// h.add("NPlus=" + ((nplus_overhang_diff.v*2+diff_width.v)/stepsize));
2292
// if (l.equals("P-Diff"))
2295
// h.add("P-Diff=" + (diff_width.v / stepsize));
2296
// h.add("PPlus=" + ((pplus_overhang_diff.v*2 + diff_width.v) / stepsize));
2297
// h.add("N-Well=" + ((nwell_overhang_diff.v*2 + diff_width.v) / stepsize));
2300
// if (l.equals("Poly"))
2303
// la = poly_width.v / stepsize;
2304
// ant = (int)Math.round(poly_antenna_ratio) | 200;
2305
// h.add(l + "=" + la);
2309
// for(String hEach : h)
2311
// int equalsPos = hEach.indexOf('=');
2312
// double lim = TextUtils.atof(hEach.substring(equalsPos+1));
2313
// if (lim > max) max = lim;
2316
// if (ant >= 0) ant = Math.round(ant);
2318
// pw.println(" <arcProto name=\"" + l + "\" fun=\"" + fun + "\">");
2319
// pw.println(" <wipable/>");
2320
// pw.println(" <extended>true</extended>");
2321
// pw.println(" <fixedAngle>true</fixedAngle>");
2322
// pw.println(" <angleIncrement>90</angleIncrement>");
2324
// pw.println(" <antennaRatio>" + floaty(ant) + "</antennaRatio>");
2326
// for(String each : h)
2328
// int equalsPos = each.indexOf('=');
2329
// String nom = each.substring(0, equalsPos);
2330
// double lim = TextUtils.atof(each.substring(equalsPos+1));
2332
// pw.println(" <arcLayer layer=\"" + nom + "\" style=\"FILLED\">");
2333
// pw.println(" <lambda>" + floaty(lim/2) + "</lambda>");
2334
// pw.println(" </arcLayer>");
2336
// pw.println(" </arcProto>");
2339
// // write the pins
2341
// pw.println("<!-- PINS -->");
2342
// for(int i=1; i<=num_metal_layers; i++)
2344
// double hla = metal_width[i-1].v / (stepsize*2);
2345
// String shla = floaty(hla);
2347
// pw.println(" <primitiveNode name=\"Metal-" + i + "-Pin\" fun=\"PIN\">");
2348
// pw.println(" <shrinkArcs/>");
2349
// pw.println(" <sizeOffset lx=\"" + shla + "\" hx=\"" + shla +
2350
// "\" ly=\"" + shla + "\" hy=\"" + shla +"\"/>");
2351
// pw.println(" <nodeLayer layer=\"Metal-" + i + "\" style=\"CROSSED\">");
2352
// pw.println(" <box>");
2353
// pw.println(" <lambdaBox klx=\"-" + shla + "\" khx=\"" + shla +
2354
// "\" kly=\"-" + shla + "\" khy=\"" + shla +"\"/>");
2355
// pw.println(" </box>");
2356
// pw.println(" </nodeLayer>");
2357
// pw.println(" <primitivePort name=\"M" + i + "\">");
2358
// pw.println(" <portAngle primary=\"0\" range=\"180\"/>");
2359
// pw.println(" <portTopology>0</portTopology>");
2360
// pw.println(" <box>");
2361
// pw.println(" <lambdaBox klx=\"0.0\" khx=\"0.0\" kly=\"0.0\" khy=\"0.0\"/>");
2362
// pw.println(" </box>");
2363
// pw.println(" <portArc>Metal-" + i + "</portArc>");
2364
// pw.println(" </primitivePort>");
2365
// pw.println(" </primitiveNode>");
2367
// double hla = poly_width.v / (stepsize*2);
2368
// String shla = floaty(hla);
2370
// pw.println(" <primitiveNode name=\"Poly-Pin\" fun=\"PIN\">");
2371
// pw.println(" <shrinkArcs/>");
2372
// pw.println(" <sizeOffset lx=\"" + shla + "\" hx=\"" + shla +
2373
// "\" ly=\"" + shla + "\" hy=\"" + shla +"\"/>");
2374
// pw.println(" <nodeLayer layer=\"Poly\" style=\"CROSSED\">");
2375
// pw.println(" <box>");
2376
// pw.println(" <lambdaBox klx=\"-" + shla + "\" khx=\"" + shla +
2377
// "\" kly=\"-" + shla + "\" khy=\"" + shla + "\"/>");
2378
// pw.println(" </box>");
2379
// pw.println(" </nodeLayer>");
2380
// pw.println(" <primitivePort name=\"Poly\">");
2381
// pw.println(" <portAngle primary=\"0\" range=\"180\"/>");
2382
// pw.println(" <portTopology>0</portTopology>");
2383
// pw.println(" <box>");
2384
// pw.println(" <lambdaBox klx=\"0.0\" khx=\"0.0\" kly=\"0.0\" khy=\"0.0\"/>");
2385
// pw.println(" </box>");
2386
// pw.println(" <portArc>Poly</portArc>");
2387
// pw.println(" </primitivePort>");
2388
// pw.println(" </primitiveNode>");
2391
// pw.println("<!-- P-Diff AND N-Diff PINS -->");
2392
// for(int i=0; i<=1; i++)
2394
// String t, d1, d2, d3;
2398
// d1 = floaty(diff_width.v/(stepsize*2));
2399
// d2 = floaty((diff_width.v+pplus_overhang_diff.v*2)/(stepsize*2));
2400
// d3 = floaty((diff_width.v+nwell_overhang_diff.v*2)/(stepsize*2));
2404
// d1 = floaty(diff_width.v/(stepsize*2));
2405
// d2 = floaty((diff_width.v+nplus_overhang_diff.v*2)/(stepsize*2));
2409
// String x = floaty(TextUtils.atof(d3) - TextUtils.atof(d1));
2411
// pw.println(" <primitiveNode name=\"" + t + "-Diff-Pin\" fun=\"PIN\">");
2412
// pw.println(" <shrinkArcs/>");
2413
//// pw.println(" <diskOffset untilVersion=\"1\" x=\"" + d3 + "\" y=\"" + d3 + "\"/>");
2414
//// pw.println(" <diskOffset untilVersion=\"2\" x=\"" + d1 + "\" y=\"" + d1 + "\"/>");
2415
// pw.println(" <sizeOffset lx=\"" + x + "\" hx=\"" + x + "\" ly=\"" + x + "\" hy=\"" + x + "\"/>");
2416
// if (t.equals("P"))
2418
// pw.println(" <nodeLayer layer=\"N-Well\" style=\"CROSSED\">");
2419
// pw.println(" <box>");
2420
// pw.println(" <lambdaBox klx=\"-" + d3 + "\" khx=\"" + d3 + "\" kly=\"-" + d3 + "\" khy=\"" + d3 + "\"/>");
2421
// pw.println(" </box>");
2422
// pw.println(" </nodeLayer>");
2424
// pw.println(" <nodeLayer layer=\"" + t + "Plus\" style=\"CROSSED\">");
2425
// pw.println(" <box>");
2426
// pw.println(" <lambdaBox klx=\"-" + d2 + "\" khx=\"" + d2 + "\" kly=\"-" + d2 + "\" khy=\"" + d2 + "\"/>");
2427
// pw.println(" </box>");
2428
// pw.println(" </nodeLayer>");
2429
// pw.println(" <nodeLayer layer=\"" + t + "-Diff\" style=\"CROSSED\">");
2430
// pw.println(" <box>");
2431
// pw.println(" <lambdaBox klx=\"-" + d1 + "\" khx=\"" + d1 + "\" kly=\"-" + d1 + "\" khy=\"" + d1 + "\"/>");
2432
// pw.println(" </box>");
2433
// pw.println(" </nodeLayer>");
2434
// pw.println(" <primitivePort name=\"" + t + "-Diff\">");
2435
// pw.println(" <portAngle primary=\"0\" range=\"180\"/>");
2436
// pw.println(" <portTopology>0</portTopology>");
2437
// pw.println(" <box>");
2438
// pw.println(" <lambdaBox klx=\"0.0\" khx=\"0.0\" kly=\"0.0\" khy=\"0.0\"/>");
2439
// pw.println(" </box>");
2440
// pw.println(" <portArc>" + t + "-Diff</portArc>");
2441
// pw.println(" </primitivePort>");
2442
// pw.println(" </primitiveNode>");
2445
// // write the contacts
2447
// pw.println("<!-- METAL TO METAL VIAS / CONTACTS -->");
2448
// for(int alt=0; alt<=1; alt++)
2450
// for(int vl=0; vl<num_metal_layers; vl++)
2453
// if (vl == 0) { src = "Poly"; il = "PolyCon"; } else { src = "Metal-" + vl; il = "Via-" + vl; }
2454
// String dest = "Metal-" + (vl+1);
2455
// String upperx, uppery, lowerx, lowery, cs, cs2, c;
2461
// upperx = floaty((contact_metal_overhang_inline_only.v*2+contact_size.v)/(stepsize*2));
2462
// uppery = floaty(contact_size.v/(stepsize*2));
2465
// upperx = floaty((contact_metal_overhang_all_sides.v*2+contact_size.v)/(stepsize*2));
2468
// lowerx = floaty((contact_poly_overhang.v*2+contact_size.v)/(stepsize*2));
2471
// cs = floaty(contact_spacing.v/stepsize);
2473
// c = floaty(contact_size.v/stepsize);
2478
// upperx = floaty(via_size[vl-1].v/(stepsize*2));
2479
// uppery = floaty((via_overhang_inline[vl-1].v*2+via_size[vl-1].v)/(stepsize*2));
2484
// upperx = floaty((via_overhang_inline[vl-1].v*2+via_size[vl-1].v)/(stepsize*2));
2485
// uppery = floaty(via_size[vl-1].v/(stepsize*2));
2490
// c = floaty(via_size[vl-1].v/stepsize);
2491
// cs = floaty(via_spacing[vl-1].v/stepsize);
2492
// cs2 = floaty(via_array_spacing[vl-1].v/stepsize);
2495
// double maxx = TextUtils.atof(upperx);
2496
// if (TextUtils.atof(lowerx) > maxx) maxx = TextUtils.atof(lowerx);
2497
// double maxy = TextUtils.atof(uppery);
2498
// if (TextUtils.atof(lowery) > maxy) maxy = TextUtils.atof(lowery);
2499
// double minx = TextUtils.atof(upperx);
2500
// if (TextUtils.atof(lowerx) < minx) minx = TextUtils.atof(lowerx);
2501
// double miny = TextUtils.atof(uppery);
2502
// if (TextUtils.atof(lowery) < miny) miny = TextUtils.atof(lowery);
2503
// String ox = floaty(maxx-minx);
2504
// String oy = floaty(maxy-miny);
2507
// pw.println(" <primitiveNode name=\"" + src + "-" + dest + "-Con" + (alt != 0 ? "-X" : "") + "\" fun=\"CONTACT\">");
2508
//// pw.println(" <diskOffset untilVersion=\"2\" x=\"" + maxx + "\" y=\"" + maxy + "\"/>");
2509
//// pw.println(" <sizeOffset lx=\"" + ox + "\" hx=\"" + ox + "\" ly=\"" + oy + "\" hy=\"" + oy + "\"/>");
2510
// pw.println(" <nodeLayer layer=\"" + src + "\" style=\"FILLED\">");
2511
// pw.println(" <box>");
2512
// pw.println(" <lambdaBox klx=\"-" + lowerx + "\" khx=\"" + lowerx + "\" kly=\"-" + lowery + "\" khy=\"" + lowery + "\"/>");
2513
// pw.println(" </box>");
2514
// pw.println(" </nodeLayer>");
2515
// pw.println(" <nodeLayer layer=\"" + dest + "\" style=\"FILLED\">");
2516
// pw.println(" <box>");
2517
// pw.println(" <lambdaBox klx=\"-" + upperx + "\" khx=\"" + upperx + "\" kly=\"-" + uppery + "\" khy=\"" + uppery + "\"/>");
2518
// pw.println(" </box>");
2519
// pw.println(" </nodeLayer>");
2520
// pw.println(" <nodeLayer layer=\"" + il + "\" style=\"FILLED\">");
2521
// pw.println(" <multicutbox sizex=\"" + c + "\" sizey=\"" + c + "\" sep1d=\"" + cs + "\" sep2d=\"" + cs2 + "\">");
2522
// pw.println(" <lambdaBox klx=\"0.0\" khx=\"0.0\" kly=\"0.0\" khy=\"0.0\"/>");
2523
// pw.println(" </multicutbox>");
2524
// pw.println(" </nodeLayer>");
2525
// pw.println(" <primitivePort name=\"" + src + "-" + dest + "\">");
2526
// pw.println(" <portAngle primary=\"0\" range=\"180\"/>");
2527
// pw.println(" <portTopology>0</portTopology>");
2528
// pw.println(" <box>");
2529
// pw.println(" <lambdaBox klx=\"-" + minx + "\" khx=\"" + minx + "\" kly=\"-" + miny + "\" khy=\"" + miny + "\"/>");
2530
// pw.println(" </box>");
2531
// pw.println(" <portArc>" + src + "</portArc>");
2532
// pw.println(" <portArc>" + dest + "</portArc>");
2533
// pw.println(" </primitivePort>");
2534
// pw.println(" <minSizeRule width=\"" + floaty(2*maxx) + "\" height=\"" + floaty(2*maxy) + "\" rule=\"" + src + "-" + dest + " rules\"/>");
2535
// pw.println(" </primitiveNode>");
2540
// pw.println("<!-- N-Diff-Metal-1 and P-Diff-Metal-1 -->");
2541
// for(int alt=0; alt<=1; alt++)
2543
// for(int i=0; i<2; i++)
2545
// String t = "", sx = "", mx = "", my = "";
2549
// sx = floaty((nplus_overhang_diff.v*2+diff_contact_overhang.v*2+contact_size.v)/(stepsize*2));
2553
// sx = floaty((pplus_overhang_diff.v*2+diff_contact_overhang.v*2+contact_size.v)/(stepsize*2));
2558
// mx = floaty((contact_metal_overhang_inline_only.v*2+contact_size.v)/(stepsize*2));
2559
// my = floaty(contact_size.v/(stepsize*2));
2562
// mx = floaty((contact_metal_overhang_all_sides.v*2+contact_size.v)/(stepsize*2));
2566
// String dx = floaty((diff_contact_overhang.v*2+contact_size.v)/(stepsize*2));
2567
// String wx = floaty((nwell_overhang_diff.v*2+diff_contact_overhang.v*2+contact_size.v)/(stepsize*2));
2569
// String maxx = mx;
2570
// if (TextUtils.atof(dx) > TextUtils.atof(maxx)) maxx = dx;
2571
// if (i==1 && TextUtils.atof(wx) > TextUtils.atof(maxx)) maxx = wx;
2572
// String maxy = my;
2573
// if (TextUtils.atof(dx) > TextUtils.atof(maxy)) maxy = dx;
2574
// if (i==1 && TextUtils.atof(wx) > TextUtils.atof(maxy)) maxy = wx;
2576
// String minx = mx;
2577
// if (TextUtils.atof(dx) < TextUtils.atof(minx)) minx = dx;
2578
// if (i==1 && TextUtils.atof(wx) < TextUtils.atof(minx)) minx = wx;
2579
// String miny = my;
2580
// if (TextUtils.atof(dx) < TextUtils.atof(miny)) miny = dx;
2581
// if (i==1 && TextUtils.atof(wx) < TextUtils.atof(miny)) miny = wx;
2583
// String sox = floaty(TextUtils.atof(maxx)-TextUtils.atof(dx));
2584
// String soy = floaty(TextUtils.atof(maxy)-TextUtils.atof(dx));
2587
// pw.println(" <primitiveNode name=\"" + t + "-Diff-Metal-1" + (alt != 0 ? "-X" : "") + "\" fun=\"CONTACT\">");
2588
//// pw.println(" <diskOffset untilVersion=\"1\" x=\"" + maxx + "\" y=\"" + maxy + "\"/>");
2589
//// pw.println(" <diskOffset untilVersion=\"2\" x=\"" + minx + "\" y=\"" + miny + "\"/>");
2590
// pw.println(" <sizeOffset lx=\"" + sox + "\" hx=\"" + sox + "\" ly=\"" + soy + "\" hy=\"" + soy + "\"/>");
2591
// pw.println(" <nodeLayer layer=\"Metal-1\" style=\"FILLED\">");
2592
// pw.println(" <box>");
2593
// pw.println(" <lambdaBox klx=\"-" + mx + "\" khx=\"" + mx + "\" kly=\"-" + my + "\" khy=\"" + my + "\"/>");
2594
// pw.println(" </box>");
2595
// pw.println(" </nodeLayer>");
2596
// pw.println(" <nodeLayer layer=\"" + t + "-Diff\" style=\"FILLED\">");
2597
// pw.println(" <box>");
2598
// pw.println(" <lambdaBox klx=\"-" + dx + "\" khx=\"" + dx + "\" kly=\"-" + dx + "\" khy=\"" + dx + "\"/>");
2599
// pw.println(" </box>");
2600
// pw.println(" </nodeLayer>");
2603
// pw.println(" <nodeLayer layer=\"N-Well\" style=\"FILLED\">");
2604
// pw.println(" <box>");
2605
// pw.println(" <lambdaBox klx=\"-" + wx + "\" khx=\"" + wx + "\" kly=\"-" + wx + "\" khy=\"" + wx + "\"/>");
2606
// pw.println(" </box>");
2607
// pw.println(" </nodeLayer>");
2609
// pw.println(" <nodeLayer layer=\"" + t + "Plus\" style=\"FILLED\">");
2610
// pw.println(" <box>");
2611
// pw.println(" <lambdaBox klx=\"-" + sx + "\" khx=\"" + sx + "\" kly=\"-" + sx + "\" khy=\"" + sx + "\"/>");
2612
// pw.println(" </box>");
2613
// pw.println(" </nodeLayer>");
2614
// pw.println(" <nodeLayer layer=\"DiffCon\" style=\"FILLED\">");
2615
// pw.println(" <multicutbox sizex=\"" + floaty(contact_size.v/stepsize) + "\" sizey=\"" +
2616
// floaty(contact_size.v/stepsize) + "\" sep1d=\"" + (floaty(contact_spacing.v/stepsize)) +
2617
// "\" sep2d=\"" + floaty(contact_spacing.v/stepsize) + "\">");
2618
// pw.println(" <lambdaBox klx=\"0.0\" khx=\"0.0\" kly=\"0.0\" khy=\"0.0\"/>");
2619
// pw.println(" </multicutbox>");
2620
// pw.println(" </nodeLayer>");
2621
// pw.println(" <primitivePort name=\"" + t + "-Diff-Metal-1" + "\">");
2622
// pw.println(" <portAngle primary=\"0\" range=\"180\"/>");
2623
// pw.println(" <portTopology>0</portTopology>");
2624
// pw.println(" <box>");
2625
// pw.println(" <lambdaBox klx=\"-" + dx + "\" khx=\"" + dx + "\" kly=\"-" + dx + "\" khy=\"" + dx + "\"/>");
2626
// pw.println(" </box>");
2627
// pw.println(" <portArc>" + t + "-Diff</portArc>");
2628
// pw.println(" <portArc>Metal-1</portArc>");
2629
// pw.println(" </primitivePort>");
2630
// pw.println(" <minSizeRule width=\"" + floaty(2*TextUtils.atof(maxx)) + "\" height=\"" +
2631
// floaty(2*TextUtils.atof(maxy)) + "\" rule=\"" + t + "-Diff, " + t + "+, M1" +
2632
// (i==1 ? ", N-Well" : "") + " and Contact rules\"/>");
2633
// pw.println(" </primitiveNode>");
2638
// pw.println("<!-- VDD-Tie-Metal-1 and VSS-Tie-Metal-1 -->");
2639
// for(int alt=0; alt<=1; alt++)
2641
// for(int i=0; i<2; i++)
2643
// String t, fun, dt, sx, mx, my;
2649
// sx = floaty((nplus_overhang_diff.v*2+diff_contact_overhang.v*2+contact_size.v)/(stepsize*2));
2653
// fun = "SUBSTRATE";
2655
// sx = floaty((pplus_overhang_diff.v*2+diff_contact_overhang.v*2+contact_size.v)/(stepsize*2));
2660
// mx = floaty((contact_metal_overhang_inline_only.v*2+contact_size.v)/(stepsize*2));
2661
// my = floaty(contact_size.v/(stepsize*2));
2664
// mx = floaty((contact_metal_overhang_all_sides.v*2+contact_size.v)/(stepsize*2));
2668
// String dx = floaty((diff_contact_overhang.v*2+contact_size.v)/(stepsize*2));
2669
// String wx = floaty((nwell_overhang_diff.v*2+diff_contact_overhang.v*2+contact_size.v)/(stepsize*2));
2671
// String maxx = mx;
2672
// if (TextUtils.atof(dx) > TextUtils.atof(maxx)) maxx = dx;
2673
// if (i==0 && TextUtils.atof(wx)>TextUtils.atof(maxx)) maxx = wx;
2674
// String maxy = my;
2675
// if (TextUtils.atof(dx) > TextUtils.atof(maxy)) maxy = dx;
2676
// if (i==0 && TextUtils.atof(wx)>TextUtils.atof(maxy)) maxy = wx;
2678
// String minx = mx;
2679
// if (TextUtils.atof(dx) < TextUtils.atof(minx)) minx = dx;
2680
// if (i==0 && TextUtils.atof(wx)<TextUtils.atof(minx)) minx = wx;
2681
// String miny = my;
2682
// if (TextUtils.atof(dx) < TextUtils.atof(miny)) miny = dx;
2683
// if (i==0 && TextUtils.atof(wx)<TextUtils.atof(miny)) miny = wx;
2685
// String sox = floaty(TextUtils.atof(maxx)-TextUtils.atof(dx));
2686
// String soy = floaty(TextUtils.atof(maxy)-TextUtils.atof(dx));
2689
// pw.println(" <primitiveNode name=\"" + t + "-Tie-Metal-1" + (alt != 0 ? "-X" : "") + "\" fun=\"" + fun + "\">");
2690
//// pw.println(" <diskOffset untilVersion=\"1\" x=\"" + maxx + "\" y=\"" + maxy + "\"/>");
2691
//// pw.println(" <diskOffset untilVersion=\"2\" x=\"" + minx + "\" y=\"" + miny + "\"/>");
2692
// pw.println(" <sizeOffset lx=\"" + sox + "\" hx=\"" + sox + "\" ly=\"" + soy + "\" hy=\"" + soy + "\"/>");
2693
// pw.println(" <nodeLayer layer=\"Metal-1\" style=\"FILLED\">");
2694
// pw.println(" <box>");
2695
// pw.println(" <lambdaBox klx=\"-" + mx + "\" khx=\"" + mx + "\" kly=\"-" + my + "\" khy=\"" + my + "\"/>");
2696
// pw.println(" </box>");
2697
// pw.println(" </nodeLayer>");
2698
// pw.println(" <nodeLayer layer=\"" + dt + "-Diff\" style=\"FILLED\">");
2699
// pw.println(" <box>");
2700
// pw.println(" <lambdaBox klx=\"-" + dx + "\" khx=\"" + dx + "\" kly=\"-" + dx + "\" khy=\"" + dx + "\"/>");
2701
// pw.println(" </box>");
2702
// pw.println(" </nodeLayer>");
2705
// pw.println(" <nodeLayer layer=\"N-Well\" style=\"FILLED\">");
2706
// pw.println(" <box>");
2707
// pw.println(" <lambdaBox klx=\"-" + wx + "\" khx=\"" + wx + "\" kly=\"-" + wx + "\" khy=\"" + wx + "\"/>");
2708
// pw.println(" </box>");
2709
// pw.println(" </nodeLayer>");
2711
// pw.println(" <nodeLayer layer=\"" + dt + "Plus\" style=\"FILLED\">");
2712
// pw.println(" <box>");
2713
// pw.println(" <lambdaBox klx=\"-" + sx + "\" khx=\"" + sx + "\" kly=\"-" + sx + "\" khy=\"" + sx + "\"/>");
2714
// pw.println(" </box>");
2715
// pw.println(" </nodeLayer>");
2716
// pw.println(" <nodeLayer layer=\"DiffCon\" style=\"FILLED\">");
2717
// pw.println(" <multicutbox sizex=\"" + floaty(contact_size.v/stepsize) + "\" sizey=\"" +
2718
// floaty(contact_size.v/stepsize) + "\" sep1d=\"" + floaty(contact_spacing.v/stepsize) +
2719
// "\" sep2d=\"" + floaty(contact_spacing.v/stepsize) + "\">");
2720
// pw.println(" <lambdaBox klx=\"0.0\" khx=\"0.0\" kly=\"0.0\" khy=\"0.0\"/>");
2721
// pw.println(" </multicutbox>");
2722
// pw.println(" </nodeLayer>");
2723
// pw.println(" <primitivePort name=\"" + t + "-Tie-M1" + "\">");
2724
// pw.println(" <portAngle primary=\"0\" range=\"180\"/>");
2725
// pw.println(" <portTopology>0</portTopology>");
2726
// pw.println(" <box>");
2727
// pw.println(" <lambdaBox klx=\"-" + dx + "\" khx=\"" + dx + "\" kly=\"-" + dx + "\" khy=\"" + dx + "\"/>");
2728
// pw.println(" </box>");
2729
// pw.println(" <portArc>Metal-1</portArc>");
2730
// pw.println(" </primitivePort>");
2731
// pw.println(" <minSizeRule width=\"" + floaty(2*TextUtils.atof(maxx)) + "\" height=\"" +
2732
// floaty(2*TextUtils.atof(maxy)) + "\" rule=\"" + dt + "-Diff, " + dt + "+, M1" +
2733
// (i==0 ? ", N-Well" : "") + " and Contact rules\"/>");
2734
// pw.println(" </primitiveNode>");
2738
// // write the transistors
2739
// for(int i=0; i<2; i++)
2741
// String wellx = "", welly = "", t, impx, impy;
2745
// wellx = floaty((gate_width.v+nwell_overhang_diff.v*2)/(stepsize*2));
2746
// welly = floaty((gate_length.v+diff_poly_overhang.v*2+nwell_overhang_diff.v*2)/(stepsize*2));
2747
// impx = floaty((gate_width.v+pplus_overhang_diff.v*2)/(stepsize*2));
2748
// impy = floaty((gate_length.v+diff_poly_overhang.v*2+pplus_overhang_diff.v*2)/(stepsize*2));
2752
// impx = floaty((gate_width.v+nplus_overhang_diff.v*2)/(stepsize*2));
2753
// impy = floaty((gate_length.v+diff_poly_overhang.v*2+nplus_overhang_diff.v*2)/(stepsize*2));
2755
// String diffx = floaty(gate_width.v/(stepsize*2));
2756
// String diffy = floaty((gate_length.v+diff_poly_overhang.v*2)/(stepsize*2));
2757
// String porty = floaty((gate_length.v+diff_poly_overhang.v*2-diff_width.v)/(stepsize*2));
2758
// String polyx = floaty((gate_width.v+poly_endcap.v*2)/(stepsize*2));
2759
// String polyy = floaty(gate_length.v/(stepsize*2));
2760
// String polyx2 = floaty((poly_endcap.v*2)/(stepsize*2));
2761
// String sx = floaty(TextUtils.atof(polyx)-TextUtils.atof(diffx));
2762
// String sy = floaty(TextUtils.atof(diffy)-TextUtils.atof(polyy));
2764
// pw.println("<!-- " + t + "-Transistor -->");
2766
// pw.println(" <primitiveNode name=\"" + t + "-Transistor\" fun=\"TRA" + t + "MOS\">");
2767
//// pw.println(" <diskOffset untilVersion=\"2\" x=\"" + polyx + "\" y=\"" + diffy + "\"/>");
2768
//// pw.println(" <sizeOffset lx=\"" + sx + "\" hx=\"" + sx + "\" ly=\"" + sy + "\" hy=\"" + sy + "\"/>");
2770
// pw.println(" <nodeLayer layer=\"Poly\" style=\"FILLED\">");
2771
// pw.println(" <box>");
2772
// pw.println(" <lambdaBox klx=\"-" + polyx + "\" khx=\"" + polyx + "\" kly=\"-" + polyy + "\" khy=\"" + polyy + "\"/>");
2773
// pw.println(" </box>");
2774
// pw.println(" </nodeLayer>");
2776
// pw.println(" <nodeLayer layer=\"PolyGate\" style=\"FILLED\">");
2777
// pw.println(" <box>");
2778
// pw.println(" <lambdaBox klx=\"-" + diffx + "\" khx=\"" + diffx + "\" kly=\"-" + polyy + "\" khy=\"" + polyy + "\"/>");
2779
// pw.println(" </box>");
2780
// pw.println(" </nodeLayer>");
2782
// pw.println(" <nodeLayer layer=\"" + t + "-Diff\" style=\"FILLED\">");
2783
// pw.println(" <box>");
2784
// pw.println(" <lambdaBox klx=\"-" + diffx + "\" khx=\"" + diffx + "\" kly=\"-" + diffy + "\" khy=\"" + diffy + "\"/>");
2785
// pw.println(" </box>");
2786
// pw.println(" </nodeLayer>");
2788
// pw.println(" <nodeLayer layer=\"" + t + "Plus\" style=\"FILLED\">");
2789
// pw.println(" <box>");
2790
// pw.println(" <lambdaBox klx=\"-" + impx + "\" khx=\"" + impx + "\" kly=\"-" + impy + "\" khy=\"" + impy + "\"/>");
2791
// pw.println(" </box>");
2792
// pw.println(" </nodeLayer>");
2794
// pw.println(" <nodeLayer layer=\"DeviceMark\" style=\"FILLED\">");
2795
// pw.println(" <box>");
2796
// pw.println(" <lambdaBox klx=\"-" + impx + "\" khx=\"" + impx + "\" kly=\"-" + impy + "\" khy=\"" + impy + "\"/>");
2797
// pw.println(" </box>");
2798
// pw.println(" </nodeLayer>");
2802
// pw.println(" <nodeLayer layer=\"N-Well\" style=\"FILLED\">");
2803
// pw.println(" <box>");
2804
// pw.println(" <lambdaBox klx=\"-" + wellx + "\" khx=\"" + wellx + "\" kly=\"-" + welly + "\" khy=\"" + welly + "\"/>");
2805
// pw.println(" </box>");
2806
// pw.println(" </nodeLayer>");
2809
// pw.println(" <primitivePort name=\"Gate-Left\">");
2810
// pw.println(" <portAngle primary=\"180\" range=\"90\"/>");
2811
// pw.println(" <portTopology>0</portTopology>");
2812
// pw.println(" <box>");
2813
// pw.println(" <lambdaBox klx=\"-" + polyx + "\" khx=\"-" + polyx2 + "\" kly=\"-" + polyy + "\" khy=\"" + polyy + "\"/>");
2814
// pw.println(" </box>");
2815
// pw.println(" <portArc>Poly</portArc>");
2816
// pw.println(" </primitivePort>");
2818
// pw.println(" <primitivePort name=\"Diff-Top\">");
2819
// pw.println(" <portAngle primary=\"90\" range=\"90\"/>");
2820
// pw.println(" <portTopology>1</portTopology>");
2821
// pw.println(" <box>");
2822
// pw.println(" <lambdaBox klx=\"-" + diffx + "\" khx=\"" + diffx + "\" kly=\"" + porty + "\" khy=\"" + porty + "\"/>");
2823
// pw.println(" </box>");
2824
// pw.println(" <portArc>" + t + "-Diff</portArc>");
2825
// pw.println(" </primitivePort>");
2827
// pw.println(" <primitivePort name=\"Gate-Right\">");
2828
// pw.println(" <portAngle primary=\"0\" range=\"90\"/>");
2829
// pw.println(" <portTopology>0</portTopology>");
2830
// pw.println(" <box>");
2831
// pw.println(" <lambdaBox klx=\"" + polyx2 + "\" khx=\"" + polyx + "\" kly=\"-" + polyy + "\" khy=\"" + polyy + "\"/>");
2832
// pw.println(" </box>");
2833
// pw.println(" <portArc>Poly</portArc>");
2834
// pw.println(" </primitivePort>");
2836
// pw.println(" <primitivePort name=\"Diff-Bottom\">");
2837
// pw.println(" <portAngle primary=\"270\" range=\"90\"/>");
2838
// pw.println(" <portTopology>2</portTopology>");
2839
// pw.println(" <box>");
2840
// pw.println(" <lambdaBox klx=\"-" + diffx + "\" khx=\"" + diffx + "\" kly=\"-" + porty + "\" khy=\"-" + porty + "\"/>");
2841
// pw.println(" </box>");
2842
// pw.println(" <portArc>" + t + "-Diff</portArc>");
2843
// pw.println(" </primitivePort>");
2844
// pw.println(" </primitiveNode>");
2847
// // write trailing boilerplate
2849
// pw.println("<!-- SKELETON HEADERS -->");
2851
// pw.println(" <spiceHeader level=\"1\">");
2852
// pw.println(" <spiceLine line=\"* Spice header (level 1)\"/>");
2853
// pw.println(" </spiceHeader>");
2855
// pw.println(" <spiceHeader level=\"2\">");
2856
// pw.println(" <spiceLine line=\"* Spice header (level 2)\"/>");
2857
// pw.println(" </spiceHeader>");
2859
// // write the component menu layout
2862
// pw.println("<!-- PALETTE -->");
2864
// pw.println(" <menuPalette numColumns=\"3\">");
2865
// for(int i=1; i<=num_metal_layers; i++)
2869
// pw.println(" <menuBox>");
2870
// pw.println(" <menuArc>Metal-" + i + "</menuArc>");
2871
// pw.println(" </menuBox>");
2872
// pw.println(" <menuBox>");
2873
// pw.println(" <menuNode>Metal-" + i + "-Pin</menuNode>");
2874
// pw.println(" </menuBox>");
2877
// pw.println(" <menuBox>");
2878
// String name = "Metal-" + h + "-Metal-" + i + "-Con";
2879
// pw.println(" <menuNodeInst protoName=\"" + name + "\" function=\"CONTACT\">");
2880
// pw.println(" <menuNodeText text=\"" + name + "\" size=\"" + ts + "\"/>");
2881
// pw.println(" </menuNodeInst>");
2882
// pw.println(" <menuNodeInst protoName=\"" + name + "-X\" function=\"CONTACT\"/>");
2883
// pw.println(" </menuBox>");
2886
// pw.println(" <menuBox>");
2887
// pw.println(" </menuBox>");
2891
// pw.println(" <menuBox>");
2892
// pw.println(" <menuArc>Poly</menuArc>");
2893
// pw.println(" </menuBox>");
2894
// pw.println(" <menuBox>");
2895
// pw.println(" <menuNode>Poly-Pin</menuNode>");
2896
// pw.println(" </menuBox>");
2897
// pw.println(" <menuBox>");
2898
// pw.println(" <menuNodeInst protoName=\"Poly-Metal-1-Con\" function=\"CONTACT\"/>");
2899
//// pw.println(" </menuNodeInst>");
2900
// pw.println(" <menuNodeInst protoName=\"Poly-Metal-1-Con-X\" function=\"CONTACT\"/>");
2901
// pw.println(" </menuBox>");
2903
// pw.println(" <menuBox>");
2904
// pw.println(" <menuArc>P-Diff</menuArc>");
2905
// pw.println(" </menuBox>");
2906
// pw.println(" <menuBox>");
2907
// pw.println(" <menuNode>P-Diff-Pin</menuNode>");
2908
// pw.println(" </menuBox>");
2909
// pw.println(" <menuBox>");
2910
// pw.println(" <menuNodeInst protoName=\"P-Transistor\" function=\"TRAPMOS\">");
2911
// pw.println(" <menuNodeText text=\"P\" size=\"" + ts + "\"/>");
2912
// pw.println(" </menuNodeInst>");
2913
// pw.println(" </menuBox>");
2915
// pw.println(" <menuBox>");
2916
// pw.println(" <menuArc>N-Diff</menuArc>");
2917
// pw.println(" </menuBox>");
2918
// pw.println(" <menuBox>");
2919
// pw.println(" <menuNode>N-Diff-Pin</menuNode>");
2920
// pw.println(" </menuBox>");
2921
// pw.println(" <menuBox>");
2922
// pw.println(" <menuNodeInst protoName=\"N-Transistor\" function=\"TRANMOS\">");
2923
// pw.println(" <menuNodeText text=\"N\" size=\"" + ts + "\"/>");
2924
// pw.println(" </menuNodeInst>");
2925
// pw.println(" </menuBox>");
2927
// pw.println(" <menuBox>");
2928
// pw.println(" <menuNodeInst protoName=\"VSS-Tie-Metal-1\" function=\"SUBSTRATE\">");
2929
// pw.println(" <menuNodeText text=\"VSS-Tie\" size=\"" + ts + "\"/>");
2930
// pw.println(" </menuNodeInst>");
2931
// pw.println(" <menuNodeInst protoName=\"VSS-Tie-Metal-1-X\" function=\"SUBSTRATE\"/>");
2932
// pw.println(" </menuBox>");
2934
// pw.println(" <menuBox>");
2935
// pw.println(" <menuNodeInst protoName=\"N-Diff-Metal-1\" function=\"CONTACT\">");
2936
// pw.println(" <menuNodeText text=\"N-Con\" size=\"" + ts + "\"/>");
2937
// pw.println(" </menuNodeInst>");
2938
// pw.println(" <menuNodeInst protoName=\"N-Diff-Metal-1-X\" function=\"CONTACT\"/>");
2939
// pw.println(" </menuBox>");
2940
// pw.println(" <menuBox>");
2941
// pw.println(" </menuBox>");
2943
// pw.println(" <menuBox>");
2944
// pw.println(" <menuNodeInst protoName=\"VDD-Tie-Metal-1\" function=\"WELL\">");
2945
// pw.println(" <menuNodeText text=\"VDD-Tie\" size=\"" + ts + "\"/>");
2946
// pw.println(" </menuNodeInst>");
2947
// pw.println(" <menuNodeInst protoName=\"VDD-Tie-Metal-1-X\" function=\"WELL\"/>");
2948
// pw.println(" </menuBox>");
2949
// pw.println(" <menuBox>");
2950
// pw.println(" <menuNodeInst protoName=\"P-Diff-Metal-1\" function=\"CONTACT\">");
2951
// pw.println(" <menuNodeText text=\"P-Con\" size=\"" + ts + "\"/>");
2952
// pw.println(" </menuNodeInst>");
2953
// pw.println(" <menuNodeInst protoName=\"P-Diff-Metal-1-X\" function=\"CONTACT\"/>");
2954
// pw.println(" </menuBox>");
2955
// pw.println(" <menuBox>");
2956
// pw.println(" </menuBox>");
2958
// pw.println(" <menuBox>");
2959
// pw.println(" <menuText>Pure</menuText>");
2960
// pw.println(" </menuBox>");
2961
// pw.println(" <menuBox>");
2962
// pw.println(" <menuText>Misc.</menuText>");
2963
// pw.println(" </menuBox>");
2964
// pw.println(" <menuBox>");
2965
// pw.println(" <menuText>Cell</menuText>");
2966
// pw.println(" </menuBox>");
2967
// pw.println(" </menuPalette>");
2969
// pw.println(" <Foundry name=\"" + foundry_name + "\">");
2971
// // write GDS layers
2973
// for(int i=1; i<=num_metal_layers; i++)
2975
// pw.println(" <layerGds layer=\"Metal-" + i + "\" gds=\"" + gds_metal_layer[i-1] + "\"/>");
2976
// if (i != num_metal_layers)
2978
// pw.println(" <layerGds layer=\"Via-" + i + "\" gds=\"" + gds_via_layer[i-1] + "\"/>");
2981
// pw.println(" <layerGds layer=\"Poly\" gds=\"" + gds_poly_layer + "\"/>");
2982
// pw.println(" <layerGds layer=\"PolyGate\" gds=\"" + gds_poly_layer + "\"/>");
2983
// pw.println(" <layerGds layer=\"DiffCon\" gds=\"" + gds_contact_layer + "\"/>");
2984
// pw.println(" <layerGds layer=\"PolyCon\" gds=\"" + gds_contact_layer + "\"/>");
2985
// pw.println(" <layerGds layer=\"N-Diff\" gds=\"" + gds_diff_layer + "\"/>");
2986
// pw.println(" <layerGds layer=\"P-Diff\" gds=\"" + gds_diff_layer + "\"/>");
2987
// pw.println(" <layerGds layer=\"NPlus\" gds=\"" + gds_nplus_layer + "\"/>");
2988
// pw.println(" <layerGds layer=\"PPlus\" gds=\"" + gds_pplus_layer + "\"/>");
2989
// pw.println(" <layerGds layer=\"N-Well\" gds=\"" + gds_nwell_layer + "\"/>");
2990
// pw.println(" <layerGds layer=\"DeviceMark\" gds=\"" + gds_marking_layer + "\"/>");
2992
// // write GDS layers
2994
// for(int i=1; i<=num_metal_layers; i++)
2996
// pw.println(" <layerGds layer=\"Metal-" + i + "\" gds=\"" + gds_metal_layer[i-1] + "\"/>");
2997
// if (i != num_metal_layers)
2999
// pw.println(" <layerGds layer=\"Via-" + i + "\" gds=\"" + gds_via_layer[i-1] + "\"/>");
3002
// pw.println(" <layerGds layer=\"Poly\" gds=\"" + gds_poly_layer + "\"/>");
3003
// pw.println(" <layerGds layer=\"PolyGate\" gds=\"" + gds_poly_layer + "\"/>");
3004
// pw.println(" <layerGds layer=\"DiffCon\" gds=\"" + gds_contact_layer + "\"/>");
3005
// pw.println(" <layerGds layer=\"PolyCon\" gds=\"" + gds_contact_layer + "\"/>");
3006
// pw.println(" <layerGds layer=\"N-Diff\" gds=\"" + gds_diff_layer + "\"/>");
3007
// pw.println(" <layerGds layer=\"P-Diff\" gds=\"" + gds_diff_layer + "\"/>");
3008
// pw.println(" <layerGds layer=\"NPlus\" gds=\"" + gds_nplus_layer + "\"/>");
3009
// pw.println(" <layerGds layer=\"PPlus\" gds=\"" + gds_pplus_layer + "\"/>");
3010
// pw.println(" <layerGds layer=\"N-Well\" gds=\"" + gds_nwell_layer + "\"/>");
3011
// pw.println(" <layerGds layer=\"DeviceMark\" gds=\"" + gds_marking_layer + "\"/>");
3014
// // Write basic design rules not implicit in primitives
3017
// for(int i=0; i<num_metal_layers; i++)
3019
// pw.println(" <LayerRule ruleName=\"" + metal_width[i].rule + "\" layerName=\"Metal-" + (i+1) + "\" type=\"MINWID\" when=\"ALL\" value=\"" + floaty(metal_width[i].v/stepsize) + "\"/>");
3022
// pw.println(" <LayerRule ruleName=\"" + diff_width.rule + "\" layerName=\"N-Diff\" type=\"MINWID\" when=\"ALL\" value=\"" + floaty(diff_width.v/stepsize) + "\"/>");
3023
// pw.println(" <LayerRule ruleName=\"" + diff_width.rule + "\" layerName=\"P-Diff\" type=\"MINWID\" when=\"ALL\" value=\"" + floaty(diff_width.v/stepsize) + "\"/>");
3024
// pw.println(" <LayerRule ruleName=\"" + nwell_width.rule + "\" layerName=\"N-Well\" type=\"MINWID\" when=\"ALL\" value=\"" + floaty(nwell_width.v/stepsize) + "\"/>");
3025
// pw.println(" <LayerRule ruleName=\"" + nplus_width.rule + "\" layerName=\"NPlus\" type=\"MINWID\" when=\"ALL\" value=\"" + floaty(nplus_width.v/stepsize) + "\"/>");
3026
// pw.println(" <LayerRule ruleName=\"" + pplus_width.rule + "\" layerName=\"PPlus\" type=\"MINWID\" when=\"ALL\" value=\"" + floaty(pplus_width.v/stepsize) + "\"/>");
3027
// pw.println(" <LayerRule ruleName=\"" + poly_width.rule + "\" layerName=\"Poly\" type=\"MINWID\" when=\"ALL\" value=\"" + floaty(poly_width.v/stepsize) + "\"/>");
3028
// pw.println(" <LayerRule ruleName=\"" + poly_width.rule + "\" layerName=\"PolyGate\" type=\"MINWID\" when=\"ALL\" value=\"" + floaty(poly_width.v/stepsize) + "\"/>");
3031
// pw.println(" <LayersRule ruleName=\"" + diff_spacing.rule + "\" layerNames=\"{N-Diff,N-Diff}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(diff_spacing.v/stepsize) + "\"/>");
3032
// pw.println(" <LayersRule ruleName=\"" + diff_spacing.rule + "\" layerNames=\"{N-Diff,P-Diff}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(diff_spacing.v/stepsize) + "\"/>");
3033
// pw.println(" <LayersRule ruleName=\"" + diff_spacing.rule + "\" layerNames=\"{P-Diff,P-Diff}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(diff_spacing.v/stepsize) + "\"/>");
3034
// pw.println(" <LayersRule ruleName=\"" + poly_diff_spacing.rule + "\" layerNames=\"{Poly,N-Diff}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(poly_diff_spacing.v/stepsize) + "\"/>");
3035
// pw.println(" <LayersRule ruleName=\"" + poly_diff_spacing.rule + "\" layerNames=\"{Poly,P-Diff}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(poly_diff_spacing.v/stepsize) + "\"/>");
3036
// pw.println(" <LayersRule ruleName=\"" + poly_spacing.rule + "\" layerNames=\"{Poly,Poly}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(poly_spacing.v/stepsize) + "\"/>");
3038
// pw.println(" <LayersRule ruleName=\"" + gate_spacing.rule + "\" layerNames=\"{PolyGate,PolyGate}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(gate_spacing.v/stepsize) + "\"/>");
3040
// pw.println(" <LayersRule ruleName=\"" + nwell_spacing.rule + "\" layerNames=\"{N-Well,N-Well}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(nwell_spacing.v/stepsize) + "\"/>");
3041
// pw.println(" <LayersRule ruleName=\"" + nplus_spacing.rule + "\" layerNames=\"{NPlus,NPlus}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(nplus_spacing.v/stepsize) + "\"/>");
3042
// pw.println(" <LayersRule ruleName=\"" + pplus_spacing.rule + "\" layerNames=\"{PPlus,PPlus}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(pplus_spacing.v/stepsize) + "\"/>");
3044
// pw.println(" <LayersRule ruleName=\"" + contact_spacing.rule + "\" layerNames=\"{PolyCon,PolyCon}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(contact_spacing.v/stepsize) + "\"/>");
3045
// pw.println(" <LayersRule ruleName=\"" + contact_spacing.rule + "\" layerNames=\"{DiffCon,DiffCon}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(contact_spacing.v/stepsize) + "\"/>");
3047
// pw.println(" <LayersRule ruleName=\"" + polycon_diff_spacing.rule + "\" layerNames=\"{PolyCon,N-Diff}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(polycon_diff_spacing.v/stepsize) + "\"/>");
3048
// pw.println(" <LayersRule ruleName=\"" + polycon_diff_spacing.rule + "\" layerNames=\"{PolyCon,P-Diff}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(polycon_diff_spacing.v/stepsize) + "\"/>");
3050
// pw.println(" <LayersRule ruleName=\"" + gate_contact_spacing.rule + "\" layerNames=\"{DiffCon,Poly}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(gate_contact_spacing.v/stepsize) + "\"/>");
3051
// pw.println(" <LayersRule ruleName=\"" + gate_contact_spacing.rule + "\" layerNames=\"{DiffCon,PolyGate}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(gate_contact_spacing.v/stepsize) + "\"/>");
3053
// System.out.println("2DCut rules are missing");
3055
// for(int i=1; i<=num_metal_layers; i++)
3057
// pw.println(" <LayersRule ruleName=\"" + metal_spacing[i-1].rule + "\" layerNames=\"{Metal-" + i + ",Metal-" + i + "}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(metal_spacing[i-1].v/stepsize) + "\"/>");
3058
// if (i != num_metal_layers)
3060
// pw.println(" <LayersRule ruleName=\"" + via_spacing[i-1].rule + "\" layerNames=\"{Via-" + i + ",Via-" + i + "}\" type=\"UCONSPA\" when=\"ALL\" value=\"" + floaty(via_spacing[i-1].v/stepsize) + "\"/>");
3063
// pw.println(" </Foundry>");
3065
// pw.println("</technology>");
3068
// private String floaty(double v)
3071
// System.out.println("Negative distance of " + v + " in the tech editor wizard");
3072
// double roundedV = DBMath.round(v);
3073
// return roundedV + ""; // the "" is needed to call the String constructor
3076
1883
private double scaledValue(double val) { return DBMath.round(val / stepsize); }