/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: IAnalyzer.java
*
* Copyright (c) 2010, 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.api.irsim;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.net.URL;
import java.util.Collection;
import java.util.List;
/**
* IRSIM simulator interface that is implemented by plugin
*/
public interface IAnalyzer {
/**
* Create IRSIM Simulation Engine to simulate a cell.
* @param gui interface to GUI
* @param steppingModel stepping model either "RC" or "Linear"
* @param parameterURL URL of IRSIM parameter file
* @param irDebug debug flags
* @param showCommands tru to print issued IRSIM commands
* @param isDelayedX true if using the delayed X model, false if using the old fast-propagating X model.
*/
public EngineIRSIM createEngine(GUI gui, String steppingModel, URL parameterURL, int irDebug, boolean showCommands, boolean isDelayedX);
public interface EngineIRSIM {
/**
* Put triansitor into the circuit
* @param gateName name of transistor gate network
* @param sourceName name of transistor gate network
* @param drainName drain name of transistor gate network
* @param gateLength gate length (lambda)
* @param gateWidth gate width (lambda)
* @param activeArea active area (lambda^2)
* @param activePerim active perim (lambda^2)
* @param centerX x-coordinate of center (lambda)
* @param centerY y coordinate of cneter (lambda)
* @param isNTypeTransistor true if this is N-type transistor
*/
public void putTransistor(String gateName, String sourceName, String drainName,
double gateLength, double gateWidth,
double activeArea, double activePerim,
double centerX, double centerY,
boolean isNTypeTransistor);
/**
* Put resistor into the circuit
* @param net1 name of first terminal network
* @param net2 name of second terminal network
* @param resistance resistance (ohm)
*/
public void putResistor(String net1, String net2, double resistance);
/**
* Put capacitor into the circuit
* @param net1 name of first terminal network
* @param net2 name of second terminal network
* @param capacitance capacitance (pf)
*/
public void putCapacitor(String net1, String net2, double capacitance);
/**
* Load a .sim file into memory.
*
* A .sim file consists of a series of lines, each of which begins with a key letter.
* The key letter beginning a line determines how the remainder of the line is interpreted.
* The following are the list of key letters understood.
*
* | units: s tech: tech format: MIT|LBL|SU
* If present, this must be the first line in the .sim file.
* It identifies the technology of this circuit as tech and gives a scale factor for units of linear dimension as s.
* All linear dimensions appearing in the .sim file are multiplied by s to give centimicrons.
* The format field signifies the sim variant. Electric only recognizes SU format.
* type g s d l w x y g=gattrs s=sattrs d=dattrs
* Defines a transistor of type type. Currently, type may be e or d for NMOS, or p or n for CMOS.
* The name of the node to which the gate, source, and drain of the transistor are connected are given by g, s, and d respectively.
* The length and width of the transistor are l and w. The next two tokens, x and y, are optional.
* If present, they give the location of a point inside the gate region of the transistor.
* The last three tokens are the attribute lists for the transistor gate, source, and drain.
* If no attributes are present for a particular terminal, the corresponding attribute list may be absent
* (i.e, there may be no g= field at all).
* The attribute lists gattrs, etc. are comma-separated lists of labels.
* The label names should not include any spaces, although some tools can accept label names with
* spaces if they are enclosed in double quotes. In version 6.4.5 and later the default format
* produced by ext2sim is SU. In this format the attribute of the gate starting with S_ is the substrate node of the fet.
* The attributes of the gate, and source and substrate starting with A_, P_ are the area and perimeter
* (summed for that node only once) of the source and drain respectively. This addition to the format is backwards compatible.
* C n1 n2 cap
* Defines a capacitor between nodes n1 and n2. The value of the capacitor is cap femtofarads.
* NOTE: since many analysis tools compute transistor gate capacitance themselves from the
* transistor's area and perimeter, the capacitance between a node and substrate (GND!)
* normally does not include the capacitance from transistor gates connected to that node.
* If the .sim file was produced by ext2sim(1), check the technology file that was used to
* produce the original .ext files to see whether transistor gate capacitance is included or excluded;
* see "Magic Maintainer's Manual 2 - The Technology File for details.
* R node res
* Defines the lumped resistance of node node to be res ohms.
* r node1 node2 res
* Defines an explicit resistor between nodes node1 and node2 of resistance res ohms.
* N node darea dperim parea pperim marea mperim
* As an alternative to computed capacitances, some tools expect the total perimeter and area
* of the polysilicon, diffusion, and metal in each node to be reported in the .sim file.
* The N construct associates diffusion area darea (in square centimicrons) and diffusion
* perimeter dperim (in centimicrons) with node node, polysilicon area parea and perimeter pperim,
* and metal area marea and perimeter mperim. This construct is technology dependent and obsolete.
* = node1 node2
* Each node in a .sim file is named implicitly by having it appear in a transistor definition.
* All node names appearing in a .sim file are assumed to be distinct.
* Some tools, such as esim(1), recognize aliases for node names.
* The = construct allows the name node2 to be defined as an alias for the name node1.
* Aliases defined by means of this construct may not appear anywhere else in the .sim file.
* @param simReader Reader of .sim file
* @param fileName file name for error messages
* @return number of errors
*/
public int inputSim(Reader simReader, String fileName) throws IOException;
/**
* Finish initialization of the circuit.
*/
public void finishNetwork();
/**
* Get lambda value in nanometers
* @return lambda in nanometers
*/
public double getLambda();
/**
* Finish initialization of the circuit and convert Stimuli.
*/
public void convertStimuli();
/**
* Finish initialization
*/
public void init();
/**
* Method to play the simulation vectors into the simulator.
*/
public void playVectors();
public void newContolPoint(String signalName, double insertTime, LogicState value);
/**
* Method to show information about the currently-selected signal.
*/
public void showSignalInfo(GuiSignal sig);
/**
* Method to clear all simulation vectors.
*/
public void clearAllVectors();
/**
* Method to remove all stimuli from the currently-selected signal.
* @param sig currently selected signal.
*/
public void clearControlPoints(GuiSignal sig);
/**
* Method to remove the selected stimuli.
* @return true if stimuli were deleted.
*/
public boolean clearControlPoint(GuiSignal sig, double insertTime);
/**
* Method to save the current stimuli information to disk.
* @param stimuliFile file to save stimuli information
*/
public void saveStimuli(File stimuliFile) throws IOException;
/**
* Method to restore the current stimuli information from URL.
* @param reader Reader with stimuli information
*/
public void restoreStimuli(Reader reader) throws IOException;
}
public interface GUI {
public GuiSignal makeSignal(String name);
public void makeBusSignals(List<GuiSignal> sigList);
public void createBus(String busName, GuiSignal ... subsigs);
public Collection<GuiSignal> getSignals();
public void setMainXPositionCursor(double curTime);
public void openPanel(Collection<GuiSignal> sigs);
public void closePanels();
public double getMaxPanelTime();
public void repaint();
/**
* Returns canonic char for ignore-case comparison .
* This is the same as Character.toLowerCase(Character.toUpperCase(ch)).
* @param ch given char.
* @return canonic char for the given char.
*/
public char canonicChar(char ch);
/**
* Returns canonic string for ignore-case comparison .
* FORALL String s1, s2: s1.equalsIgnoreCase(s2) == canonicString(s1).equals(canonicString(s2)
* FORALL String s: canonicString(canonicString(s)).equals(canonicString(s))
* @param s given String
* @return canonic String
* Simple "toLowerCase" is not sufficient.
* For example ("\u0131").equalsIgnoreCase("i") , but Character.toLowerCase('\u0131') == '\u0131' .
*/
public String canonicString(String s);
/**
* Method to parse the floating-point number in a string.
* There is one reason to use this method instead of Double.parseDouble:
* this method does not throw an exception if the number is invalid (or blank).
* @param text the string with a number in it.
* @return the numeric value.
*/
public double atof(String text);
/**
* Method to parse the number in a string.
* <P>
* There are many reasons to use this method instead of Integer.parseInt...
* <UL>
* <LI>This method can handle any radix.
* If the number begins with "0", presume base 8.
* If the number begins with "0b", presume base 2.
* If the number begins with "0x", presume base 16.
* Otherwise presume base 10.
* <LI>This method can handle numbers that affect the sign bit.
* If you give 0xFFFFFFFF to Integer.parseInt, you get a numberFormatPostFix exception.
* This method properly returns -1.
* <LI>This method does not require that the entire string be part of the number.
* If there is extra text after the end, Integer.parseInt fails (for example "123xx").
* <LI>This method does not throw an exception if the number is invalid (or blank).
* </UL>
* @param s the string with a number in it.
* @return the numeric value.
*/
public int atoi(String s);
/**
* Method to convert a double to a string.
* If the double has no precision past the decimal, none will be shown.
* @param v the double value to format.
* @return the string representation of the number.
*/
public String formatDouble(double v);
}
public interface GuiSignal {
public String getFullName();
public String getSignalName();
public GuiSignal[] getBusMembers();
public void addControlPoint(double time);
public void removeControlPoint(double time);
public void addSample(double t, LogicState v);
}
public enum LogicState { LOGIC_0, LOGIC_1, LOGIC_X };
}