📄 techeditwizarddata.java
字号:
/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: TechEditWizardData.java * Create an Electric XML Technology from a simple numeric description of design rules * Written in Perl by Andrew Wewist, translated to Java by Steven Rubin. * * Copyright (c) 2008 Sun Microsystems and Static Free Software * * 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.tecEditWizard;import com.sun.electric.database.text.TextUtils;import com.sun.electric.database.geometry.*;import com.sun.electric.database.geometry.Poly;import com.sun.electric.tool.Job;import com.sun.electric.tool.io.FileType;import com.sun.electric.tool.user.dialogs.OpenFile;import com.sun.electric.technology.*;import java.awt.Color;import java.io.BufferedWriter;import java.io.FileWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.LineNumberReader;import java.io.PrintWriter;import java.net.URL;import java.net.URLConnection;import java.util.ArrayList;import java.util.LinkedHashMap;import java.util.List;import java.util.Map;/** * Class to handle the "Technology Creation Wizard" dialog. */public class TechEditWizardData{ /************************************** THE DATA **************************************/ private String tech_name; private String tech_description; private int num_metal_layers; private int stepsize; private boolean pWellFlag = true; // to store if process is a pwell process or not. If true, Tech Creation Wizard will not create pwell layers private boolean horizontalFlag = true; // to store if transistor gates are aligned horizontally. True by default // DIFFUSION RULES private WizardField diff_width = new WizardField(); private WizardField diff_poly_overhang = new WizardField(); // min. diff overhang from gate edge private WizardField diff_contact_overhang = new WizardField(); // min. diff overhang contact private WizardField diff_spacing = new WizardField(); // POLY RULES private WizardField poly_width = new WizardField(); private WizardField poly_endcap = new WizardField(); // min. poly gate extension from edge of diffusion private WizardField poly_spacing = new WizardField(); private WizardField poly_diff_spacing = new WizardField(); // min. spacing between poly and diffusion // GATE RULES private WizardField gate_length = new WizardField(); // min. transistor gate length private WizardField gate_width = new WizardField(); // min. transistor gate width private WizardField gate_spacing = new WizardField(); // min. gate to gate spacing on diffusion private WizardField gate_contact_spacing = new WizardField(); // min. spacing from gate edge to contact inside diffusion // CONTACT RULES private WizardField contact_size = new WizardField(); private WizardField contact_spacing = new WizardField(); private WizardField contact_array_spacing = new WizardField(); private WizardField contact_metal_overhang_inline_only = new WizardField(); // metal overhang when overhanging contact from two sides only private WizardField contact_metal_overhang_all_sides = new WizardField(); // metal overhang when surrounding contact private WizardField contact_poly_overhang = new WizardField(); // poly overhang contact private WizardField polycon_diff_spacing = new WizardField(); // spacing between poly-metal contact edge and diffusion // WELL AND IMPLANT RULES private WizardField nplus_width = new WizardField(); private WizardField nplus_overhang_diff = new WizardField(); private WizardField nplus_overhang_poly = new WizardField(); private WizardField nplus_spacing = new WizardField(); private WizardField pplus_width = new WizardField(); private WizardField pplus_overhang_diff = new WizardField(); private WizardField pplus_overhang_poly = new WizardField(); private WizardField pplus_spacing = new WizardField(); private WizardField nwell_width = new WizardField(); private WizardField nwell_overhang_diff_p = new WizardField(); private WizardField nwell_overhang_diff_n = new WizardField(); private WizardField nwell_spacing = new WizardField(); // METAL RULES private WizardField [] metal_width; private WizardField [] metal_spacing; // VIA RULES private WizardField [] via_size; private WizardField [] via_spacing; private WizardField [] via_array_spacing; private WizardField [] via_overhang_inline; // ANTENNA RULES private double poly_antenna_ratio; private double [] metal_antenna_ratio; // GDS-II LAYERS private int gds_diff_layer; private int gds_poly_layer; private int gds_nplus_layer; private int gds_pplus_layer; private int gds_nwell_layer; private int gds_contact_layer; private int [] gds_metal_layer; private int [] gds_via_layer; private int gds_marking_layer; // Device marking layer public TechEditWizardData() { stepsize = 100; num_metal_layers = 2; metal_width = new WizardField[num_metal_layers]; metal_spacing = new WizardField[num_metal_layers]; via_size = new WizardField[num_metal_layers-1]; via_spacing = new WizardField[num_metal_layers-1]; via_array_spacing = new WizardField[num_metal_layers-1]; via_overhang_inline = new WizardField[num_metal_layers-1]; metal_antenna_ratio = new double[num_metal_layers]; gds_metal_layer = new int[num_metal_layers]; gds_via_layer = new int[num_metal_layers-1]; for(int i=0; i<num_metal_layers; i++) { metal_width[i] = new WizardField(); metal_spacing[i] = new WizardField(); } for(int i=0; i<num_metal_layers-1; i++) { via_size[i] = new WizardField(); via_spacing[i] = new WizardField(); via_array_spacing[i] = new WizardField(); via_overhang_inline[i] = new WizardField(); } } /************************************** ACCESSOR METHODS **************************************/ public String getTechName() { return tech_name; } public void setTechName(String s) { tech_name = s; } public String getTechDescription() { return tech_description; } public void setTechDescription(String s) { tech_description = s; } public int getStepSize() { return stepsize; } public void setStepSize(int n) { stepsize = n; } public int getNumMetalLayers() { return num_metal_layers; } public void setNumMetalLayers(int n) { int smallest = Math.min(n, num_metal_layers); WizardField [] new_metal_width = new WizardField[n]; for(int i=0; i<smallest; i++) new_metal_width[i] = metal_width[i]; for(int i=smallest; i<n; i++) new_metal_width[i] = new WizardField(); metal_width = new_metal_width; WizardField [] new_metal_spacing = new WizardField[n]; for(int i=0; i<smallest; i++) new_metal_spacing[i] = metal_spacing[i]; for(int i=smallest; i<n; i++) new_metal_spacing[i] = new WizardField(); metal_spacing = new_metal_spacing; WizardField [] new_via_size = new WizardField[n-1]; for(int i=0; i<smallest-1; i++) new_via_size[i] = via_size[i]; for(int i=smallest-1; i<n-1; i++) new_via_size[i] = new WizardField(); via_size = new_via_size; WizardField [] new_via_spacing = new WizardField[n-1]; for(int i=0; i<smallest-1; i++) new_via_spacing[i] = via_spacing[i]; for(int i=smallest-1; i<n-1; i++) new_via_spacing[i] = new WizardField(); via_spacing = new_via_spacing; WizardField [] new_via_array_spacing = new WizardField[n-1]; for(int i=0; i<smallest-1; i++) new_via_array_spacing[i] = via_array_spacing[i]; for(int i=smallest-1; i<n-1; i++) new_via_array_spacing[i] = new WizardField(); via_array_spacing = new_via_array_spacing; WizardField [] new_via_overhang_inline = new WizardField[n-1]; for(int i=0; i<smallest-1; i++) new_via_overhang_inline[i] = via_overhang_inline[i]; for(int i=smallest-1; i<n-1; i++) new_via_overhang_inline[i] = new WizardField(); via_overhang_inline = new_via_overhang_inline; double [] new_metal_antenna_ratio = new double[n]; for(int i=0; i<smallest; i++) new_metal_antenna_ratio[i] = metal_antenna_ratio[i]; metal_antenna_ratio = new_metal_antenna_ratio; int [] new_gds_metal_layer = new int[n]; for(int i=0; i<smallest; i++) new_gds_metal_layer[i] = gds_metal_layer[i]; gds_metal_layer = new_gds_metal_layer; int [] new_gds_via_layer = new int[n-1]; for(int i=0; i<smallest-1; i++) new_gds_via_layer[i] = gds_via_layer[i]; gds_via_layer = new_gds_via_layer; num_metal_layers = n; } // Flags boolean getPWellProcess() { return pWellFlag;} void setPWellProcess(boolean b) { pWellFlag = b; } boolean getHorizontalTransistors() { return horizontalFlag;} void setHorizontalTransistors(boolean b) { horizontalFlag = b; } // DIFFUSION RULES WizardField getDiffWidth() { return diff_width; } void setDiffWidth(WizardField v) { diff_width = v; } WizardField getDiffPolyOverhang() { return diff_poly_overhang; } void setDiffPolyOverhang(WizardField v) { diff_poly_overhang = v; } WizardField getDiffContactOverhang() { return diff_contact_overhang; } void setDiffContactOverhang(WizardField v) { diff_contact_overhang = v; } WizardField getDiffSpacing() { return diff_spacing; } void setDiffSpacing(WizardField v) { diff_spacing = v; } // POLY RULES WizardField getPolyWidth() { return poly_width; } void setPolyWidth(WizardField v) { poly_width = v; } WizardField getPolyEndcap() { return poly_endcap; } void setPolyEndcap(WizardField v) { poly_endcap = v; } WizardField getPolySpacing() { return poly_spacing; } void setPolySpacing(WizardField v) { poly_spacing = v; } WizardField getPolyDiffSpacing() { return poly_diff_spacing; } void setPolyDiffSpacing(WizardField v) { poly_diff_spacing = v; } // GATE RULES WizardField getGateLength() { return gate_length; } void setGateLength(WizardField v) { gate_length = v; } WizardField getGateWidth() { return gate_width; } void setGateWidth(WizardField v) { gate_width = v; } WizardField getGateSpacing() { return gate_spacing; } void setGateSpacing(WizardField v) { gate_spacing = v; } WizardField getGateContactSpacing() { return gate_contact_spacing; } void setGateContactSpacing(WizardField v) { gate_contact_spacing = v; } // CONTACT RULES WizardField getContactSize() { return contact_size; } void setContactSize(WizardField v) { contact_size = v; } WizardField getContactSpacing() { return contact_spacing; } void setContactSpacing(WizardField v) { contact_spacing = v; } WizardField getContactArraySpacing() { return contact_array_spacing; } void setContactArraySpacing(WizardField v) { contact_array_spacing = v; } WizardField getContactMetalOverhangInlineOnly() { return contact_metal_overhang_inline_only; } void setContactMetalOverhangInlineOnly(WizardField v) { contact_metal_overhang_inline_only = v; } WizardField getContactMetalOverhangAllSides() { return contact_metal_overhang_all_sides; } void setContactMetalOverhangAllSides(WizardField v) { contact_metal_overhang_all_sides = v; } WizardField getContactPolyOverhang() { return contact_poly_overhang; } void setContactPolyOverhang(WizardField v) { contact_poly_overhang = v; } WizardField getPolyconDiffSpacing() { return polycon_diff_spacing; } void setPolyconDiffSpacing(WizardField v) { polycon_diff_spacing = v; } // WELL AND IMPLANT RULES WizardField getNPlusWidth() { return nplus_width; } void setNPlusWidth(WizardField v) { nplus_width = v; } WizardField getNPlusOverhangDiff() { return nplus_overhang_diff; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -