
 // -*- C++ -*-


 namespace Hurricane {

 /*! \class        Layer
  *  \brief        Layer description (\b API)
  *
  *  \section      secLayerIntro  Introduction
  *
  *                There are two layer types : Basic layers which are indeed the 
  *                real process layers (GDS ones) and composite layers on which 
  *                are located components of the layout. A composite layer 
  *                groups a set of basic layers. For example, the contact layer 
  *                VIA12 is built of the basic layers CM1 (metal1), CM2 (metal2) 
  *                and C12 (contact cuts between CM1 and CM2). 
  *
  *                Like for the Technology object, a layer must not be deleted, 
  *                else all components located on it will have a dangling 
  *                pointer to an deleted object ... 
  */

 /*! \typedef      Layer::Mask
  *                This type represents a mask bit field characterising 
  *                efficiently the constituents of any kind of layer. It 
  *                associates to each basic layer a bit and to each composite 
  *                layer the union of the bits corresponding to its basic 
  *                layers. 
  */

 /*! \name         Accessors
  */
 //  \{

 /*! \function     Technology* Layer::getTechnology() const;
  *  \Return       the technolgy owning the layer. 
  */

 /*! \function     const Name& Layer::getName() const;
  *  \Return       the name of the layer. 
  */

 /*! \function     const Layer::Mask& Layer::getMask() const;
  *  \Return       the mask associated to the layer. 
  */

 /*! \function     const Layer::Mask& Layer::getExtractMask() const;
  *  \Return       the mask used for extraction. 
  *
  *                Two differents basic layers have different masks but may have 
  *                same extraction masks (ie CP layer which represent poly and 
  *                CPG which represent poly used to realize transistor gates). 
  */

 /*! \function     const DbU::Unit& Layer::getMinimalSize() const;
  *  \Return       the minimal size allowed for a rectangular layout pad on this 
  *                layer. 
  */

 /*! \function     const DbU::Unit& Layer::getMinimalSpacing() const;
  *  \Return       the minimal spacing between two pads on this layer. 
  */

 /*! \function     BasicLayers Layer::getBasicLayers() const;
  *  \Return       the collection of basic layers within this layer. 
  *
  *  \remark       For a basic layer the collection contains this one only. 
  */

 //  \}


 /*! \name         Predicates
  */
 //  \{

 /*! \function     bool Layer::contains(const Layer* layer) const;
  *  \Return       \true if the \c \<layer\> is completely included in the layer 
  *                \c \<this\> (that is if the basic layers of \c \<layer\> are 
  *                a sub-set of the basic layers of \c \<this\>), else \false. 
  */

 /*! \function     bool Layer::intersect(const Layer* layer) const;
  *  \Return       \true if the \c \<layer\> and the layer \c \<this\> have at 
  *                least a common basic layer, else \false. 
  */

 //  \}


 /*! \name         Modifiers
  */
 //  \{

 /*! \function     void Layer::setName(const Name& name);
  *                sets or changes the layer name. 
  *
  *  \remark       An exception is thrown if the name is empty or if there is an 
  *                other layer with that name. 
  */

 /*! \function     void Layer::setMinimalSize(const DbU::Unit& minimalSize);
  *                sets the minimal size of a pad on this layer. 
  */

 /*! \function     void Layer::setMinimalSpacing(const DbU::Unit& minimalSpacing);
  *                sets the minimal spacing between two pads on this layer. 
  */

 //  \}


 /*! \name         Layer Collection
  */
 //  \{

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

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

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

 /*! \def          for_each_layer(layer, layers)
  *                Macro for visiting all the layers of a collection of layers. 
  */

 //  \}


 }
