// -*- C++ -*-
/*! \mainpage
*
* \section secMainDoc Software Architecture
*
*
* \subsection ssecUniqueInstance Unique Instance-Cell Relationship
*
* MetaTransistor and Device are derived classes of Cell and are the
* building blocks of all analogic designs.
* - MetaTransistor(s) are used to build the Devices, and \e only them.
* - Device(s) are then assembled into more complex design.
*
* The important point to remember is that Device and MetaTransistor
* \b are Cell(s).
*
* \note An analogy can be made between the Devices and the Standard Cells
* in the numeric world.
*
* In Analog designs, Devices and MetaTransistors are all parametriseds
* in such a way that each one become effectively unique. So any
* Device or MetaTransistor is only instanciated once with it's specific
* set of parameter's values, thus there is a \b unique relationship between
* a Device and it's instance. We can keep tab of only one of the two.
* As the Cell contains more information, this is the one we choose.
* But we still need the Instance to perform (store) the placement
* informations. So, how to get the Instance from one Device.
*
* Method 1: name matching.
*
* For the sake of clarity, we impose that the Device name must be identical
* to the instance name. This way we can lookup for an Instance in the
* top device with the same name as the current model. We assume that we
* indeed have the containing Cell in handy:
*
\code
Instance* instance = parentCell->getInstance( cell->getName() );
\endcode
*
* Method 2: Slave instance.
*
* In the Hurricane data structure, every Device (Cell) keep track of the
* Instances pointing to it. Since there should be only one in analogic,
* we can do the following:
*
\code
Instance* instance = cell->getSlaveInstances().getFirst();
\endcode
*
*
* \subsection ssecWhyMetaTrans Why Meta-Transistor
*
* The Hurricane database does not have true support for transistor
* as Cell(s), only a dedicated layer for Segment. Hence the
* implementation of the MetaTransistor in Hurricane/Analog. It provides
* a Cell derived class with four connectors (\c G , \c S , \c D ,
* \c B ) and a comprenhensive set of electrical parameters.
*
* It is meant to represent a complete transistor, not a finger
* of a larger one, it \b is the larger one...
*
*
* \subsection ssecClassOrg Class Organization
*
* Almost UML schema of the Device related classes.
*
* \image html device_schema_1_uml.png
*
* For the Transistor device:
*
* -# The netlist is fixed and generated (in C++) in the Transistor, by
* instanciating one MetaTransistor.
* -# The layout is generated on the fly by calling the relevant
* python sceript.
* -# The parameters, which are commons to all the Transistor based
* devices are created in TransistorFamily. The parameters are created
* through the Device parameter factory and stored at the Device level.
* A pointer to the concrete type of Parameter is also kept at the
* TransistorFamily level.
* -# The Device::getParameters() method is implemented at this level
* and returns a TransistorArguments pointer.
* -# Parameters are used to set up the Device characteristics, either
* programmatically or through the Pharos
graphical
* interface.
* -# Arguments
, on the other hand, are mostly used to
* transmit the setting of a Device (i.e. it's Parameters values)
* to the Python script in charge of the layout generation.
* Arguments have Python wrapper PyArguments, and it is copies of
* the values that are transmitted.
*
*
* \subsection ssecOpenQuestions Open questions
*
* -# As Arguments are used to transmit parameters, why not simply
* encapsulate Parameters in a Python wrapper? Thus completly
* suppressing Arguments. And by the way, using pointers to
* to make the relationship bi-directionnal (event if it's not
* needed now).
*/