
 // -*- C++ -*-


 namespace Hurricane {

 /*! \class        CompositeLayer
  *  \brief        CompositeLayer description (\b API)
  *
  *  \section      secCompositeLayerIntro  Introduction
  *
  *                Composite layers are an assembly of basic layers. 
  *
  *                Given a rectangular area filled with a composite layer we can 
  *                determine, according to different geometrical parameters, 
  *                which are the characteristics of the different pads filled 
  *                with each basic layer building the composite layer. Those 
  *                parameters are the following : ContactSize, SegmentSize, 
  *                SegmentExtention and PadSize. They differ for each basic 
  *                layer participating to a composite layer. Refer to the 
  *                chapter ExpandRules in order to get more information on the 
  *                meaning of those parameters. 
  */



 /*! \typedef      CompositeLayer::Inherit
  *                Useful for calling upon methods of the base class without 
  *                knowing it. 
  */

 /*! \class        CompositeLayer::Type
  *                This enumeration defines the composite layer types. table: 
  *                Composite Layer Types headers: Name Code Signification slots: 
  *                UNDEFINED 0 Undefined type slots: METAL 4 Routing layer 
  *                slots: VIA 5 Contact layer 
  */


 /*! \function     CompositeLayer* CompositeLayer::create(Technology* technology,const Name& name,const CompositeLayer::Type& type,const Unit& minimalSize = 0,const Unit& minimalSpacing = 0);
  *                creates and returns a new composite layer named \c \<name\>, 
  *                of type \c \<type\> for the given technology (some 
  *                geometrical characteristics can also be specified). 
  *
  *  \caution      Throws an exception if the technology is null, if the name is 
  *                empty or if a layer of same name already exists. 
  */


 /*! \function     const CompositeLayer::Type& CompositeLayer::getType() const;
  *  \Return       the composite layer type. 
  */

 /*! \function     Unit CompositeLayer::getContactSize(const BasicLayer* basicLayer) const;
  *  \Return       the contact size associated to the basic layer 
  *                \c \<basicLayer\> (0 if this basic layer doesn't pertains to 
  *                composite one). 
  */

 /*! \function     Unit CompositeLayer::getSegmentSize(const BasicLayer* basicLayer) const;
  *  \Return       the segment size associated to the basic layer 
  *                \c \<basicLayer\> (0 if this basic layer doesn't pertains to 
  *                composite one). 
  */

 /*! \function     Unit CompositeLayer::getSegmentExtention(const BasicLayer* basicLayer) const;
  *  \Return       the segment extension associated to the basic layer 
  *                \c \<basicLayer\> (0 if this basic layer doesn't pertains to 
  *                composite one). 
  */

 /*! \function     Unit CompositeLayer::getPadSize(const BasicLayer* basicLayer) const;
  *  \Return       the pad size associated to the basic layer \c \<basicLayer\> 
  *                (0 if this basic layer doesn't pertains to composite one). 
  */

 /*! \function     const Unit& CompositeLayer::getMaximalContactSize() const;
  *  \Return       the maximum contact size for all the basic layers composing 
  *                the composite layer. 
  */

 /*! \function     const Unit& CompositeLayer::getMaximalSegmentSize() const;
  *  \Return       the maximum segment size for all the basic layers composing 
  *                the composite layer. 
  */

 /*! \function     const Unit& CompositeLayer::getMaximalSegmentExtention() const;
  *  \Return       the maximum segment extension for all the basic layers 
  *                composing the composite layer. 
  */

 /*! \function     const Unit& CompositeLayer::getMaximalPadSize() const;
  *  \Return       the maximum pad size for all the basic layers composing the 
  *                composite layer. 
  */


 /*! \function     void CompositeLayer::add(BasicLayer* basicLayer,const Unit& contactSize,const Unit& segmentSize,const Unit& segmentExtention,const Unit& padSize);
  *                adds the basic layer with associated characteristics 
  *                specified by the other arguments. 
  *
  *  \caution      Throws an exception if the basic layer is null or already 
  *                present in the composite layer. 
  *
  *                Usage example : 
\code
DataBase* dataBase = getDataBase();
 
Technology* technology = dataBaseGetTechnology();
 
CompositeLayer* metal2 = technologyGetCompositeLayer("metal2"):
 
Unit contactSize = getUnit(0.5);
Unit segmentSize = getUnit(1.0);
Unit segmentExtention = getUnit(1.3);
Unit padSize = getUnit(0);
 
BasicLayer* CM2 = technologyGetBasicLayer("CM2");
 
metal2Add(CM2, contactSize, segmentSize, segmentExtention, padSize);
 
assert(metal2GetContactSize(CM2) == contactSize);
assert(metal2GetSegmentSize(CM2) == segmentSize);
assert(metal2GetSegmentExtention(CM2) == segmentExtention);
assert(metal2GetPadSize(CM2) == padSize);
\endcode
  *
  *                
  */

 /*! \function     void CompositeLayer::remove(BasicLayer* basicLayer);
  *                removes the basic layer from the composite layer. 
  *
  *  \caution      Throws an exception if the basic layer is null or it doesn't 
  *                pertain to the composite layer. 
  */


 //! \name         CompositeLayer Collection
 //  \{

 /*! \typedef      CompositeLayers
  *                Generic collection representing a set of composite layers. 
  */

 /*! \typedef      CompositeLayerLocator
  *                Generic locator for traversing a collection of composite 
  *                layers. 
  */

 /*! \typedef      CompositeLayerFilter
  *                Generic filter allowing to select a subset of composite 
  *                layers matching some criteria. 
  */

 /*! \def          for_each_composite_layer(compositeLayer, compositeLayers)
  *                Macro for visiting all the composite layers of a collection 
  *                of composite layers. 
  */

 //  \}


 }
