coriolis/hurricane/src/hurricane/DeepNet.cpp

192 lines
5.3 KiB
C++

// -*- C++ -*-
//
// This file is part of the Coriolis Project.
// Copyright (C) Laboratoire LIP6 - Departement ASIM
// Universite Pierre et Marie Curie
//
// Main contributors :
// Christophe Alexandre <Christophe.Alexandre@lip6.fr>
// Hugo Clément <Hugo.Clement@lip6.fr>
// Jean-Paul Chaput <Jean-Paul.Chaput@lip6.fr>
// Christian Masson <Christian.Masson@lip6.fr>
//
// The Coriolis Project 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 2 of
// the License, or (at your option) any later version.
//
// The Coriolis Project 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 the Coriolis Project; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA
//
// License-Tag
// Authors-Tag
// ===================================================================
//
// $Id: DeepNet.cpp,v 1.4 2008/02/15 12:26:38 dosfin Exp $
//
// x-----------------------------------------------------------------x
// | |
// | H U R R I C A N E |
// | V L S I B a c k e n d D a t a - B a s e |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== |
// | C++ Header : "./DeepNet.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
# include "DeepNet.h"
# include "Cell.h"
# include "Instance.h"
# include "Plug.h"
# include "RoutingPad.h"
# include "Pin.h"
# include "Contact.h"
# include "Vertical.h"
# include "Horizontal.h"
# include "Pad.h"
# include "UpdateSession.h"
# include "Error.h"
namespace Hurricane {
namespace {
using namespace std;
using namespace Hurricane;
# if !defined(__DOXYGEN_PROCESSOR__)
# endif
} // End of local namespace.
// x-----------------------------------------------------------------x
// | "::DeepNet" Class Definitions |
// x-----------------------------------------------------------------x
# if !defined(__DOXYGEN_PROCESSOR__)
// -------------------------------------------------------------------
// Constructor : "DeepNet::DeepNet ()".
DeepNet::DeepNet ( Occurrence& netOccurrence )
: Net(netOccurrence.getOwnerCell()
,netOccurrence.getName()
)
, _netOccurrence(netOccurrence)
{
}
// -------------------------------------------------------------------
// Inspector Management : "DeepNet::_getRecord ()".
Record* DeepNet::_getRecord () const
{
Record* record = Net::_getRecord();
if (record) {
record->add(getSlot("_netOccurrence", &_netOccurrence));
}
return record;
}
# endif
// -------------------------------------------------------------------
// Constructor : "DeepNet::create ()".
DeepNet* DeepNet::create ( HyperNet& hyperNet )
{
if ( !hyperNet.isValid() )
throw Error ( "Can't create " + _TName("DeepNet") + ": occurence is invalid." );
Occurrence rootNetOccurrence = getHyperNetRootNetOccurrence ( hyperNet.getNetOccurrence() );
if ( rootNetOccurrence.getMasterCell()->isFlattenLeaf() ) return NULL;
if ( rootNetOccurrence.getPath().isEmpty() ) return NULL;
DeepNet* deepNet = new DeepNet ( rootNetOccurrence );
deepNet->_postCreate ();
return deepNet;
}
// -------------------------------------------------------------------
// Internal Modifier : "DeepNet::_createRoutingPads ()".
size_t DeepNet::_createRoutingPads ( bool buildRings )
{
size_t nbRoutingPads = 0;
HyperNet hyperNet ( _netOccurrence );
RoutingPad* previousRP = NULL;
RoutingPad* currentRP = NULL;
for_each_occurrence ( plugOccurrence, hyperNet.getLeafPlugOccurrences() ) {
nbRoutingPads++;
currentRP = createRoutingPad ( this, plugOccurrence );
if ( buildRings ) {
if ( previousRP ) {
currentRP->getBodyHook()->attach ( previousRP->getBodyHook() );
}
previousRP = currentRP;
}
end_for
}
return nbRoutingPads;
}
// -------------------------------------------------------------------
//
Net* getDeepNet(HyperNet& hypernet)
// ********************************
{
Occurrence rootNetOccurrence = getHyperNetRootNetOccurrence ( hypernet.getNetOccurrence() );
//if ( rootNetOccurrence.getMasterCell()->IsFlattenLeaf() ) return NULL;
//if ( rootNetOccurrence.getPath().IsEmpty() ) return NULL;
return rootNetOccurrence.getOwnerCell()->getNet(rootNetOccurrence.getName());
}
} // End of Hurricane namespace.