45
45
import com.sun.electric.technology.PrimitiveNodeSize;
46
46
import com.sun.electric.technology.Technology;
47
47
import com.sun.electric.technology.Technology.NodeLayer;
48
import com.sun.electric.technology.Technology.ExtraField;
48
49
import com.sun.electric.technology.technologies.Artwork;
49
50
import com.sun.electric.technology.technologies.Generic;
50
51
import com.sun.electric.technology.technologies.Schematics;
102
104
private List<AttributesTable.AttValPair> allAttributes;
103
105
private List<ArcInst> portObjects;
104
106
private boolean bigger;
105
private boolean scalableTrans;
106
private boolean multiCutNode;
107
private boolean carbonNanotubeNode;
108
107
private boolean swapXY;
108
private ExtraFields extraFields = new ExtraFields();
109
109
private AttributesTable attributesTable;
110
110
private EditWindow wnd;
112
private static class ExtraFields implements Serializable
114
private boolean scalableTrans;
115
private boolean multiCutNode;
116
private boolean carbonNanotubeNode;
117
private boolean routingExclusionNode;
118
private ExtraField extraField1;
119
private ExtraField extraField2;
112
122
private static Preferences prefs = Preferences.userNodeForPackage(GetInfoNode.class);
533
543
if (!ni.getFunction().isFET())
535
textField1.setEditable(true);
536
545
textField1Label.setText("Area:");
538
547
Variable var = ni.getVar(Schematics.ATTR_AREA);
539
textField1.setText(var.getPureValue(-1));
548
initialTextField1 = var.getPureValue(-1);
549
textField1.setEditable(true);
550
textField1.setText(initialTextField1);
543
multiCutNode = false;
554
extraFields.multiCutNode = false;
544
555
if (!ni.isCellInstance())
546
557
PrimitiveNode pnp = (PrimitiveNode)np;
547
multiCutNode = pnp.isMulticut();
558
extraFields.multiCutNode = pnp.isMulticut();
548
559
// if (pnp.findMulticut() != null) multiCutNode = true;
561
if (extraFields.multiCutNode)
552
563
popupLabel.setText("Cut placement:");
553
564
popup.setEnabled(true);
558
569
popup.setSelectedIndex(initialPopupIndex);
560
571
textField1Label.setText("Cut spacing:");
561
textField1.setEditable(true);
562
572
Variable var = ni.getVar(NodeLayer.CUT_SPACING);
564
textField1.setText("DEFAULT");
566
textField1.setText(var.getPureValue(-1));
569
carbonNanotubeNode = false;
573
if (var == null) initialTextField1 = "DEFAULT"; else
574
initialTextField1 = var.getPureValue(-1);
575
textField1.setEditable(true);
576
textField1.setText(initialTextField1);
579
extraFields.extraField1 = extraFields.extraField2 = null;
580
if (!ni.isCellInstance())
582
List phFields = Technology.getExtraFields((PrimitiveNode)ni.getProto());
583
if (phFields != null)
585
for(Object o : phFields)
587
ExtraField ef = (ExtraField)o;
588
if (extraFields.extraField1 == null)
590
extraFields.extraField1 = ef;
591
textField1Label.setText(ef.getDescription() + ":");
592
Variable var = ni.getVar(ef.getKey());
593
if (var == null) initialTextField1 = "DEFAULT"; else
594
initialTextField1 = var.getPureValue(-1);
595
textField1.setEditable(true);
596
textField1.setText(initialTextField1);
599
extraFields.extraField2 = ef;
600
textField2Label.setText(ef.getDescription() + ":");
601
Variable var = ni.getVar(ef.getKey());
602
if (var == null) initialTextField2 = "DEFAULT"; else
603
initialTextField2 = var.getPureValue(-1);
604
textField2.setEditable(true);
605
textField2.setText(initialTextField2);
611
extraFields.routingExclusionNode = false;
612
if (ni.getProto() == Generic.tech().routeNode)
614
extraFields.routingExclusionNode = true;
615
textField1Label.setText("Routing exclusion layers:");
616
Variable var = ni.getVar(Generic.ROUTING_EXCLUSION);
617
if (var == null) initialTextField1 = ""; else
618
initialTextField1 = var.getPureValue(-1);
619
textField1.setEditable(true);
620
textField1.setText(initialTextField1);
623
extraFields.carbonNanotubeNode = false;
570
624
if (!ni.isCellInstance())
572
626
PrimitiveNode pnp = (PrimitiveNode)np;
576
630
NodeLayer[] primLayers = pnp.getNodeLayers();
577
631
for (NodeLayer nodeLayer: primLayers)
578
if (nodeLayer.getLayer().isCarbonNanotubeLayer()) carbonNanotubeNode = true;
632
if (nodeLayer.getLayer().isCarbonNanotubeLayer()) extraFields.carbonNanotubeNode = true;
581
if (carbonNanotubeNode)
635
if (extraFields.carbonNanotubeNode)
583
637
textField1Label.setText("Number of Carbon Nanotubes:");
584
textField1.setEditable(true);
585
638
Variable var = ni.getVar(NodeLayer.CARBON_NANOTUBE_COUNT);
587
textField1.setText("DEFAULT");
589
textField1.setText(var.getPureValue(-1));
639
if (var == null) initialTextField1 = "DEFAULT"; else
640
initialTextField1 = var.getPureValue(-1);
641
textField1.setEditable(true);
642
textField1.setText(initialTextField1);
591
644
textField2Label.setText("Spacing of Carbon Nanotubes:");
645
var = ni.getVar(NodeLayer.CARBON_NANOTUBE_PITCH);
646
if (var == null) initialTextField2 = "DEFAULT"; else
647
initialTextField2 = var.getPureValue(-1);
592
648
textField2.setEditable(true);
593
var = ni.getVar(NodeLayer.CARBON_NANOTUBE_PITCH);
595
textField2.setText("DEFAULT");
597
textField2.setText(var.getPureValue(-1));
649
textField2.setText(initialTextField2);
600
scalableTrans = false;
652
extraFields.scalableTrans = false;
601
653
if (!ni.isCellInstance())
603
655
if (np.getTechnology() == Technology.getMocmosTechnology())
605
657
if (np.getName().equals("P-Transistor-Scalable") ||
606
658
np.getName().equals("N-Transistor-Scalable"))
607
scalableTrans = true;
659
extraFields.scalableTrans = true;
662
if (extraFields.scalableTrans)
612
664
popupLabel.setText("Contacts:");
613
665
popup.addItem("Top & Bottom / normal spacing");
978
1030
private String initialTextField1, currentTextField1;
979
1031
private String initialTextField2, currentTextField2;
980
1032
private String initialPopupEntry, currentPopupEntry;
981
private boolean scalableTrans;
982
private boolean multiCutNode;
983
private boolean carbonNanotubeNode;
1033
private ExtraFields extrafields;
984
1034
private boolean swapXY;
986
1036
public ChangeNode(NodeInst ni,
998
1048
String initialTextField2, String currentTextField2,
999
1049
String initialPopupEntry, String currentPopupEntry,
1000
1050
boolean bigger,
1001
boolean scalableTrans,
1002
boolean multiCutNode,
1003
boolean carbonNanotubeNode,
1051
ExtraFields extrafields,
1004
1052
boolean swapXY)
1006
1054
super("Modify Node", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER);
1021
1069
this.initialTextField1 = initialTextField1; this.currentTextField1 = currentTextField1;
1022
1070
this.initialTextField2 = initialTextField2; this.currentTextField2 = currentTextField2;
1023
1071
this.initialPopupEntry = initialPopupEntry; this.currentPopupEntry = currentPopupEntry;
1024
this.scalableTrans = scalableTrans;
1025
this.multiCutNode = multiCutNode;
1026
this.carbonNanotubeNode = carbonNanotubeNode;
1072
this.extrafields = extrafields;
1027
1073
this.swapXY = swapXY;
1138
if (extrafields.extraField1 != null)
1140
if (!currentTextField1.equals(initialTextField1))
1142
if (currentTextField1.length() == 0)
1143
ni.delVar(extrafields.extraField1.getKey()); else
1144
ni.newVar(extrafields.extraField1.getKey(), new Double(TextUtils.atof(currentTextField1)), ep);
1147
if (extrafields.extraField2 != null)
1149
if (!currentTextField2.equals(initialTextField2))
1151
if (currentTextField2.length() == 0)
1152
ni.delVar(extrafields.extraField2.getKey()); else
1153
ni.newVar(extrafields.extraField2.getKey(), new Double(TextUtils.atof(currentTextField2)), ep);
1157
if (extrafields.multiCutNode)
1093
1159
if (!currentTextField1.equals(initialTextField1))
1120
1187
ni.newVar(NodeLayer.CARBON_NANOTUBE_PITCH, new Double(TextUtils.atof(currentTextField2)), ep);
1191
if (extrafields.routingExclusionNode)
1193
if (!currentTextField1.equals(initialTextField1))
1194
ni.updateVar(Generic.ROUTING_EXCLUSION, currentTextField1, ep);
1123
1197
PrimitiveNode.Function fun = ni.getFunction();
1124
1198
if (fun == PrimitiveNode.Function.DIODE || fun == PrimitiveNode.Function.DIODEZ)
1278
1352
// set length and width by node size for layout transistors
1279
1353
double initialWidth = size.getDoubleWidth();
1280
1354
double initialLength = size.getDoubleLength();
1281
double width = TextUtils.atof(currentXSize, new Double(initialWidth));
1282
double length = TextUtils.atof(currentYSize, new Double(initialLength));
1355
double width = TextUtils.atof(currentXSize, new Double(initialWidth), TextDescriptor.Unit.DISTANCE, Technology.getCurrent());
1356
double length = TextUtils.atof(currentYSize, new Double(initialLength), TextDescriptor.Unit.DISTANCE, Technology.getCurrent());
1357
// double width = TextUtils.atof(currentXSize, new Double(initialWidth));
1358
// double length = TextUtils.atof(currentYSize, new Double(initialLength));
1283
1359
if (!DBMath.doublesEqual(width, initialWidth) ||
1284
1360
!DBMath.doublesEqual(length, initialLength))