/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: TechnologyTab.java
*
* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.tool.user.dialogs.options;
import com.sun.electric.Main;
import com.sun.electric.database.text.Setting;
import com.sun.electric.technology.Foundry;
import com.sun.electric.technology.PrimitiveNode;
import com.sun.electric.technology.Technology;
import com.sun.electric.technology.technologies.Schematics;
import com.sun.electric.tool.io.output.GenerateVHDL;
import com.sun.electric.tool.user.User;
import com.sun.electric.tool.user.dialogs.EDialog;
import com.sun.electric.tool.user.dialogs.PreferencesFrame;
import com.sun.electric.tool.user.ui.EditWindow;
import com.sun.electric.tool.user.ui.WindowFrame;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.ListSelectionModel;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
/**
* Class to handle the "Technology" tab of the Preferences dialog.
*/
public class TechnologyTab extends PreferencePanel
{
private static final long serialVersionUID = 1L;
/** Value for standard SCMOS rules. */ public static final int MOCMOS_SCMOSRULES = 0; // = MoCMOS.SCMOSRULES
/** Value for submicron rules. */ public static final int MOCMOS_SUBMRULES = 1; // = MoCMOS.SUBMRULES
/** Value for deep rules. */ public static final int MOCMOS_DEEPRULES = 2; // = MoCMOS.DEEPRULES
private ArrayList<Object> extraTechTabs = new ArrayList<Object>();
private JList schemPrimList;
private DefaultListModel schemPrimModel;
private Map<PrimitiveNode,String> schemPrimMap;
private boolean changingVHDL = false;
private Setting defaultTechnologySetting = User.getDefaultTechnologySetting();
private Setting schematicTechnologySetting = User.getSchematicTechnologySetting();
private Setting processLayoutTechnologySetting = User.getPSubstrateProcessLayoutTechnologySetting();
private Technology mocmos = Technology.getMocmosTechnology();
private Setting mocmosRuleSetSetting = mocmos.getSetting("MOCMOS Rule Set");
private Setting mocmosNumMetalSetting = mocmos.getSetting("NumMetalLayers");
private Setting mocmosSecondPolysiliconSetting = mocmos.getSetting("UseSecondPolysilicon");
private Setting mocmosDisallowStackedViasSetting = mocmos.getSetting("DisallowStackedVias");
private Setting mocmosAlternateActivePolyRulesSetting = mocmos.getSetting("UseAlternativeActivePolyRules");
private Setting mocmosAnalogSetting = mocmos.getSetting("Analog");
/** Creates new form TechnologyTab */
public TechnologyTab(PreferencesFrame parent, boolean modal)
{
super(parent, modal);
initComponents();
// make all text fields select-all when entered
EDialog.makeTextFieldSelectAllOnTab(vhdlName);
EDialog.makeTextFieldSelectAllOnTab(vhdlNegatedName);
}
/** return the JPanel to use for the user preferences. */
public JPanel getUserPreferencesPanel() { return preferences; }
/** return the JPanel to use for the project preferences. */
public JPanel getProjectPreferencesPanel() { return projectSettings; }
/** return the name of this preferences tab. */
public String getName() { return "Technology"; }
/**
* Method called at the start of the dialog.
* Caches current values and displays them in the Technology tab.
*/
public void init()
{
// Layout
rotateLayoutTransistors.setSelected(User.isRotateLayoutTransistors());
// VHDL layers list in Schematics
schemPrimModel = new DefaultListModel();
schemPrimList = new JList(schemPrimModel);
schemPrimList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
vhdlPrimPane.setViewportView(schemPrimList);
schemPrimList.clearSelection();
schemPrimList.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent evt) { schemClickPrim(); }
});
schemPrimModel.clear();
schemPrimMap = new HashMap<PrimitiveNode,String>();
GenerateVHDL.VHDLPreferences vp = new GenerateVHDL.VHDLPreferences(false);
for(Iterator<PrimitiveNode> it = Schematics.tech().getNodes(); it.hasNext(); )
{
PrimitiveNode np = it.next();
if (np != Schematics.tech().andNode && np != Schematics.tech().orNode &&
np != Schematics.tech().xorNode && np != Schematics.tech().muxNode &&
np != Schematics.tech().bufferNode) continue;
String str = vp.vhdlNames.get(np);
schemPrimMap.put(np, str);
schemPrimModel.addElement(makeLine(np, str));
}
schemPrimList.setSelectedIndex(0);
vhdlName.getDocument().addDocumentListener(new SchemPrimDocumentListener(this));
vhdlNegatedName.getDocument().addDocumentListener(new SchemPrimDocumentListener(this));
schemClickPrim();
// MOCMOS Project preferences
int initialTechRules = getInt(mocmosRuleSetSetting);
if (initialTechRules == MOCMOS_SCMOSRULES) techMOCMOSSCMOSRules.setSelected(true); else
if (initialTechRules == MOCMOS_SUBMRULES) techMOCMOSSubmicronRules.setSelected(true); else
techMOCMOSDeepRules.setSelected(true);
techMetalLayers.addItem("2 Layers");
techMetalLayers.addItem("3 Layers");
techMetalLayers.addItem("4 Layers");
techMetalLayers.addItem("5 Layers");
techMetalLayers.addItem("6 Layers");
techMetalLayers.setSelectedIndex(getInt(mocmosNumMetalSetting)-2);
techMOCMOSSecondPoly.setSelected(getBoolean(mocmosSecondPolysiliconSetting));
techMOCMOSDisallowStackedVias.setSelected(getBoolean(mocmosDisallowStackedViasSetting));
techMOCMOSAlternateContactRules.setSelected(getBoolean(mocmosAlternateActivePolyRulesSetting));
techMOCMOSAnalog.setSelected(getBoolean(mocmosAnalogSetting));
// Technology Project preferences
for(Iterator<Technology> it = Technology.getTechnologies(); it.hasNext(); )
{
Technology tech = it.next();
defaultTechPulldown.addItem(tech.getTechName());
if (tech.isScaleRelevant()) technologyPopup.addItem(tech.getTechName());
}
defaultTechPulldown.setSelectedItem(getString(defaultTechnologySetting));
technologyPopup.setSelectedItem(User.getSchematicTechnology().getTechName());
technologyProcess.setSelected(processLayoutTechnologySetting.getBoolean());
// Tabs for extra technologies if available
initExtraTab("com.sun.electric.plugins.tsmc.CMOS90Tab", cmos90Panel);
initExtraTab("com.sun.electric.plugins.tsmc.TSMC180Tab", tsmc180Panel);
}
/**
* Method called when the "OK" panel is hit.
* Updates any changed fields in the Technology tab.
*/
public void term()
{
boolean redrawWindows = false;
boolean redrawMenus = false;
// Layout Preferences
boolean currentRotateTransistors = rotateLayoutTransistors.isSelected();
if (currentRotateTransistors != User.isRotateLayoutTransistors())
{
User.setRotateLayoutTransistors(currentRotateTransistors);
redrawMenus = true;
}
// VHDL name Preferences
GenerateVHDL.VHDLPreferences vp = new GenerateVHDL.VHDLPreferences(false);
for(int i=0; i<schemPrimModel.size(); i++)
{
String str = (String)schemPrimModel.get(i);
int spacePos = str.indexOf(' ');
if (spacePos < 0) continue;
String primName = str.substring(0, spacePos);
PrimitiveNode np = Schematics.tech().findNodeProto(primName);
if (np == null) continue;
String newVHDLname = str.substring(spacePos+3, str.length()-1);
vp.vhdlNames.put(np, newVHDLname);
}
putPrefs(vp);
// MOCMOS Project preferences
int currentNumMetals = techMetalLayers.getSelectedIndex() + 2;
int currentRules = MOCMOS_SCMOSRULES;
if (techMOCMOSSubmicronRules.isSelected()) currentRules = MOCMOS_SUBMRULES; else
if (techMOCMOSDeepRules.isSelected()) currentRules = MOCMOS_DEEPRULES;
boolean secondPoly = techMOCMOSSecondPoly.isSelected();
boolean alternateContactRules = techMOCMOSAlternateContactRules.isSelected();
if (techMOCMOSAnalog.isSelected())
{
// analog rules don't demand 2 metals, SCMOS (Dec 09)
// Keeping the 2 poly, no stacked vias anymore though
if (/*currentNumMetals != 2 || currentRules != MOCMOS_SCMOSRULES ||*/
currentRules == MOCMOS_DEEPRULES || !secondPoly || alternateContactRules)
{
JOptionPane.showMessageDialog(Main.getCurrentJFrame(),
"The Analog setting requires 2 polys, SCM or SUB rules and no alternate contact rules..." +
" making these changes with SUB rules");
// techMetalLayers.setSelectedIndex(0);
techMOCMOSSubmicronRules.setSelected(true);
techMOCMOSSecondPoly.setSelected(true);
techMOCMOSAlternateContactRules.setSelected(true);
// currentNumMetals = 2;
currentRules = MOCMOS_SUBMRULES;
secondPoly = true;
alternateContactRules = false;
}
}
switch (currentNumMetals)
{
// cannot use deep rules if less than 5 layers of metal
case 2:
case 3:
case 4:
if (currentRules == MOCMOS_DEEPRULES)
{
JOptionPane.showMessageDialog(Main.getCurrentJFrame(),
"Cannot use Deep rules if there are less than 5 layers of metal...using SubMicron rules.");
currentRules = MOCMOS_SUBMRULES;
}
break;
// cannot use scmos rules if more than 4 layers of metal
case 5:
case 6:
if (currentRules == MOCMOS_SCMOSRULES)
{
JOptionPane.showMessageDialog(Main.getCurrentJFrame(),
"Cannot use SCMOS rules if there are more than 4 layers of metal...using SubMicron rules.");
currentRules = MOCMOS_SUBMRULES;
}
break;
}
setInt(mocmosNumMetalSetting, currentNumMetals);
setInt(mocmosRuleSetSetting, currentRules);
setBoolean(mocmosSecondPolysiliconSetting, secondPoly);
setBoolean(mocmosDisallowStackedViasSetting, techMOCMOSDisallowStackedVias.isSelected());
setBoolean(mocmosAlternateActivePolyRulesSetting,alternateContactRules);
setBoolean(mocmosAnalogSetting, techMOCMOSAnalog.isSelected());
// Technology Project preferences
String currentTechName = (String)technologyPopup.getSelectedItem();
if (Technology.findTechnology(currentTechName) != null)
setString(schematicTechnologySetting, currentTechName);
setString(defaultTechnologySetting, (String)defaultTechPulldown.getSelectedItem());
boolean currentV = technologyProcess.isSelected();
if (currentV != processLayoutTechnologySetting.getBoolean())
{
setBoolean(processLayoutTechnologySetting, currentV);
// It will force the reload of the factory rules.
Technology.getCurrent().setCachedRules(null);
}
// Tabs for extra technologies if available
for (Object extraTechTab: extraTechTabs)
{
try
{
extraTechTab.getClass().getMethod("term").invoke(extraTechTab);
} catch (Exception e)
{
System.out.println("Exceptions while closing extra technologies: " + e.getMessage());
}
}
// update the display
if (redrawMenus)
{
Technology tech = Technology.getCurrent();
for(Iterator<WindowFrame> it = WindowFrame.getWindows(); it.hasNext(); )
{
WindowFrame wf = it.next();
wf.getPaletteTab().loadForTechnology(tech, wf);
}
}
if (redrawWindows)
EditWindow.repaintAllContents();
}
/**
* Method called when the factory reset is requested.
*/
public void reset()
{
// preferences
if (User.isFactoryRotateLayoutTransistors() != User.isRotateLayoutTransistors())
User.setRotateLayoutTransistors(User.isFactoryRotateLayoutTransistors());
putPrefs(new GenerateVHDL.VHDLPreferences(true));
}
private void initExtraTab(String className, JPanel panel)
{
try
{
Class<?> extraTechClass = Class.forName(className);
Object extraTechTab = extraTechClass.getConstructor(TechnologyTab.class, JPanel.class).newInstance(this, panel);
extraTechTabs.add(extraTechTab);
} catch (Exception e)
{
projectSettings.remove(panel);
}
}
private String makeLine(PrimitiveNode np, String vhdlName)
{
return np.getName() + " (" + vhdlName + ")";
}
/**
* Method called when the user clicks on a layer name in the scrollable list.
*/
private void schemClickPrim()
{
changingVHDL = true;
PrimitiveNode np = getSelectedPrim();
if (np == null) return;
String vhdlNames = schemPrimMap.get(np);
int slashPos = vhdlNames.indexOf('/');
if (slashPos < 0)
{
vhdlName.setText(vhdlNames);
vhdlNegatedName.setText("");
} else
{
vhdlName.setText(vhdlNames.substring(0, slashPos));
vhdlNegatedName.setText(vhdlNames.substring(slashPos+1));
}
changingVHDL = false;
}
private PrimitiveNode getSelectedPrim()
{
String str = (String)schemPrimList.getSelectedValue();
int spacePos = str.indexOf(' ');
if (spacePos >= 0) str = str.substring(0, spacePos);
PrimitiveNode np = Schematics.tech().findNodeProto(str);
return np;
}
/**
* Class to handle special changes to changes to a CIF layer.
*/
private static class SchemPrimDocumentListener implements DocumentListener
{
TechnologyTab dialog;
SchemPrimDocumentListener(TechnologyTab dialog) { this.dialog = dialog; }
public void changedUpdate(DocumentEvent e) { dialog.primVHDLChanged(); }
public void insertUpdate(DocumentEvent e) { dialog.primVHDLChanged(); }
public void removeUpdate(DocumentEvent e) { dialog.primVHDLChanged(); }
}
/**
* Method called when the user types a new VHDL into the schematics tab.
*/
private void primVHDLChanged()
{
if (changingVHDL) return;
String str = vhdlName.getText();
String strNot = vhdlNegatedName.getText();
String vhdl = "";
if (str.length() > 0 || strNot.length() > 0) vhdl = str + "/" + strNot;
PrimitiveNode np = getSelectedPrim();
if (np == null) return;
schemPrimMap.put(np, vhdl);
int index = schemPrimList.getSelectedIndex();
schemPrimModel.set(index, makeLine(np, vhdl));
}
public Foundry.Type setFoundrySelected(Technology tech, javax.swing.JComboBox pulldown)
{
String selectedFoundry = getString(tech.getPrefFoundrySetting());
Foundry.Type foundry = Foundry.Type.NONE;
for (Iterator<Foundry> itF = tech.getFoundries(); itF.hasNext();)
{
Foundry factory = itF.next();
Foundry.Type type = factory.getType();
pulldown.addItem(type);
if (selectedFoundry.equalsIgnoreCase(factory.getType().getName())) foundry = type;
}
pulldown.setEnabled(foundry != Foundry.Type.NONE);
pulldown.setSelectedItem(foundry);
return foundry;
}
/**
* Method to check whether the foundry value has been changed. If changed, primitives might need resizing.
* @param foundry
* @param tech
*/
public boolean checkFoundry(Foundry.Type foundry, Technology tech)
{
if (foundry == null) return false; // technology without design rules.
boolean changed = false;
if (!foundry.getName().equalsIgnoreCase(getString(tech.getPrefFoundrySetting())))
{
changed = true;
String [] messages = {
tech.getTechShortName()+" primitives in database might be resized according to values provided by " + foundry + ".",
"If you do not resize now, arc widths might not be optimal for " + foundry + ".",
"If you cancel the operation, the foundry will not be changed.",
"Do you want to resize the database?"};
Object [] options = {"Yes", "No", "Cancel"};
int val = JOptionPane.showOptionDialog(Main.getCurrentJFrame(), messages,
"Resize primitive Nodes and Arcs", JOptionPane.DEFAULT_OPTION,
JOptionPane.WARNING_MESSAGE, null, options, options[0]);
if (val != 2)
{
setString(tech.getPrefFoundrySetting(), foundry.getName());
}
}
return changed;
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
*/
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
mocmosGroup = new javax.swing.ButtonGroup();
preferences = new javax.swing.JPanel();
vhdlPrimPane = new javax.swing.JScrollPane();
jLabel2 = new javax.swing.JLabel();
vhdlName = new javax.swing.JTextField();
jLabel3 = new javax.swing.JLabel();
vhdlNegatedName = new javax.swing.JTextField();
rotateLayoutTransistors = new javax.swing.JCheckBox();
jLabel1 = new javax.swing.JLabel();
jSeparator1 = new javax.swing.JSeparator();
projectSettings = new javax.swing.JPanel();
defaultsPanel = new javax.swing.JPanel();
defaultTechLabel = new javax.swing.JLabel();
defaultTechPulldown = new javax.swing.JComboBox();
jLabel59 = new javax.swing.JLabel();
technologyPopup = new javax.swing.JComboBox();
technologyProcess = new javax.swing.JCheckBox();
mosisPanel = new javax.swing.JPanel();
techMetalLabel = new javax.swing.JLabel();
techMetalLayers = new javax.swing.JComboBox();
techMOCMOSSCMOSRules = new javax.swing.JRadioButton();
techMOCMOSSubmicronRules = new javax.swing.JRadioButton();
techMOCMOSDeepRules = new javax.swing.JRadioButton();
techMOCMOSSecondPoly = new javax.swing.JCheckBox();
techMOCMOSDisallowStackedVias = new javax.swing.JCheckBox();
techMOCMOSAlternateContactRules = new javax.swing.JCheckBox();
techMOCMOSAnalog = new javax.swing.JCheckBox();
cmos90Panel = new javax.swing.JPanel();
tsmc180Panel = new javax.swing.JPanel();
setTitle("Edit Options");
setName(""); // NOI18N
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
closeDialog(evt);
}
});
getContentPane().setLayout(new java.awt.GridBagLayout());
preferences.setLayout(new java.awt.GridBagLayout());
vhdlPrimPane.setMinimumSize(new java.awt.Dimension(22, 70));
vhdlPrimPane.setPreferredSize(new java.awt.Dimension(22, 70));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
preferences.add(vhdlPrimPane, gridBagConstraints);
jLabel2.setText("VHDL for primitive:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
preferences.add(jLabel2, gridBagConstraints);
vhdlName.setColumns(8);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
preferences.add(vhdlName, gridBagConstraints);
jLabel3.setText("VHDL for negated primitive:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 4, 4);
preferences.add(jLabel3, gridBagConstraints);
vhdlNegatedName.setColumns(8);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 4, 4);
preferences.add(vhdlNegatedName, gridBagConstraints);
rotateLayoutTransistors.setText("Rotate layout transistors in menu");
rotateLayoutTransistors.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 5;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 4, 4);
preferences.add(rotateLayoutTransistors, gridBagConstraints);
jLabel1.setText("Schematic primitives:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
preferences.add(jLabel1, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
preferences.add(jSeparator1, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
getContentPane().add(preferences, gridBagConstraints);
projectSettings.setLayout(new java.awt.GridBagLayout());
defaultsPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("Defaults"));
defaultsPanel.setLayout(new java.awt.GridBagLayout());
defaultTechLabel.setText("Startup technology:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 2, 4);
defaultsPanel.add(defaultTechLabel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 2, 4);
defaultsPanel.add(defaultTechPulldown, gridBagConstraints);
jLabel59.setText("Layout technology to use for Schematics:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
defaultsPanel.add(jLabel59, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
defaultsPanel.add(technologyPopup, gridBagConstraints);
technologyProcess.setText("PSubstrate process in Layout Technology");
technologyProcess.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
technologyProcessActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(1, 4, 4, 4);
defaultsPanel.add(technologyProcess, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 4;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
projectSettings.add(defaultsPanel, gridBagConstraints);
mosisPanel.setBorder(javax.swing.BorderFactory.createTitledBorder("mocmos Technology"));
mosisPanel.setLayout(new java.awt.GridBagLayout());
techMetalLabel.setText("Metal layers:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
mosisPanel.add(techMetalLabel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
mosisPanel.add(techMetalLayers, gridBagConstraints);
mocmosGroup.add(techMOCMOSSCMOSRules);
techMOCMOSSCMOSRules.setText("SCMOS rules (4 metal or less)");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 1, 4);
mosisPanel.add(techMOCMOSSCMOSRules, gridBagConstraints);
mocmosGroup.add(techMOCMOSSubmicronRules);
techMOCMOSSubmicronRules.setText("Submicron rules");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(1, 4, 1, 4);
mosisPanel.add(techMOCMOSSubmicronRules, gridBagConstraints);
mocmosGroup.add(techMOCMOSDeepRules);
techMOCMOSDeepRules.setText("Deep rules (5 metal or more)");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(1, 4, 4, 4);
mosisPanel.add(techMOCMOSDeepRules, gridBagConstraints);
techMOCMOSSecondPoly.setText("Second Polysilicon Layer");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 1, 4);
mosisPanel.add(techMOCMOSSecondPoly, gridBagConstraints);
techMOCMOSDisallowStackedVias.setText("Disallow stacked vias");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 5;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(1, 4, 1, 4);
mosisPanel.add(techMOCMOSDisallowStackedVias, gridBagConstraints);
techMOCMOSAlternateContactRules.setText("Alternate Active and Poly contact rules");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 6;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(1, 4, 1, 4);
mosisPanel.add(techMOCMOSAlternateContactRules, gridBagConstraints);
techMOCMOSAnalog.setText("Analog");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 7;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(1, 4, 4, 4);
mosisPanel.add(techMOCMOSAnalog, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.gridheight = 3;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
projectSettings.add(mosisPanel, gridBagConstraints);
cmos90Panel.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
cmos90Panel.setLayout(new java.awt.GridBagLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
projectSettings.add(cmos90Panel, gridBagConstraints);
tsmc180Panel.setBorder(javax.swing.BorderFactory.createTitledBorder(""));
tsmc180Panel.setLayout(new java.awt.GridBagLayout());
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 3;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
projectSettings.add(tsmc180Panel, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
getContentPane().add(projectSettings, gridBagConstraints);
pack();
}// </editor-fold>//GEN-END:initComponents
/** Closes the dialog */
private void closeDialog(java.awt.event.WindowEvent evt)//GEN-FIRST:event_closeDialog
{
setVisible(false);
dispose();
}//GEN-LAST:event_closeDialog
private void technologyProcessActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_technologyProcessActionPerformed
// TODO add your handling code here:
}//GEN-LAST:event_technologyProcessActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel cmos90Panel;
private javax.swing.JLabel defaultTechLabel;
private javax.swing.JComboBox defaultTechPulldown;
private javax.swing.JPanel defaultsPanel;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel59;
private javax.swing.JSeparator jSeparator1;
private javax.swing.ButtonGroup mocmosGroup;
private javax.swing.JPanel mosisPanel;
private javax.swing.JPanel preferences;
private javax.swing.JPanel projectSettings;
private javax.swing.JCheckBox rotateLayoutTransistors;
private javax.swing.JCheckBox techMOCMOSAlternateContactRules;
private javax.swing.JCheckBox techMOCMOSAnalog;
private javax.swing.JRadioButton techMOCMOSDeepRules;
private javax.swing.JCheckBox techMOCMOSDisallowStackedVias;
private javax.swing.JRadioButton techMOCMOSSCMOSRules;
private javax.swing.JCheckBox techMOCMOSSecondPoly;
private javax.swing.JRadioButton techMOCMOSSubmicronRules;
private javax.swing.JLabel techMetalLabel;
private javax.swing.JComboBox techMetalLayers;
private javax.swing.JComboBox technologyPopup;
private javax.swing.JCheckBox technologyProcess;
private javax.swing.JPanel tsmc180Panel;
private javax.swing.JTextField vhdlName;
private javax.swing.JTextField vhdlNegatedName;
private javax.swing.JScrollPane vhdlPrimPane;
// End of variables declaration//GEN-END:variables
}