first commit
This commit is contained in:
parent
b88b10988a
commit
2c80b6000e
|
@ -0,0 +1,13 @@
|
||||||
|
project(HURRICANE)
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 2.4.0)
|
||||||
|
|
||||||
|
set(CMAKE_MODULE_PATH "cmake_modules/")
|
||||||
|
|
||||||
|
find_package(Qt4 REQUIRED) # find and setup Qt4 for this project
|
||||||
|
FIND_PACKAGE(BISON REQUIRED)
|
||||||
|
FIND_PACKAGE(FLEX REQUIRED)
|
||||||
|
|
||||||
|
add_subdirectory(hurricane)
|
||||||
|
add_subdirectory(analogic)
|
||||||
|
add_subdirectory(figures)
|
|
@ -0,0 +1,45 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: AnalogicalCommons.h
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_ANALOGICALCOMMONS
|
||||||
|
#define HURRICANE_ANALOGICALCOMMONS
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// *********************************************************************
|
||||||
|
// Macros Declaration.
|
||||||
|
// *********************************************************************
|
||||||
|
|
||||||
|
# define TRANSN 'N'
|
||||||
|
# define TRANSP 'P'
|
||||||
|
|
||||||
|
|
||||||
|
# define MAXNBCONTACT 8
|
||||||
|
|
||||||
|
# define IF_DEBUG_HUR_ANALOG \
|
||||||
|
if(getenv("DEBUG_HUR_ANALOG")) {
|
||||||
|
|
||||||
|
# ifndef END_IF
|
||||||
|
# define END_IF \
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
// *********************************************************************
|
||||||
|
// Analogical Unit declaration.
|
||||||
|
// *********************************************************************
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
|
||||||
|
typedef double Micro;
|
||||||
|
typedef double MicroPower2;
|
||||||
|
typedef long Nano;
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#include "TwoSpaces.h"
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HURRICANE_ANALOGICALCOMMONS
|
|
@ -0,0 +1,43 @@
|
||||||
|
set(includes RdsUnit.h)
|
||||||
|
|
||||||
|
include_directories(${HURRICANE_SOURCE_DIR}/hurricane)
|
||||||
|
|
||||||
|
add_custom_target(DTRParser echo "Creating DTRParser")
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
SOURCE ${HURRICANE_SOURCE_DIR}/analogic/ParserDtrScan.ll
|
||||||
|
COMMAND ${FLEX_EXECUTABLE}
|
||||||
|
ARGS -Pdtr -o${HURRICANE_BINARY_DIR}/analogic/ParserDtrScan.cpp
|
||||||
|
${HURRICANE_SOURCE_DIR}/analogic/ParserDtrScan.ll
|
||||||
|
TARGET DTRParser
|
||||||
|
OUTPUTS ${HURRICANE_BINARY_DIR}/analogic/ParserDtrScan.cpp)
|
||||||
|
|
||||||
|
add_custom_command(
|
||||||
|
SOURCE ${HURRICANE_SOURCE_DIR}/analogic/ParserDtrGram.yy
|
||||||
|
COMMAND ${BISON_EXECUTABLE}
|
||||||
|
ARGS -d -v -p dtr -y ${HURRICANE_SOURCE_DIR}/analogic/ParserDtrGram.yy
|
||||||
|
-o ${HURRICANE_BINARY_DIR}/analogic/ParserDtrGram.cpp
|
||||||
|
TARGET DSTParser
|
||||||
|
DEPENDS ${HURRICANE_BINARY_DIR}/analogic/ParserDtrScan.cpp
|
||||||
|
OUTPUTS ${HURRICANE_BINARY_DIR}/analogic/ParserDtrGram.cpp)
|
||||||
|
|
||||||
|
set(DST_SRCS ${DST_SRCS} ${HURRICANE_BINARY_DIR}/analogic/ParserDtrGram.cpp
|
||||||
|
${HURRICANE_BINARY_DIR}/analogic/ParserDtrScan.cpp)
|
||||||
|
|
||||||
|
SET_SOURCE_FILES_PROPERTIES(${HURRICANE_BINARY_DIR}/analogic/ParserDtrGram.cpp GENERATED)
|
||||||
|
SET_SOURCE_FILES_PROPERTIES(${HURRICANE_BINARY_DIR}/analogic/ParserDtrScan.cpp GENERATED)
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES(${HURRICANE_BINARY_DIR}/analogic/)
|
||||||
|
|
||||||
|
add_library(analogic SHARED
|
||||||
|
${DST_SRCS}
|
||||||
|
DtrAccess.cpp
|
||||||
|
GenericDtrAccess.cpp
|
||||||
|
GenV1Trans.cpp
|
||||||
|
MetaTransistor.cpp
|
||||||
|
RdsUnit.cpp
|
||||||
|
Transistor.cpp
|
||||||
|
TwoSpaces.cpp)
|
||||||
|
|
||||||
|
install(FILES ${includes} DESTINATION /include/hurricane)
|
||||||
|
install(TARGETS analogic DESTINATION /lib)
|
|
@ -0,0 +1,307 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: DtrAccess.cpp
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "DtrAccess.h"
|
||||||
|
#include "RdsUnit.h"
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
#include "DataBase.h"
|
||||||
|
#include "Technology.h"
|
||||||
|
|
||||||
|
extern void ParseDtr(const char*, Hurricane::DtrAccess*);
|
||||||
|
|
||||||
|
|
||||||
|
BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DtrAccess implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
// static data defintion
|
||||||
|
// *********************
|
||||||
|
DtrAccess* DtrAccess::_instance = NULL;
|
||||||
|
|
||||||
|
map<string, DtrAccess*> DtrAccess::_registry;
|
||||||
|
|
||||||
|
DtrAccess::DtrAccess()
|
||||||
|
// *******************
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DtrAccess * DtrAccess::Create()
|
||||||
|
// *****************************
|
||||||
|
{
|
||||||
|
DtrAccess * dtraccess = new DtrAccess();
|
||||||
|
|
||||||
|
dtraccess->_PostCreate();
|
||||||
|
|
||||||
|
return dtraccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DtrAccess::_PostCreate()
|
||||||
|
// **************************
|
||||||
|
{
|
||||||
|
const char * dtrfilename = getenv("DTR_FILE");
|
||||||
|
if(!dtrfilename) {
|
||||||
|
throw Error("Can't not get Macro DTR_FILE.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use API of DtrParser for get technology informations
|
||||||
|
// ****************************************************
|
||||||
|
ParseDtr(dtrfilename, this);
|
||||||
|
|
||||||
|
// Traduit Micro to RdsUnit
|
||||||
|
// ************************
|
||||||
|
map<string, list<double> >::iterator it_rulemap = _label2ruleMap.begin(),
|
||||||
|
it_end_rulemap = _label2ruleMap.end();
|
||||||
|
|
||||||
|
while(it_rulemap!=it_end_rulemap) {
|
||||||
|
|
||||||
|
list<double>::iterator m = ((*it_rulemap).second).begin()
|
||||||
|
, n = ((*it_rulemap).second).end();
|
||||||
|
|
||||||
|
while(m!=n) {
|
||||||
|
_label2RdsRuleMap[(*it_rulemap).first].push_back(ConvertRealToRdsUnit(*m));
|
||||||
|
m++;
|
||||||
|
}
|
||||||
|
it_rulemap++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get Objet Layer from Technology with its name.
|
||||||
|
// **********************************************
|
||||||
|
|
||||||
|
DataBase * db = GetDataBase();
|
||||||
|
|
||||||
|
if(!db) throw Error("In GetV1Trans::Generate : can't find DataBase.");
|
||||||
|
|
||||||
|
Technology * tech = db->GetTechnology();
|
||||||
|
|
||||||
|
map<string, list<string> >::iterator it_layermap = _label2layerNameMap.begin(),
|
||||||
|
it_end_layermap = _label2layerNameMap.end();
|
||||||
|
|
||||||
|
while(it_layermap != it_end_layermap) {
|
||||||
|
|
||||||
|
list<string>::iterator m = (*it_layermap).second.begin(),
|
||||||
|
n = (*it_layermap).second.end();
|
||||||
|
|
||||||
|
while(m!=n) {
|
||||||
|
Layer * layer = tech->GetLayer(Name(*m));
|
||||||
|
if(!layer) {
|
||||||
|
throw Error("Error : in function DtrAccess::_PostCreate , Can't find Layer "
|
||||||
|
+ GetString(*m) + " in technology file when parser DtrFile.");
|
||||||
|
// cerr << Warning("In function DtrAccess::_PostCreate , Can't find Layer "
|
||||||
|
// + GetString(*m) + " in technology file when parser DtrFile");
|
||||||
|
}
|
||||||
|
|
||||||
|
_label2layerMap[(*it_layermap).first].push_back(layer);
|
||||||
|
m++;
|
||||||
|
}
|
||||||
|
it_layermap++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
DtrAccess * DtrAccess::Instance()
|
||||||
|
// *****************************
|
||||||
|
{
|
||||||
|
// User or environnement supplies this at startup
|
||||||
|
// **********************************************
|
||||||
|
const char * singleton_name = getenv("DTRACCESS_SINGLETON");
|
||||||
|
|
||||||
|
if(!singleton_name) { // if MACRO IS INVALID
|
||||||
|
if(!_instance) {
|
||||||
|
_instance = DtrAccess::Create();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(!_instance){
|
||||||
|
if( !(_instance=LookUp(string(singleton_name))) ) // if singleton hasn't been registered
|
||||||
|
_instance = DtrAccess::Create();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return _instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DtrAccess::_PreDelete()
|
||||||
|
// ***********************
|
||||||
|
{
|
||||||
|
// Do something
|
||||||
|
// ************
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DtrAccess::Delete()
|
||||||
|
// ********************
|
||||||
|
{
|
||||||
|
_PreDelete();
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GenericCollection<double> DtrAccess::GetRuleByLabel(const string& label) const
|
||||||
|
// ***************************************************************************
|
||||||
|
{
|
||||||
|
map<string, list<double> >::const_iterator i = _label2ruleMap.find(label);
|
||||||
|
|
||||||
|
if(i==_label2ruleMap.end())
|
||||||
|
throw Error("Can't find in DtrFile rule the label : " + GetString(label));
|
||||||
|
|
||||||
|
return GetCollection((*i).second);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GenericCollection<long> DtrAccess::GetRdsRuleByLabel(const string& label) const
|
||||||
|
// ******************************************************************************
|
||||||
|
{
|
||||||
|
map<string, list<long> >::const_iterator i = _label2RdsRuleMap.find(label);
|
||||||
|
|
||||||
|
if(i==_label2RdsRuleMap.end())
|
||||||
|
throw Error("Can't find in DtrFile The Rds Value of Rule by label : " + GetString(label));
|
||||||
|
|
||||||
|
return GetCollection((*i).second);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GenericCollection<string> DtrAccess::GetLayerNamesByLabel(const string& label) const
|
||||||
|
// *********************************************************************************
|
||||||
|
{
|
||||||
|
map<string, list<string> >::const_iterator i = _label2layerNameMap.find(label);
|
||||||
|
|
||||||
|
if(i==_label2layerNameMap.end())
|
||||||
|
throw Error("Can't find in DtrFile layers the label : " + label);
|
||||||
|
|
||||||
|
return GetCollection((*i).second);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GenericCollection<Layer*> DtrAccess::GetLayersByLabel(const string& label) const
|
||||||
|
// ******************************************************************************
|
||||||
|
{
|
||||||
|
map<string, list<Layer*> >::const_iterator i = _label2layerMap.find(label);
|
||||||
|
|
||||||
|
if(i==_label2layerMap.end())
|
||||||
|
throw Error("Can't find in DtrFile objet Layer by label : " + label );
|
||||||
|
|
||||||
|
return GetCollection((*i).second);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GenericCollection<double> DtrAccess::GetElectricalsByLabel(const string& label) const
|
||||||
|
// **********************************************************************************
|
||||||
|
{
|
||||||
|
map<string, list<double> >::const_iterator i = _label2electricalMap.find(label);
|
||||||
|
|
||||||
|
if(i==_label2electricalMap.end())
|
||||||
|
throw Error("Can't find in DtrFile electricals by label : " + label);
|
||||||
|
|
||||||
|
return GetCollection((*i).second);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int DtrAccess::GetModellingByLabel(const string& label) const
|
||||||
|
// **********************************************************
|
||||||
|
{
|
||||||
|
map<string, int>::const_iterator i = _label2modellingMap.find(label);
|
||||||
|
|
||||||
|
if(i==_label2modellingMap.end())
|
||||||
|
throw Error("Can't find in DtrFile modelling by label : " + GetString(label));
|
||||||
|
|
||||||
|
return (*i).second;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
double DtrAccess::GetSimpleCapaMimByLabel(const string& label) const
|
||||||
|
// ****************************************************************
|
||||||
|
{
|
||||||
|
map<string, double>::const_iterator i = _label2simplecapamimMap.find(label);
|
||||||
|
|
||||||
|
if(i==_label2simplecapamimMap.end())
|
||||||
|
throw Error("Can't find in DtrFile simple capa mim by label : " + GetString(label));
|
||||||
|
|
||||||
|
return (*i).second;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------------------------------------
|
||||||
|
// Function "DtrAccess::LookUp(const string&)".
|
||||||
|
//
|
||||||
|
|
||||||
|
/* \static DtrAccess* DtrAccess::LookUp(const string& singletonname)
|
||||||
|
* \param singletonname normally the name of derive class of DtrAccess.
|
||||||
|
* \return addresse of objet singleton of derive class if success.
|
||||||
|
* NULL if failure.
|
||||||
|
*
|
||||||
|
* Find the singleton objet if it exist according to the singletonname.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
DtrAccess* DtrAccess::LookUp(const string& singletonname)
|
||||||
|
// ******************************************************
|
||||||
|
{
|
||||||
|
map<string, DtrAccess*>::iterator i = _registry.find(singletonname);
|
||||||
|
|
||||||
|
if(i==_registry.end())
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return (*i).second;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Function Register(const string&, DtrAccess*)
|
||||||
|
|
||||||
|
/* \void DtrAccess::Register(const string& singletonname, DtrAccess* dtraccess)
|
||||||
|
* \param singletonname the name of derive class.
|
||||||
|
* \param dtraccess addresse of objet singleton of derive class.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* This function is to be called when the singleton objet of derive class is
|
||||||
|
* created.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
void DtrAccess::Register(const string& singletonname, DtrAccess* dtraccess)
|
||||||
|
// *************************************************************************
|
||||||
|
{
|
||||||
|
_registry[singletonname]=dtraccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string DtrAccess::_GetString() const
|
||||||
|
// **********************************
|
||||||
|
{
|
||||||
|
string s("Singleton DtrAccess");
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Record* DtrAccess::_GetRecord() const
|
||||||
|
// **********************************
|
||||||
|
{
|
||||||
|
Record* record = new Record(_GetString());
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
string GetString(const H::DtrAccess& access)
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
return access._GetString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,187 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: DtrAccess.h
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_DTRACCESS
|
||||||
|
#define HURRICANE_DTRACCESS
|
||||||
|
|
||||||
|
#include "Layer.h"
|
||||||
|
#include "Layers.h"
|
||||||
|
|
||||||
|
//BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class DtrAccess {
|
||||||
|
// **************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
private : static DtrAccess * _instance;
|
||||||
|
|
||||||
|
private : map<string, list<double> > _label2ruleMap;
|
||||||
|
private : map<string, list<string> > _label2layerNameMap;
|
||||||
|
private : map<string, list<double> > _label2electricalMap;
|
||||||
|
private : map<string, int> _label2modellingMap;
|
||||||
|
private : map<string, double> _label2simplecapamimMap;
|
||||||
|
|
||||||
|
private : map<string, list<long> > _label2RdsRuleMap;
|
||||||
|
private : map<string, list<Layer*> > _label2layerMap;
|
||||||
|
|
||||||
|
|
||||||
|
// For reusability of software
|
||||||
|
// ***************************
|
||||||
|
private : static map<string, DtrAccess*> _registry;
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
protected : DtrAccess();
|
||||||
|
private : DtrAccess(const DtrAccess&);
|
||||||
|
private : DtrAccess& operator=(const DtrAccess&);
|
||||||
|
|
||||||
|
protected : static DtrAccess * Create();
|
||||||
|
protected : virtual void _PostCreate();
|
||||||
|
# endif
|
||||||
|
|
||||||
|
public : static DtrAccess* Instance();
|
||||||
|
|
||||||
|
// Destructors
|
||||||
|
// ***********
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
protected : virtual ~DtrAccess() {};
|
||||||
|
protected : virtual void _PreDelete();
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
public : virtual void Delete();
|
||||||
|
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
// If can't find data , throw Hurricane::Error
|
||||||
|
// *******************************************
|
||||||
|
public : GenericCollection<double> GetRuleByLabel(const string&) const;
|
||||||
|
public : GenericCollection<long> GetRdsRuleByLabel(const string&) const;
|
||||||
|
public : GenericCollection<string> GetLayerNamesByLabel(const string&) const;
|
||||||
|
public : Layers GetLayersByLabel(const string&) const;
|
||||||
|
public : GenericCollection<double> GetElectricalsByLabel(const string& ) const;
|
||||||
|
public : int GetModellingByLabel(const string&) const;
|
||||||
|
public : double GetSimpleCapaMimByLabel(const string&) const;
|
||||||
|
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
public : double GetSingleRealRuleByLabel(const string& s) const
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
GenericLocator<double> locator = GetRuleByLabel(s).GetLocator();
|
||||||
|
return locator.GetElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
public : long GetSingleRdsRuleByLabel(const string& s) const
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
GenericLocator<long> locator = GetRdsRuleByLabel(s).GetLocator();
|
||||||
|
return locator.GetElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
public : string GetSingleLayerNameByLabel(const string& s) const
|
||||||
|
// ****************************************************
|
||||||
|
{
|
||||||
|
GenericLocator<string> locator = GetLayerNamesByLabel(s).GetLocator();
|
||||||
|
return locator.GetElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
public : Layer* GetSingleLayerByLabel(const string& s) const
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
LayerLocator locator = GetLayersByLabel(s).GetLocator();
|
||||||
|
return locator.GetElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
public : double GetSingleRealRuleByLabel(char* prefix, const string& type, char* suffix) const
|
||||||
|
// **********************************************************************************
|
||||||
|
{
|
||||||
|
return GetSingleRealRuleByLabel(prefix + type + suffix);
|
||||||
|
}
|
||||||
|
|
||||||
|
public : long GetSingleRdsRuleByLabel(char* prefix, const string& type, char* suffix) const
|
||||||
|
// *******************************************************************************
|
||||||
|
{
|
||||||
|
return GetSingleRdsRuleByLabel(prefix + type + suffix);
|
||||||
|
}
|
||||||
|
|
||||||
|
public : string GetSingleLayerNameByLabel(char* prefix, const string& type, const string& suffix) const
|
||||||
|
// ************************************************************************************
|
||||||
|
{
|
||||||
|
return GetSingleLayerNameByLabel(prefix + type + suffix);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public : Layer* GetSingleLayerByLabel(char* prefix, const string& type, const string& suffix) const
|
||||||
|
// ***************************************************************************************
|
||||||
|
{
|
||||||
|
return GetSingleLayerByLabel(prefix + type + suffix);
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
public : void AddRuleByLabel(const string& label, const list<double>& rule){ _label2ruleMap[label]=rule; };
|
||||||
|
public : void AddLayersByLabel(const string& label, const list<string>& layers) { _label2layerNameMap[label]=layers; };
|
||||||
|
public : void AddElectricalsByLabel(const string& label, const list<double>& electricals)
|
||||||
|
{ _label2electricalMap[label]=electricals; };
|
||||||
|
|
||||||
|
public : void AddModellingByLabel(const string& label, const int modelling) { _label2modellingMap[label]=modelling; };
|
||||||
|
public : void AddSimpleCapaMimByLabel(const string& label, const double capamim) { _label2simplecapamimMap[label]=capamim; };
|
||||||
|
|
||||||
|
// Operations
|
||||||
|
// **********
|
||||||
|
|
||||||
|
// For reusability of software
|
||||||
|
// ***************************
|
||||||
|
protected : static DtrAccess* LookUp(const string&);
|
||||||
|
protected : static void Register(const string& , DtrAccess* );
|
||||||
|
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
public: virtual string _GetTypeName() const {return _TName("DtrAccess");};
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
|
||||||
|
public: map<string, list<double> >& _GetLabel2RuleMap() { return _label2ruleMap; };
|
||||||
|
public: map<string, list<string> >& _GetLabel2LayerNameMap() { return _label2layerNameMap; };
|
||||||
|
public: map<string, list<double> >& _GetLabel2ElectricalMap()
|
||||||
|
{ return _label2electricalMap; };
|
||||||
|
public: map<string, int>& _GetLabel2ModellingMap() { return _label2modellingMap; };
|
||||||
|
public: map<string, double>& _GetLabel2SimpleCapaMimMap()
|
||||||
|
{ return _label2simplecapamimMap; };
|
||||||
|
# endif
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
string GetString(const H::DtrAccess&);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HURRICANE_DTRACCESS
|
|
@ -0,0 +1,220 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: GenTrans.h
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 04/04/2007
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef HURRICANE_GENTRANS
|
||||||
|
#define HURRICANE_GENTRANS
|
||||||
|
|
||||||
|
|
||||||
|
#include "Transistor.h"
|
||||||
|
#include "Box.h"
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// Macro Method : "MAXLONG(a,b), MINLONG(a,b)"
|
||||||
|
// Comparaison Method Macro For Calculate Rectangles.
|
||||||
|
|
||||||
|
# define MAXLONG(a,b) (a>b?a:b)
|
||||||
|
# define MINLONG(a,b) (a>b?b:a)
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// Macro Method : "GET_RULE(s)"
|
||||||
|
// This Method Macro is For Geting The Value in RdsUnit of a DRM Rule.
|
||||||
|
// To Use This Macro, you must predefine Pointeur dtraccess.
|
||||||
|
|
||||||
|
# define GET_RULE(s) \
|
||||||
|
dtraccess->GetSingleRdsRuleByLabel(string(s))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// Macro Method "GET_RULE_BYNP(prefix, type, suffix)"
|
||||||
|
// This Method Macro is For Geting The Value in RdsUnit of a DRM Rule
|
||||||
|
// selected by string type which is mostype .
|
||||||
|
|
||||||
|
/* \prefix must be a chain character.
|
||||||
|
* \type mos type('N'/'P'), must be a string.
|
||||||
|
* \suffix must be a chain character.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// To Use This Macro, you must Predefine Pointeur dtraccess.
|
||||||
|
|
||||||
|
# define GET_RULE_BYNP(prefix, type, suffix) \
|
||||||
|
dtraccess->GetSingleRdsRuleByLabel(prefix, type, suffix)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// Macro Method : "Get_LAYER_BYNP(prefix, type, suffix)"
|
||||||
|
// This Method Macro is For Geting the Layer of a Layer Rule Selected
|
||||||
|
// by string type which is mostype. To Use This Macro, you must predefine
|
||||||
|
// Pointeur dtraccess.
|
||||||
|
|
||||||
|
/* \prefix must be a chain of character.
|
||||||
|
* \type mos type('N'/'P'), must be a string.
|
||||||
|
* \suffix must be a string.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// To Use This Macro, you must Predefine Pointeur dtraccess.
|
||||||
|
|
||||||
|
# define GET_LAYER_BYNP(prefix, type, suffix) \
|
||||||
|
dtraccess->GetSingleLayerByLabel(prefix, type, suffix)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// Macro Method : "SAVE_RECTANGLE(S, x, y, dx, dy)"
|
||||||
|
// This Method Macro is For Saving A Rectangle in a map .
|
||||||
|
|
||||||
|
/* \s name of rectangle, must be a chain of character.
|
||||||
|
* \x xmin, must be a long.
|
||||||
|
* \y ymin, must be a long.
|
||||||
|
* \dx width, must be a long.
|
||||||
|
* \dy height, must be a long.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This Method Macro must be used in Membre Function Calculate.
|
||||||
|
|
||||||
|
# define SAVE_RECTANGLE(s, x, y, dx, dy) \
|
||||||
|
_mapString2Box[string(s)] = Box(GetUnit(x), GetUnit(y), GetUnit(x+dx), GetUnit(y+dy)); \
|
||||||
|
xmin = MINLONG(xmin, GetUnit(x)); \
|
||||||
|
ymin = MINLONG(ymin, GetUnit(y));
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------------------
|
||||||
|
// Macro Method : "GET_BOX(s)"
|
||||||
|
// This Method Macro is For Get the box According to the its name.
|
||||||
|
|
||||||
|
/*
|
||||||
|
* \s name of rectangle, must be a string.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This Method Macro must be used in member function of Class GenTrans.
|
||||||
|
//
|
||||||
|
|
||||||
|
# define GET_BOX(s) \
|
||||||
|
_mapString2Box[s]
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------
|
||||||
|
// Macro Method : "CREATE_CONTACT_MATRIX_UNDER(boxname, nbcolumn, layer, net)"
|
||||||
|
// This Method Macro is For Create a matrix of Contact under a zone for
|
||||||
|
// a net specified.
|
||||||
|
|
||||||
|
/* \underbox A rectangle under which contacts will be placed, must be a objet Box.
|
||||||
|
* \nbcolumn the number of column, must be a integer.
|
||||||
|
* \layer the layer of contact, must be a pointer of type Layer*.
|
||||||
|
* \net the net to be hooked, must be a pointer of type Net*.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// To use this Macro Function. You Must also définir variable nbcontact,
|
||||||
|
// tmp_xcenter, tmp_ycenter, rw_cont, rd_cont.
|
||||||
|
//
|
||||||
|
|
||||||
|
# define CREATE_CONTACT_MATRIX_UNDER(underbox, nbcolumn, layer, net) \
|
||||||
|
\
|
||||||
|
if(underbox.GetHeight()<rw_cont) \
|
||||||
|
nbcontact = 0; \
|
||||||
|
else \
|
||||||
|
nbcontact = (underbox.GetHeight()-rw_cont)/(rw_cont + rd_cont) + 1 ;\
|
||||||
|
\
|
||||||
|
\
|
||||||
|
tmp_xcenter = underbox.GetXMin() + (rw_cont/2); \
|
||||||
|
tmp_ycenter = underbox.GetYMin() + (rw_cont/2); \
|
||||||
|
\
|
||||||
|
\
|
||||||
|
for(unsigned i=0; i<nbcolumn; i++) { \
|
||||||
|
\
|
||||||
|
for(unsigned j=0; j<nbcontact; j++) { \
|
||||||
|
Contact::Create(net, layer \
|
||||||
|
, tmp_xcenter \
|
||||||
|
, tmp_ycenter \
|
||||||
|
, rw_cont \
|
||||||
|
, rw_cont \
|
||||||
|
); \
|
||||||
|
\
|
||||||
|
tmp_ycenter += (rw_cont + rd_cont); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
tmp_xcenter += (rw_cont + rd_cont); \
|
||||||
|
tmp_ycenter = underbox.GetYMin() + (rw_cont/2); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// Macro Function : "BOX_IS_VALID(box)"
|
||||||
|
// This Macro Function is for check if the box is correctly in the
|
||||||
|
// grille of fondor. It will check if the value of x,y,dx,dy are all
|
||||||
|
// pair.
|
||||||
|
|
||||||
|
/*
|
||||||
|
* box the box is to check. must be a objet Box.
|
||||||
|
*/
|
||||||
|
|
||||||
|
# define BOX_IS_VALID(box) \
|
||||||
|
( (long)(GetValue(box.GetXMin()))%2==0 )&& \
|
||||||
|
( (long)(GetValue(box.GetXMax()))%2==0 )&& \
|
||||||
|
( (long)(GetValue(box.GetYMin()))%2==0 )&& \
|
||||||
|
( (long)(GetValue(box.GetYMax()))%2==0 )
|
||||||
|
|
||||||
|
|
||||||
|
BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
class GenTrans {
|
||||||
|
// *************
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
protected : map<string, Box> _mapString2Box;
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// *************
|
||||||
|
public : GenTrans() {};
|
||||||
|
|
||||||
|
// Destructors
|
||||||
|
// ***********
|
||||||
|
public : virtual ~GenTrans() {};
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// **********
|
||||||
|
public : virtual void Calculate(Transistor*) = 0;
|
||||||
|
public : virtual void Generate(Transistor*) = 0;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class GenV1Trans : public GenTrans {
|
||||||
|
// *********************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
public : typedef GenTrans Inherit;
|
||||||
|
|
||||||
|
// Attributs
|
||||||
|
// *********
|
||||||
|
public : const Transistor::MaskV1Info* _masqueV1Info;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
public : GenV1Trans(Transistor::MaskV1Info*);
|
||||||
|
|
||||||
|
// Destructors
|
||||||
|
// ************
|
||||||
|
public : virtual ~GenV1Trans() {};
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
public : virtual void Calculate(Transistor*) ;
|
||||||
|
public : virtual void Generate(Transistor*) ;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,539 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: GenV1Trans.cpp
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 04/04/2007
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
#include "RdsUnit.h"
|
||||||
|
#include "GenTrans.h"
|
||||||
|
#include "DtrAccess.h"
|
||||||
|
#include "GenericDtrAccess.h"
|
||||||
|
|
||||||
|
#include "Technology.h"
|
||||||
|
#include "UpdateSession.h"
|
||||||
|
|
||||||
|
#include "DataBase.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Globals Datas
|
||||||
|
// ****************************************************************************************************
|
||||||
|
string segsforsource[] = {string("20"), string("23")};
|
||||||
|
string segsfordrain[] = {string("40"), string("43")};
|
||||||
|
string segsforgrid[] = {string("00"), string("01"), string("30"), string("31")};
|
||||||
|
//string segsforgrid[] = {string("00"), string("30") };
|
||||||
|
string segsforanonym[] = {string("10"), string("11"), string("12"), string("50")};
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Class GetV1Trans implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
GenV1Trans::GenV1Trans(Transistor::MaskV1Info* masqueinfo)
|
||||||
|
// *********************************************************
|
||||||
|
: _masqueV1Info(masqueinfo)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GenV1Trans::Calculate(Transistor* transistor)
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
DtrAccess * dtraccess = DtrAccess::Instance();
|
||||||
|
|
||||||
|
// Check out mask param.
|
||||||
|
// *********************
|
||||||
|
if(_masqueV1Info->GetL() < dtraccess->GetSingleRealRuleByLabel("L_TRANS") ||
|
||||||
|
_masqueV1Info->GetL() > dtraccess->GetSingleRealRuleByLabel("L_TRANS_MAX") ||
|
||||||
|
_masqueV1Info->GetW() < dtraccess->GetSingleRealRuleByLabel("W_TRANS") ||
|
||||||
|
_masqueV1Info->GetW() > dtraccess->GetSingleRealRuleByLabel("W_TRANS_MAX") )
|
||||||
|
|
||||||
|
throw Error("Can't launch function GenV1Trans::Calculate for " + GetString(transistor)
|
||||||
|
+ " the L " + GetString(_masqueV1Info->GetL())
|
||||||
|
+ " or the W " + GetString(_masqueV1Info->GetW())
|
||||||
|
+ " of this transistor is invalid."
|
||||||
|
);
|
||||||
|
|
||||||
|
if(_masqueV1Info->GetNbSourceColumn() < 1 || _masqueV1Info->GetNbSourceColumn() > MAXNBCONTACT ||
|
||||||
|
_masqueV1Info->GetNbDrainColumn() < 1 || _masqueV1Info->GetNbDrainColumn() > MAXNBCONTACT )
|
||||||
|
|
||||||
|
throw Error("Can't launch function GenV1Trans::Calculate for " + GetString(transistor)
|
||||||
|
+ " the nbsourcecolumn " + GetString(_masqueV1Info->GetNbSourceColumn())
|
||||||
|
+ " or the nbdraincolumn " + GetString(_masqueV1Info->GetNbDrainColumn())
|
||||||
|
+ " of this transistor is invalid."
|
||||||
|
);
|
||||||
|
|
||||||
|
IF_DEBUG_HUR_ANALOG
|
||||||
|
cout << ts << GetString(transistor) + " 's masqueinfo is " + GetString(_masqueV1Info)
|
||||||
|
<< endl;
|
||||||
|
END_IF
|
||||||
|
|
||||||
|
|
||||||
|
// Tempory Variable.
|
||||||
|
// **************************
|
||||||
|
long x00, y00, dx00, dy00;
|
||||||
|
long x10, y10, dx10, dy10;
|
||||||
|
long x11, y11, dx11, dy11;
|
||||||
|
long x12, y12, dx12, dy12;
|
||||||
|
long x20, y20, dx20, dy20;
|
||||||
|
long x23, y23, dx23, dy23;
|
||||||
|
long x30, y30, dx30, dy30;
|
||||||
|
long x31, y31, dx31, dy31;
|
||||||
|
long x01, y01, dx01, dy01;
|
||||||
|
long x40, y40, dx40, dy40;
|
||||||
|
long x43, y43, dx43, dy43;
|
||||||
|
long x50, y50, dx50, dy50;
|
||||||
|
|
||||||
|
long xmin = 999999L, ymin = 999999L;
|
||||||
|
long realw = 0;
|
||||||
|
|
||||||
|
// Tempory Variable.
|
||||||
|
// **************************
|
||||||
|
long extension1 = 0;
|
||||||
|
long extension2 = 0;
|
||||||
|
long extension3 = 0;
|
||||||
|
long extension4 = 0;
|
||||||
|
long ymax = 0;
|
||||||
|
string mostype; // Get Mos Type (N/P).
|
||||||
|
|
||||||
|
if(transistor->IsNmos())
|
||||||
|
mostype='N';
|
||||||
|
else
|
||||||
|
mostype='P';
|
||||||
|
|
||||||
|
//string mostype; // Get Mos Type (N/P).
|
||||||
|
//mostype=transistor->GetType();
|
||||||
|
|
||||||
|
// -------------------------------------------------------------
|
||||||
|
// Begin Calculate.
|
||||||
|
|
||||||
|
//long re_imp_acti = GET_RULE_BYNP("RE_", mostype, "IMP_ACTI");
|
||||||
|
long re_imp_acti = GET_RULE_BYNP("RE_", mostype, "IMP_ACTI");
|
||||||
|
long re_imp_poly = GET_RULE_BYNP("RE_", mostype, "IMP_POLY");
|
||||||
|
long re_imp_cont = GET_RULE_BYNP("RE_", mostype, "IMP_CONT");
|
||||||
|
long re_imp_gate = GET_RULE_BYNP("RE_", mostype, "IMP_GATE");
|
||||||
|
//long re_well_acti = GET_RULE_BYNP("RE_", mostype, "WELL_ACTI");
|
||||||
|
|
||||||
|
// Calculate Rectangle 00
|
||||||
|
// **********************
|
||||||
|
x00 = 0;
|
||||||
|
y00 = -( GET_RULE("RE_GATE_ACTI") );
|
||||||
|
|
||||||
|
dx00 = ConvertRealToRdsUnit(_masqueV1Info->GetL());
|
||||||
|
realw = ConvertRealToRdsUnit(_masqueV1Info->GetW());
|
||||||
|
|
||||||
|
dy00 = realw + 2*(-y00);
|
||||||
|
|
||||||
|
SAVE_RECTANGLE("00", x00, y00, dx00, dy00)
|
||||||
|
|
||||||
|
|
||||||
|
// Calculate Rectangle 30
|
||||||
|
// **********************
|
||||||
|
|
||||||
|
// cout << "RD_ACTI_CONT is " << GET_RULE("RD_ACTI_CONT")<<endl;
|
||||||
|
// cout << "RD_ACTI_POLY is " << GET_RULE("RD_ACTI_POLY")<<endl;
|
||||||
|
// cout << "RE_POLY_CONT is " << GET_RULE("RE_POLY_CONT")<<endl;
|
||||||
|
// cout << "MAX RD_ACTI_POLY is " << (MAXLONG(GET_RULE("RD_ACTI_CONT"), GET_RULE("RD_ACTI_POLY") + GET_RULE("RE_POLY_CONT"))) <<endl;
|
||||||
|
//
|
||||||
|
|
||||||
|
dx31 = GET_RULE("RW_CONT") + 2*GET_RULE("RE_POLY_CONT");
|
||||||
|
if (dx31 >= dx00) {
|
||||||
|
dx30 = GET_RULE("RW_CONT");
|
||||||
|
dy30 = dx30;
|
||||||
|
y30 = 0 + realw + MAXLONG(GET_RULE("RD_ACTI_CONT"), GET_RULE("RD_ACTI_POLY") + GET_RULE("RE_POLY_CONT"));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
dx30 = dx00 - 2*GET_RULE("RE_POLY_CONT");
|
||||||
|
dy30 = GET_RULE("RW_CONT");
|
||||||
|
y30 = 0 + realw + GET_RULE("RD_ACTI_CONT");
|
||||||
|
}
|
||||||
|
|
||||||
|
x30 = x00 + dx00/2 - dx30/2;
|
||||||
|
|
||||||
|
SAVE_RECTANGLE("30", x30, y30, dx30, dy30)
|
||||||
|
|
||||||
|
|
||||||
|
// Calculate Rectangle 31
|
||||||
|
// **********************
|
||||||
|
dx31 = dx30 + 2*GET_RULE("RE_POLY_CONT");
|
||||||
|
dy31 = dy30 + 2*GET_RULE("RE_POLY_CONT");
|
||||||
|
x31 = x30 - GET_RULE("RE_POLY_CONT");
|
||||||
|
y31 = y30 - GET_RULE("RE_POLY_CONT");
|
||||||
|
|
||||||
|
SAVE_RECTANGLE("31", x31, y31, dx31, dy31)
|
||||||
|
|
||||||
|
|
||||||
|
// Calculate Rectangle 01
|
||||||
|
// **********************
|
||||||
|
if ( y31 <= (y00+dy00) ) {
|
||||||
|
x01 = 0; y01 = 0; dx01 = 0; dy01 = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
x01 = x00;
|
||||||
|
y01 = y00 + dy00;
|
||||||
|
dx01 = dx00;
|
||||||
|
dy01 = y31 - (y00 + dy00);
|
||||||
|
}
|
||||||
|
|
||||||
|
SAVE_RECTANGLE("01", x01, y01, dx01, dy01)
|
||||||
|
|
||||||
|
|
||||||
|
// Calculate Rectangle 12
|
||||||
|
// **********************
|
||||||
|
x12 = MINLONG(x31, x00) - re_imp_poly;
|
||||||
|
y12 = MINLONG(0 - re_imp_acti, y00 - re_imp_poly);
|
||||||
|
dx12 = MAXLONG(dx31, dx00) + 2 * re_imp_poly;
|
||||||
|
|
||||||
|
ymax = MAXLONG( MAXLONG( y30 + dy30 + re_imp_cont
|
||||||
|
, MAXLONG(y31 + dy31, y00 + dy00) + re_imp_poly )
|
||||||
|
, realw + re_imp_acti );
|
||||||
|
|
||||||
|
dy12 = ymax - y12 ;
|
||||||
|
|
||||||
|
SAVE_RECTANGLE("12", x12, y12, dx12, dy12)
|
||||||
|
|
||||||
|
|
||||||
|
// Calculate Rectangle 20
|
||||||
|
// **********************
|
||||||
|
y20 = 0 + GET_RULE("RE_ACTI_CONT");
|
||||||
|
dy20 = realw - 2 * GET_RULE("RE_ACTI_CONT");
|
||||||
|
dx20 = (_masqueV1Info->GetNbSourceColumn()) * GET_RULE("RW_CONT") +
|
||||||
|
((_masqueV1Info->GetNbSourceColumn()) - 1) * GET_RULE("RD_CONT");
|
||||||
|
x20 = 0 - ( dx20 + GET_RULE("RD_CONT_GATE") );
|
||||||
|
|
||||||
|
SAVE_RECTANGLE("20", x20, y20, dx20, dy20)
|
||||||
|
|
||||||
|
|
||||||
|
// Calculate Rectangle 40
|
||||||
|
// **********************
|
||||||
|
y40 = y20;
|
||||||
|
x40 = x00 + dx00 + GET_RULE("RD_CONT_GATE");
|
||||||
|
dx40 = (_masqueV1Info->GetNbDrainColumn()) * GET_RULE("RW_CONT") +
|
||||||
|
((_masqueV1Info->GetNbDrainColumn()) - 1) * GET_RULE("RD_CONT");
|
||||||
|
dy40 = dy20;
|
||||||
|
|
||||||
|
SAVE_RECTANGLE("40", x40, y40, dx40, dy40)
|
||||||
|
|
||||||
|
// Calculate Rectangle 10
|
||||||
|
// **********************
|
||||||
|
y10 = 0;
|
||||||
|
x10 = MINLONG(x20 - GET_RULE("RE_ACTI_CONT"), 0 - GET_RULE("RE_ACTI_GATE"));
|
||||||
|
dy10 = realw;
|
||||||
|
|
||||||
|
extension1 = MAXLONG(0 + x40 + dx40 + GET_RULE("RE_ACTI_CONT"), dx00 + GET_RULE("RE_ACTI_GATE"));
|
||||||
|
|
||||||
|
dx10 = 0 - x10 + extension1;
|
||||||
|
|
||||||
|
SAVE_RECTANGLE("10", x10, y10, dx10, dy10)
|
||||||
|
|
||||||
|
|
||||||
|
// Calculate Rectangle 23
|
||||||
|
// ***********************
|
||||||
|
x23 = x10;
|
||||||
|
y23 = y10;
|
||||||
|
dx23 = 0 - x10;
|
||||||
|
dy23 = realw;
|
||||||
|
|
||||||
|
SAVE_RECTANGLE("23", x23, y23, dx23, dy23)
|
||||||
|
|
||||||
|
|
||||||
|
// Calculate Rectangle 43
|
||||||
|
// **********************
|
||||||
|
x43 = x00 + dx00 ;
|
||||||
|
y43 = y10;
|
||||||
|
dx43 = x10 + dx10 - (x00 + dx00);
|
||||||
|
dy43 = realw;
|
||||||
|
|
||||||
|
SAVE_RECTANGLE("43", x43, y43, dx43, dy43)
|
||||||
|
|
||||||
|
|
||||||
|
// Calculate Rectangle 11
|
||||||
|
// **********************
|
||||||
|
extension1 = re_imp_gate;
|
||||||
|
extension2 = re_imp_cont + 0 - x20;
|
||||||
|
extension3 = re_imp_acti + 0 - x10;
|
||||||
|
|
||||||
|
extension4 = MAXLONG(MAXLONG(extension1, extension2), extension3);
|
||||||
|
|
||||||
|
x11 = 0 - extension4;
|
||||||
|
|
||||||
|
extension1 = re_imp_gate + x00 + dx00;
|
||||||
|
extension2 = re_imp_cont + x40 + dx40;
|
||||||
|
extension3 = re_imp_acti + x10 + dx10;
|
||||||
|
|
||||||
|
extension4 = MAXLONG(MAXLONG(extension1, extension2), extension3);
|
||||||
|
|
||||||
|
dx11 = 0 - x11 + extension4;
|
||||||
|
|
||||||
|
y11 = MINLONG(y20 - re_imp_cont, y23 - re_imp_acti);
|
||||||
|
|
||||||
|
ymax = MAXLONG(y20 + dy20 + re_imp_cont, y23 + dy23 + re_imp_acti);
|
||||||
|
|
||||||
|
dy11 = ymax - y11;
|
||||||
|
|
||||||
|
SAVE_RECTANGLE("11", x11, y11, dx11, dy11);
|
||||||
|
|
||||||
|
|
||||||
|
// Calculate Rectangle 50 just for PMOS.
|
||||||
|
// -------------------------------------------------------------
|
||||||
|
if (transistor->IsPmos()) { // Calculate Rectangle 50 for PMos.
|
||||||
|
x50 = x10 - GET_RULE("RE_NWELL_ACTI");
|
||||||
|
y50 = y10 - GET_RULE("RE_NWELL_ACTI");
|
||||||
|
dx50 = dx10 + 2 * GET_RULE("RE_NWELL_ACTI");
|
||||||
|
dy50 = dy10 + 2 * GET_RULE("RE_NWELL_ACTI");
|
||||||
|
|
||||||
|
SAVE_RECTANGLE("50", x50, y50, dx50, dy50);
|
||||||
|
}
|
||||||
|
|
||||||
|
// End Calculate.
|
||||||
|
// -------------------------------------------------------------
|
||||||
|
|
||||||
|
// Translate rectangles.
|
||||||
|
// *********************
|
||||||
|
map<string, Box>::iterator i = _mapString2Box.begin(),
|
||||||
|
j = _mapString2Box.end();
|
||||||
|
|
||||||
|
while(i!=j) {
|
||||||
|
_mapString2Box[(*i).first] = (*i).second.Translate(-xmin, -ymin);
|
||||||
|
|
||||||
|
IF_DEBUG_HUR_ANALOG
|
||||||
|
cout << ts << (*i).first <<" " << GetString((*i).second) << endl;
|
||||||
|
END_IF
|
||||||
|
|
||||||
|
assert(BOX_IS_VALID((*i).second));
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GenV1Trans::Generate(Transistor* transistor)
|
||||||
|
// *********************************************
|
||||||
|
{
|
||||||
|
OpenUpdateSession();
|
||||||
|
|
||||||
|
Net* source = transistor->GetNet(Name(transistor->GetSourceName()));
|
||||||
|
Net* drain = transistor->GetNet(Name(transistor->GetDrainName()) );
|
||||||
|
Net* grid = transistor->GetNet(Name(transistor->GetGridName()) );
|
||||||
|
|
||||||
|
DtrAccess * dtraccess = DtrAccess::Instance();
|
||||||
|
//string mostype(1, transistor->GetType()); // Get Mos Type (N/P).
|
||||||
|
|
||||||
|
string mostype; // Get Mos Type (N/P).
|
||||||
|
|
||||||
|
if(transistor->IsNmos())
|
||||||
|
mostype='N';
|
||||||
|
else
|
||||||
|
mostype='P';
|
||||||
|
|
||||||
|
long rw_cont = GetUnit(GET_RULE("RW_CONT"));
|
||||||
|
long rd_cont = GetUnit(GET_RULE("RD_CONT"));
|
||||||
|
unsigned nbcontact = 0;
|
||||||
|
long tmp_xcenter = 0;
|
||||||
|
long tmp_ycenter = 0;
|
||||||
|
|
||||||
|
DataBase * db = GetDataBase();
|
||||||
|
|
||||||
|
if(!db) throw Error("In GetV1Trans::Generate : can't find DataBase");
|
||||||
|
|
||||||
|
//Technology * tech = db->GetTechnology();
|
||||||
|
|
||||||
|
Layer * layer_20 = GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_20");
|
||||||
|
Layer * layer_30 = GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_30");
|
||||||
|
Layer * layer_40 = GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_40");
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------
|
||||||
|
// Begin Generation.
|
||||||
|
|
||||||
|
// Cenerate Components For Net Source.
|
||||||
|
// ***********************************
|
||||||
|
IF_DEBUG_HUR_ANALOG
|
||||||
|
cout << ts << "Begin for create components for net Source of " << GetString(transistor) << endl;
|
||||||
|
END_IF
|
||||||
|
|
||||||
|
for(size_t i=0; i<sizeof(segsforsource)/sizeof(string); i++) {
|
||||||
|
|
||||||
|
if(segsforsource[i]=="20") {
|
||||||
|
//cout << ts << " Begin create contact for source , Under Box is " << GetString(GET_BOX(segsforsource[i])) <<endl;
|
||||||
|
Box underbox = GET_BOX(segsforsource[i]);
|
||||||
|
CREATE_CONTACT_MATRIX_UNDER(underbox, transistor->GetNbSourceColumn(), layer_20, source)
|
||||||
|
//cout << ts << " Finish create contact for source " <<endl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Contact::Create(source, GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_"+segsforsource[i])
|
||||||
|
, GET_BOX(segsforsource[i]).GetXCenter()
|
||||||
|
, GET_BOX(segsforsource[i]).GetYCenter()
|
||||||
|
, GET_BOX(segsforsource[i]).GetWidth()
|
||||||
|
, GET_BOX(segsforsource[i]).GetHeight()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IF_DEBUG_HUR_ANALOG
|
||||||
|
cout << ts << "End for create components for net Source of " << GetString(transistor) << endl;
|
||||||
|
END_IF
|
||||||
|
|
||||||
|
|
||||||
|
// Generate Components For Net Grid.
|
||||||
|
// *********************************
|
||||||
|
IF_DEBUG_HUR_ANALOG
|
||||||
|
cout << ts << "Begin for create components for net Grid of " << GetString(transistor) << endl;
|
||||||
|
END_IF
|
||||||
|
for(size_t i=0; i<sizeof(segsforgrid)/sizeof(string); i++) {
|
||||||
|
if(segsforgrid[i]=="30"){
|
||||||
|
if( GET_BOX(segsforgrid[i]).GetWidth()==GET_RULE("RW_CONT") ) {
|
||||||
|
Contact::Create(grid, GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_"+segsforgrid[i])
|
||||||
|
, GET_BOX(segsforgrid[i]).GetXCenter()
|
||||||
|
, GET_BOX(segsforgrid[i]).GetYCenter()
|
||||||
|
, GET_BOX(segsforgrid[i]).GetWidth()
|
||||||
|
, GET_BOX(segsforgrid[i]).GetHeight()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
unsigned int nbcolumn = (GET_BOX(segsforgrid[i]).GetWidth()-rw_cont)/(rw_cont + rd_cont) + 1;
|
||||||
|
|
||||||
|
IF_DEBUG_HUR_ANALOG
|
||||||
|
cout << ts << "nbcolumn in rectangle 30 is " << nbcolumn <<endl;
|
||||||
|
END_IF
|
||||||
|
|
||||||
|
Box underbox = GET_BOX(segsforgrid[i]);
|
||||||
|
CREATE_CONTACT_MATRIX_UNDER(underbox, nbcolumn, layer_30, grid)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(GET_BOX(segsforgrid[i]).GetXMin() < GET_BOX(segsforgrid[i]).GetXMax()) {
|
||||||
|
Contact::Create(grid, GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_"+segsforgrid[i])
|
||||||
|
, GET_BOX(segsforgrid[i]).GetXCenter()
|
||||||
|
, GET_BOX(segsforgrid[i]).GetYCenter()
|
||||||
|
, GET_BOX(segsforgrid[i]).GetWidth()
|
||||||
|
, GET_BOX(segsforgrid[i]).GetHeight()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
IF_DEBUG_HUR_ANALOG
|
||||||
|
cout << ts << "End for create components for net Grid of " << GetString(transistor) << endl;
|
||||||
|
END_IF
|
||||||
|
|
||||||
|
|
||||||
|
// Generate Components For Net Drain.
|
||||||
|
// **********************************
|
||||||
|
IF_DEBUG_HUR_ANALOG
|
||||||
|
cout << ts << "Begin for create components for net Drain of " << GetString(transistor) << endl;
|
||||||
|
END_IF
|
||||||
|
for(size_t i=0; i<sizeof(segsfordrain)/sizeof(string); i++) {
|
||||||
|
|
||||||
|
if(segsfordrain[i]=="40") {
|
||||||
|
//cout << ts << " Begin create contact for drain, Under Box is " << GetString(GET_BOX(segsforsource[i])) <<endl;
|
||||||
|
Box underbox = GET_BOX(segsfordrain[i]);
|
||||||
|
CREATE_CONTACT_MATRIX_UNDER(underbox, transistor->GetNbDrainColumn(), layer_40, drain)
|
||||||
|
//cout << ts << " Finish create contact for drain" <<endl;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Contact::Create(drain, GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_"+segsfordrain[i])
|
||||||
|
, GET_BOX(segsfordrain[i]).GetXCenter()
|
||||||
|
, GET_BOX(segsfordrain[i]).GetYCenter()
|
||||||
|
, GET_BOX(segsfordrain[i]).GetWidth()
|
||||||
|
, GET_BOX(segsfordrain[i]).GetHeight()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IF_DEBUG_HUR_ANALOG
|
||||||
|
cout << ts << "End for create components for net Drain of " << GetString(transistor) << endl;
|
||||||
|
END_IF
|
||||||
|
|
||||||
|
// Generate Components For Anonyms Nets.
|
||||||
|
// *************************************
|
||||||
|
IF_DEBUG_HUR_ANALOG
|
||||||
|
cout << ts << "Begin for create components for net Anonyme of " << GetString(transistor) << endl;
|
||||||
|
END_IF
|
||||||
|
Net * anonym = Net::Create(transistor, Name("anonym"));
|
||||||
|
for(size_t i=0; i<sizeof(segsforanonym)/sizeof(string);i++) {
|
||||||
|
if(transistor->IsNmos() && segsforanonym[i]=="50")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
Contact::Create(anonym, GET_LAYER_BYNP("TRANS_",mostype,"_LAYER_"+segsforanonym[i])
|
||||||
|
, GET_BOX(segsforanonym[i]).GetXCenter()
|
||||||
|
, GET_BOX(segsforanonym[i]).GetYCenter()
|
||||||
|
, GET_BOX(segsforanonym[i]).GetWidth()
|
||||||
|
, GET_BOX(segsforanonym[i]).GetHeight()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
IF_DEBUG_HUR_ANALOG
|
||||||
|
cout << ts << "End for create components for net Anonyme of " << GetString(transistor) << endl;
|
||||||
|
END_IF
|
||||||
|
|
||||||
|
// End Generation.
|
||||||
|
// -------------------------------------------------------------
|
||||||
|
|
||||||
|
CloseUpdateSession();
|
||||||
|
|
||||||
|
// Set Transistor::_mapNet2Box.
|
||||||
|
// ****************************
|
||||||
|
(*(transistor->_GetMapNet2Box()))[grid] = _mapString2Box[string("30")];
|
||||||
|
(*(transistor->_GetMapNet2Box()))[source] = _mapString2Box[string("20")];
|
||||||
|
(*(transistor->_GetMapNet2Box()))[drain] = _mapString2Box[string("40")];
|
||||||
|
|
||||||
|
cout<< GetString(_mapString2Box[string("30")]) <<endl;
|
||||||
|
cout<< GetString(_mapString2Box[string("20")]) <<endl;
|
||||||
|
cout<< GetString(_mapString2Box[string("40")]) <<endl;
|
||||||
|
|
||||||
|
// Set Abutment Box.
|
||||||
|
// *****************
|
||||||
|
switch(transistor->GetAbutmentType().GetCode()) {
|
||||||
|
|
||||||
|
case Transistor::Type::INTERNAL :
|
||||||
|
transistor->SetAbutmentBox( Box(GET_BOX(string("20")).GetXCenter()
|
||||||
|
, transistor->GetBoundingBox().GetYMin()
|
||||||
|
, GET_BOX(string("40")).GetXCenter()
|
||||||
|
, transistor->GetBoundingBox().GetYMax()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Transistor::Type::LEFT:
|
||||||
|
transistor->SetAbutmentBox( Box(GET_BOX(string("11")).GetXMin()
|
||||||
|
, transistor->GetBoundingBox().GetYMin()
|
||||||
|
, GET_BOX(string("40")).GetXCenter()
|
||||||
|
, transistor->GetBoundingBox().GetYMax()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
break ;
|
||||||
|
|
||||||
|
case Transistor::Type::RIGHT:
|
||||||
|
transistor->SetAbutmentBox( Box(GET_BOX(string("20")).GetXCenter()
|
||||||
|
, transistor->GetBoundingBox().GetYMin()
|
||||||
|
, GET_BOX(string("11")).GetXMax()
|
||||||
|
, transistor->GetBoundingBox().GetYMax()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
break ;
|
||||||
|
|
||||||
|
case Transistor::Type::SINGLE:
|
||||||
|
transistor->SetAbutmentBox( Box(GET_BOX(string("11")).GetXMin()
|
||||||
|
, transistor->GetBoundingBox().GetYMin()
|
||||||
|
, GET_BOX(string("11")).GetXMax()
|
||||||
|
, transistor->GetBoundingBox().GetYMax()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
break ;
|
||||||
|
|
||||||
|
default :
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
END_NAMESPACE_HURRICANE
|
|
@ -0,0 +1,61 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: GenericDtrAccess.cpp
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "DtrAccess.h"
|
||||||
|
#include "GenericDtrAccess.h"
|
||||||
|
//#include "DtrAccess.h"
|
||||||
|
|
||||||
|
BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// GenericDtrAccess implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
GenericDtrAccess GenericDtrAccess::instance(NULL);
|
||||||
|
|
||||||
|
GenericDtrAccess::GenericDtrAccess(DtrAccess* dtraccess):_dtrAccess(dtraccess)
|
||||||
|
// **************************************************************************
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void GenericDtrAccess::Instance(DtrAccess* dtraccess)
|
||||||
|
// **************************************************
|
||||||
|
{
|
||||||
|
if(!(instance._dtrAccess))
|
||||||
|
instance._dtrAccess = dtraccess;
|
||||||
|
}
|
||||||
|
|
||||||
|
GenericDtrAccess::~GenericDtrAccess()
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
if(_dtrAccess) { cout<<GetString(_dtrAccess)<<" is delete "<<endl; _dtrAccess->Delete();}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string GenericDtrAccess::_GetString() const
|
||||||
|
// ****************************************
|
||||||
|
{
|
||||||
|
string s("Singleton GenericDtrAccess");
|
||||||
|
return s;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
string GetString(const H::GenericDtrAccess& access)
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
return access._GetString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: GenericDtrAccess.h
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef HURRICANE_GENERICDTRACCESS
|
||||||
|
#define HURRICANE_GENERICDTRACCESS
|
||||||
|
|
||||||
|
|
||||||
|
//BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class DtrAccess;
|
||||||
|
|
||||||
|
class GenericDtrAccess {
|
||||||
|
// *********************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
private : static GenericDtrAccess instance;
|
||||||
|
|
||||||
|
private : DtrAccess * _dtrAccess;
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
protected : GenericDtrAccess(DtrAccess*);
|
||||||
|
private : GenericDtrAccess(const GenericDtrAccess&);
|
||||||
|
private : GenericDtrAccess& operator=(const GenericDtrAccess&);
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
public : static void Instance(DtrAccess*);
|
||||||
|
|
||||||
|
// Destructors
|
||||||
|
// ***********
|
||||||
|
protected : virtual ~GenericDtrAccess();
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
// Operations
|
||||||
|
// **********
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
public: virtual string _GetTypeName() const {return _TName("GenericDtrAccess");};
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
string GetString(const H::GenericDtrAccess&);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HURRICANE_GENERICDTRACCESS
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,184 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: MetaTransistor.cpp
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
#include "MetaTransistor.h"
|
||||||
|
#include "Transistor.h"
|
||||||
|
#include "Instances.h"
|
||||||
|
#include "UpdateSession.h"
|
||||||
|
#include "Vertical.h"
|
||||||
|
|
||||||
|
|
||||||
|
BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// MetaTransistor implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
MetaTransistor::MetaTransistor(Library* library, const Name& name, char type)
|
||||||
|
// **************************************************************************
|
||||||
|
: Inherit(library, name),
|
||||||
|
_type(type),
|
||||||
|
_m(1),
|
||||||
|
_le(0.0),
|
||||||
|
_we(0.0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MetaTransistor* MetaTransistor::Create(Library* library, const Name& name, char type)
|
||||||
|
// **********************************************************************************
|
||||||
|
{
|
||||||
|
MetaTransistor* metatransistor = new MetaTransistor(library, name, type);
|
||||||
|
|
||||||
|
metatransistor->_PostCreate();
|
||||||
|
|
||||||
|
return metatransistor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MetaTransistor::_PreDelete()
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
// do something
|
||||||
|
// ************
|
||||||
|
|
||||||
|
Inherit::_PreDelete();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MetaTransistor::_PostCreate()
|
||||||
|
// *******************************
|
||||||
|
{
|
||||||
|
Inherit::_PostCreate();
|
||||||
|
|
||||||
|
(Net::Create(this, Name("DRAIN")))->SetExternal(true);
|
||||||
|
(Net::Create(this, Name("SOURCE")))->SetExternal(true);
|
||||||
|
(Net::Create(this, Name("GRID")))->SetExternal(true);
|
||||||
|
(Net::Create(this, Name("BULK")))->SetExternal(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MetaTransistor::CreateConnection()
|
||||||
|
// ***********************************
|
||||||
|
{
|
||||||
|
for_each_instance(instance, this->GetInstances())
|
||||||
|
Cell * mastercell = instance->GetMasterCell();
|
||||||
|
|
||||||
|
// Assurance of unique instanciation
|
||||||
|
// *********************************
|
||||||
|
if(mastercell->_GetSlaveInstanceSet()._GetSize()!=1) {
|
||||||
|
string err_msg = "Can't create connection : " + GetString(mastercell) + " hasn't only one slave instance";
|
||||||
|
assert(err_msg.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
instance->GetPlug(mastercell->GetNet(Name("DRAIN")))->SetNet(GetNet(Name("DRAIN")));
|
||||||
|
instance->GetPlug(mastercell->GetNet(Name("SOURCE")))->SetNet(GetNet(Name("SOURCE")));
|
||||||
|
instance->GetPlug(mastercell->GetNet(Name("GRID")))->SetNet(GetNet(Name("GRID")));
|
||||||
|
instance->GetPlug(mastercell->GetNet(Name("BULK")))->SetNet(GetNet(Name("BULK")));
|
||||||
|
end_for
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MetaTransistor::CreateLayout()
|
||||||
|
// ********************************
|
||||||
|
{
|
||||||
|
// OpenUpdateSession();
|
||||||
|
|
||||||
|
if((_le == 0.0) || (_we == 0.0)) {
|
||||||
|
throw Error("Can't generate layout : " + GetString(this) + " hasn't been dimensionned");
|
||||||
|
}
|
||||||
|
|
||||||
|
SetTerminal(false);
|
||||||
|
|
||||||
|
Transistor * internal_ref = NULL;
|
||||||
|
Transistor * left_ref = NULL;
|
||||||
|
Transistor * right_ref = NULL;
|
||||||
|
|
||||||
|
for_each_instance(instance, this->GetInstances())
|
||||||
|
Cell * mastercell = instance->GetMasterCell();
|
||||||
|
|
||||||
|
// Assurance of unique instanciation
|
||||||
|
// *********************************
|
||||||
|
if(mastercell->_GetSlaveInstanceSet()._GetSize()!=1) {
|
||||||
|
string err_msg = "Can't generate layout : " + GetString(mastercell) + " hasn't only one slave instance";
|
||||||
|
assert(err_msg.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
Transistor * trans = dynamic_cast<Transistor*>(mastercell);
|
||||||
|
if(!trans){
|
||||||
|
string err_msg = "Can't genrate layout : " + GetString(mastercell) + " isn't a Transistor";
|
||||||
|
}
|
||||||
|
|
||||||
|
if(trans->IsInternal()) {
|
||||||
|
if(!internal_ref) {
|
||||||
|
trans->CreateLayout();
|
||||||
|
internal_ref = trans;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
trans->DuplicateLayout(internal_ref);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(trans->IsLeft()) {
|
||||||
|
if(!left_ref) {
|
||||||
|
trans->CreateLayout();
|
||||||
|
left_ref=trans;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
trans->DuplicateLayout(left_ref);
|
||||||
|
}
|
||||||
|
else if(trans->IsRight()) {
|
||||||
|
if(!right_ref) {
|
||||||
|
trans->CreateLayout();
|
||||||
|
right_ref=trans;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
trans->DuplicateLayout(right_ref);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
trans->CreateLayout();
|
||||||
|
end_for
|
||||||
|
|
||||||
|
|
||||||
|
Materialize();
|
||||||
|
// CloseUpdateSession();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MetaTransistor::Flush()
|
||||||
|
// *************************
|
||||||
|
{
|
||||||
|
OpenUpdateSession();
|
||||||
|
for_each_instance(instance, this->GetInstances())
|
||||||
|
Cell * mastercell = instance->GetMasterCell();
|
||||||
|
instance->Delete();
|
||||||
|
mastercell->Delete();
|
||||||
|
end_for
|
||||||
|
CloseUpdateSession();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
string MetaTransistor::_GetString() const
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
string s= Inherit::_GetString();
|
||||||
|
s.insert(s.length()-1, " " + GetString(GetType()) );
|
||||||
|
s.insert(s.length()-1, " " + GetString(GetM()) );
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* MetaTransistor::_GetRecord() const
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,133 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: MetaTransistor.h
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_METATRANSISTOR
|
||||||
|
#define HURRICANE_METATRANSISTOR
|
||||||
|
|
||||||
|
#include "Cell.h"
|
||||||
|
#include "AnalogicalCommons.h"
|
||||||
|
|
||||||
|
|
||||||
|
//BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Library;
|
||||||
|
class Name;
|
||||||
|
class Symbol;
|
||||||
|
class Record;
|
||||||
|
|
||||||
|
class MetaTransistor: public Cell {
|
||||||
|
// ********************************
|
||||||
|
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
public : typedef Cell Inherit;
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
|
||||||
|
// Logicals Attributes
|
||||||
|
// *******************
|
||||||
|
private : char _type;
|
||||||
|
private : unsigned _m;
|
||||||
|
private : Micro _le, _we; // length and width expected
|
||||||
|
private : Micro _lr, _wr; // real length and real width
|
||||||
|
private : unsigned _nSex, _nDex, nSin, _nDin, _nSsh, _nDsh;
|
||||||
|
private : Micro _dgg, _de;
|
||||||
|
private : MicroPower2 _as, _ad;
|
||||||
|
private : Micro _ps, _pd;
|
||||||
|
private : double _capaDrain, _capaGate, _capaSource;
|
||||||
|
private : double _cgb, _cgs, _cdb, _cds, _csb, _cgd;
|
||||||
|
|
||||||
|
|
||||||
|
// Behaviorals attributes
|
||||||
|
// **********************
|
||||||
|
private : double _temp, _vds, _vgs; // DC
|
||||||
|
private : double _vg, _vd, _vs, _vb;
|
||||||
|
private : char _region;
|
||||||
|
private : double _ids;
|
||||||
|
private : double _vth, _vdsat; // AC
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
protected : MetaTransistor(Library* library, const Name& name, char type);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
public : static MetaTransistor* Create(Library* library, const Name& name, char type);
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
protected : virtual void _PostCreate();
|
||||||
|
|
||||||
|
|
||||||
|
// Destructors
|
||||||
|
// ***********
|
||||||
|
protected : ~MetaTransistor() {};
|
||||||
|
protected : virtual void _PreDelete();
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Operations
|
||||||
|
// **********
|
||||||
|
|
||||||
|
// Create the connection between all instances.
|
||||||
|
// ********************************************
|
||||||
|
public : void CreateConnection();
|
||||||
|
|
||||||
|
// Create the layout of all motifs in this metatransistor.
|
||||||
|
// *******************************************************
|
||||||
|
public : void CreateLayout();
|
||||||
|
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
// Get all paramters after generation of Layout (capa..).
|
||||||
|
// *****************************************************
|
||||||
|
public : void GetParameterOfGeneration() { /* to do */};
|
||||||
|
|
||||||
|
// Delete all instances and all motifs in this metatransistor.
|
||||||
|
// ***********************************************************
|
||||||
|
public : void Flush();
|
||||||
|
# endif
|
||||||
|
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
public : const Micro& GetLe() const { return _le; };
|
||||||
|
public : const Micro& GetWe() const { return _we; };
|
||||||
|
public : const char GetType() const { return _type; };
|
||||||
|
public : const unsigned GetM() const { return _m; };
|
||||||
|
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
public : void SetLe (const Micro le) { _le=le; };
|
||||||
|
public : void SetWe (const Micro we) { _we=we; };
|
||||||
|
public : void SetType(const char type) { _type=type; };
|
||||||
|
public : void SetM (const unsigned m) { _m=m; };
|
||||||
|
|
||||||
|
|
||||||
|
//#endif
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
public: virtual string _GetTypeName() const {return _TName("MetaTransistor");};
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
# endif
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
#endif // HURRICANE_METATRANSISTOR
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: MetaTransistors.h
|
||||||
|
// Authors: YIFEI WU
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_METATRANSISTORS
|
||||||
|
#define HURRICANE_METATRANSISTORS
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
class MetaTransistor;
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// MetaTransistors declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<MetaTransistor*> MetaTransistors;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// MetaTransistorLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<MetaTransistor*> MetaTransistorLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// MetaTransistorFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<MetaTransistor*> MetaTransistorFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_metatransistor declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_metatransistor(metatransistor, metatransistors)\
|
||||||
|
/******************************/\
|
||||||
|
{\
|
||||||
|
MetaTransistorLocator _locator = metatransistors.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
MetaTransistor* metatransistor = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
#endif // HURRICANE_METATRANSISTORS
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
/* A Bison parser, made by GNU Bison 2.3. */
|
||||||
|
|
||||||
|
/* Skeleton interface for Bison's Yacc-like parsers in C
|
||||||
|
|
||||||
|
Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program 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, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program 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 this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
/* As a special exception, you may create a larger work that contains
|
||||||
|
part or all of the Bison parser skeleton and distribute that work
|
||||||
|
under terms of your choice, so long as that work isn't itself a
|
||||||
|
parser generator using the skeleton or a modified version thereof
|
||||||
|
as a parser skeleton. Alternatively, if you modify or redistribute
|
||||||
|
the parser skeleton itself, you may (at your option) remove this
|
||||||
|
special exception, which will cause the skeleton and the resulting
|
||||||
|
Bison output files to be licensed under the GNU General Public
|
||||||
|
License without this special exception.
|
||||||
|
|
||||||
|
This special exception was added by the Free Software Foundation in
|
||||||
|
version 2.2 of Bison. */
|
||||||
|
|
||||||
|
/* Tokens. */
|
||||||
|
#ifndef YYTOKENTYPE
|
||||||
|
# define YYTOKENTYPE
|
||||||
|
/* Put the tokens into the symbol table, so that GDB and other debuggers
|
||||||
|
know about them. */
|
||||||
|
enum yytokentype {
|
||||||
|
T_TABLE = 258,
|
||||||
|
T_TABLE_END = 259,
|
||||||
|
T_DOUBLE = 260,
|
||||||
|
T_ID = 261
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
/* Tokens. */
|
||||||
|
#define T_TABLE 258
|
||||||
|
#define T_TABLE_END 259
|
||||||
|
#define T_DOUBLE 260
|
||||||
|
#define T_ID 261
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
|
||||||
|
typedef union YYSTYPE
|
||||||
|
#line 47 "/home/xtof/workspace/hurricane/src/analogic/ParserDtrGram.yy"
|
||||||
|
{ double _value;
|
||||||
|
char * _text;
|
||||||
|
}
|
||||||
|
/* Line 1489 of yacc.c. */
|
||||||
|
#line 65 "/home/xtof/workspace/hurricane/src/analogic/ParserDtrGram.hpp"
|
||||||
|
YYSTYPE;
|
||||||
|
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
|
||||||
|
# define YYSTYPE_IS_DECLARED 1
|
||||||
|
# define YYSTYPE_IS_TRIVIAL 1
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern YYSTYPE dtrlval;
|
||||||
|
|
|
@ -0,0 +1,202 @@
|
||||||
|
%{
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <map>
|
||||||
|
#include <list>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "Error.h"
|
||||||
|
#include "DtrAccess.h"
|
||||||
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
#include "ParserDtrGram.hpp"
|
||||||
|
|
||||||
|
extern FILE * dtrin;
|
||||||
|
extern int dtrlex(void);
|
||||||
|
extern char * dtrtext;
|
||||||
|
extern int DTRlineno;
|
||||||
|
|
||||||
|
|
||||||
|
// *************************************************************************
|
||||||
|
// Static Function&Data
|
||||||
|
// *************************************************************************
|
||||||
|
|
||||||
|
static int dtrerror( char * message)
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
char * str = (char*)malloc(200*sizeof(char));
|
||||||
|
sprintf(str, "ParserDtr():\n %s before %s at line %d.\n", message, dtrtext, DTRlineno);
|
||||||
|
|
||||||
|
string errmsg = str;
|
||||||
|
|
||||||
|
throw Error (errmsg);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static DtrAccess * dtraccess = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
static char* table_name = NULL;
|
||||||
|
|
||||||
|
static list<double> doubleList;
|
||||||
|
static list<string> stringList;
|
||||||
|
|
||||||
|
|
||||||
|
%}
|
||||||
|
|
||||||
|
%union { double _value;
|
||||||
|
char * _text;
|
||||||
|
};
|
||||||
|
|
||||||
|
%token T_TABLE T_TABLE_END T_DOUBLE T_ID
|
||||||
|
%type < _value > T_DOUBLE
|
||||||
|
%type < _text > T_ID
|
||||||
|
|
||||||
|
%start file
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
file: lines tables
|
||||||
|
;
|
||||||
|
|
||||||
|
lines : '\n'
|
||||||
|
| lines '\n'
|
||||||
|
;
|
||||||
|
|
||||||
|
tables: table
|
||||||
|
|tables table
|
||||||
|
;
|
||||||
|
|
||||||
|
table: T_TABLE T_ID '\n'
|
||||||
|
{ table_name = $2; }
|
||||||
|
items T_TABLE_END lines
|
||||||
|
;
|
||||||
|
|
||||||
|
items: item
|
||||||
|
|items item
|
||||||
|
;
|
||||||
|
|
||||||
|
item: T_ID elems '\n'
|
||||||
|
{
|
||||||
|
|
||||||
|
string label = $1;
|
||||||
|
delete $1;
|
||||||
|
|
||||||
|
if( strcmp(table_name, "RULES")==0 ) {
|
||||||
|
if ( doubleList.empty() ) {
|
||||||
|
|
||||||
|
dtrerror("ParserDtr detect no data in a line of table RULES : Please check it");
|
||||||
|
}
|
||||||
|
|
||||||
|
list<double>::iterator i = doubleList.begin()
|
||||||
|
, j = doubleList.end();
|
||||||
|
|
||||||
|
while(i!=j) {
|
||||||
|
(dtraccess->_GetLabel2RuleMap())[label].push_back(*i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( strcmp(table_name, "LAYERS")==0 ) {
|
||||||
|
if ( stringList.empty() ) {
|
||||||
|
dtrerror("ParserDtr detect no data in a line of table LAYERS : Please check it");
|
||||||
|
}
|
||||||
|
|
||||||
|
list<string>::iterator i = stringList.begin()
|
||||||
|
, j = stringList.end();
|
||||||
|
|
||||||
|
while(i!=j) {
|
||||||
|
(dtraccess->_GetLabel2LayerNameMap())[label].push_back(*i);;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( strcmp(table_name, "ELECTRICAL") == 0 ) {
|
||||||
|
if ( doubleList.empty() ) {
|
||||||
|
dtrerror("ParserDtr detect no data in a line of table ELECTRICAL : Please check it");
|
||||||
|
}
|
||||||
|
|
||||||
|
list<double>::iterator i = doubleList.begin()
|
||||||
|
, j = doubleList.end();
|
||||||
|
|
||||||
|
while(i!=j) {
|
||||||
|
(dtraccess->_GetLabel2ElectricalMap())[label].push_back(*i);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( strcmp(table_name, "MODELLING") == 0 ) {
|
||||||
|
if ( (doubleList.empty()) || (doubleList.size()!=1) ) {
|
||||||
|
dtrerror("ParserDtr detect no data or mutli datas in a line of table MODELLING: Please check it");
|
||||||
|
}
|
||||||
|
|
||||||
|
list<double>::iterator i = doubleList.begin();
|
||||||
|
|
||||||
|
(dtraccess->_GetLabel2ModellingMap())[label] = (int)(*i);
|
||||||
|
}
|
||||||
|
|
||||||
|
else if( strcmp(table_name, "SIMPLE_CAPA_MIM")==0 ) {
|
||||||
|
if( (doubleList.empty()) || (doubleList.size()!=1) ) {
|
||||||
|
dtrerror("ParserDtr detect no data or mutli datas in a line of table SIMPLE_CAPA_MIM : Please check it");
|
||||||
|
}
|
||||||
|
|
||||||
|
list<double>::iterator i = doubleList.begin();
|
||||||
|
(dtraccess->_GetLabel2SimpleCapaMimMap())[label] = (*i);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
throw Error("ParserDtr detect unknown table name " + string(table_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vide temporary list
|
||||||
|
// ********************
|
||||||
|
doubleList.clear();
|
||||||
|
stringList.clear();
|
||||||
|
|
||||||
|
}
|
||||||
|
| lines
|
||||||
|
;
|
||||||
|
|
||||||
|
elems: elem
|
||||||
|
|elems elem
|
||||||
|
;
|
||||||
|
|
||||||
|
elem: T_ID
|
||||||
|
{
|
||||||
|
if(!(doubleList.empty())) {
|
||||||
|
|
||||||
|
dtrerror("ParserDtr detect incompatibles datas : Please check it");
|
||||||
|
}
|
||||||
|
|
||||||
|
stringList.push_back(string($1));
|
||||||
|
delete $1;
|
||||||
|
}
|
||||||
|
| T_DOUBLE
|
||||||
|
{
|
||||||
|
if(!(stringList.empty())) {
|
||||||
|
|
||||||
|
dtrerror("ParserDtr detect incompatibles datas : Please check it");
|
||||||
|
}
|
||||||
|
|
||||||
|
doubleList.push_back($1);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
// *************************************************************************
|
||||||
|
// Generic Function
|
||||||
|
// *************************************************************************
|
||||||
|
|
||||||
|
void ParseDtr(const char* dtrfilename, DtrAccess* dtr)
|
||||||
|
// ***************************************************
|
||||||
|
{
|
||||||
|
dtraccess = dtr;
|
||||||
|
|
||||||
|
if((dtrin=fopen(dtrfilename, "r"))==NULL)
|
||||||
|
{
|
||||||
|
throw Error("Can't open dtr file : " + string(dtrfilename));
|
||||||
|
}
|
||||||
|
|
||||||
|
dtrparse();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
%{
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
#include <iostream>
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
#include "ParserDtrGram.hpp"
|
||||||
|
|
||||||
|
#define YY_NO_UNPUT
|
||||||
|
|
||||||
|
int DTRlineno = 1;
|
||||||
|
|
||||||
|
%}
|
||||||
|
%%
|
||||||
|
([ \t]+|#.*) {/* nothing to do */}
|
||||||
|
\n { DTRlineno++; return '\n'; }
|
||||||
|
TABLE_1DM { return T_TABLE;}
|
||||||
|
END_TABLE_1DM { return T_TABLE_END;}
|
||||||
|
[1-9]?[0-9]*(\.)?[0-9]+ { dtrlval._value=atof(dtrtext); return T_DOUBLE;}
|
||||||
|
[a-zA-Z0-9]+(_?[a-zA-Z0-9]+)* {dtrlval._text=strdup(dtrtext); return T_ID;}
|
||||||
|
. { return *dtrtext; }
|
||||||
|
|
||||||
|
%%
|
||||||
|
|
||||||
|
int dtrwrap() {return 1;}
|
||||||
|
|
|
@ -0,0 +1,260 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: RdsUnit.cpp
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
#include "Error.h"
|
||||||
|
#include "stdio.h"
|
||||||
|
#include "regex.h"
|
||||||
|
#include "math.h"
|
||||||
|
#include "Commons.h"
|
||||||
|
#include "RdsUnit.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Static data&function
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
static long RDS_UNIT = -1;
|
||||||
|
|
||||||
|
static long RDS_PHYSICAL_GRID = 2;
|
||||||
|
|
||||||
|
static long RDS_LAMBDA = -1;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------
|
||||||
|
// Function : "GetPattern()".
|
||||||
|
|
||||||
|
/* \static char * GetPattern (const string& str, const char* pattern)
|
||||||
|
* \param str the string to check for regex.
|
||||||
|
* \param pattern the pattern to find.
|
||||||
|
*
|
||||||
|
* Get and return the march substring from str according to the pattern.
|
||||||
|
*
|
||||||
|
* \return NULL if Failure.
|
||||||
|
* \return the according substring if Success.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static char* GetPattern(const string& str, const char* pattern)
|
||||||
|
// ************************************************************
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
regex_t preg;
|
||||||
|
const char *str_request = str.c_str();
|
||||||
|
const char *str_regex = pattern;
|
||||||
|
|
||||||
|
/* (1) */
|
||||||
|
err = regcomp (&preg, str_regex, REG_EXTENDED);
|
||||||
|
|
||||||
|
if (err == 0)
|
||||||
|
{
|
||||||
|
int match;
|
||||||
|
size_t nmatch = 0;
|
||||||
|
regmatch_t *pmatch = NULL;
|
||||||
|
|
||||||
|
nmatch= 1;
|
||||||
|
pmatch = (regmatch_t*)malloc (sizeof (*pmatch) * nmatch);
|
||||||
|
|
||||||
|
if (pmatch)
|
||||||
|
{
|
||||||
|
/* (2) */
|
||||||
|
match = regexec (&preg, str_request, nmatch, pmatch, 0);
|
||||||
|
|
||||||
|
/* (3) */
|
||||||
|
regfree (&preg);
|
||||||
|
|
||||||
|
/* (4) */
|
||||||
|
if (match == 0)
|
||||||
|
{
|
||||||
|
char *site = NULL;
|
||||||
|
int start = pmatch[0].rm_so;
|
||||||
|
int end = pmatch[0].rm_eo;
|
||||||
|
size_t size = end - start;
|
||||||
|
|
||||||
|
site = (char*)malloc (sizeof (*site) * (size + 1));
|
||||||
|
if (site)
|
||||||
|
{
|
||||||
|
strncpy (site, &str_request[start], size);
|
||||||
|
site[size] = '\0';
|
||||||
|
|
||||||
|
return site;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf (stderr, "Memoire insuffisante\n");
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* (5) */
|
||||||
|
else if (match == REG_NOMATCH)
|
||||||
|
{
|
||||||
|
printf ("%s doesn't accord to %s\n", str_request, str_regex);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
/* (6) */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *text;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
/* (7) */
|
||||||
|
size = regerror (err, &preg, NULL, 0);
|
||||||
|
text = (char*)malloc (sizeof (*text) * size);
|
||||||
|
if (text)
|
||||||
|
{
|
||||||
|
/* (8) */
|
||||||
|
regerror (err, &preg, text, size);
|
||||||
|
fprintf (stderr, "%s\n", text);
|
||||||
|
free (text);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Memoire insuffisante\n");
|
||||||
|
}
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf (stderr, "Memoire insuffisante\n");
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fprintf (stderr, "Regcomp fail\n");
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Function : "CalculateRdsUnit()".
|
||||||
|
|
||||||
|
/* static void CalculateRdsUnit()
|
||||||
|
*
|
||||||
|
* Open rds techno file who's name is MACRO RDS_TECHNO_FILE,
|
||||||
|
* and get values technology : rds_physical_grid, rds_lambda.
|
||||||
|
* Calculate the RDS_UNIT according to these values.
|
||||||
|
*
|
||||||
|
* If RDS_TECHNO_FILE is invalid or operaton of reading values technologys
|
||||||
|
* fail, a Hurricane Error will be throwed to explain the reason of failure.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
static void CalculateRdsUnit()
|
||||||
|
// ***************************
|
||||||
|
{
|
||||||
|
using Hurricane::Error;
|
||||||
|
|
||||||
|
const char * rdsfilename = getenv("RDS_TECHNO_NAME");
|
||||||
|
FILE * rdstechnofile;
|
||||||
|
|
||||||
|
if(!rdsfilename) {
|
||||||
|
throw Error("Can't not find macro RDS_TECHNO_FILE");
|
||||||
|
}
|
||||||
|
|
||||||
|
if( !(rdstechnofile = fopen(rdsfilename, "r")) ) {
|
||||||
|
throw Error("Can't not open rds techno file : " + GetString(rdsfilename));
|
||||||
|
}
|
||||||
|
|
||||||
|
char buffer[80]; // For stock a line of the rds techno file
|
||||||
|
double rds_physical_grid = -0.1; // For stock value of physical_grid
|
||||||
|
double rds_lambda = -0.1; // For stock value of lamba
|
||||||
|
|
||||||
|
while(fgets(buffer, 80, rdstechnofile )!=NULL){
|
||||||
|
string tmp = buffer;
|
||||||
|
|
||||||
|
if( tmp.find("define physical_grid")!=string::npos) { // Find the ligne begin with "define physical_grid"
|
||||||
|
|
||||||
|
string pattern;
|
||||||
|
|
||||||
|
if( (pattern = GetPattern(tmp, "[[:digit:]\\.]+")).size()==0 ) { // Get the value behind
|
||||||
|
throw Error("Can't get rds_physical_grid : GetPattern(string&, char*) return NULL");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!Scan(pattern, rds_physical_grid)){ // Convert from string to double
|
||||||
|
throw Error("Can't get rds_physical_grid " + pattern + " : Hurricane::Scan(string&, double&) return false");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if( tmp.find("define lambda")!=string::npos ) {
|
||||||
|
|
||||||
|
string pattern;
|
||||||
|
|
||||||
|
if( (pattern = GetPattern(tmp, "[[:digit:]\\.]+")).size()==0 ) {
|
||||||
|
throw Error("Can't get rds_lambda : GetPattern(string&, char*) return NULL");
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!Scan(pattern, rds_lambda)){
|
||||||
|
throw Error("Can't get rds_lambda " + pattern + " : Hurricane::Scan(string&, double&) return false");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// if rds_physical_grid and rds_lambda are finded, break the loop
|
||||||
|
// **************************************************************
|
||||||
|
if( (rds_physical_grid!=-0.1) && (rds_lambda!=-0.1) )
|
||||||
|
break;
|
||||||
|
|
||||||
|
} // end of while
|
||||||
|
|
||||||
|
if( (rds_physical_grid==-0.1) && (rds_lambda==-0.1) ) {
|
||||||
|
throw Error("Can't get rds_physical_grid and rds_lambda from rds techno file : \n" + string(rdsfilename));
|
||||||
|
}
|
||||||
|
|
||||||
|
long rds_physical_grid_nano = (long)rint(rds_physical_grid*(double)1000);
|
||||||
|
|
||||||
|
rds_physical_grid_nano = (long)rint( (double)1000/(double)rds_physical_grid_nano );
|
||||||
|
|
||||||
|
RDS_UNIT = rds_physical_grid_nano << 1;
|
||||||
|
|
||||||
|
long rds_lambda_nano = (long)rint( rds_lambda*(double)1000 );
|
||||||
|
|
||||||
|
RDS_LAMBDA = rds_lambda_nano * RDS_UNIT / 1000 ;
|
||||||
|
|
||||||
|
fclose(rdstechnofile);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Utilitarians
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
const long& GetRdsUnit()
|
||||||
|
// *********************
|
||||||
|
{
|
||||||
|
if ( RDS_UNIT == -1)
|
||||||
|
CalculateRdsUnit();
|
||||||
|
|
||||||
|
return RDS_UNIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
const long& GetRdsPhysicalGrid()
|
||||||
|
// *****************************
|
||||||
|
{
|
||||||
|
return RDS_PHYSICAL_GRID;
|
||||||
|
}
|
||||||
|
|
||||||
|
const long& GetRdsLambda()
|
||||||
|
// ***********************
|
||||||
|
{
|
||||||
|
if ( RDS_LAMBDA == -1)
|
||||||
|
CalculateRdsUnit();
|
||||||
|
|
||||||
|
return RDS_LAMBDA;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
END_NAMESPACE_HURRICANE
|
|
@ -0,0 +1,54 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: RdsUnit.h
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_RDSUNIT
|
||||||
|
#define HURRICANE_RDSUNIT
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
//BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Utilitarians
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
const long& GetRdsUnit();
|
||||||
|
|
||||||
|
const long& GetRdsPhysicalGrid();
|
||||||
|
|
||||||
|
const long& GetRdsLambda();
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// Function : "ConvertRealToRdsUnit(const double&)".
|
||||||
|
//
|
||||||
|
|
||||||
|
/* \inline long ConvertRealToRdsUnit(const double& value)
|
||||||
|
* \param value the value en Micro to convert to RdsUnit.
|
||||||
|
*
|
||||||
|
* Get and return the value en RdsUnit.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
inline long ConvertRealToRdsUnit(const double& value)
|
||||||
|
// *******************************************************
|
||||||
|
{
|
||||||
|
long tmp_value = (long)rint(value*GetRdsUnit());
|
||||||
|
return (tmp_value%2)==0?tmp_value:(tmp_value+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // HURRICANE_RDSUNIT
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,505 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Transistor.h
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "AnalogicalCommons.h"
|
||||||
|
#include "Transistor.h"
|
||||||
|
#include "GenTrans.h"
|
||||||
|
|
||||||
|
#include "Vertical.h"
|
||||||
|
#include "Horizontal.h"
|
||||||
|
|
||||||
|
#include "UpdateSession.h"
|
||||||
|
|
||||||
|
BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Transistor::MaskVersion implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
Transistor::MaskVersion::MaskVersion(const Code& code)
|
||||||
|
// *******************************************************
|
||||||
|
:_code(code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Transistor::MaskVersion::MaskVersion(const MaskVersion& version)
|
||||||
|
// *******************************************************************
|
||||||
|
:_code(version._code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::MaskVersion& Transistor::MaskVersion::operator=(const MaskVersion& version)
|
||||||
|
// ******************************************************************************************
|
||||||
|
{
|
||||||
|
_code = version._code;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Transistor::MaskVersion::operator==(const MaskVersion& version) const
|
||||||
|
// ***************************************************************************
|
||||||
|
{
|
||||||
|
return _code==version._code;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string Transistor::MaskVersion::_GetString() const
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
switch(_code) {
|
||||||
|
case VERSION1 : return "VERSION1";
|
||||||
|
}
|
||||||
|
return "ABNORMAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Record* Transistor::MaskVersion::_GetRecord() const
|
||||||
|
// **************************************************
|
||||||
|
{
|
||||||
|
Record* record = new Record(GetString(this));
|
||||||
|
record->Add(GetSlot("Code", _code));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Transistor::Type implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
Transistor::Type::Type(const Code& code)
|
||||||
|
// *************************************
|
||||||
|
:_code(code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::Type::Type(const Type& type)
|
||||||
|
// *************************************
|
||||||
|
:_code(type._code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::Type& Transistor::Type::operator=(const Type& type)
|
||||||
|
// ************************************************************
|
||||||
|
{
|
||||||
|
_code = type._code;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string Transistor::Type::_GetString() const
|
||||||
|
// *****************************************
|
||||||
|
{
|
||||||
|
switch(_code) {
|
||||||
|
case INTERNAL : return "INTERNAL";
|
||||||
|
case LEFT : return "LEFT";
|
||||||
|
case RIGHT : return "RIGHT";
|
||||||
|
case SINGLE : return "SINGLE";
|
||||||
|
}
|
||||||
|
|
||||||
|
return "ABNORMAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Record* Transistor::Type::_GetRecord() const
|
||||||
|
// *****************************************
|
||||||
|
{
|
||||||
|
Record* record = new Record(GetString(this));
|
||||||
|
record->Add(GetSlot("Code", _code));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Transistor::MaskInfo implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
Transistor::MaskInfo::MaskInfo(const double& l, const double& w, const Type::Code& type
|
||||||
|
, const unsigned& nbDrainColumn
|
||||||
|
, const unsigned& nbSourceColumn)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
: _l(l)
|
||||||
|
, _w(w)
|
||||||
|
, _type(type)
|
||||||
|
, _nbDrainColumn(nbDrainColumn)
|
||||||
|
, _nbSourceColumn(nbSourceColumn)
|
||||||
|
{};
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::MaskInfo& Transistor::MaskInfo::operator=(const MaskInfo& masqueinfo)
|
||||||
|
// ************************************************************************************
|
||||||
|
{
|
||||||
|
_l = masqueinfo.GetL();
|
||||||
|
_w = masqueinfo.GetW();
|
||||||
|
_type= masqueinfo.GetType();
|
||||||
|
_nbDrainColumn = masqueinfo.GetNbDrainColumn();
|
||||||
|
_nbSourceColumn = masqueinfo.GetNbSourceColumn();
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::MaskInfo::_PostCreate()
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::MaskInfo::_PreDelete()
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::MaskInfo::Delete()
|
||||||
|
// **********************************
|
||||||
|
{
|
||||||
|
_PreDelete();
|
||||||
|
delete this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Transistor::MaskInfo::operator==(const MaskInfo& masqueinfo)
|
||||||
|
// ******************************************************************
|
||||||
|
{
|
||||||
|
if(_l == masqueinfo.GetL() &&
|
||||||
|
_w == masqueinfo.GetW() &&
|
||||||
|
_type== masqueinfo.GetType() &&
|
||||||
|
_nbDrainColumn == masqueinfo.GetNbDrainColumn() &&
|
||||||
|
_nbSourceColumn == masqueinfo.GetNbSourceColumn()
|
||||||
|
)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string Transistor::MaskInfo::_GetString() const
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _GetTypeName() + " "
|
||||||
|
+ GetString(_l) + " "
|
||||||
|
+ GetString(_w) + " "
|
||||||
|
+ _type._GetString() + " "
|
||||||
|
+ GetString(_nbSourceColumn) + " "
|
||||||
|
+ GetString(_nbDrainColumn)
|
||||||
|
+ ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Record* Transistor::MaskInfo::_GetRecord() const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
Record * record = new Record(_GetString());
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Transistor::MaskV1Info implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
Transistor::MaskV1Info::MaskV1Info(const double& l, const double& w, const Type::Code& type
|
||||||
|
, const unsigned& nbDrainColumn
|
||||||
|
, const unsigned& nbSourceColumn)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
: Inherit(l
|
||||||
|
, w
|
||||||
|
, type
|
||||||
|
, nbDrainColumn
|
||||||
|
, nbSourceColumn
|
||||||
|
)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::MaskV1Info* Transistor::MaskV1Info::Create(const double& l, const double& w
|
||||||
|
, const Type::Code& type
|
||||||
|
, const unsigned& nbDrainColumn
|
||||||
|
, const unsigned& nbSourceColumn)
|
||||||
|
// **********************************************************************************************
|
||||||
|
{
|
||||||
|
MaskV1Info* masquev1info = new MaskV1Info(l, w, type, nbDrainColumn, nbSourceColumn);
|
||||||
|
|
||||||
|
masquev1info->_PostCreate();
|
||||||
|
|
||||||
|
return masquev1info;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::MaskInfo& Transistor::MaskV1Info::operator=(const MaskInfo& masqueinfo)
|
||||||
|
// **************************************************************************************
|
||||||
|
{
|
||||||
|
// (*(static_cast<Inherit*>(this)))=masqueinfo;
|
||||||
|
Inherit::operator=(masqueinfo);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::MaskV1Info::_PostCreate()
|
||||||
|
// *****************************************
|
||||||
|
{
|
||||||
|
Inherit::_PostCreate();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::MaskV1Info::_PreDelete()
|
||||||
|
// ****************************************
|
||||||
|
{
|
||||||
|
Inherit::_PreDelete();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Transistor::MaskV1Info::operator == (const MaskInfo& masqueinfo)
|
||||||
|
// **********************************************************************
|
||||||
|
{
|
||||||
|
//return (*(static_cast<Inherit*>(this)))==masqueinfo;
|
||||||
|
return Inherit::operator==(masqueinfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string Transistor::MaskV1Info::_GetString() const
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
string s = Inherit::_GetString();
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* Transistor::MaskV1Info::_GetRecord() const
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Transistor implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Transistor::Transistor(Library* library, const Name& name, char type)
|
||||||
|
// *******************************************************************
|
||||||
|
: Inherit(library, name),
|
||||||
|
_type(type),
|
||||||
|
_masqueInfo(NULL),
|
||||||
|
_genTrans(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor* Transistor::Create(Library* library, const Name& name, char type)
|
||||||
|
// **************************************************************************
|
||||||
|
{
|
||||||
|
Transistor* transistor = new Transistor(library, name, type);
|
||||||
|
|
||||||
|
transistor->_PostCreate();
|
||||||
|
|
||||||
|
return transistor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::_PreDelete()
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
// Delete aggregated objets.
|
||||||
|
// *************************
|
||||||
|
if(_masqueInfo)
|
||||||
|
_masqueInfo->Delete();
|
||||||
|
|
||||||
|
if(_genTrans)
|
||||||
|
delete _genTrans;
|
||||||
|
|
||||||
|
Inherit::_PreDelete();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::_PostCreate()
|
||||||
|
// *******************************
|
||||||
|
{
|
||||||
|
Inherit::_PostCreate();
|
||||||
|
|
||||||
|
(Net::Create(this, Name("DRAIN")))->SetExternal(true);
|
||||||
|
(Net::Create(this, Name("SOURCE")))->SetExternal(true);
|
||||||
|
(Net::Create(this, Name("GRID")))->SetExternal(true);
|
||||||
|
(Net::Create(this, Name("BULK")))->SetExternal(true);
|
||||||
|
|
||||||
|
// By default, transistor's length and heigth is NULL, and is internal.
|
||||||
|
// ********************************************************************
|
||||||
|
_masqueInfo = new MaskV1Info(0.0, 0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string Transistor::_GetString() const
|
||||||
|
// ***********************************
|
||||||
|
{
|
||||||
|
string s = Inherit::_GetString();
|
||||||
|
s.insert(s.length()-1, " " + GetString(_type));
|
||||||
|
s.insert(s.length()-1, " " + GetAbutmentType()._GetString());
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Record* Transistor::_GetRecord() const
|
||||||
|
// ************************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::MaskVersion Transistor::_GetMaskInfoVersion(MaskInfo* masqueinfo)
|
||||||
|
// ***************************************************************************************
|
||||||
|
{
|
||||||
|
if(!masqueinfo)
|
||||||
|
throw Error("Error : In Transistor::_GetMaskInfoVersion, param masqueinfo is NULL");
|
||||||
|
|
||||||
|
if(dynamic_cast<MaskV1Info*>(masqueinfo))
|
||||||
|
return MaskVersion(MaskVersion::VERSION1);
|
||||||
|
|
||||||
|
throw Error("Error : In Transistor::_GetMaskInfoVersion, can't dynamic cast param masqueinfo");
|
||||||
|
return MaskVersion(MaskVersion::VERSION1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Transistor::MaskInfo* Transistor::_CreateMaskInfo(const MaskVersion& version)
|
||||||
|
// *******************************************************************************
|
||||||
|
{
|
||||||
|
switch((const MaskVersion::Code&)version) {
|
||||||
|
case MaskVersion::VERSION1 :
|
||||||
|
return MaskV1Info::Create(0.0, 0.0);
|
||||||
|
|
||||||
|
default :
|
||||||
|
throw Error ("Error : In Transistor::_CreateMaskInfoBy, unknown param version");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::SetMaskInfo(MaskInfo* masqueinfo)
|
||||||
|
// ***************************************************
|
||||||
|
{
|
||||||
|
if(!masqueinfo)
|
||||||
|
throw Error("Error : In Transistor::CreateLayout : masqueinfo is NULL");
|
||||||
|
|
||||||
|
// Set new Param.
|
||||||
|
// ***************
|
||||||
|
MaskVersion newversion = _GetMaskInfoVersion(masqueinfo);
|
||||||
|
MaskVersion oldversion = _GetMaskInfoVersion(_masqueInfo);
|
||||||
|
|
||||||
|
if(newversion == oldversion) { // If they are the same version.
|
||||||
|
if((*_masqueInfo)==(*masqueinfo)) // If they are identical.
|
||||||
|
return;
|
||||||
|
else
|
||||||
|
(*_masqueInfo)=(*masqueinfo);
|
||||||
|
}
|
||||||
|
else { // If change the version.
|
||||||
|
_masqueInfo->Delete();
|
||||||
|
_masqueInfo = _CreateMaskInfo(newversion);
|
||||||
|
(*_masqueInfo) == (*masqueinfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::CreateLayout()
|
||||||
|
// ****************************
|
||||||
|
{
|
||||||
|
MaskVersion version = _GetMaskInfoVersion(_masqueInfo);
|
||||||
|
MaskV1Info* masquev1info = NULL;
|
||||||
|
|
||||||
|
// Select algorithme with technology and masque version.
|
||||||
|
// *****************************************************
|
||||||
|
switch((const MaskVersion::Code&)version) {
|
||||||
|
|
||||||
|
case MaskVersion::VERSION1 :
|
||||||
|
masquev1info = dynamic_cast<MaskV1Info*>(_masqueInfo);
|
||||||
|
_genTrans = new GenV1Trans(masquev1info);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default :
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SetTerminal(false);
|
||||||
|
|
||||||
|
// Launch the selected algorithme.
|
||||||
|
// ******************************
|
||||||
|
_genTrans->Calculate(this);
|
||||||
|
_genTrans->Generate(this);
|
||||||
|
|
||||||
|
Materialize();
|
||||||
|
|
||||||
|
delete _genTrans;
|
||||||
|
_genTrans = NULL;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Transistor::DuplicateLayout(Transistor* transistor)
|
||||||
|
// *****************************************************
|
||||||
|
{
|
||||||
|
OpenUpdateSession();
|
||||||
|
|
||||||
|
SetTerminal(false);
|
||||||
|
|
||||||
|
Net * tmp = NULL;
|
||||||
|
Contact * con = NULL;
|
||||||
|
Segment * seg = NULL;
|
||||||
|
|
||||||
|
for_each_net(net, transistor->GetNets())
|
||||||
|
if( !( tmp=GetNet(net->GetName()) ) ) { //
|
||||||
|
tmp = Net::Create(this, net->GetName());
|
||||||
|
tmp->SetExternal(net->IsExternal());
|
||||||
|
}
|
||||||
|
|
||||||
|
for_each_component(component, net->GetComponents())
|
||||||
|
if( (con=dynamic_cast<Contact*>(component)) ){
|
||||||
|
Contact::Create(tmp, component->GetLayer(), con->GetX(), con->GetY(), con->GetWidth(), con->GetHeight());
|
||||||
|
}
|
||||||
|
else if( (seg=dynamic_cast<Vertical*>(component)) ) {
|
||||||
|
Vertical::Create(tmp, component->GetLayer(), seg->GetSourceX(), seg->GetWidth(), seg->GetSourceY(),
|
||||||
|
seg->GetTargetY());
|
||||||
|
}
|
||||||
|
else if( (seg=dynamic_cast<Horizontal*>(component)) ){
|
||||||
|
Horizontal::Create(tmp, component->GetLayer(), seg->GetSourceY(), seg->GetWidth(), seg->GetSourceX(),
|
||||||
|
seg->GetTargetX());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw Error ("Error : In Transistor::DuplicateLayout, find illegal elem : " + GetString(component) +
|
||||||
|
"In Transistor, all component must be contact or segment" ) ;
|
||||||
|
end_for
|
||||||
|
end_for
|
||||||
|
|
||||||
|
SetAbutmentBox(transistor->GetAbutmentBox());
|
||||||
|
|
||||||
|
_mapNet2Box.clear();
|
||||||
|
|
||||||
|
map<Net*, Box>::iterator i = transistor->_GetMapNet2Box()->begin(),
|
||||||
|
j = transistor->_GetMapNet2Box()->end();
|
||||||
|
|
||||||
|
while(i!=j) {
|
||||||
|
_mapNet2Box[GetNet((*i).first->GetName())]=(*i).second;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
Materialize();
|
||||||
|
|
||||||
|
CloseUpdateSession();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
string GetString(const H::Transistor::MaskInfo& masqueinfo)
|
||||||
|
// **********************************************************
|
||||||
|
{
|
||||||
|
return masqueinfo._GetString();
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,344 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Transistor.h
|
||||||
|
// Authors: Wu YiFei
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_TRANSISTOR
|
||||||
|
#define HURRICANE_TRANSISTOR
|
||||||
|
|
||||||
|
#include "Cell.h"
|
||||||
|
#include "AnalogicalCommons.h"
|
||||||
|
|
||||||
|
|
||||||
|
//BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Library;
|
||||||
|
class Name;
|
||||||
|
class Symbol;
|
||||||
|
class Record;
|
||||||
|
class GenTrans;
|
||||||
|
|
||||||
|
class Transistor : public Cell {
|
||||||
|
// ********************************
|
||||||
|
|
||||||
|
//# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public : typedef Cell Inherit;
|
||||||
|
|
||||||
|
|
||||||
|
public : class MaskVersion {
|
||||||
|
// ******************
|
||||||
|
public : enum Code { VERSION1=0 };
|
||||||
|
|
||||||
|
private: Code _code;
|
||||||
|
|
||||||
|
public : explicit MaskVersion(const Code& code=VERSION1);
|
||||||
|
public : MaskVersion(const MaskVersion&);
|
||||||
|
public : MaskVersion& operator=(const MaskVersion&);
|
||||||
|
|
||||||
|
public : bool operator==(const MaskVersion&) const;
|
||||||
|
|
||||||
|
public : operator const Code& () const { return _code; };
|
||||||
|
public : const Code& GetCode() const { return _code; };
|
||||||
|
|
||||||
|
public : string _GetTypeName() const { return _TName("Transistor::MaskVersion"); };
|
||||||
|
public : string _GetString() const;
|
||||||
|
public : Record* _GetRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
public : class Type {
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public : enum Code { INTERNAL=0, LEFT=1, RIGHT=2, SINGLE=3};
|
||||||
|
|
||||||
|
private: Code _code;
|
||||||
|
|
||||||
|
public : explicit Type(const Code& code=INTERNAL);
|
||||||
|
public : Type(const Type& type);
|
||||||
|
public : Type& operator=(const Type& type);
|
||||||
|
public : operator const Code&() const { return _code; };
|
||||||
|
|
||||||
|
public : void SetCode(const Code& code) { _code = code; };
|
||||||
|
|
||||||
|
public : const Code& GetCode() const { return _code; };
|
||||||
|
|
||||||
|
public : string _GetTypeName() const { return _TName("Transistor::Type"); };
|
||||||
|
public : string _GetString() const;
|
||||||
|
public : Record* _GetRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
public : class MaskInfo {
|
||||||
|
// ***************
|
||||||
|
|
||||||
|
// Attributs
|
||||||
|
// *********
|
||||||
|
private : double _l;
|
||||||
|
private : double _w ;
|
||||||
|
private : Type _type;
|
||||||
|
private : unsigned _nbDrainColumn;
|
||||||
|
private : unsigned _nbSourceColumn;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
public : MaskInfo(const double& l, const double& w, const Type::Code& type=Type::INTERNAL
|
||||||
|
, const unsigned& nbDrainColumn=1
|
||||||
|
, const unsigned& nbSourceColumn=1);
|
||||||
|
|
||||||
|
public : virtual MaskInfo& operator=(const MaskInfo&);
|
||||||
|
|
||||||
|
private : MaskInfo(const MaskInfo& );
|
||||||
|
|
||||||
|
protected : virtual void _PostCreate();
|
||||||
|
|
||||||
|
// Destructors
|
||||||
|
// ***********
|
||||||
|
protected: virtual ~MaskInfo() {};
|
||||||
|
protected: virtual void _PreDelete();
|
||||||
|
public : virtual void Delete();
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
public : const double& GetL() const { return _l; };
|
||||||
|
public : const double& GetW() const { return _w; };
|
||||||
|
public : const unsigned & GetNbDrainColumn() const { return _nbDrainColumn; };
|
||||||
|
public : const unsigned & GetNbSourceColumn() const { return _nbSourceColumn; };
|
||||||
|
public : const Type& GetType() const { return _type; };
|
||||||
|
|
||||||
|
// Update
|
||||||
|
// ******
|
||||||
|
public : void SetL(const double& l) { _l=l;};
|
||||||
|
public : void SetW(const double& w) { _w=w;};
|
||||||
|
public : void SetNbDrainColumn(const unsigned& column) { _nbDrainColumn=column; };
|
||||||
|
public : void SetNbSourceColumn(const unsigned& column) { _nbSourceColumn=column; };
|
||||||
|
public : void SetType(const Type::Code& code) { _type.SetCode(code); };
|
||||||
|
public : void SetType(const Type& type) { _type = type; };
|
||||||
|
|
||||||
|
// Predicats
|
||||||
|
// *********
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
public : virtual bool operator==(const MaskInfo&);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
public : virtual string _GetTypeName() const =0;
|
||||||
|
public : virtual string _GetString() const;
|
||||||
|
public : virtual Record* _GetRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
public : class MaskV1Info : public MaskInfo {
|
||||||
|
// *************************************
|
||||||
|
|
||||||
|
// type
|
||||||
|
// *****
|
||||||
|
public : typedef MaskInfo Inherit ;
|
||||||
|
|
||||||
|
// Attributs
|
||||||
|
// *********
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
public: MaskV1Info(const double& l, const double& w, const Type::Code& type=Type::INTERNAL
|
||||||
|
, const unsigned& nbDrainColumn = 1
|
||||||
|
, const unsigned& nbSourceColumn = 1);
|
||||||
|
|
||||||
|
public: static MaskV1Info* Create(const double& l, const double& w, const Type::Code& type=Type::INTERNAL
|
||||||
|
, const unsigned& nbDrainColumn = 1
|
||||||
|
, const unsigned& nbSourceColumn = 1);
|
||||||
|
|
||||||
|
public : MaskInfo& operator=(const MaskInfo&);
|
||||||
|
|
||||||
|
protected : void _PostCreate();
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
// ***********
|
||||||
|
public : virtual ~MaskV1Info() {};
|
||||||
|
protected: void _PreDelete();
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
public : bool operator==(const MaskInfo&);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// *********
|
||||||
|
public : virtual string _GetTypeName() const { return _TName("Transistor::MaskV1Info"); };
|
||||||
|
public : virtual string _GetString() const;
|
||||||
|
public : virtual Record* _GetRecord() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// *******************
|
||||||
|
private : char _type;
|
||||||
|
private : MaskInfo* _masqueInfo;
|
||||||
|
private : GenTrans * _genTrans;
|
||||||
|
//public : RealInfo * _realInfo;
|
||||||
|
|
||||||
|
private : map<Net*, Box> _mapNet2Box; // This Map Is For localize The Position Of Routing.
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
protected : Transistor(Library* library, const Name& name, char type);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
public : static Transistor* Create(Library* library, const Name& name, char type);
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
protected : virtual void _PostCreate();
|
||||||
|
|
||||||
|
|
||||||
|
// Destructors
|
||||||
|
// ***********
|
||||||
|
protected : ~Transistor() {};
|
||||||
|
protected : virtual void _PreDelete();
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
public : char GetType() const { return _type; };
|
||||||
|
public : MaskVersion GetMaskVersion() const { return _GetMaskInfoVersion(_masqueInfo); };
|
||||||
|
public : const MaskInfo* GetMaskInfo() const { return _masqueInfo; };
|
||||||
|
public : const double& GetL() const { return _masqueInfo->GetL(); };
|
||||||
|
public : const double& GetW() const { return _masqueInfo->GetW(); };
|
||||||
|
public : const unsigned& GetNbDrainColumn() const { return _masqueInfo->GetNbDrainColumn(); };
|
||||||
|
public : const unsigned& GetNbSourceColumn() const { return _masqueInfo->GetNbSourceColumn(); };
|
||||||
|
public : const char* GetDrainName() const { return "DRAIN"; };
|
||||||
|
public : const char* GetSourceName() const { return "SOURCE"; };
|
||||||
|
public : const char* GetGridName() const { return "GRID"; };
|
||||||
|
public : Net* GetDrain() const { return GetNet(GetDrainName()); };
|
||||||
|
public : Net* GetSource() const { return GetNet(GetSourceName()); };
|
||||||
|
public : Net* GetGrid() const { return GetNet(GetGridName()); };
|
||||||
|
public : const Type& GetAbutmentType() const { return _masqueInfo->GetType(); };
|
||||||
|
|
||||||
|
// Predicats
|
||||||
|
// *********
|
||||||
|
public : bool IsNmos() const { return _type==TRANSN; };
|
||||||
|
public : bool IsPmos() const { return _type==TRANSP; };
|
||||||
|
public : bool IsInternal() const { return GetAbutmentType().GetCode()==Type::INTERNAL; };
|
||||||
|
public : bool IsLeft() const { return GetAbutmentType().GetCode()==Type::LEFT; };
|
||||||
|
public : bool IsRight() const { return GetAbutmentType().GetCode()==Type::RIGHT; };
|
||||||
|
public : bool IsSingle() const { return GetAbutmentType().GetCode()==Type::SINGLE; };
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
public : void SetL(const double& l) { _masqueInfo->SetL(l); };
|
||||||
|
public : void SetW(const double& w) { _masqueInfo->SetW(w); };
|
||||||
|
|
||||||
|
//# endif
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
public : virtual string _GetTypeName() const {return _TName("Transistor");};
|
||||||
|
public : virtual string _GetString() const;
|
||||||
|
public : virtual Record* _GetRecord() const;
|
||||||
|
public : const GenTrans* _GetGenTrans() const {return _genTrans; };
|
||||||
|
public : static MaskVersion _GetMaskInfoVersion(MaskInfo*) ;
|
||||||
|
public : static MaskInfo* _CreateMaskInfo(const MaskVersion&) ;
|
||||||
|
public : map<Net*, Box>* _GetMapNet2Box() { return &_mapNet2Box; };
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
public : void SetMaskInfo(MaskInfo*);
|
||||||
|
public : void CreateLayout();
|
||||||
|
public : void DuplicateLayout(Transistor* transistor) ;
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Proxy...<const Transistor::MaskVersion::Code*>".
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyTypeName<Transistor::MaskVersion::Code>
|
||||||
|
( const Transistor::MaskVersion::Code* object )
|
||||||
|
{ return "<PointerSlotAdapter<Transistor::MaskVersion::Code>>"; }
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyString <Transistor::MaskVersion::Code>
|
||||||
|
( const Transistor::MaskVersion::Code* object )
|
||||||
|
{
|
||||||
|
switch ( *object ) {
|
||||||
|
case Transistor::MaskVersion::VERSION1: return "VERSION1";
|
||||||
|
}
|
||||||
|
return "ABNORMAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline Record* ProxyRecord <Transistor::MaskVersion::Code>
|
||||||
|
( const Transistor::MaskVersion::Code* object )
|
||||||
|
{
|
||||||
|
Record* record = new Record(GetString(object));
|
||||||
|
record->Add(GetSlot("Code", (unsigned int*)object));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Proxy...<const Transistor::Type::Code*>".
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyTypeName<Transistor::Type::Code>
|
||||||
|
( const Transistor::Type::Code* object )
|
||||||
|
{ return "<PointerSlotAdapter<Transistor::Type::Code>>"; }
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyString <Transistor::Type::Code>
|
||||||
|
( const Transistor::Type::Code* object )
|
||||||
|
{
|
||||||
|
switch ( *object ) {
|
||||||
|
case Transistor::Type::LEFT : return "LEFT";
|
||||||
|
case Transistor::Type::SINGLE: return "SINGLE";
|
||||||
|
case Transistor::Type::RIGHT: return "RIGHT";
|
||||||
|
case Transistor::Type::INTERNAL: return "INTERNAL";
|
||||||
|
}
|
||||||
|
return "ABNORMAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline Record* ProxyRecord <Transistor::Type::Code>
|
||||||
|
( const Transistor::Type::Code* object )
|
||||||
|
{
|
||||||
|
Record* record = new Record(GetString(object));
|
||||||
|
record->Add(GetSlot("Code", (unsigned int*)object));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
string GetString(const H::Transistor::MaskInfo&);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HURRICANE_TRANSISTOR
|
|
@ -0,0 +1,59 @@
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Transistors.h
|
||||||
|
// Authors: YIFEI WU
|
||||||
|
// Date : 21/12/2006
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_TRANSISTORS
|
||||||
|
#define HURRICANE_TRANSISTORS
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
class Transistor;
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Transistors declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<Transistor*> Transistors;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// TransistorLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<Transistor*> TransistorLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// TransistorFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<Transistor*> TransistorFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_transistor declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_transistor(transistor, transistors)\
|
||||||
|
/******************************/\
|
||||||
|
{\
|
||||||
|
TransistorLocator _locator = transistors.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
Transistor* transistor = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
#endif // HURRICANE_TRANSISTORS
|
||||||
|
|
|
@ -0,0 +1,123 @@
|
||||||
|
// **************************************************************
|
||||||
|
// TwoSpaces.cpp
|
||||||
|
// Author : Wu YiFei
|
||||||
|
// Date : 12/04/2007
|
||||||
|
// ***************************************************************
|
||||||
|
|
||||||
|
#include "TwoSpaces.h"
|
||||||
|
|
||||||
|
|
||||||
|
BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Two Spaces definition.
|
||||||
|
// ****************************************************************************************************
|
||||||
|
TwoSpaces::TwoSpaces(const string& s)
|
||||||
|
// *********************************
|
||||||
|
: _s(s)
|
||||||
|
,_n(1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TwoSpaces::TwoSpaces(const TwoSpaces& ts)
|
||||||
|
// **************************************
|
||||||
|
: _s(ts._s)
|
||||||
|
,_n(ts._n)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TwoSpaces& TwoSpaces::operator=(const TwoSpaces& ts)
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
_s = ts._s;
|
||||||
|
_n = ts._n;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TwoSpaces& TwoSpaces::operator++()
|
||||||
|
// *******************************
|
||||||
|
{
|
||||||
|
if(_n<100) _n++;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
TwoSpaces TwoSpaces::operator++(int)
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
TwoSpaces ts = *this;
|
||||||
|
if(_n<100) _n++;
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TwoSpaces& TwoSpaces::operator--()
|
||||||
|
// *******************************
|
||||||
|
{
|
||||||
|
if(_n>1) _n--;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TwoSpaces TwoSpaces::operator--(int)
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
TwoSpaces ts = *this;
|
||||||
|
if(_n>1) _n--;
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TwoSpaces TwoSpaces::operator+(int count)
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
TwoSpaces ts = *this;
|
||||||
|
if( (_n+count) <= 100 ) ts._n = _n + count;
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TwoSpaces TwoSpaces::operator-(int count)
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
TwoSpaces ts = *this;
|
||||||
|
if ( (_n - count) >= 1 ) ts._n = _n - count;
|
||||||
|
return ts;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
string TwoSpaces::_GetString() const
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
string s;
|
||||||
|
unsigned n = _n;
|
||||||
|
|
||||||
|
while(n--) {
|
||||||
|
s += _s;
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Variables definition.
|
||||||
|
// ****************************************************************************************************
|
||||||
|
TwoSpaces ts(" ");
|
||||||
|
|
||||||
|
|
||||||
|
END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
string GetString(const H::TwoSpaces& ts)
|
||||||
|
// ***********************************
|
||||||
|
{
|
||||||
|
return ts._GetString();
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,72 @@
|
||||||
|
// **************************************************************
|
||||||
|
// TwoSpaces.h
|
||||||
|
// Author : Wu YiFei
|
||||||
|
// Date : 12/04/2007
|
||||||
|
// ***************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
# ifndef HURRICANE_TWOSPACES
|
||||||
|
# define HURRICANE_TWOSPACES
|
||||||
|
|
||||||
|
# include "Commons.h"
|
||||||
|
|
||||||
|
|
||||||
|
BEGIN_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// TwoSpaces declaration.
|
||||||
|
// ****************************************************************************************************
|
||||||
|
class TwoSpaces {
|
||||||
|
// ***************
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
private : string _s;
|
||||||
|
private : unsigned _n;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// *************
|
||||||
|
public : TwoSpaces(const string& s = " ");
|
||||||
|
public : TwoSpaces(const TwoSpaces&);
|
||||||
|
|
||||||
|
// Destructors
|
||||||
|
// ***********
|
||||||
|
public : ~TwoSpaces(){};
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
public : TwoSpaces& operator=(const TwoSpaces&);
|
||||||
|
public : TwoSpaces& operator++();
|
||||||
|
public : TwoSpaces operator++(int);
|
||||||
|
public : TwoSpaces& operator--();
|
||||||
|
public : TwoSpaces operator--(int);
|
||||||
|
public : TwoSpaces operator+(int);
|
||||||
|
public : TwoSpaces operator-(int);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
public : string _GetString() const ;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Variables declaration.
|
||||||
|
// ****************************************************************************************************
|
||||||
|
extern TwoSpaces ts;
|
||||||
|
|
||||||
|
END_NAMESPACE_HURRICANE
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
string GetString(const H::TwoSpaces&);
|
||||||
|
|
||||||
|
inline ostream& operator<<(ostream& stream, const H::TwoSpaces& ts)
|
||||||
|
// ****************************************************************
|
||||||
|
{
|
||||||
|
return stream<< GetString(ts);
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif // END HURRICANE_TWOSPACES
|
|
@ -0,0 +1,162 @@
|
||||||
|
# - Find bison executable and provides macros to generate custom build rules
|
||||||
|
# The module defined the following variables:
|
||||||
|
# BISON_EXECUTABLE - path to the bison program
|
||||||
|
# BISON_VERSION - version of bison
|
||||||
|
# BISON_FOUND - true if the program was found
|
||||||
|
# If bison is found, the module defines the macros:
|
||||||
|
# BISON_TARGET(<Name> <YaccInput> <CodeOutput> [VERBOSE <file>]
|
||||||
|
# [COMPILE_FLAGS <string>])
|
||||||
|
# which will create a custom rule to generate a parser. <YaccInput> is
|
||||||
|
# the path to a yacc file. <CodeOutput> is the name of the source file
|
||||||
|
# generated by bison. A header file is also be generated, and contains
|
||||||
|
# the token list. If COMPILE_FLAGS option is specified, the next
|
||||||
|
# parameter is added in the bison command line. if VERBOSE option is
|
||||||
|
# specified, <file> is created and contains verbose descriptions of the
|
||||||
|
# grammar and parser. The macro defines a set of variables:
|
||||||
|
# BISON_${Name}_DEFINED - true is the macro ran successfully
|
||||||
|
# BISON_${Name}_INPUT - The input source file, an alias for <YaccInput>
|
||||||
|
# BISON_${Name}_OUTPUT_SOURCE - The source file generated by bison
|
||||||
|
# BISON_${Name}_OUTPUT_HEADER - The header file generated by bison
|
||||||
|
# BISON_${Name}_OUTPUTS - The sources files generated by bison
|
||||||
|
# BISON_${Name}_COMPILE_FLAGS - Options used in the bison command line
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# FIND_PACKAGE(BISON)
|
||||||
|
# BISON_TARGET(MyParser parser.y ${PROJECT_BINARY_DIR}/parser.cpp)
|
||||||
|
# ADD_EXECUTABLE(Foo main.cpp ${BISON_MyParser_OUTPUTS})
|
||||||
|
#
|
||||||
|
|
||||||
|
# Copyright (c) 2006, Tristan Carel
|
||||||
|
# All rights reserved.
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Berkeley nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
# $Id: FindBISON.cmake 1218 2007-03-22 22:10:45Z jmh $
|
||||||
|
|
||||||
|
SET(BISON_FOUND FALSE)
|
||||||
|
|
||||||
|
FIND_PROGRAM(BISON_EXECUTABLE bison DOC "path to the bison executable")
|
||||||
|
MARK_AS_ADVANCED(BISON_EXECUTABLE)
|
||||||
|
|
||||||
|
IF(BISON_EXECUTABLE)
|
||||||
|
SET(BISON_FOUND TRUE)
|
||||||
|
|
||||||
|
EXECUTE_PROCESS(COMMAND ${BISON_EXECUTABLE} --version
|
||||||
|
OUTPUT_VARIABLE BISON_version_output
|
||||||
|
ERROR_VARIABLE BISON_version_error
|
||||||
|
RESULT_VARIABLE BISON_version_result
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
IF(NOT ${BISON_version_result} EQUAL 0)
|
||||||
|
MESSAGE(SEND_ERROR "Command \"${BISON_EXECUTABLE} --version\" failed with output:\n${BISON_version_error}")
|
||||||
|
ELSE(NOT ${BISON_version_result} EQUAL 0)
|
||||||
|
STRING(REGEX REPLACE "^bison \\(GNU Bison\\) ([^\n]+)\n.*" "\\1"
|
||||||
|
BISON_VERSION "${BISON_version_output}")
|
||||||
|
ENDIF(NOT ${BISON_version_result} EQUAL 0)
|
||||||
|
|
||||||
|
# internal macro
|
||||||
|
MACRO(BISON_TARGET_option_verbose Name BisonOutput filename)
|
||||||
|
LIST(APPEND BISON_TARGET_cmdopt "--verbose")
|
||||||
|
GET_FILENAME_COMPONENT(BISON_TARGET_output_path "${BisonOutput}" PATH)
|
||||||
|
GET_FILENAME_COMPONENT(BISON_TARGET_output_name "${BisonOutput}" NAME_WE)
|
||||||
|
ADD_CUSTOM_COMMAND(OUTPUT ${filename}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -E copy
|
||||||
|
"${BISON_TARGET_output_path}/${BISON_TARGET_output_name}.output"
|
||||||
|
"${filename}"
|
||||||
|
DEPENDS
|
||||||
|
"${BISON_TARGET_output_path}/${BISON_TARGET_output_name}.output"
|
||||||
|
COMMENT "[BISON][${Name}] Copying bison verbose table to ${filename}"
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||||
|
SET(BISON_${Name}_VERBOSE_FILE ${filename})
|
||||||
|
LIST(APPEND BISON_TARGET_extraoutputs
|
||||||
|
"${BISON_TARGET_output_path}/${BISON_TARGET_output_name}.output")
|
||||||
|
ENDMACRO(BISON_TARGET_option_verbose)
|
||||||
|
|
||||||
|
# internal macro
|
||||||
|
MACRO(BISON_TARGET_option_extraopts Options)
|
||||||
|
SET(BISON_TARGET_extraopts "${Options}")
|
||||||
|
SEPARATE_ARGUMENTS(BISON_TARGET_extraopts)
|
||||||
|
LIST(APPEND BISON_TARGET_cmdopt ${BISON_TARGET_extraopts})
|
||||||
|
ENDMACRO(BISON_TARGET_option_extraopts)
|
||||||
|
|
||||||
|
MACRO(BISON_TARGET Name BisonInput BisonOutput)
|
||||||
|
SET(BISON_TARGET_output_header "")
|
||||||
|
SET(BISON_TARGET_command_opt "")
|
||||||
|
SET(BISON_TARGET_outputs "${BisonOutput}")
|
||||||
|
IF(NOT ${ARGC} EQUAL 3 AND NOT ${ARGC} EQUAL 5 AND NOT ${ARGC} EQUAL 7)
|
||||||
|
MESSAGE(SEND_ERROR "Usage")
|
||||||
|
ELSE(NOT ${ARGC} EQUAL 3 AND NOT ${ARGC} EQUAL 5 AND NOT ${ARGC} EQUAL 7)
|
||||||
|
# Parsing parameters
|
||||||
|
IF(${ARGC} GREATER 5 OR ${ARGC} EQUAL 5)
|
||||||
|
IF("${ARGV3}" STREQUAL "VERBOSE")
|
||||||
|
BISON_TARGET_option_verbose(${Name} ${BisonOutput} "${ARGV4}")
|
||||||
|
ENDIF("${ARGV3}" STREQUAL "VERBOSE")
|
||||||
|
IF("${ARGV3}" STREQUAL "COMPILE_FLAGS")
|
||||||
|
BISON_TARGET_option_extraopts("${ARGV4}")
|
||||||
|
ENDIF("${ARGV3}" STREQUAL "COMPILE_FLAGS")
|
||||||
|
ENDIF(${ARGC} GREATER 5 OR ${ARGC} EQUAL 5)
|
||||||
|
IF(${ARGC} EQUAL 7)
|
||||||
|
IF("${ARGV5}" STREQUAL "VERBOSE")
|
||||||
|
BISON_TARGET_option_verbose(${Name} ${BisonOutput} "${ARGV6}")
|
||||||
|
ENDIF("${ARGV5}" STREQUAL "VERBOSE")
|
||||||
|
IF("${ARGV5}" STREQUAL "COMPILE_FLAGS")
|
||||||
|
BISON_TARGET_option_extraopts("${ARGV6}")
|
||||||
|
ENDIF("${ARGV5}" STREQUAL "COMPILE_FLAGS")
|
||||||
|
ENDIF(${ARGC} EQUAL 7)
|
||||||
|
|
||||||
|
# Header's name generated by bison (see option -d)
|
||||||
|
LIST(APPEND BISON_TARGET_cmdopt "-d")
|
||||||
|
STRING(REGEX REPLACE "^(.*)\\.c([^.]*)$" "\\1.h\\2"
|
||||||
|
BISON_${Name}_OUTPUT_HEADER "${ARGV2}")
|
||||||
|
LIST(APPEND BISON_TARGET_outputs "${BISON_${Name}_OUTPUT_HEADER}")
|
||||||
|
|
||||||
|
ADD_CUSTOM_COMMAND(OUTPUT ${BISON_TARGET_outputs}
|
||||||
|
${BISON_TARGET_extraoutputs}
|
||||||
|
COMMAND ${BISON_EXECUTABLE} ${BISON_TARGET_cmdopt} -o ${ARGV2} ${ARGV1}
|
||||||
|
DEPENDS ${ARGV1}
|
||||||
|
COMMENT "[BISON][${Name}] Building parser with bison ${BISON_VERSION}"
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||||
|
|
||||||
|
# define target variables
|
||||||
|
SET(BISON_${Name}_DEFINED TRUE)
|
||||||
|
SET(BISON_${Name}_INPUT ${ARGV1})
|
||||||
|
SET(BISON_${Name}_OUTPUTS ${BISON_TARGET_outputs})
|
||||||
|
SET(BISON_${Name}_COMPILE_FLAGS ${BISON_TARGET_cmdopt})
|
||||||
|
SET(BISON_${Name}_OUTPUT_SOURCE "${BisonOutput}")
|
||||||
|
|
||||||
|
ENDIF(NOT ${ARGC} EQUAL 3 AND NOT ${ARGC} EQUAL 5 AND NOT ${ARGC} EQUAL 7)
|
||||||
|
ENDMACRO(BISON_TARGET)
|
||||||
|
|
||||||
|
ENDIF(BISON_EXECUTABLE)
|
||||||
|
|
||||||
|
|
||||||
|
IF(NOT BISON_FOUND)
|
||||||
|
IF(NOT BISON_FIND_QUIETLY)
|
||||||
|
MESSAGE(STATUS "BISON was not found.")
|
||||||
|
ELSE(NOT BISON_FIND_QUIETLY)
|
||||||
|
IF(BISON_FIND_REQUIRED)
|
||||||
|
MESSAGE(FATAL_ERROR "BISON was not found.")
|
||||||
|
ENDIF(BISON_FIND_REQUIRED)
|
||||||
|
ENDIF(NOT BISON_FIND_QUIETLY)
|
||||||
|
ENDIF(NOT BISON_FOUND)
|
||||||
|
|
||||||
|
# FindBISON.cmake ends here
|
|
@ -0,0 +1,134 @@
|
||||||
|
# - Find flex executable and provides a macro to generate custom build rules
|
||||||
|
# The module defines the following variables:
|
||||||
|
# FLEX_FOUND - true is flex executable is found
|
||||||
|
# FLEX_VERSION - the version of flex
|
||||||
|
# If flex is found on the system, the module provides the macro:
|
||||||
|
# FLEX_TARGET(Name FlexInput FlexOutput [COMPILE_FLAGS <string>])
|
||||||
|
# which creates a custom command to generate the <FlexOutput> file from
|
||||||
|
# the <FlexInput> file. If COMPILE_FLAGS option is specified, the next
|
||||||
|
# parameter is added to the flex command line. Name is an alias used to
|
||||||
|
# get details of this custom command. Indeed the macro defines the
|
||||||
|
# following variables:
|
||||||
|
# FLEX_${Name}_DEFINED - true is the macro ran successfully
|
||||||
|
# FLEX_${Name}_OUTPUTS - the source file generated by the custom rule, an
|
||||||
|
# alias for FlexOutput
|
||||||
|
# FLEX_${Name}_INPUT - the flex source file, an alias for ${FlexInput}
|
||||||
|
#
|
||||||
|
# Flex scanners oftenly use tokens defined by Bison: the code generated
|
||||||
|
# by Flex depends of the header generated by Bison. This module also
|
||||||
|
# defines a macro:
|
||||||
|
# ADD_FLEX_BISON_DEPENDENCY(FlexTarget BisonTarget)
|
||||||
|
# which adds the required dependency between a scanner and a parser
|
||||||
|
# where <FlexTarget> and <BisonTarget> are the first parameters of
|
||||||
|
# respectively FLEX_TARGET and BISON_TARGET macros.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# FIND_PACKAGE(BISON)
|
||||||
|
# FIND_PACKAGE(FLEX)
|
||||||
|
# BISON_TARGET(MyParser parser.y ${PROJECT_BINARY_DIR}/parser.cpp
|
||||||
|
# FLEX_TARGET(MyScanner lexer.l ${PROJECT_BINARY_DIR}/lexer.cpp)
|
||||||
|
# ADD_FLEX_BISON_DEPENDENCY(MyScanner MyParser)
|
||||||
|
#
|
||||||
|
|
||||||
|
# Copyright (c) 2006, Tristan Carel
|
||||||
|
# All rights reserved.
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the University of California, Berkeley nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
|
||||||
|
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
# $Id: FindFLEX.cmake 1218 2007-03-22 22:10:45Z jmh $
|
||||||
|
|
||||||
|
SET(FLEX_FOUND FALSE)
|
||||||
|
|
||||||
|
FIND_PROGRAM(FLEX_EXECUTABLE flex DOC "path to the flex executable")
|
||||||
|
MARK_AS_ADVANCED(FLEX_EXECUTABLE)
|
||||||
|
|
||||||
|
FIND_LIBRARY(FL_LIBRARY NAMES fl
|
||||||
|
PATHS /usr/lib DOC "path to the fl library")
|
||||||
|
SET(FLEX_LIBRARIES ${FL_LIBRARY})
|
||||||
|
|
||||||
|
IF(FLEX_EXECUTABLE)
|
||||||
|
SET(FLEX_FOUND TRUE)
|
||||||
|
|
||||||
|
EXECUTE_PROCESS(COMMAND ${FLEX_EXECUTABLE} --version
|
||||||
|
OUTPUT_VARIABLE FLEX_version_output
|
||||||
|
ERROR_VARIABLE FLEX_version_error
|
||||||
|
RESULT_VARIABLE FLEX_version_result
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
IF(NOT ${FLEX_version_result} EQUAL 0)
|
||||||
|
MESSAGE(SEND_ERROR "Command \"${FLEX_EXECUTABLE} --version\" failed with output:\n${FLEX_version_error}")
|
||||||
|
ELSE(NOT ${FLEX_version_result} EQUAL 0)
|
||||||
|
STRING(REGEX REPLACE "^flex (.*)$" "\\1"
|
||||||
|
FLEX_VERSION "${FLEX_version_output}")
|
||||||
|
ENDIF(NOT ${FLEX_version_result} EQUAL 0)
|
||||||
|
|
||||||
|
MACRO(FLEX_TARGET Name Input Output)
|
||||||
|
SET(FLEX_TARGET_usage "FLEX_TARGET(<Name> <Input> <Output> [COMPILE_FLAGS <string>]")
|
||||||
|
IF(${ARGC} GREATER 3)
|
||||||
|
IF(${ARGC} EQUAL 5)
|
||||||
|
IF("${ARGV3}" STREQUAL "COMPILE_FLAGS")
|
||||||
|
SET(FLEX_EXECUTABLE_opts "${ARGV4}")
|
||||||
|
SEPARATE_ARGUMENTS(FLEX_EXECUTABLE_opts)
|
||||||
|
ELSE("${ARGV3}" STREQUAL "COMPILE_FLAGS")
|
||||||
|
MESSAGE(SEND_ERROR ${FLEX_TARGET_usage})
|
||||||
|
ENDIF("${ARGV3}" STREQUAL "COMPILE_FLAGS")
|
||||||
|
ELSE(${ARGC} EQUAL 5)
|
||||||
|
MESSAGE(SEND_ERROR ${FLEX_TARGET_usage})
|
||||||
|
ENDIF(${ARGC} EQUAL 5)
|
||||||
|
ENDIF(${ARGC} GREATER 3)
|
||||||
|
ADD_CUSTOM_COMMAND(OUTPUT ${Output}
|
||||||
|
COMMAND ${FLEX_EXECUTABLE} ${FLEX_EXECUTABLE_opts} -o${Output} ${Input}
|
||||||
|
DEPENDS ${Input}
|
||||||
|
COMMENT "[FLEX][${Name}] Building scanner with flex ${FLEX_VERSION}"
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
||||||
|
|
||||||
|
SET(FLEX_${Name}_DEFINED TRUE)
|
||||||
|
SET(FLEX_${Name}_OUTPUTS ${Output})
|
||||||
|
SET(FLEX_${Name}_INPUT ${Input})
|
||||||
|
SET(FLEX_${Name}_COMPILE_FLAGS ${FLEX_EXECUTABLE_opts})
|
||||||
|
ENDMACRO(FLEX_TARGET)
|
||||||
|
|
||||||
|
MACRO(ADD_FLEX_BISON_DEPENDENCY FlexTarget BisonTarget)
|
||||||
|
IF(NOT FLEX_${FlexTarget}_TARGET)
|
||||||
|
MESSAGE(SEND_ERROR "Flex target `${FlexTarget}' does not exists.")
|
||||||
|
ENDIF(NOT FLEX_${FlexTarget}_TARGET)
|
||||||
|
IF(NOT BISON_${BisonTarget}_TARGET)
|
||||||
|
MESSAGE(SEND_ERROR "Bison target `${BisonTarget}' does not exists.")
|
||||||
|
ENDIF(NOT BISON_${BisonTarget}_TARGET)
|
||||||
|
|
||||||
|
SET_SOURCE_FILES_PROPERTIES(${FLEX_${FlexTarget}_OUTPUT}
|
||||||
|
PROPERTIES OBJECT_DEPENDS ${BISON_${BisonTarget}_OUTPUT_HEADER})
|
||||||
|
ENDMACRO(ADD_FLEX_BISON_DEPENDENCY)
|
||||||
|
|
||||||
|
ENDIF(FLEX_EXECUTABLE)
|
||||||
|
|
||||||
|
IF(NOT FLEX_FOUND)
|
||||||
|
IF(NOT FLEX_FIND_QUIETLY)
|
||||||
|
MESSAGE(STATUS "FLEX was not found.")
|
||||||
|
ELSE(NOT FLEX_FIND_QUIETLY)
|
||||||
|
IF(FLEX_FIND_REQUIRED)
|
||||||
|
MESSAGE(FATAL_ERROR "FLEX was not found.")
|
||||||
|
ENDIF(FLEX_FIND_REQUIRED)
|
||||||
|
ENDIF(NOT FLEX_FIND_QUIETLY)
|
||||||
|
ENDIF(NOT FLEX_FOUND)
|
||||||
|
|
||||||
|
# FindFLEX.cmake ends here
|
|
@ -0,0 +1,11 @@
|
||||||
|
include(${QT_USE_FILE})
|
||||||
|
|
||||||
|
include_directories(${HURRICANE_SOURCE_DIR}/hurricane)
|
||||||
|
|
||||||
|
set(includes CellFigure.h InstanceFigure.h SliceFigure.h GoFigure.h SegmentFigure.h)
|
||||||
|
set(cpps CellFigure.cpp InstanceFigure.cpp SliceFigure.cpp GoFigure.cpp SegmentFigure.cpp)
|
||||||
|
|
||||||
|
add_library(hurricanefigs SHARED ${cpps})
|
||||||
|
|
||||||
|
install(FILES ${includes} DESTINATION /include/hurricane)
|
||||||
|
install(TARGETS hurricanefigs DESTINATION /lib)
|
|
@ -0,0 +1,81 @@
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QStyleOptionGraphicsItem>
|
||||||
|
|
||||||
|
#include "InstanceFigure.h"
|
||||||
|
#include "SliceFigure.h"
|
||||||
|
|
||||||
|
#include "Utils.h"
|
||||||
|
#include "CellFigure.h"
|
||||||
|
|
||||||
|
CellFigure::CellFigure(Cell* c):
|
||||||
|
QGraphicsItem(),
|
||||||
|
cell(c) {
|
||||||
|
QTransform transform;
|
||||||
|
transform.setMatrix(1.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 1.0);
|
||||||
|
setTransform(transform);
|
||||||
|
for_each_instance(instance, cell->GetInstances()) {
|
||||||
|
new InstanceFigure(this, instance);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
for_each_slice(slice, cell->GetSlices()) {
|
||||||
|
new SliceFigure(this, slice);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CellFigure::CellFigure(InstanceFigure* master, Cell* c) : QGraphicsItem(master), cell(c) {
|
||||||
|
for_each_instance(instance, cell->GetInstances()) {
|
||||||
|
new InstanceFigure(this, instance);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
for_each_slice(slice, cell->GetSlices()) {
|
||||||
|
new SliceFigure(this, slice);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF CellFigure::boundingRect() const {
|
||||||
|
Box box = cell->GetBoundingBox();
|
||||||
|
QRectF rect;
|
||||||
|
BoxToRectangle(box, rect);
|
||||||
|
rect = transform().mapRect(rect);
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CellFigure::paint(QPainter *painter, const QStyleOptionGraphicsItem* option, QWidget *) {
|
||||||
|
// QPen pen(Qt::blue);
|
||||||
|
// pen.setWidth(10);
|
||||||
|
// painter->setPen(pen);
|
||||||
|
// painter->drawLine(0, 0, 50, 0);
|
||||||
|
//
|
||||||
|
// painter->drawLine(0, 0, 0, 50);
|
||||||
|
// pen.setColor(Qt::red);
|
||||||
|
// painter->setPen(pen);
|
||||||
|
|
||||||
|
painter->setClipRect(option->exposedRect);
|
||||||
|
if (option->levelOfDetail > 1.0) {
|
||||||
|
drawBoundary(painter);
|
||||||
|
} else {
|
||||||
|
drawPhantom(painter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CellFigure::drawBoundary(QPainter* painter) {
|
||||||
|
QPen pen(Qt::black);
|
||||||
|
painter->setPen(pen);
|
||||||
|
Box box = cell->GetAbutmentBox();
|
||||||
|
QRectF rect;
|
||||||
|
BoxToRectangle(box, rect);
|
||||||
|
painter->drawRect(rect);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CellFigure::drawPhantom(QPainter* painter) {
|
||||||
|
painter->setBrush(Qt::red);
|
||||||
|
Box box = cell->GetAbutmentBox();
|
||||||
|
QRectF rect;
|
||||||
|
BoxToRectangle(box, rect);
|
||||||
|
painter->drawRect(rect);
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#ifndef __CELL_FIGURE_H
|
||||||
|
#define __CELL_FIGURE_H
|
||||||
|
|
||||||
|
#include <QGraphicsItem>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "Cell.h"
|
||||||
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
class InstanceFigure;
|
||||||
|
|
||||||
|
|
||||||
|
class CellFigure : public QGraphicsItem {
|
||||||
|
public:
|
||||||
|
CellFigure(Cell* cell);
|
||||||
|
CellFigure(InstanceFigure* master, Cell* cell);
|
||||||
|
QRectF boundingRect() const;
|
||||||
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
||||||
|
QWidget *widget);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Cell* cell;
|
||||||
|
void drawBoundary(QPainter* painter);
|
||||||
|
void drawPhantom(QPainter* painter);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __CELL_FIGURE_H */
|
|
@ -0,0 +1,19 @@
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <QPainter>
|
||||||
|
|
||||||
|
#include "SliceFigure.h"
|
||||||
|
|
||||||
|
#include "Utils.h"
|
||||||
|
#include "GoFigure.h"
|
||||||
|
|
||||||
|
GoFigure::GoFigure(SliceFigure* master):
|
||||||
|
QGraphicsItem(master)
|
||||||
|
{}
|
||||||
|
|
||||||
|
QRectF GoFigure::boundingRect() const {
|
||||||
|
Box box = getGo()->GetBoundingBox();
|
||||||
|
QRectF rect;
|
||||||
|
BoxToRectangle(box, rect);
|
||||||
|
return rect;
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
#ifndef __GO_FIGURE_H
|
||||||
|
#define __GO_FIGURE_H
|
||||||
|
|
||||||
|
#include <QGraphicsItem>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "Go.h"
|
||||||
|
using namespace H;
|
||||||
|
|
||||||
|
class SliceFigure;
|
||||||
|
|
||||||
|
class GoFigure : public QGraphicsItem {
|
||||||
|
public:
|
||||||
|
GoFigure(SliceFigure* parent);
|
||||||
|
QRectF boundingRect() const;
|
||||||
|
protected:
|
||||||
|
virtual Go* getGo() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __GO_FIGURE_H */
|
|
@ -0,0 +1,30 @@
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QTransform>
|
||||||
|
|
||||||
|
#include "Utils.h"
|
||||||
|
#include "InstanceFigure.h"
|
||||||
|
|
||||||
|
InstanceFigure::InstanceFigure(CellFigure* parent, Instance* inst):
|
||||||
|
QGraphicsItem(parent),
|
||||||
|
instance(inst) {
|
||||||
|
Cell* masterCell = inst->GetMasterCell();
|
||||||
|
|
||||||
|
Transformation transformation = instance->GetTransformation();
|
||||||
|
QTransform transform;
|
||||||
|
QPoint pos;
|
||||||
|
HurricanePositionToQtPosition(transformation, transform, pos);
|
||||||
|
setTransform(transform);
|
||||||
|
setPos(pos);
|
||||||
|
new CellFigure(this, masterCell);
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF InstanceFigure::boundingRect() const {
|
||||||
|
Cell* masterCell = instance->GetMasterCell();
|
||||||
|
Box box = masterCell->GetAbutmentBox();
|
||||||
|
QRectF rect;
|
||||||
|
BoxToRectangle(box, rect);
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InstanceFigure::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
|
||||||
|
{}
|
|
@ -0,0 +1,24 @@
|
||||||
|
#ifndef __INSTANCE_FIGURE_H
|
||||||
|
#define __INSTANCE_FIGURE_H
|
||||||
|
|
||||||
|
#include <QGraphicsItem>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "CellFigure.h"
|
||||||
|
|
||||||
|
#include "Instance.h"
|
||||||
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
class InstanceFigure : public QGraphicsItem {
|
||||||
|
public:
|
||||||
|
InstanceFigure(CellFigure* parent, Instance* instance);
|
||||||
|
QRectF boundingRect() const;
|
||||||
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
||||||
|
QWidget *widget);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Instance* instance;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __INSTANCE_FIGURE_H */
|
|
@ -0,0 +1,31 @@
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QStyleOptionGraphicsItem>
|
||||||
|
|
||||||
|
#include "BasicLayer.h"
|
||||||
|
using namespace H;
|
||||||
|
|
||||||
|
#include "Utils.h"
|
||||||
|
#include "SegmentFigure.h"
|
||||||
|
|
||||||
|
SegmentFigure::SegmentFigure(SliceFigure* master, Segment* s):
|
||||||
|
GoFigure(master),
|
||||||
|
segment(s)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void SegmentFigure::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
|
||||||
|
if (option->levelOfDetail < 1.0) {
|
||||||
|
painter->setClipRect(option->exposedRect);
|
||||||
|
BasicLayer* layer = dynamic_cast<BasicLayer*>(segment->GetLayer());
|
||||||
|
if (layer) {
|
||||||
|
painter->setBrush(QColor(layer->GetRedValue(), layer->GetGreenValue(), layer->GetBlueValue()));
|
||||||
|
} else {
|
||||||
|
painter->setBrush(Qt::blue);
|
||||||
|
}
|
||||||
|
Box box = segment->GetBoundingBox();
|
||||||
|
QRectF rect;
|
||||||
|
BoxToRectangle(box, rect);
|
||||||
|
painter->drawRect(rect);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
#ifndef __SEGMENT_FIGURE_H
|
||||||
|
#define __SEGMENT_FIGURE_H
|
||||||
|
|
||||||
|
#include <QGraphicsItem>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "GoFigure.h"
|
||||||
|
|
||||||
|
#include "Segment.h"
|
||||||
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
class SegmentFigure : public GoFigure {
|
||||||
|
public:
|
||||||
|
SegmentFigure(SliceFigure* parent, Segment* segment);
|
||||||
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Segment* segment;
|
||||||
|
protected:
|
||||||
|
Go* getGo() const { return segment; }
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __SEGMENT_FIGURE_H */
|
|
@ -0,0 +1,53 @@
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QStyleOptionGraphicsItem>
|
||||||
|
|
||||||
|
#include "BasicLayer.h"
|
||||||
|
using namespace H;
|
||||||
|
|
||||||
|
#include "SegmentFigure.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
#include "SliceFigure.h"
|
||||||
|
|
||||||
|
SliceFigure::SliceFigure(CellFigure* parent, Slice* sli):
|
||||||
|
QGraphicsItem(parent),
|
||||||
|
slice(sli)
|
||||||
|
{
|
||||||
|
// constructGoFigures();
|
||||||
|
}
|
||||||
|
|
||||||
|
QRectF SliceFigure::boundingRect() const {
|
||||||
|
Box box = slice->GetBoundingBox();
|
||||||
|
return QRectF(box.GetXMin(), box.GetXMax(), box.GetYMin(), box.GetYMax());
|
||||||
|
}
|
||||||
|
|
||||||
|
void SliceFigure::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
|
||||||
|
if (option->levelOfDetail > 1.0) {
|
||||||
|
// painter->setClipRect(option->exposedRect);
|
||||||
|
BasicLayer* layer = dynamic_cast<BasicLayer*>(slice->GetLayer());
|
||||||
|
if (layer) {
|
||||||
|
painter->setBrush(QColor(layer->GetRedValue(), layer->GetGreenValue(), layer->GetBlueValue()));
|
||||||
|
} else {
|
||||||
|
painter->setBrush(Qt::blue);
|
||||||
|
}
|
||||||
|
for_each_go(go, slice->GetGos()) {
|
||||||
|
Segment* segment = dynamic_cast<Segment*>(go);
|
||||||
|
if (segment) {
|
||||||
|
Box box = segment->GetBoundingBox();
|
||||||
|
QRectF rect;
|
||||||
|
BoxToRectangle(box, rect);
|
||||||
|
painter->drawRect(rect);
|
||||||
|
}
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SliceFigure::constructGoFigures() {
|
||||||
|
for_each_go(go, slice->GetGos()) {
|
||||||
|
Segment* segment = dynamic_cast<Segment*>(go);
|
||||||
|
if (segment) {
|
||||||
|
new SegmentFigure(this, segment);
|
||||||
|
}
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
#ifndef __SLICE_FIGURE_H
|
||||||
|
#define __SLICE_FIGURE_H
|
||||||
|
|
||||||
|
#include <QGraphicsItem>
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "CellFigure.h"
|
||||||
|
|
||||||
|
#include "Slice.h"
|
||||||
|
using namespace Hurricane;
|
||||||
|
|
||||||
|
class SliceFigure : public QGraphicsItem {
|
||||||
|
public:
|
||||||
|
SliceFigure(CellFigure* parent, Slice* slice);
|
||||||
|
QRectF boundingRect() const;
|
||||||
|
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
|
||||||
|
QWidget *widget);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Slice* slice;
|
||||||
|
void constructGoFigures();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __SLICE_FIGURE_H */
|
|
@ -0,0 +1,44 @@
|
||||||
|
#ifndef __UTILS_H
|
||||||
|
#define __UTILS_H
|
||||||
|
|
||||||
|
#include <QRectF>
|
||||||
|
#include <QTransform>
|
||||||
|
#include "Box.h"
|
||||||
|
#include "Transformation.h"
|
||||||
|
using namespace H;
|
||||||
|
|
||||||
|
inline void BoxToRectangle(const Box& box, QRectF& rec) {
|
||||||
|
double xmin = GetValue(box.GetXMin());
|
||||||
|
double xmax = GetValue(box.GetXMax());
|
||||||
|
double ymin = GetValue(box.GetYMin());
|
||||||
|
double ymax = GetValue(box.GetYMax());
|
||||||
|
rec.setCoords(xmin, ymin, xmax, ymax);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline void HurricanePositionToQtPosition(const Transformation& transformation, QTransform& transform, QPoint& position) {
|
||||||
|
double tx = GetValue(transformation.GetTx());
|
||||||
|
double ty = GetValue(transformation.GetTy());
|
||||||
|
|
||||||
|
position.setX((int)tx);
|
||||||
|
position.setY((int)ty);
|
||||||
|
|
||||||
|
switch (transformation.GetOrientation()) {
|
||||||
|
case Transformation::Orientation::ID:
|
||||||
|
transform.setMatrix(1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
|
||||||
|
break;
|
||||||
|
case Transformation::Orientation::MX:
|
||||||
|
transform.setMatrix(-1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0);
|
||||||
|
break;
|
||||||
|
case Transformation::Orientation::MY:
|
||||||
|
transform.setMatrix(1.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 1.0);
|
||||||
|
break;
|
||||||
|
case Transformation::Orientation::R2:
|
||||||
|
transform.setMatrix(-1.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 1.0);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __UTILS_H */
|
|
@ -1 +0,0 @@
|
||||||
test
|
|
|
@ -0,0 +1,462 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: BasicLayer.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "BasicLayer.h"
|
||||||
|
#include "Technology.h"
|
||||||
|
#include "CompositeLayer.h"
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// BasicLayer_BasicLayers declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class BasicLayer_BasicLayers : public Collection<BasicLayer*> {
|
||||||
|
// **********************************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Collection<BasicLayer*> Inherit;
|
||||||
|
|
||||||
|
public: class Locator : public Hurricane::Locator<BasicLayer*> {
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
public: typedef Hurricane::Locator<BasicLayer*> Inherit;
|
||||||
|
|
||||||
|
private: const BasicLayer* _basicLayer;
|
||||||
|
|
||||||
|
public: Locator(const BasicLayer* basicLayer = NULL);
|
||||||
|
public: Locator(const Locator& locator);
|
||||||
|
|
||||||
|
public: Locator& operator=(const Locator& locator);
|
||||||
|
|
||||||
|
public: virtual BasicLayer* GetElement() const;
|
||||||
|
public: virtual Hurricane::Locator<BasicLayer*>* GetClone() const;
|
||||||
|
|
||||||
|
public: virtual bool IsValid() const;
|
||||||
|
|
||||||
|
public: virtual void Progress();
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Atributes
|
||||||
|
// *********
|
||||||
|
|
||||||
|
private: const BasicLayer* _basicLayer;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: BasicLayer_BasicLayers(const BasicLayer* basicLayer = NULL);
|
||||||
|
public: BasicLayer_BasicLayers(const BasicLayer_BasicLayers& basicLayers);
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: BasicLayer_BasicLayers& operator=(const BasicLayer_BasicLayers& basicLayers);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Collection<BasicLayer*>* GetClone() const;
|
||||||
|
public: virtual Hurricane::Locator<BasicLayer*>* GetLocator() const;
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// BasicLayer implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
BasicLayer::BasicLayer(Technology* technology, const Name& name, const Type& type, unsigned extractNumber, const Unit& minimalSize, const Unit& minimalSpacing)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
: Inherit(technology, name, minimalSize, minimalSpacing),
|
||||||
|
_type(type),
|
||||||
|
_extractNumber(extractNumber),
|
||||||
|
_redValue(255),
|
||||||
|
_greenValue(255),
|
||||||
|
_blueValue(255),
|
||||||
|
_fillPattern("FFFFFFFFFFFFFFFF"),
|
||||||
|
_displayThreshold(0.0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicLayer* BasicLayer::Create(Technology* technology, const Name& name, const Type& type, unsigned extractNumber, const Unit& minimalSize, const Unit& minimalSpacing)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
{
|
||||||
|
BasicLayer* basicLayer =
|
||||||
|
new BasicLayer(technology, name, type, extractNumber, minimalSize, minimalSpacing);
|
||||||
|
|
||||||
|
basicLayer->_PostCreate();
|
||||||
|
|
||||||
|
return basicLayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicLayers BasicLayer::GetBasicLayers() const
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
return BasicLayer_BasicLayers(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BasicLayer::SetColor(unsigned short redValue, unsigned short greenValue, unsigned short blueValue)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
{
|
||||||
|
if ((redValue != _redValue) || (greenValue != _greenValue) || (blueValue != _blueValue)) {
|
||||||
|
_redValue = redValue;
|
||||||
|
_greenValue = greenValue;
|
||||||
|
_blueValue = blueValue;
|
||||||
|
//if (_drawGC) {
|
||||||
|
// gdk_gc_destroy(_drawGC);
|
||||||
|
// _drawGC = NULL;
|
||||||
|
//}
|
||||||
|
//if (_fillGC) {
|
||||||
|
// gdk_gc_destroy(_fillGC);
|
||||||
|
// _fillGC = NULL;
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BasicLayer::SetFillPattern(const string& fillPattern)
|
||||||
|
// *******************************************************
|
||||||
|
{
|
||||||
|
if (fillPattern != _fillPattern) {
|
||||||
|
if (fillPattern.size() != 16)
|
||||||
|
throw Error("Can't set fill pattern (bad value)");
|
||||||
|
|
||||||
|
string validChars = "0123456789ABCDEFabcdef";
|
||||||
|
for (unsigned i = 0; i < 16; i++) {
|
||||||
|
if (validChars.find(fillPattern[i]) == string::npos)
|
||||||
|
throw Error("Can't set fill pattern (bad value)");
|
||||||
|
}
|
||||||
|
_fillPattern = fillPattern;
|
||||||
|
//if (_drawGC) {
|
||||||
|
// gdk_gc_destroy(_drawGC);
|
||||||
|
// _drawGC = NULL;
|
||||||
|
//}
|
||||||
|
//if (_fillGC) {
|
||||||
|
// gdk_gc_destroy(_fillGC);
|
||||||
|
// _fillGC = NULL;
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BasicLayer::_PostCreate()
|
||||||
|
// ***************************
|
||||||
|
{
|
||||||
|
Mask basicLayersMask = 0;
|
||||||
|
for_each_basic_layer(basicLayer, GetTechnology()->GetBasicLayers()) {
|
||||||
|
basicLayersMask |= basicLayer->GetMask();
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
Mask mask = 1;
|
||||||
|
while (mask && (mask & basicLayersMask)) mask = mask<<1;
|
||||||
|
|
||||||
|
if (!mask)
|
||||||
|
throw Error("Can't create " + _TName("BasicLayer") + " : mask capacity overflow");
|
||||||
|
|
||||||
|
_SetMask(mask);
|
||||||
|
|
||||||
|
if (_extractNumber) {
|
||||||
|
Mask extractMask = (1 << _extractNumber);
|
||||||
|
|
||||||
|
if (!extractMask)
|
||||||
|
throw Error("Can't create " + _TName("BasicLayer") + " : extract mask capacity overflow");
|
||||||
|
|
||||||
|
_SetExtractMask(extractMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
Inherit::_PostCreate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void BasicLayer::_PreDelete()
|
||||||
|
// **************************
|
||||||
|
{
|
||||||
|
Inherit::_PreDelete();
|
||||||
|
|
||||||
|
//if (_drawGC) gdk_gc_destroy(_drawGC);
|
||||||
|
//if (_fillGC) gdk_gc_destroy(_fillGC);
|
||||||
|
|
||||||
|
CompositeLayers compositeLayers = GetTechnology()->GetCompositeLayers();
|
||||||
|
for_each_composite_layer(compositeLayer, compositeLayers) {
|
||||||
|
if (compositeLayer->Contains(this)) compositeLayer->Remove(this);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string BasicLayer::_GetString() const
|
||||||
|
// **********************************
|
||||||
|
{
|
||||||
|
string s = Inherit::_GetString();
|
||||||
|
// s.insert(s.length() - 1, " " + GetString(_type));
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* BasicLayer::_GetRecord() const
|
||||||
|
// *****************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
if (record) {
|
||||||
|
record->Add(GetSlot("Type", &_type));
|
||||||
|
record->Add(GetSlot("RedValue", &_redValue));
|
||||||
|
record->Add(GetSlot("GreenValue", &_greenValue));
|
||||||
|
record->Add(GetSlot("BlueValue", &_blueValue));
|
||||||
|
record->Add(GetSlot("FillPattern", &_fillPattern));
|
||||||
|
record->Add(GetSlot("DisplayThreshold", &_displayThreshold));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
//GdkGC* BasicLayer::_GetDrawGC()
|
||||||
|
//// ****************************
|
||||||
|
//{
|
||||||
|
// if (!_drawGC) _drawGC = gtk_gc_new(_redValue, _greenValue, _blueValue);
|
||||||
|
//
|
||||||
|
// return _drawGC;
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//GdkGC* BasicLayer::_GetFillGC()
|
||||||
|
//// ****************************
|
||||||
|
//{
|
||||||
|
// if (!_fillGC) _fillGC = gtk_gc_new(_redValue, _greenValue, _blueValue, _fillPattern);
|
||||||
|
//
|
||||||
|
// return _fillGC;
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
|
||||||
|
//void BasicLayer::_Fill(View* view, const Box& box) const
|
||||||
|
//// *****************************************************
|
||||||
|
//{
|
||||||
|
// switch (_type) {
|
||||||
|
// case Type::CONTACT : {
|
||||||
|
//
|
||||||
|
// Unit minimalSize = GetMinimalSize();
|
||||||
|
// Unit minimalSpacing = GetMinimalSpacing();
|
||||||
|
//
|
||||||
|
// if ((minimalSize <= 0) || (minimalSpacing <= 0))
|
||||||
|
// view->FillRectangle(box);
|
||||||
|
// else {
|
||||||
|
// view->DrawRectangle(box);
|
||||||
|
//
|
||||||
|
// Unit width = box.GetWidth();
|
||||||
|
// Unit height = box.GetHeight();
|
||||||
|
// Unit offset = minimalSize + minimalSpacing;
|
||||||
|
//
|
||||||
|
// int nx = (int)(GetValue(width) / GetValue(offset));
|
||||||
|
// int ny = (int)(GetValue(height) / GetValue(offset));
|
||||||
|
//
|
||||||
|
// Unit dx = (width - (minimalSize + (offset * nx))) / 2;
|
||||||
|
// Unit dy = (height - (minimalSize + (offset * ny))) / 2;
|
||||||
|
//
|
||||||
|
// if (dx < 0) dx = (width - (minimalSize + (offset * (--nx)))) / 2;
|
||||||
|
// if (dy < 0) dy = (height - (minimalSize + (offset * (--ny)))) / 2;
|
||||||
|
//
|
||||||
|
// Unit xmin = box.GetXMin() + dx;
|
||||||
|
// Unit ymin = box.GetYMin() + dy;
|
||||||
|
// Unit xmax = box.GetXMax() - dx;
|
||||||
|
// Unit ymax = box.GetYMax() - dy;
|
||||||
|
//
|
||||||
|
// if ((xmin < xmax) && (ymin < ymax)) {
|
||||||
|
// Unit y = ymin;
|
||||||
|
// do {
|
||||||
|
// Unit x = xmin;
|
||||||
|
// do {
|
||||||
|
// view->FillRectangle(x, y, x + minimalSize, y + minimalSize, true);
|
||||||
|
// x += offset;
|
||||||
|
// } while (x < xmax);
|
||||||
|
// y += offset;
|
||||||
|
// } while (y < ymax);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// default : {
|
||||||
|
// view->FillRectangle(box);
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// BasicLayer_BasicLayers implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
BasicLayer_BasicLayers::BasicLayer_BasicLayers(const BasicLayer* basicLayer)
|
||||||
|
// *************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_basicLayer(basicLayer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicLayer_BasicLayers::BasicLayer_BasicLayers(const BasicLayer_BasicLayers& basicLayers)
|
||||||
|
// **************************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_basicLayer(basicLayers._basicLayer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicLayer_BasicLayers& BasicLayer_BasicLayers::operator=(const BasicLayer_BasicLayers& basicLayers)
|
||||||
|
// *************************************************************************************************
|
||||||
|
{
|
||||||
|
_basicLayer = basicLayers._basicLayer;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Collection<BasicLayer*>* BasicLayer_BasicLayers::GetClone() const
|
||||||
|
// **************************************************************
|
||||||
|
{
|
||||||
|
return new BasicLayer_BasicLayers(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<BasicLayer*>* BasicLayer_BasicLayers::GetLocator() const
|
||||||
|
// *************************************************************
|
||||||
|
{
|
||||||
|
return new Locator(_basicLayer);
|
||||||
|
}
|
||||||
|
|
||||||
|
string BasicLayer_BasicLayers::_GetString() const
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("BasicLayer::BasicLayers");
|
||||||
|
if (_basicLayer) s += " " + GetString(_basicLayer);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// BasicLayer_BasicLayers::Locator implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
BasicLayer_BasicLayers::Locator::Locator(const BasicLayer* basicLayer)
|
||||||
|
// *******************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_basicLayer(basicLayer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicLayer_BasicLayers::Locator::Locator(const Locator& locator)
|
||||||
|
// *************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_basicLayer(locator._basicLayer)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicLayer_BasicLayers::Locator& BasicLayer_BasicLayers::Locator::operator=(const Locator& locator)
|
||||||
|
// ************************************************************************************************
|
||||||
|
{
|
||||||
|
_basicLayer = locator._basicLayer;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicLayer* BasicLayer_BasicLayers::Locator::GetElement() const
|
||||||
|
// ************************************************************
|
||||||
|
{
|
||||||
|
return (BasicLayer*)_basicLayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<BasicLayer*>* BasicLayer_BasicLayers::Locator::GetClone() const
|
||||||
|
// ********************************************************************
|
||||||
|
{
|
||||||
|
return new Locator(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool BasicLayer_BasicLayers::Locator::IsValid() const
|
||||||
|
// **************************************************
|
||||||
|
{
|
||||||
|
return (_basicLayer != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void BasicLayer_BasicLayers::Locator::Progress()
|
||||||
|
// *********************************************
|
||||||
|
{
|
||||||
|
_basicLayer = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
string BasicLayer_BasicLayers::Locator::_GetString() const
|
||||||
|
// *******************************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("BasicLayer::BasicLayers::Locator");
|
||||||
|
if (_basicLayer) s += " " + GetString(_basicLayer);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// BasicLayer::Type implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
BasicLayer::Type::Type(const Code& code)
|
||||||
|
// *************************************
|
||||||
|
: _code(code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicLayer::Type::Type(const Type& type)
|
||||||
|
// *************************************
|
||||||
|
: _code(type._code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicLayer::Type& BasicLayer::Type::operator=(const Type& type)
|
||||||
|
// ************************************************************
|
||||||
|
{
|
||||||
|
_code = type._code;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
string BasicLayer::Type::_GetString() const
|
||||||
|
// ****************************************
|
||||||
|
{
|
||||||
|
return GetString(_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* BasicLayer::Type::_GetRecord() const
|
||||||
|
// ***********************************
|
||||||
|
{
|
||||||
|
Record* record = new Record(GetString(this));
|
||||||
|
record->Add(GetSlot("Code", &_code));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
bool Scan(const string& s, H::BasicLayer::Type& type)
|
||||||
|
// **************************************************
|
||||||
|
{
|
||||||
|
if (s == "UNDEFINED") {
|
||||||
|
type = H::BasicLayer::Type::UNDEFINED;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (s == "CONDUCTING") {
|
||||||
|
type = H::BasicLayer::Type::CONDUCTING;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (s == "CONTACT") {
|
||||||
|
type = H::BasicLayer::Type::CONTACT;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,154 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: BasicLayer.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_BASIC_LAYER
|
||||||
|
#define HURRICANE_BASIC_LAYER
|
||||||
|
|
||||||
|
#include "Layer.h"
|
||||||
|
#include "BasicLayers.h"
|
||||||
|
#include "Box.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class View;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// BasicLayer declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class BasicLayer : public Layer {
|
||||||
|
// ****************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Layer Inherit;
|
||||||
|
|
||||||
|
public: class Type {
|
||||||
|
// ***************
|
||||||
|
|
||||||
|
public: enum Code {UNDEFINED=0, CONDUCTING=1, CONTACT=2};
|
||||||
|
|
||||||
|
private: Code _code;
|
||||||
|
|
||||||
|
public: Type(const Code& code = UNDEFINED);
|
||||||
|
public: Type(const Type& type);
|
||||||
|
|
||||||
|
public: Type& operator=(const Type& type);
|
||||||
|
|
||||||
|
public: operator const Code&() const {return _code;};
|
||||||
|
|
||||||
|
public: const Code& GetCode() const {return _code;};
|
||||||
|
|
||||||
|
public: string _GetTypeName() const { return _TName("BasicLayer::Type"); };
|
||||||
|
public: string _GetString() const;
|
||||||
|
public: Record* _GetRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Type _type;
|
||||||
|
private: unsigned _extractNumber;
|
||||||
|
private: unsigned short _redValue;
|
||||||
|
private: unsigned short _greenValue;
|
||||||
|
private: unsigned short _blueValue;
|
||||||
|
private: string _fillPattern;
|
||||||
|
private: double _displayThreshold;
|
||||||
|
// private: GdkGC* _drawGC;
|
||||||
|
// private: GdkGC* _fillGC;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: BasicLayer(Technology* technology, const Name& name, const Type& type, unsigned extractNumber, const Unit& minimalSize = 0, const Unit& minimalSpacing = 0);
|
||||||
|
|
||||||
|
public: static BasicLayer* Create(Technology* technology, const Name& name, const Type& type, unsigned extractNumber, const Unit& minimalSize = 0, const Unit& minimalSpacing = 0);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: const Type& GetType() const {return _type;};
|
||||||
|
public: unsigned GetExtractNumber() const {return _extractNumber;};
|
||||||
|
public: const unsigned short& GetRedValue() const {return _redValue;};
|
||||||
|
public: const unsigned short& GetGreenValue() const {return _greenValue;};
|
||||||
|
public: const unsigned short& GetBlueValue() const {return _blueValue;};
|
||||||
|
public: const string& GetFillPattern() const {return _fillPattern;};
|
||||||
|
public: double GetDisplayThreshold() const {return _displayThreshold;};
|
||||||
|
public: virtual BasicLayers GetBasicLayers() const;
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: void SetColor(unsigned short redValue, unsigned short greenValue, unsigned short blueValue);
|
||||||
|
public: void SetFillPattern(const string& fillPattern);
|
||||||
|
public: void SetDisplayThreshold(double threshold) {_displayThreshold = threshold;};
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
protected: virtual void _PostCreate();
|
||||||
|
|
||||||
|
protected: virtual void _PreDelete();
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const {return _TName("BasicLayer");};
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
public: virtual BasicLayer* _GetSymbolicBasicLayer() {return this;};
|
||||||
|
//public: GdkGC* _GetDrawGC();
|
||||||
|
//public: GdkGC* _GetFillGC();
|
||||||
|
|
||||||
|
public: void _Fill(View* view, const Box& box) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Proxy...<const BasicLayer::Type::Code*>".
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyTypeName<BasicLayer::Type::Code> ( const BasicLayer::Type::Code* object )
|
||||||
|
{ return "<PointerSlotAdapter<BasicLayer::Type::Code>>"; }
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyString<BasicLayer::Type::Code> ( const BasicLayer::Type::Code* object )
|
||||||
|
{
|
||||||
|
switch ( *object ) {
|
||||||
|
case BasicLayer::Type::UNDEFINED: return "UNDEFINED";
|
||||||
|
case BasicLayer::Type::CONDUCTING: return "CONDUCTING";
|
||||||
|
case BasicLayer::Type::CONTACT: return "CONTACT";
|
||||||
|
}
|
||||||
|
return "ABNORMAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline Record* ProxyRecord<BasicLayer::Type::Code> ( const BasicLayer::Type::Code* object )
|
||||||
|
{
|
||||||
|
Record* record = new Record(GetString(object));
|
||||||
|
record->Add(GetSlot("Code", (unsigned int*)object));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::BasicLayer)
|
||||||
|
|
||||||
|
|
||||||
|
bool Scan(const string& s, H::BasicLayer::Type& type);
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HURRICANE_BASIC_LAYER
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,62 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: BasicLayers.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_BASIC_LAYERS
|
||||||
|
#define HURRICANE_BASIC_LAYERS
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class BasicLayer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// BasicLayers declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<BasicLayer*> BasicLayers;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// BasicLayerLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<BasicLayer*> BasicLayerLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// BasicLayerFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<BasicLayer*> BasicLayerFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_basic_layer declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_basic_layer(basicLayer, basicLayers)\
|
||||||
|
/****************************************************/\
|
||||||
|
{\
|
||||||
|
BasicLayerLocator _locator = basicLayers.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
BasicLayer* basicLayer = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_BASIC_LAYERS
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,349 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Box.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// 21-10-2003 added ManhattanDistance & ShrinkByFactor
|
||||||
|
|
||||||
|
#include "Error.h"
|
||||||
|
#include "Box.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Box implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Box::Box()
|
||||||
|
// *******
|
||||||
|
: _xMin(1),
|
||||||
|
_yMin(1),
|
||||||
|
_xMax(-1),
|
||||||
|
_yMax(-1)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Box::Box(const Unit& x, const Unit& y)
|
||||||
|
// ***********************************
|
||||||
|
: _xMin(x),
|
||||||
|
_yMin(y),
|
||||||
|
_xMax(x),
|
||||||
|
_yMax(y)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Box::Box(const Point& point)
|
||||||
|
// *************************
|
||||||
|
: _xMin(point.GetX()),
|
||||||
|
_yMin(point.GetY()),
|
||||||
|
_xMax(point.GetX()),
|
||||||
|
_yMax(point.GetY())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Box::Box(const Unit& x1, const Unit& y1, const Unit& x2, const Unit& y2)
|
||||||
|
// *********************************************************************
|
||||||
|
: _xMin(min(x1, x2)),
|
||||||
|
_yMin(min(y1, y2)),
|
||||||
|
_xMax(max(x1, x2)),
|
||||||
|
_yMax(max(y1, y2))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Box::Box(const Point& point1, const Point& point2)
|
||||||
|
// ***********************************************
|
||||||
|
: _xMin(min(point1.GetX(), point2.GetX())),
|
||||||
|
_yMin(min(point1.GetY(), point2.GetY())),
|
||||||
|
_xMax(max(point1.GetX(), point2.GetX())),
|
||||||
|
_yMax(max(point1.GetY(), point2.GetY()))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Box::Box(const Box& box)
|
||||||
|
// *********************
|
||||||
|
: _xMin(box._xMin),
|
||||||
|
_yMin(box._yMin),
|
||||||
|
_xMax(box._xMax),
|
||||||
|
_yMax(box._yMax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Box& Box::operator=(const Box& box)
|
||||||
|
// ********************************
|
||||||
|
{
|
||||||
|
_xMin = box._xMin;
|
||||||
|
_yMin = box._yMin;
|
||||||
|
_xMax = box._xMax;
|
||||||
|
_yMax = box._yMax;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Box::operator==(const Box& box) const
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
return (!IsEmpty() &&
|
||||||
|
!box.IsEmpty() &&
|
||||||
|
(_xMin == box._xMin) &&
|
||||||
|
(_yMin == box._yMin) &&
|
||||||
|
(_xMax == box._xMax) &&
|
||||||
|
(_yMax == box._yMax));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Box::operator!=(const Box& box) const
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
return (IsEmpty() ||
|
||||||
|
box.IsEmpty() ||
|
||||||
|
(_xMin != box._xMin) ||
|
||||||
|
(_yMin != box._yMin) ||
|
||||||
|
(_xMax != box._xMax) ||
|
||||||
|
(_yMax != box._yMax));
|
||||||
|
}
|
||||||
|
|
||||||
|
Box Box::GetUnion(const Box& box) const
|
||||||
|
// ************************************
|
||||||
|
{
|
||||||
|
if (IsEmpty() && box.IsEmpty()) return Box();
|
||||||
|
return Box(min(_xMin, box._xMin),
|
||||||
|
min(_yMin, box._yMin),
|
||||||
|
max(_xMax, box._xMax),
|
||||||
|
max(_yMax, box._yMax));
|
||||||
|
}
|
||||||
|
|
||||||
|
Box Box::GetIntersection(const Box& box) const
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
if (!Intersect(box)) return Box();
|
||||||
|
return Box(max(_xMin, box._xMin),
|
||||||
|
max(_yMin, box._yMin),
|
||||||
|
min(_xMax, box._xMax),
|
||||||
|
min(_yMax, box._yMax));
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit Box::ManhattanDistance(const Point& pt) const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
Unit dist = 0;
|
||||||
|
if (IsEmpty())
|
||||||
|
throw Error("Can't compute distance to an empty Box");
|
||||||
|
if (pt.GetX() < _xMin) dist = _xMin - pt.GetX();
|
||||||
|
else if (pt.GetX() > _xMax) dist = pt.GetX() - _xMax;
|
||||||
|
// else dist = 0;
|
||||||
|
if (pt.GetY() < _yMin) dist += _yMin - pt.GetY();
|
||||||
|
else if (pt.GetY() > _yMax) dist += pt.GetY() - _yMax;
|
||||||
|
// else dist += 0;
|
||||||
|
return dist;
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit Box::ManhattanDistance(const Box& box) const
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
if (IsEmpty() || box.IsEmpty())
|
||||||
|
throw Error("Can't compute distance to an empty Box");
|
||||||
|
Unit dx, dy;
|
||||||
|
if ((dx=box.GetXMin() - _xMax) < 0)
|
||||||
|
if ((dx=_xMin-box.GetXMax()) < 0) dx=0;
|
||||||
|
if ((dy=box.GetYMin() - _yMax) < 0)
|
||||||
|
if ((dy=_yMin-box.GetYMax()) < 0) dy=0;
|
||||||
|
return dx+dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Box::IsEmpty() const
|
||||||
|
// **********************
|
||||||
|
{
|
||||||
|
return ((_xMax < _xMin) || (_yMax < _yMin));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Box::IsFlat() const
|
||||||
|
// *********************
|
||||||
|
{
|
||||||
|
return (!IsEmpty() &&
|
||||||
|
(((_xMin == _xMax) && (_yMin < _yMax)) ||
|
||||||
|
((_xMin < _xMax) && (_yMin == _yMax))));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Box::IsPonctual() const
|
||||||
|
// *************************
|
||||||
|
{
|
||||||
|
return (!IsEmpty() && (_xMax == _xMin) && (_yMax == _yMin));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Box::Contains(const Unit& x, const Unit& y) const
|
||||||
|
// ***************************************************
|
||||||
|
{
|
||||||
|
return (!IsEmpty() &&
|
||||||
|
(_xMin <= x) &&
|
||||||
|
(_yMin <= y) &&
|
||||||
|
(x <= _xMax) &&
|
||||||
|
(y <= _yMax));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Box::Contains(const Point& point) const
|
||||||
|
// *****************************************
|
||||||
|
{
|
||||||
|
return Contains(point.GetX(), point.GetY());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Box::Contains(const Box& box) const
|
||||||
|
// *************************************
|
||||||
|
{
|
||||||
|
return (!IsEmpty() &&
|
||||||
|
!box.IsEmpty() &&
|
||||||
|
(_xMin <= box._xMin) &&
|
||||||
|
(box._xMax <= _xMax) &&
|
||||||
|
(_yMin <= box._yMin) &&
|
||||||
|
(box._yMax <= _yMax));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Box::Intersect(const Box& box) const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
return (!IsEmpty() &&
|
||||||
|
!box.IsEmpty() &&
|
||||||
|
!((_xMax < box._xMin) ||
|
||||||
|
(box._xMax < _xMin) ||
|
||||||
|
(_yMax < box._yMin) ||
|
||||||
|
(box._yMax < _yMin)));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Box::IsConstrainedBy(const Box& box) const
|
||||||
|
// ********************************************
|
||||||
|
{
|
||||||
|
return (!IsEmpty() &&
|
||||||
|
!box.IsEmpty() &&
|
||||||
|
((_xMin == box.GetXMin()) ||
|
||||||
|
(_yMin == box.GetYMin()) ||
|
||||||
|
(_xMax == box.GetXMax()) ||
|
||||||
|
(_yMax == box.GetYMax())));
|
||||||
|
}
|
||||||
|
|
||||||
|
Box& Box::MakeEmpty()
|
||||||
|
// ******************
|
||||||
|
{
|
||||||
|
_xMin = 1;
|
||||||
|
_yMin = 1;
|
||||||
|
_xMax = -1;
|
||||||
|
_yMax = -1;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Box& Box::Inflate(const Unit& d)
|
||||||
|
// *****************************
|
||||||
|
{
|
||||||
|
return Inflate(d, d, d, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
Box& Box::Inflate(const Unit& dx, const Unit& dy)
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
return Inflate(dx, dy, dx, dy);
|
||||||
|
}
|
||||||
|
|
||||||
|
Box& Box::Inflate(const Unit& dxMin, const Unit& dyMin, const Unit& dxMax, const Unit& dyMax)
|
||||||
|
// ******************************************************************************************
|
||||||
|
{
|
||||||
|
if (!IsEmpty()) {
|
||||||
|
_xMin -= dxMin;
|
||||||
|
_yMin -= dyMin;
|
||||||
|
_xMax += dxMax;
|
||||||
|
_yMax += dyMax;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Box& Box::ShrinkByFactor(double factor)
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
assert((0 <= factor) && (factor <= 1));
|
||||||
|
Unit dx=GetUnit(0.5*(1- factor) * (GetValue(_xMax) - GetValue(_xMin)));
|
||||||
|
Unit dy=GetUnit(0.5*(1- factor) * (GetValue(_yMax) - GetValue(_yMin)));
|
||||||
|
return Inflate(-dx, -dy);
|
||||||
|
}
|
||||||
|
|
||||||
|
Box& Box::Merge(const Unit& x, const Unit& y)
|
||||||
|
// ******************************************
|
||||||
|
{
|
||||||
|
if (IsEmpty()) {
|
||||||
|
_xMin = x;
|
||||||
|
_yMin = y;
|
||||||
|
_xMax = x;
|
||||||
|
_yMax = y;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_xMin = min(_xMin, x);
|
||||||
|
_yMin = min(_yMin, y);
|
||||||
|
_xMax = max(_xMax, x);
|
||||||
|
_yMax = max(_yMax, y);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Box& Box::Merge(const Point& point)
|
||||||
|
// ********************************
|
||||||
|
{
|
||||||
|
return Merge(point.GetX(), point.GetY());
|
||||||
|
}
|
||||||
|
|
||||||
|
Box& Box::Merge(const Unit& x1, const Unit& y1, const Unit& x2, const Unit& y2)
|
||||||
|
// ****************************************************************************
|
||||||
|
{
|
||||||
|
Merge(x1, y1);
|
||||||
|
Merge(x2, y2);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Box& Box::Merge(const Box& box)
|
||||||
|
// ****************************
|
||||||
|
{
|
||||||
|
if (!box.IsEmpty()) {
|
||||||
|
Merge(box.GetXMin(), box.GetYMin());
|
||||||
|
Merge(box.GetXMax(), box.GetYMax());
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Box& Box::Translate(const Unit& dx, const Unit& dy)
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
if (!IsEmpty()) {
|
||||||
|
_xMin += dx;
|
||||||
|
_yMin += dy;
|
||||||
|
_xMax += dx;
|
||||||
|
_yMax += dy;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
string Box::_GetString() const
|
||||||
|
// ***************************
|
||||||
|
{
|
||||||
|
if (IsEmpty())
|
||||||
|
return "<" + _TName("Box") + " empty>";
|
||||||
|
else
|
||||||
|
return "<" + _TName("Box") + " " +
|
||||||
|
GetValueString(_xMin) + " " + GetValueString(_yMin) + " " +
|
||||||
|
GetValueString(_xMax) + " " + GetValueString(_yMax) +
|
||||||
|
">";
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* Box::_GetRecord() const
|
||||||
|
// **********************
|
||||||
|
{
|
||||||
|
if (IsEmpty()) return NULL;
|
||||||
|
|
||||||
|
Record* record = new Record(GetString(this));
|
||||||
|
record->Add(GetSlot("XMin", &_xMin));
|
||||||
|
record->Add(GetSlot("YMin", &_yMin));
|
||||||
|
record->Add(GetSlot("XMax", &_xMax));
|
||||||
|
record->Add(GetSlot("YMax", &_yMax));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,128 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Box.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// 21-10-2003 added ManhattanDistance & ShrinkByFactor
|
||||||
|
|
||||||
|
#ifndef HURRICANE_BOX
|
||||||
|
#define HURRICANE_BOX
|
||||||
|
|
||||||
|
#include "Point.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Box declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Box {
|
||||||
|
// ******
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Unit _xMin;
|
||||||
|
private: Unit _yMin;
|
||||||
|
private: Unit _xMax;
|
||||||
|
private: Unit _yMax;
|
||||||
|
|
||||||
|
// constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: Box();
|
||||||
|
|
||||||
|
public: Box(const Unit& x, const Unit& y);
|
||||||
|
public: Box(const Point& point);
|
||||||
|
public: Box(const Unit& x1, const Unit& y1, const Unit& x2, const Unit& y2);
|
||||||
|
public: Box(const Point& point1, const Point& point2);
|
||||||
|
|
||||||
|
public: Box(const Box& box);
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: Box& operator=(const Box& box);
|
||||||
|
|
||||||
|
public: bool operator==(const Box& box) const;
|
||||||
|
public: bool operator!=(const Box& box) const;
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: const Unit& GetXMin() const {return _xMin;};
|
||||||
|
public: const Unit& GetYMin() const {return _yMin;};
|
||||||
|
public: const Unit& GetXMax() const {return _xMax;};
|
||||||
|
public: const Unit& GetYMax() const {return _yMax;};
|
||||||
|
|
||||||
|
public: Unit GetXCenter() const {return ((_xMin + _xMax) / 2);};
|
||||||
|
public: Unit GetYCenter() const {return ((_yMin + _yMax) / 2);};
|
||||||
|
public: Point GetCenter() const {return Point(GetXCenter(), GetYCenter());};
|
||||||
|
|
||||||
|
public: Unit GetWidth() const {return (_xMax - _xMin);};
|
||||||
|
public: Unit GetHalfWidth() const {return (GetWidth() / 2);};
|
||||||
|
public: Unit GetHeight() const {return (_yMax - _yMin);};
|
||||||
|
public: Unit GetHalfHeight() const {return (GetHeight() / 2);};
|
||||||
|
|
||||||
|
public: Box GetUnion(const Box& box) const;
|
||||||
|
|
||||||
|
public: Box GetIntersection(const Box& box) const;
|
||||||
|
public: Unit ManhattanDistance(const Point& pt) const;
|
||||||
|
public: Unit ManhattanDistance(const Box& box) const;
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: bool IsEmpty() const;
|
||||||
|
public: bool IsFlat() const;
|
||||||
|
public: bool IsPonctual() const;
|
||||||
|
|
||||||
|
public: bool Contains(const Unit& x, const Unit& y) const;
|
||||||
|
public: bool Contains(const Point& point) const;
|
||||||
|
public: bool Contains(const Box& box) const;
|
||||||
|
|
||||||
|
public: bool Intersect(const Box& box) const;
|
||||||
|
|
||||||
|
public: bool IsConstrainedBy(const Box& box) const;
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: Box& MakeEmpty();
|
||||||
|
|
||||||
|
public: Box& Inflate(const Unit& d);
|
||||||
|
public: Box& Inflate(const Unit& dx, const Unit& dy);
|
||||||
|
public: Box& Inflate(const Unit& dxMin, const Unit& dyMin, const Unit& dxMax, const Unit& dyMax);
|
||||||
|
public: Box& ShrinkByFactor(double factor); // 0 <= factor <= 1
|
||||||
|
|
||||||
|
public: Box& Merge(const Unit& x, const Unit& y);
|
||||||
|
public: Box& Merge(const Point& point);
|
||||||
|
public: Box& Merge(const Unit& x1, const Unit& y1, const Unit& x2, const Unit& y2);
|
||||||
|
public: Box& Merge(const Box& box);
|
||||||
|
|
||||||
|
public: Box& Translate(const Unit& dx, const Unit& dy);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: string _GetTypeName() const { return _TName("Box"); };
|
||||||
|
public: string _GetString() const;
|
||||||
|
public: Record* _GetRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
ValueIOStreamSupport(Hurricane::Box)
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HURRICANE_BOX
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,61 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Boxes.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_BOXES
|
||||||
|
#define HURRICANE_BOXES
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
#include "Box.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Boxes declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<Box> Boxes;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// BoxLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<Box> BoxLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// BoxFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<Box> BoxFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_box declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_box(box, boxes)\
|
||||||
|
/*******************************/\
|
||||||
|
{\
|
||||||
|
BoxLocator _locator = boxes.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
Box box = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_BOXES
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,36 @@
|
||||||
|
set(includes BasicLayer.h BasicLayers.h Boxes.h Box.h Cell.h
|
||||||
|
Cells.h Collection.h Commons.h Component.h Components.h CompositeLayer.h
|
||||||
|
CompositeLayers.h Contact.h Contacts.h DataBase.h DBo.h DBos.h
|
||||||
|
DeepNet.h DisplaySlot.h DisplaySlots.h DRCError.h Entities.h
|
||||||
|
Entity.h Error.h Exception.h Filter.h Go.h Gos.h
|
||||||
|
Hook.h Hooks.h Horizontal.h Horizontals.h
|
||||||
|
HyperNet.h Instance.h Instances.h Interruption.h Interval.h
|
||||||
|
Intervals.h IntrusiveMap.h IntrusiveSet.h Layer.h Layers.h Libraries.h
|
||||||
|
Library.h ListCollection.h Locator.h MapCollection.h Marker.h Markers.h
|
||||||
|
MultisetCollection.h Name.h Names.h NetExternalComponents.h Net.h
|
||||||
|
Nets.h Occurrence.h Occurrences.h Pad.h Pads.h Pathes.h Path.h
|
||||||
|
Pin.h Pins.h Plug.h Plugs.h Point.h Points.h Primitives.h Properties.h
|
||||||
|
Property.h QuadTree.h Quark.h Quarks.h Record.h Reference.h References.h Region.h
|
||||||
|
Relation.h RoutingPad.h RoutingPads.h Rubber.h Rubbers.h Segment.h Segments.h Selectors.h
|
||||||
|
SetCollection.h SharedName.h SharedPathes.h SharedPath.h Slice.h Slices.h
|
||||||
|
SlotAdapter.h Slot.h Symbols.h Tabulation.h Tag.h Tags.h Technology.h Timer.h
|
||||||
|
Transformation.h Unit.h UpdateSession.h UserGo.h UserGos.h VectorCollection.h Vertical.h
|
||||||
|
Verticals.h Views.h Warning.h)
|
||||||
|
|
||||||
|
set(cpps BasicLayer.cpp Box.cpp CellCollections.cpp Cell.cpp
|
||||||
|
Commons.cpp Component.cpp CompositeLayer.cpp Contact.cpp DataBase.cpp
|
||||||
|
DBo.cpp DeepNet.cpp DisplaySlot.cpp DRCError.cpp Entity.cpp
|
||||||
|
Error.cpp Exception.cpp Go.cpp Hook.cpp Horizontal.cpp HyperNet.cpp
|
||||||
|
Instance.cpp Interruption.cpp Interval.cpp Layer.cpp Library.cpp
|
||||||
|
Marker.cpp Name.cpp Net.cpp NetExternalComponents.cpp Occurrence.cpp
|
||||||
|
Pad.cpp Path.cpp Pin.cpp Plug.cpp Point.cpp Property.cpp
|
||||||
|
QuadTree.cpp Quark.cpp Record.cpp Reference.cpp Region.cpp
|
||||||
|
Relation.cpp RoutingPad.cpp Rubber.cpp Segment.cpp SharedName.cpp
|
||||||
|
SharedPath.cpp Slice.cpp SlotAdapter.cpp Slot.cpp Tabulation.cpp
|
||||||
|
Tag.cpp Technology.cpp Timer.cpp Transformation.cpp Unit.cpp UpdateSession.cpp
|
||||||
|
UserGo.cpp Vertical.cpp Warning.cpp)
|
||||||
|
|
||||||
|
add_library(hurricane SHARED ${cpps})
|
||||||
|
|
||||||
|
install(FILES ${includes} DESTINATION /include/hurricane)
|
||||||
|
install(TARGETS hurricane DESTINATION /lib)
|
|
@ -0,0 +1,701 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Cell.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Cell.h"
|
||||||
|
#include "DataBase.h"
|
||||||
|
#include "Library.h"
|
||||||
|
#include "Instance.h"
|
||||||
|
#include "Net.h"
|
||||||
|
#include "Pin.h"
|
||||||
|
#include "RoutingPad.h"
|
||||||
|
#include "Layer.h"
|
||||||
|
#include "Slice.h"
|
||||||
|
#include "Rubber.h"
|
||||||
|
#include "Marker.h"
|
||||||
|
#include "Component.h"
|
||||||
|
#include "UpdateSession.h"
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Cell implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Cell::Cell(Library* library, const Name& name)
|
||||||
|
// *******************************************
|
||||||
|
: Inherit(),
|
||||||
|
_library(library),
|
||||||
|
_name(name),
|
||||||
|
_instanceMap(),
|
||||||
|
_quadTree(),
|
||||||
|
_slaveInstanceSet(),
|
||||||
|
_netMap(),
|
||||||
|
_sliceMap(),
|
||||||
|
_markerSet(),
|
||||||
|
//_viewSet(),
|
||||||
|
_abutmentBox(),
|
||||||
|
_boundingBox(),
|
||||||
|
_isTerminal(true),
|
||||||
|
_isPad(false),
|
||||||
|
_nextOfLibraryCellMap(NULL),
|
||||||
|
_nextOfSymbolCellSet(NULL),
|
||||||
|
_slaveEntityMap()
|
||||||
|
{
|
||||||
|
if (!_library)
|
||||||
|
throw Error("Can't create " + _TName("Cell") + " : null library");
|
||||||
|
|
||||||
|
if (name.IsEmpty())
|
||||||
|
throw Error("Can't create " + _TName("Cell") + " : empty name");
|
||||||
|
|
||||||
|
if (_library->GetCell(_name))
|
||||||
|
throw Error("Can't create " + _TName("Cell") + " : already exists");
|
||||||
|
}
|
||||||
|
|
||||||
|
Cell* Cell::Create(Library* library, const Name& name)
|
||||||
|
// ***************************************************
|
||||||
|
{
|
||||||
|
Cell* cell = new Cell(library, name);
|
||||||
|
|
||||||
|
cell->_PostCreate();
|
||||||
|
|
||||||
|
return cell;
|
||||||
|
}
|
||||||
|
|
||||||
|
Box Cell::GetBoundingBox() const
|
||||||
|
// *****************************
|
||||||
|
{
|
||||||
|
if (_boundingBox.IsEmpty()) {
|
||||||
|
Box& boundingBox = (Box&)_boundingBox;
|
||||||
|
boundingBox = _abutmentBox;
|
||||||
|
boundingBox.Merge(_quadTree.GetBoundingBox());
|
||||||
|
for_each_slice(slice, GetSlices()) {
|
||||||
|
boundingBox.Merge(slice->GetBoundingBox());
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return _boundingBox;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Cell::IsLeaf() const
|
||||||
|
// **********************
|
||||||
|
{
|
||||||
|
return _instanceMap.IsEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Cell::IsCalledBy(Cell* cell) const
|
||||||
|
// ************************************
|
||||||
|
{
|
||||||
|
for_each_instance(instance, cell->GetInstances()) {
|
||||||
|
Cell* masterCell = instance->GetMasterCell();
|
||||||
|
if (masterCell == this) return true;
|
||||||
|
if (IsCalledBy(masterCell)) return true;
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::SetName(const Name& name)
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
if (name != _name) {
|
||||||
|
if (name.IsEmpty())
|
||||||
|
throw Error("Can't change " + _TName("Cell") + " name : empty name");
|
||||||
|
|
||||||
|
if (_library->GetCell(name))
|
||||||
|
throw Error("Can't change " + _TName("Cell") + " name : already exists");
|
||||||
|
|
||||||
|
_library->_GetCellMap()._Remove(this);
|
||||||
|
_name = name;
|
||||||
|
_library->_GetCellMap()._Insert(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::SetAbutmentBox(const Box& abutmentBox)
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
if (abutmentBox != _abutmentBox) {
|
||||||
|
if (!_abutmentBox.IsEmpty() &&
|
||||||
|
(abutmentBox.IsEmpty() || !abutmentBox.Contains(_abutmentBox)))
|
||||||
|
_Unfit(_abutmentBox);
|
||||||
|
_abutmentBox = abutmentBox;
|
||||||
|
_Fit(_abutmentBox);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::FlattenNets(bool buildRings)
|
||||||
|
// ************************************
|
||||||
|
{
|
||||||
|
OpenUpdateSession ();
|
||||||
|
|
||||||
|
for_each_occurrence ( occurrence, GetHyperNetRootNetOccurrences() ) {
|
||||||
|
HyperNet hyperNet ( occurrence );
|
||||||
|
if ( !occurrence.GetPath().IsEmpty() ) {
|
||||||
|
DeepNet* deepNet = DeepNet::Create ( hyperNet );
|
||||||
|
if (deepNet) deepNet->_CreateRoutingPads ( buildRings );
|
||||||
|
} else {
|
||||||
|
RoutingPad* previousRP = NULL;
|
||||||
|
RoutingPad* currentRP = NULL;
|
||||||
|
Net* net = static_cast<Net*>(occurrence.GetEntity());
|
||||||
|
|
||||||
|
for_each_component ( component, net->GetComponents() ) {
|
||||||
|
Plug* primaryPlug = dynamic_cast<Plug*>( component );
|
||||||
|
if ( primaryPlug ) {
|
||||||
|
if ( !primaryPlug->GetBodyHook()->GetSlaveHooks().IsEmpty() ) {
|
||||||
|
cerr << "[ERROR] " << primaryPlug << "\n"
|
||||||
|
<< " has attached components, not managed yet." << endl;
|
||||||
|
} else {
|
||||||
|
primaryPlug->GetBodyHook()->Detach ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end_for
|
||||||
|
}
|
||||||
|
|
||||||
|
for_each_occurrence ( plugOccurrence, hyperNet.GetLeafPlugOccurrences() ) {
|
||||||
|
currentRP = CreateRoutingPad ( net, plugOccurrence );
|
||||||
|
currentRP->Materialize ();
|
||||||
|
if ( buildRings ) {
|
||||||
|
if ( previousRP ) {
|
||||||
|
currentRP->GetBodyHook()->Attach ( previousRP->GetBodyHook() );
|
||||||
|
}
|
||||||
|
Plug* plug = static_cast<Plug*>( plugOccurrence.GetEntity() );
|
||||||
|
if ( plugOccurrence.GetPath().IsEmpty() ) {
|
||||||
|
plug->GetBodyHook()->Attach ( currentRP->GetBodyHook() );
|
||||||
|
plug->GetBodyHook()->Detach ();
|
||||||
|
}
|
||||||
|
previousRP = currentRP;
|
||||||
|
}
|
||||||
|
|
||||||
|
end_for
|
||||||
|
}
|
||||||
|
|
||||||
|
for_each_component ( component, net->GetComponents() ) {
|
||||||
|
Pin* pin = dynamic_cast<Pin*>( component );
|
||||||
|
if ( pin ) {
|
||||||
|
currentRP = CreateRoutingPad ( pin );
|
||||||
|
if ( buildRings ) {
|
||||||
|
if ( previousRP ) {
|
||||||
|
currentRP->GetBodyHook()->Attach ( previousRP->GetBodyHook() );
|
||||||
|
}
|
||||||
|
pin->GetBodyHook()->Attach ( currentRP->GetBodyHook() );
|
||||||
|
pin->GetBodyHook()->Detach ();
|
||||||
|
}
|
||||||
|
previousRP = currentRP;
|
||||||
|
}
|
||||||
|
|
||||||
|
end_for
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end_for
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseUpdateSession ();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::Materialize()
|
||||||
|
// *********************
|
||||||
|
{
|
||||||
|
for_each_instance(instance, GetInstances()) instance->Materialize(); end_for;
|
||||||
|
for_each_net(net, GetNets()) net->Materialize(); end_for;
|
||||||
|
for_each_marker(marker, GetMarkers()) marker->Materialize(); end_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::Unmaterialize()
|
||||||
|
// ***********************
|
||||||
|
{
|
||||||
|
for_each_instance(instance, GetInstances()) instance->Unmaterialize(); end_for;
|
||||||
|
for_each_net(net, GetNets()) net->Unmaterialize(); end_for;
|
||||||
|
for_each_marker(marker, GetMarkers()) marker->Unmaterialize(); end_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::_PostCreate()
|
||||||
|
// *********************
|
||||||
|
{
|
||||||
|
_library->_GetCellMap()._Insert(this);
|
||||||
|
|
||||||
|
Inherit::_PostCreate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::_PreDelete()
|
||||||
|
// ********************
|
||||||
|
{
|
||||||
|
Inherit::_PreDelete();
|
||||||
|
|
||||||
|
while(_slaveEntityMap.size()) {
|
||||||
|
_slaveEntityMap.begin()->second->Delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
//for_each_view(view, GetViews()) view->SetCell(NULL); end_for;
|
||||||
|
for_each_marker(marker, GetMarkers()) marker->Delete(); end_for;
|
||||||
|
for_each_instance(slaveInstance, GetSlaveInstances()) slaveInstance->Delete(); end_for;
|
||||||
|
for_each_instance(instance, GetInstances()) instance->Delete(); end_for;
|
||||||
|
for_each_net(net, GetNets()) net->Delete(); end_for;
|
||||||
|
for_each_slice(slice, GetSlices()) slice->_Delete(); end_for;
|
||||||
|
|
||||||
|
_library->_GetCellMap()._Remove(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
string Cell::_GetString() const
|
||||||
|
// ****************************
|
||||||
|
{
|
||||||
|
string s = Inherit::_GetString();
|
||||||
|
s.insert(s.length() - 1, " " + GetString(_name));
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* Cell::_GetRecord() const
|
||||||
|
// ***********************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
if (record) {
|
||||||
|
record->Add(GetSlot("Library", _library));
|
||||||
|
record->Add(GetSlot("Name", &_name));
|
||||||
|
record->Add(GetSlot("Instances", &_instanceMap));
|
||||||
|
record->Add(GetSlot("QuadTree", &_quadTree));
|
||||||
|
record->Add(GetSlot("SlaveInstances", &_slaveInstanceSet));
|
||||||
|
record->Add(GetSlot("Nets", &_netMap));
|
||||||
|
record->Add(GetSlot("Pins", &_pinMap));
|
||||||
|
record->Add(GetSlot("Slices", &_sliceMap));
|
||||||
|
record->Add(GetSlot("Markers", &_markerSet));
|
||||||
|
//record->Add(GetSlot("Views", &_viewSet));
|
||||||
|
record->Add(GetSlot("AbutmentBox", &_abutmentBox));
|
||||||
|
record->Add(GetSlot("BoundingBox", &_boundingBox));
|
||||||
|
record->Add(GetSlot("IsTerminal", &_isTerminal));
|
||||||
|
record->Add(GetSlot("IsFlattenLeaf", &_isFlattenLeaf));
|
||||||
|
//record->Add(GetSlot("Symbol", _symbol));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::_Fit(const Box& box)
|
||||||
|
// ****************************
|
||||||
|
{
|
||||||
|
if (box.IsEmpty()) return;
|
||||||
|
if (_boundingBox.IsEmpty()) return;
|
||||||
|
if (_boundingBox.Contains(box)) return;
|
||||||
|
_boundingBox.Merge(box);
|
||||||
|
for_each_instance(instance, GetSlaveInstances()) {
|
||||||
|
instance->GetCell()->_Fit(instance->GetTransformation().GetBox(box));
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::_Unfit(const Box& box)
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
if (box.IsEmpty()) return;
|
||||||
|
if (_boundingBox.IsEmpty()) return;
|
||||||
|
if (!_boundingBox.IsConstrainedBy(box)) return;
|
||||||
|
_boundingBox.MakeEmpty();
|
||||||
|
for_each_instance(instance, GetSlaveInstances()) {
|
||||||
|
instance->GetCell()->_Unfit(instance->GetTransformation().GetBox(box));
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::_AddSlaveEntity(Entity* entity, Entity* slaveEntity)
|
||||||
|
// ************************************************************************
|
||||||
|
{
|
||||||
|
assert(entity->GetCell() == this);
|
||||||
|
|
||||||
|
_slaveEntityMap.insert(pair<Entity*,Entity*>(entity,slaveEntity));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::_RemoveSlaveEntity(Entity* entity, Entity* slaveEntity)
|
||||||
|
// ***************************************************************************
|
||||||
|
{
|
||||||
|
assert(entity->GetCell() == this);
|
||||||
|
|
||||||
|
pair<SlaveEntityMap::iterator,SlaveEntityMap::iterator>
|
||||||
|
bounds = _slaveEntityMap.equal_range(entity);
|
||||||
|
multimap<Entity*,Entity*>::iterator it = bounds.first;
|
||||||
|
for(; it != bounds.second ; it++ ) {
|
||||||
|
if (it->second == slaveEntity) {
|
||||||
|
_slaveEntityMap.erase(it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::_GetSlaveEntities(SlaveEntityMap::iterator& begin, SlaveEntityMap::iterator& end)
|
||||||
|
// *********************************************************************************************************
|
||||||
|
{
|
||||||
|
begin = _slaveEntityMap.begin();
|
||||||
|
end = _slaveEntityMap.end();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::_GetSlaveEntities(Entity* entity, SlaveEntityMap::iterator& begin, SlaveEntityMap::iterator& end)
|
||||||
|
// *********************************************************************************************************
|
||||||
|
{
|
||||||
|
begin = _slaveEntityMap.lower_bound(entity);
|
||||||
|
end = _slaveEntityMap.upper_bound(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
//bool Cell::_IsDrawable(View* view) const
|
||||||
|
//// *************************************
|
||||||
|
//{
|
||||||
|
// return true;
|
||||||
|
// //if (view->GetCell() == this) return true;
|
||||||
|
//
|
||||||
|
// //if (is_a<MapView*>(view)) return true;
|
||||||
|
//
|
||||||
|
// //return (1 < (double)view->GetScreenSize(_boundingBox.GetHeight()));
|
||||||
|
//// return (100 < ((double)view->GetScreenSize(_boundingBox.GetWidth()) *
|
||||||
|
//// (double)view->GetScreenSize(_boundingBox.GetHeight())));
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//bool Cell::_ContentIsDrawable(View* view) const
|
||||||
|
//// ********************************************
|
||||||
|
//{
|
||||||
|
// if (IsTerminal()) return false;
|
||||||
|
//
|
||||||
|
// return true;
|
||||||
|
//
|
||||||
|
// //if (view->GetCell() == this) return true;
|
||||||
|
//
|
||||||
|
// //if (is_a<MapView*>(view)) return false;
|
||||||
|
//
|
||||||
|
// //return (40 < (double)view->GetScreenSize(_boundingBox.GetHeight()));
|
||||||
|
//// return (400 < ((double)view->GetScreenSize(_boundingBox.GetWidth()) *
|
||||||
|
//// (double)view->GetScreenSize(_boundingBox.GetHeight())));
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Cell::_DrawPhantoms(View* view, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// **********************************************************************************************
|
||||||
|
//{
|
||||||
|
//// if (_IsDrawable(view)) { // To avoid irregular display of instances phantoms
|
||||||
|
//// if (!_ContentIsDrawable(view))
|
||||||
|
//// view->FillRectangle(transformation.GetBox(GetAbutmentBox()));
|
||||||
|
//// else {
|
||||||
|
//// for_each_instance(instance, GetInstancesUnder(updateArea)) {
|
||||||
|
//// instance->_DrawPhantoms(view, updateArea, transformation);
|
||||||
|
//// end_for;
|
||||||
|
//// }
|
||||||
|
//// }
|
||||||
|
//// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Cell::_DrawBoundaries(View* view, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// ************************************************************************************************
|
||||||
|
//{
|
||||||
|
// // if (_IsDrawable(view)) { // To avoid irregular display of instances phantoms
|
||||||
|
// // view->DrawRectangle(transformation.GetBox(GetAbutmentBox()));
|
||||||
|
// // if (_ContentIsDrawable(view)) {
|
||||||
|
// // for_each_instance(instance, GetInstancesUnder(updateArea)) {
|
||||||
|
// // instance->_DrawBoundaries(view, updateArea, transformation);
|
||||||
|
// // end_for;
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Cell::_DrawContent(View* view, BasicLayer* basicLayer, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// ****************************************************************************************************
|
||||||
|
//{
|
||||||
|
//// if (_IsDrawable(view)) {
|
||||||
|
//// if (_ContentIsDrawable(view)) {
|
||||||
|
//// view->CheckForDisplayInterruption();
|
||||||
|
//// for_each_instance(instance, GetInstancesUnder(updateArea)) {
|
||||||
|
//// instance->_Draw(view, basicLayer, updateArea, transformation);
|
||||||
|
//// end_for;
|
||||||
|
//// }
|
||||||
|
//// for_each_slice(slice, GetSlices()) {
|
||||||
|
//// slice->_Draw(view, basicLayer, updateArea, transformation);
|
||||||
|
//// end_for;
|
||||||
|
//// }
|
||||||
|
//// }
|
||||||
|
//// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Cell::_DrawRubbers(View* view, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// *********************************************************************************************
|
||||||
|
//{
|
||||||
|
//// if (_IsDrawable(view)) {
|
||||||
|
//// if (_ContentIsDrawable(view)) {
|
||||||
|
//// for_each_instance(instance, GetInstancesUnder(updateArea)) {
|
||||||
|
//// instance->_DrawRubbers(view, updateArea, transformation);
|
||||||
|
//// end_for;
|
||||||
|
//// }
|
||||||
|
//// for_each_rubber(rubber, GetRubbersUnder(updateArea)) {
|
||||||
|
//// rubber->_Draw(view, NULL, updateArea, transformation);
|
||||||
|
//// end_for;
|
||||||
|
//// }
|
||||||
|
//// }
|
||||||
|
//// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Cell::_DrawMarkers(View* view, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// *********************************************************************************************
|
||||||
|
//{
|
||||||
|
//// if (_IsDrawable(view)) {
|
||||||
|
//// if (_ContentIsDrawable(view)) {
|
||||||
|
//// for_each_instance(instance, GetInstancesUnder(updateArea)) {
|
||||||
|
//// instance->_DrawMarkers(view, updateArea, transformation);
|
||||||
|
//// end_for;
|
||||||
|
//// }
|
||||||
|
//// for_each_marker(marker, GetMarkersUnder(updateArea)) {
|
||||||
|
//// marker->_Draw(view, NULL, updateArea, transformation);
|
||||||
|
//// end_for;
|
||||||
|
//// }
|
||||||
|
//// }
|
||||||
|
//// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Cell::_DrawDisplaySlots(View* view, const Box& area, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// ********************************************************************************************************************
|
||||||
|
//{
|
||||||
|
//// if (_IsDrawable(view)) {
|
||||||
|
//// if (_ContentIsDrawable(view)) {
|
||||||
|
//// for_each_instance(instance, GetInstancesUnder(updateArea)) {
|
||||||
|
//// instance->_DrawDisplaySlots(view, area, updateArea, transformation);
|
||||||
|
//// end_for;
|
||||||
|
//// }
|
||||||
|
//// for_each_display_slot(displaySlot, GetDisplaySlots(this)) {
|
||||||
|
//// view->_DrawDisplaySlot(displaySlot, area, updateArea, transformation);
|
||||||
|
//// end_for;
|
||||||
|
//// }
|
||||||
|
//// }
|
||||||
|
//// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Cell::InstanceMap implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Cell::InstanceMap::InstanceMap()
|
||||||
|
// *****************************
|
||||||
|
: Inherit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Name Cell::InstanceMap::_GetKey(Instance* instance) const
|
||||||
|
// ******************************************************
|
||||||
|
{
|
||||||
|
return instance->GetName();
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned Cell::InstanceMap::_GetHashValue(Name name) const
|
||||||
|
// *******************************************************
|
||||||
|
{
|
||||||
|
return ( (unsigned int)( (unsigned long)name._GetSharedName() ) ) / 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance* Cell::InstanceMap::_GetNextElement(Instance* instance) const
|
||||||
|
// *******************************************************************
|
||||||
|
{
|
||||||
|
return instance->_GetNextOfCellInstanceMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::InstanceMap::_SetNextElement(Instance* instance, Instance* nextInstance) const
|
||||||
|
// **************************************************************************************
|
||||||
|
{
|
||||||
|
instance->_SetNextOfCellInstanceMap(nextInstance);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Cell::SlaveInstanceSet implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Cell::SlaveInstanceSet::SlaveInstanceSet()
|
||||||
|
// ***************************************
|
||||||
|
: Inherit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned Cell::SlaveInstanceSet::_GetHashValue(Instance* slaveInstance) const
|
||||||
|
// **************************************************************************
|
||||||
|
{
|
||||||
|
return ( (unsigned int)( (unsigned long)slaveInstance ) ) / 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance* Cell::SlaveInstanceSet::_GetNextElement(Instance* slaveInstance) const
|
||||||
|
// *****************************************************************************
|
||||||
|
{
|
||||||
|
return slaveInstance->_GetNextOfCellSlaveInstanceSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::SlaveInstanceSet::_SetNextElement(Instance* slaveInstance, Instance* nextSlaveInstance) const
|
||||||
|
// ****************************************************************************************************
|
||||||
|
{
|
||||||
|
slaveInstance->_SetNextOfCellSlaveInstanceSet(nextSlaveInstance);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Cell::NetMap implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Cell::NetMap::NetMap()
|
||||||
|
// *******************
|
||||||
|
: Inherit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Name Cell::NetMap::_GetKey(Net* net) const
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
return net->GetName();
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned Cell::NetMap::_GetHashValue(Name name) const
|
||||||
|
// **************************************************
|
||||||
|
{
|
||||||
|
return ( (unsigned int)( (unsigned long)name._GetSharedName() ) ) / 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
Net* Cell::NetMap::_GetNextElement(Net* net) const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
return net->_GetNextOfCellNetMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::NetMap::_SetNextElement(Net* net, Net* nextNet) const
|
||||||
|
// *************************************************************
|
||||||
|
{
|
||||||
|
net->_SetNextOfCellNetMap(nextNet);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Cell::PinMap implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Cell::PinMap::PinMap()
|
||||||
|
// *******************
|
||||||
|
: Inherit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Name Cell::PinMap::_GetKey(Pin* pin) const
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
return pin->GetName();
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned Cell::PinMap::_GetHashValue(Name name) const
|
||||||
|
// **************************************************
|
||||||
|
{
|
||||||
|
return ( (unsigned int)( (unsigned long)name._GetSharedName() ) ) / 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
Pin* Cell::PinMap::_GetNextElement(Pin* pin) const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
return pin->_GetNextOfCellPinMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::PinMap::_SetNextElement(Pin* pin, Pin* nextPin) const
|
||||||
|
// *************************************************************
|
||||||
|
{
|
||||||
|
pin->_SetNextOfCellPinMap(nextPin);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Cell::SliceMap implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Cell::SliceMap::SliceMap()
|
||||||
|
// ***********************
|
||||||
|
: Inherit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const Layer* Cell::SliceMap::_GetKey(Slice* slice) const
|
||||||
|
// *****************************************************
|
||||||
|
{
|
||||||
|
return slice->GetLayer();
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned Cell::SliceMap::_GetHashValue(const Layer* layer) const
|
||||||
|
// *************************************************************
|
||||||
|
{
|
||||||
|
return ( (unsigned int)( (unsigned long)layer ) ) / 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
Slice* Cell::SliceMap::_GetNextElement(Slice* slice) const
|
||||||
|
// *******************************************************
|
||||||
|
{
|
||||||
|
return slice->_GetNextOfCellSliceMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::SliceMap::_SetNextElement(Slice* slice, Slice* nextSlice) const
|
||||||
|
// ***********************************************************************
|
||||||
|
{
|
||||||
|
slice->_SetNextOfCellSliceMap(nextSlice);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Cell::MarkerSet implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Cell::MarkerSet::MarkerSet()
|
||||||
|
// *************************
|
||||||
|
: Inherit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned Cell::MarkerSet::_GetHashValue(Marker* marker) const
|
||||||
|
// **********************************************************
|
||||||
|
{
|
||||||
|
return ( (unsigned int)( (unsigned long)marker ) ) / 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
Marker* Cell::MarkerSet::_GetNextElement(Marker* marker) const
|
||||||
|
// ***********************************************************
|
||||||
|
{
|
||||||
|
return marker->_GetNextOfCellMarkerSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Cell::MarkerSet::_SetNextElement(Marker* marker, Marker* nextMarker) const
|
||||||
|
// ****************************************************************************
|
||||||
|
{
|
||||||
|
marker->_SetNextOfCellMarkerSet(nextMarker);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//// ****************************************************************************************************
|
||||||
|
//// Cell::ViewSet implementation
|
||||||
|
//// ****************************************************************************************************
|
||||||
|
//
|
||||||
|
//Cell::ViewSet::ViewSet()
|
||||||
|
//// *********************
|
||||||
|
//: Inherit()
|
||||||
|
//{
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//unsigned Cell::ViewSet::_GetHashValue(View* view) const
|
||||||
|
//// ****************************************************
|
||||||
|
//{
|
||||||
|
// return ( (unsigned int)( (unsigned long)view ) ) / 8;
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//View* Cell::ViewSet::_GetNextElement(View* view) const
|
||||||
|
//// ***************************************************
|
||||||
|
//{
|
||||||
|
// return view->_GetNextOfCellViewSet();
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Cell::ViewSet::_SetNextElement(View* view, View* nextView) const
|
||||||
|
//// ******************************************************************
|
||||||
|
//{
|
||||||
|
// view->_SetNextOfCellViewSet(nextView);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,322 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Cell.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_CELL
|
||||||
|
#define HURRICANE_CELL
|
||||||
|
|
||||||
|
#include "Pathes.h"
|
||||||
|
#include "Entity.h"
|
||||||
|
#include "Cells.h"
|
||||||
|
#include "Instance.h"
|
||||||
|
#include "DeepNet.h"
|
||||||
|
#include "Pin.h"
|
||||||
|
#include "Pins.h"
|
||||||
|
#include "Slices.h"
|
||||||
|
#include "Rubbers.h"
|
||||||
|
#include "Markers.h"
|
||||||
|
#include "Marker.h"
|
||||||
|
#include "Reference.h"
|
||||||
|
#include "Components.h"
|
||||||
|
#include "Occurrences.h"
|
||||||
|
#include "Transformation.h"
|
||||||
|
#include "Layer.h"
|
||||||
|
#include "QuadTree.h"
|
||||||
|
#include "IntrusiveMap.h"
|
||||||
|
#include "IntrusiveSet.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Library;
|
||||||
|
class BasicLayer;
|
||||||
|
|
||||||
|
|
||||||
|
typedef multimap<Entity*,Entity*> SlaveEntityMap;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Cell declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Cell : public Entity {
|
||||||
|
// ***********************
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Entity Inherit;
|
||||||
|
|
||||||
|
class InstanceMap : public IntrusiveMap<Name, Instance> {
|
||||||
|
// ****************************************************
|
||||||
|
|
||||||
|
public: typedef IntrusiveMap<Name, Instance> Inherit;
|
||||||
|
|
||||||
|
public: InstanceMap();
|
||||||
|
|
||||||
|
public: virtual Name _GetKey(Instance* instance) const;
|
||||||
|
public: virtual unsigned _GetHashValue(Name name) const;
|
||||||
|
public: virtual Instance* _GetNextElement(Instance* instance) const;
|
||||||
|
public: virtual void _SetNextElement(Instance* instance, Instance* nextInstance) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
public: class SlaveInstanceSet : public IntrusiveSet<Instance> {
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
public: typedef IntrusiveSet<Instance> Inherit;
|
||||||
|
|
||||||
|
public: SlaveInstanceSet();
|
||||||
|
|
||||||
|
public: virtual unsigned _GetHashValue(Instance* slaveInstance) const;
|
||||||
|
public: virtual Instance* _GetNextElement(Instance* slaveInstance) const;
|
||||||
|
public: virtual void _SetNextElement(Instance* slaveInstance, Instance* nextSlaveInstance) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
public: class NetMap : public IntrusiveMap<Name, Net> {
|
||||||
|
// **************************************************
|
||||||
|
|
||||||
|
public: typedef IntrusiveMap<Name, Net> Inherit;
|
||||||
|
|
||||||
|
public: NetMap();
|
||||||
|
|
||||||
|
public: virtual Name _GetKey(Net* net) const;
|
||||||
|
public: virtual unsigned _GetHashValue(Name name) const;
|
||||||
|
public: virtual Net* _GetNextElement(Net* net) const;
|
||||||
|
public: virtual void _SetNextElement(Net* net, Net* nextNet) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class PinMap : public IntrusiveMap<Name, Pin> {
|
||||||
|
// *******************************************
|
||||||
|
|
||||||
|
public: typedef IntrusiveMap<Name, Pin> Inherit;
|
||||||
|
|
||||||
|
public: PinMap();
|
||||||
|
|
||||||
|
public: virtual Name _GetKey(Pin* pin) const;
|
||||||
|
public: virtual unsigned _GetHashValue(Name name) const;
|
||||||
|
public: virtual Pin* _GetNextElement(Pin* pin) const;
|
||||||
|
public: virtual void _SetNextElement(Pin* pin, Pin* nextPin) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
public: class SliceMap : public IntrusiveMap<const Layer*, Slice> {
|
||||||
|
// **************************************************************
|
||||||
|
|
||||||
|
public: typedef IntrusiveMap<const Layer*, Slice> Inherit;
|
||||||
|
|
||||||
|
public: SliceMap();
|
||||||
|
|
||||||
|
public: virtual const Layer* _GetKey(Slice* slice) const;
|
||||||
|
public: virtual unsigned _GetHashValue(const Layer* layer) const;
|
||||||
|
public: virtual Slice* _GetNextElement(Slice* slice) const;
|
||||||
|
public: virtual void _SetNextElement(Slice* slice, Slice* nextSlice) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
public: class MarkerSet : public IntrusiveSet<Marker> {
|
||||||
|
// **************************************************
|
||||||
|
|
||||||
|
public: typedef IntrusiveSet<Marker> Inherit;
|
||||||
|
|
||||||
|
public: MarkerSet();
|
||||||
|
|
||||||
|
public: virtual unsigned _GetHashValue(Marker* marker) const;
|
||||||
|
public: virtual Marker* _GetNextElement(Marker* marker) const;
|
||||||
|
public: virtual void _SetNextElement(Marker* marker, Marker* nextMarker) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
//public: class ViewSet : public IntrusiveSet<View> {
|
||||||
|
//// **********************************************
|
||||||
|
|
||||||
|
// public: typedef IntrusiveSet<View> Inherit;
|
||||||
|
//
|
||||||
|
// public: ViewSet();
|
||||||
|
|
||||||
|
// public: virtual unsigned _GetHashValue(View* view) const;
|
||||||
|
// public: virtual View* _GetNextElement(View* view) const;
|
||||||
|
// public: virtual void _SetNextElement(View* view, View* nextView) const;
|
||||||
|
|
||||||
|
//};
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Library* _library;
|
||||||
|
private: Name _name;
|
||||||
|
private: InstanceMap _instanceMap;
|
||||||
|
private: QuadTree _quadTree;
|
||||||
|
private: SlaveInstanceSet _slaveInstanceSet;
|
||||||
|
private: NetMap _netMap;
|
||||||
|
private: PinMap _pinMap;
|
||||||
|
private: SliceMap _sliceMap;
|
||||||
|
private: MarkerSet _markerSet;
|
||||||
|
//private: ViewSet _viewSet;
|
||||||
|
private: Box _abutmentBox;
|
||||||
|
private: Box _boundingBox;
|
||||||
|
private: bool _isTerminal;
|
||||||
|
private: bool _isFlattenLeaf;
|
||||||
|
private: bool _isPad;
|
||||||
|
private: Cell* _nextOfLibraryCellMap;
|
||||||
|
private: Cell* _nextOfSymbolCellSet;
|
||||||
|
private: multimap<Entity*,Entity*> _slaveEntityMap;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: Cell(Library* library, const Name& name);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
protected: virtual void _PostCreate();
|
||||||
|
|
||||||
|
protected: virtual void _PreDelete();
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const {return _TName("Cell");};
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
|
||||||
|
public: InstanceMap& _GetInstanceMap() {return _instanceMap;};
|
||||||
|
public: QuadTree* _GetQuadTree() {return &_quadTree;};
|
||||||
|
public: SlaveInstanceSet& _GetSlaveInstanceSet() {return _slaveInstanceSet;};
|
||||||
|
public: NetMap& _GetNetMap() {return _netMap;};
|
||||||
|
public: PinMap& _GetPinMap() {return _pinMap;};
|
||||||
|
public: SliceMap& _GetSliceMap() {return _sliceMap;};
|
||||||
|
public: MarkerSet& _GetMarkerSet() {return _markerSet;};
|
||||||
|
//public: ViewSet& _GetViewSet() {return _viewSet;};
|
||||||
|
public: Cell* _GetNextOfLibraryCellMap() const {return _nextOfLibraryCellMap;};
|
||||||
|
public: Cell* _GetNextOfSymbolCellSet() const {return _nextOfSymbolCellSet;};
|
||||||
|
|
||||||
|
public: void _SetNextOfLibraryCellMap(Cell* cell) {_nextOfLibraryCellMap = cell;};
|
||||||
|
public: void _SetNextOfSymbolCellSet(Cell* cell) {_nextOfSymbolCellSet = cell;};
|
||||||
|
|
||||||
|
public: void _Fit(const Box& box);
|
||||||
|
public: void _Unfit(const Box& box);
|
||||||
|
|
||||||
|
public: void _AddSlaveEntity(Entity* entity, Entity* slaveEntity);
|
||||||
|
public: void _RemoveSlaveEntity(Entity* entity, Entity* slaveEntity);
|
||||||
|
public: void _GetSlaveEntities(SlaveEntityMap::iterator& begin, SlaveEntityMap::iterator& end);
|
||||||
|
public: void _GetSlaveEntities(Entity* entity, SlaveEntityMap::iterator& begin, SlaveEntityMap::iterator& end);
|
||||||
|
|
||||||
|
//public: bool _IsDrawable(View* view) const;
|
||||||
|
//public: bool _ContentIsDrawable(View* view) const;
|
||||||
|
//public: void _DrawPhantoms(View* view, const Box& updateArea, const Transformation& transformation);
|
||||||
|
//public: void _DrawBoundaries(View* view, const Box& updateArea, const Transformation& transformation);
|
||||||
|
//public: void _DrawContent(View* view, BasicLayer* basicLayer, const Box& updateArea, const Transformation& transformation);
|
||||||
|
//public: void _DrawRubbers(View* view, const Box& updateArea, const Transformation& transformation);
|
||||||
|
//public: void _DrawMarkers(View* view, const Box& updateArea, const Transformation& transformation);
|
||||||
|
//public: void _DrawDisplaySlots(View* view, const Box& area, const Box& updateArea, const Transformation& transformation);
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: static Cell* Create(Library* library, const Name& name);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Cell* GetCell() const {return (Cell*)this;};
|
||||||
|
public: virtual Box GetBoundingBox() const;
|
||||||
|
public: Library* GetLibrary() const {return _library;};
|
||||||
|
public: const Name& GetName() const {return _name;};
|
||||||
|
public: Instance* GetInstance(const Name& name) const {return _instanceMap.GetElement(name);};
|
||||||
|
public: Instances GetInstances() const {return _instanceMap.GetElements();};
|
||||||
|
public: Instances GetPlacedInstances() const;
|
||||||
|
public: Instances GetFixedInstances() const;
|
||||||
|
public: Instances GetUnplacedInstances() const;
|
||||||
|
public: Instances GetNotUnplacedInstances() const;
|
||||||
|
public: Instances GetInstancesUnder(const Box& area) const;
|
||||||
|
public: Instances GetPlacedInstancesUnder(const Box& area) const;
|
||||||
|
public: Instances GetFixedInstancesUnder(const Box& area) const;
|
||||||
|
public: Instances GetUnplacedInstancesUnder(const Box& area) const;
|
||||||
|
public: Instances GetNotUnplacedInstancesUnder(const Box& area) const;
|
||||||
|
public: Instances GetSlaveInstances() const; // {return _slaveInstanceSet.GetElements();}; NOON!!
|
||||||
|
public: Instances GetTerminalInstances() const;
|
||||||
|
public: Instances GetTerminalInstancesUnder(const Box& area) const;
|
||||||
|
public: Instances GetNonTerminalInstances() const;
|
||||||
|
public: Instances GetNonTerminalInstancesUnder(const Box& area) const;
|
||||||
|
public: Instances GetLeafInstances() const;
|
||||||
|
public: Instances GetLeafInstancesUnder(const Box& area) const;
|
||||||
|
public: Instances GetNonLeafInstances() const;
|
||||||
|
public: Instances GetNonLeafInstancesUnder(const Box& area) const;
|
||||||
|
public: Net* GetNet(const Name& name) const {return _netMap.GetElement(name);};
|
||||||
|
public: Nets GetNets() const {return _netMap.GetElements();};
|
||||||
|
public: Nets GetGlobalNets() const;
|
||||||
|
public: Nets GetExternalNets() const;
|
||||||
|
public: Nets GetInternalNets() const;
|
||||||
|
public: Nets GetClockNets() const;
|
||||||
|
public: Nets GetSupplyNets() const;
|
||||||
|
public: Nets GetPowerNets() const;
|
||||||
|
public: Nets GetGroundNets() const;
|
||||||
|
public: Pin* GetPin(const Name& name) const {return _pinMap.GetElement(name);};
|
||||||
|
public: Pins GetPins() const {return _pinMap.GetElements();};
|
||||||
|
public: Slice* GetSlice(const Layer* layer) const {return _sliceMap.GetElement(layer);};
|
||||||
|
public: Slices GetSlices(const Layer::Mask& mask = ~0) const;
|
||||||
|
// public: Views GetViews() const {return _viewSet.GetElements();};
|
||||||
|
// public: MainViews GetMainViews() const;
|
||||||
|
// public: MainViews GetImpactedMainViews() const;
|
||||||
|
public: Rubbers GetRubbers() const;
|
||||||
|
public: Rubbers GetRubbersUnder(const Box& area) const;
|
||||||
|
public: Markers GetMarkers() const {return _markerSet.GetElements();};
|
||||||
|
public: Markers GetMarkersUnder(const Box& area) const;
|
||||||
|
public: References GetReferences() const;
|
||||||
|
public: Components GetComponents(const Layer::Mask& mask = ~0) const;
|
||||||
|
public: Components GetComponentsUnder(const Box& area, const Layer::Mask& mask = ~0) const;
|
||||||
|
public: Occurrences GetOccurrences(unsigned searchDepth = (unsigned)-1) const;
|
||||||
|
public: Occurrences GetOccurrencesUnder(const Box& area, unsigned searchDepth = (unsigned)-1) const;
|
||||||
|
public: Occurrences GetTerminalInstanceOccurrences() const;
|
||||||
|
public: Occurrences GetTerminalInstanceOccurrencesUnder(const Box& area) const;
|
||||||
|
public: Occurrences GetLeafInstanceOccurrences() const;
|
||||||
|
public: Occurrences GetLeafInstanceOccurrencesUnder(const Box& area) const;
|
||||||
|
public: Occurrences GetComponentOccurrences(const Layer::Mask& mask = ~0) const;
|
||||||
|
public: Occurrences GetComponentOccurrencesUnder(const Box& area, const Layer::Mask& mask = ~0) const;
|
||||||
|
public: Occurrences GetHyperNetRootNetOccurrences() const;
|
||||||
|
public: Cells GetSubCells() const;
|
||||||
|
public: Pathes GetRecursiveSlavePathes() const;
|
||||||
|
public: const Box& GetAbutmentBox() const {return _abutmentBox;};
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: bool IsCalledBy(Cell* cell) const;
|
||||||
|
public: bool IsTerminal() const {return _isTerminal;};
|
||||||
|
public: bool IsFlattenLeaf() const {return _isFlattenLeaf;};
|
||||||
|
public: bool IsLeaf() const;
|
||||||
|
public: bool IsPad() const {return _isPad;};
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: void SetName(const Name& name);
|
||||||
|
public: void SetAbutmentBox(const Box& abutmentBox);
|
||||||
|
public: void SetTerminal(bool isTerminal) {_isTerminal = isTerminal;};
|
||||||
|
public: void SetFlattenLeaf(bool isFlattenLeaf) {_isFlattenLeaf = isFlattenLeaf;};
|
||||||
|
public: void SetPad(bool isPad) {_isPad = isPad;};
|
||||||
|
public: void FlattenNets(bool buildRings=true);
|
||||||
|
public: void Materialize();
|
||||||
|
public: void Unmaterialize();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::Cell)
|
||||||
|
|
||||||
|
#endif // HURRICANE_CELL
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,62 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Cells.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_CELLS
|
||||||
|
#define HURRICANE_CELLS
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Cell;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Cells declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<Cell*> Cells;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// CellLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<Cell*> CellLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// CellFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<Cell*> CellFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_cell declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_cell(cell, cells)\
|
||||||
|
/*********************************/\
|
||||||
|
{\
|
||||||
|
CellLocator _locator = cells.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
Cell* cell = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_CELLS
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,837 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Collection.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// 21-10-2003 Alignment LIP6 & BULL versions
|
||||||
|
|
||||||
|
#ifndef HURRICANE_COLLECTION
|
||||||
|
#define HURRICANE_COLLECTION
|
||||||
|
|
||||||
|
#include "Locator.h"
|
||||||
|
#include "Filter.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
template<class Type> class GenericCollection;
|
||||||
|
template<class Type, class SubType> class SubTypeCollection;
|
||||||
|
template<class Type> class SubSetCollection;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Collection declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
template<class Type> class Collection : public NestedSlotAdapter {
|
||||||
|
// *************************************************************
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: Collection()
|
||||||
|
// ********************
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
private: Collection(const Collection& collection);
|
||||||
|
// ***********************************************
|
||||||
|
// not implemented to forbid copy construction
|
||||||
|
// ***********************************************
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: virtual ~Collection()
|
||||||
|
// **************************
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
private: Collection& operator=(const Collection& collection);
|
||||||
|
// **********************************************************
|
||||||
|
// not implemented to forbid assignment
|
||||||
|
// **********************************************************
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Collection<Type>* GetClone() const = 0;
|
||||||
|
|
||||||
|
public: virtual Locator<Type>* GetLocator() const = 0;
|
||||||
|
|
||||||
|
public: virtual unsigned GetSize() const
|
||||||
|
// *************************************
|
||||||
|
{
|
||||||
|
unsigned size = 0;
|
||||||
|
// we use a GenericLocator to delete the locator allocated by GetLocator()
|
||||||
|
GenericLocator<Type> locator = GetLocator();
|
||||||
|
while (locator.IsValid()) {
|
||||||
|
size++;
|
||||||
|
locator.Progress();
|
||||||
|
}
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
public: Type GetFirst() const
|
||||||
|
// **************************
|
||||||
|
{
|
||||||
|
// we use a GenericLocator to delete the locator allocated by GetLocator()
|
||||||
|
return GenericLocator<Type>(GetLocator()).GetElement();
|
||||||
|
}
|
||||||
|
|
||||||
|
public: GenericCollection<Type> GetSubSet(const Filter<Type>& filter) const
|
||||||
|
// ************************************************************************
|
||||||
|
{
|
||||||
|
return SubSetCollection<Type>(*this, filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public: template<class SubType> GenericCollection<SubType> GetSubSet() const
|
||||||
|
// *************************************************************************
|
||||||
|
{
|
||||||
|
return SubTypeCollection<Type, SubType>(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public: template<class SubType>
|
||||||
|
GenericCollection<SubType> GetSubSet(const Filter<SubType>& filter) const
|
||||||
|
// ******************************************************************************
|
||||||
|
{
|
||||||
|
return GetSubSet<SubType>().GetSubSet(filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: bool IsEmpty() const
|
||||||
|
// *************************
|
||||||
|
{
|
||||||
|
// we use a GenericLocator to delete the locator allocated by GetLocator()
|
||||||
|
return !GenericLocator<Type>(GetLocator()).IsValid();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Utilitarians
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: void Fill(list<Type>& list) const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
GenericLocator<Type> locator = GetLocator();
|
||||||
|
while (locator.IsValid()) {
|
||||||
|
list.push_back(locator.GetElement());
|
||||||
|
locator.Progress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public: void Fill(set<Type>& set) const
|
||||||
|
// ************************************
|
||||||
|
{
|
||||||
|
GenericLocator<Type> locator = GetLocator();
|
||||||
|
while (locator.IsValid()) {
|
||||||
|
set.insert(locator.GetElement());
|
||||||
|
locator.Progress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public: template<class Compare> void Fill(set<Type, Compare>& set) const
|
||||||
|
// *********************************************************************
|
||||||
|
{
|
||||||
|
GenericLocator<Type> locator = GetLocator();
|
||||||
|
while (locator.IsValid()) {
|
||||||
|
set.insert(locator.GetElement());
|
||||||
|
locator.Progress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public: void Fill(vector<Type>& vector) const
|
||||||
|
// ******************************************
|
||||||
|
{
|
||||||
|
GenericLocator<Type> locator = GetLocator();
|
||||||
|
while (locator.IsValid()) {
|
||||||
|
vector.push_back(locator.GetElement());
|
||||||
|
locator.Progress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
return _TName("Collection<Type>");
|
||||||
|
};
|
||||||
|
|
||||||
|
public: virtual string _GetString() const = 0;
|
||||||
|
|
||||||
|
public: Record* _GetRecord() const
|
||||||
|
// *************************
|
||||||
|
{
|
||||||
|
Record* record = NULL;
|
||||||
|
if (!IsEmpty()) {
|
||||||
|
record = new Record(GetString(this));
|
||||||
|
unsigned n = 1;
|
||||||
|
GenericLocator<Type> locator = GetLocator();
|
||||||
|
while (locator.IsValid()) {
|
||||||
|
string slotName = GetString(n++);
|
||||||
|
Type slotRecord = locator.GetElement();
|
||||||
|
record->Add(GetSlot(slotName, slotRecord));
|
||||||
|
locator.Progress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// GenericCollection declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
template<class Type> class GenericCollection : public Collection<Type> {
|
||||||
|
// *******************************************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Collection<Type> Inherit;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Collection<Type>* _collection;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: GenericCollection()
|
||||||
|
// ***********************
|
||||||
|
: Inherit(),
|
||||||
|
_collection(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public: GenericCollection(const Collection<Type>& collection)
|
||||||
|
// **********************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_collection(collection.GetClone())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public: GenericCollection(const GenericCollection<Type>& genericCollection)
|
||||||
|
// ************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_collection(genericCollection.GetClone())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public: GenericCollection(Collection<Type>* collection)
|
||||||
|
// *************************************************************
|
||||||
|
// CAUTION : collection will be deleted by the GenericCollection
|
||||||
|
// *************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_collection(collection)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: virtual ~GenericCollection()
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
if (_collection) delete _collection;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: GenericCollection& operator=(const Collection<Type>& collection)
|
||||||
|
// *********************************************************************
|
||||||
|
{
|
||||||
|
if (_collection) delete _collection;
|
||||||
|
_collection = collection.GetClone();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public: GenericCollection& operator=(const GenericCollection& genericCollection)
|
||||||
|
// *****************************************************************************
|
||||||
|
{
|
||||||
|
if (_collection) delete _collection;
|
||||||
|
_collection = genericCollection.GetClone();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public: GenericCollection& operator=(Collection<Type>* collection)
|
||||||
|
// ***************************************************************
|
||||||
|
// CAUTION : collection will be deleted by the GenericCollection
|
||||||
|
// ***************************************************************
|
||||||
|
{
|
||||||
|
if (_collection) delete _collection;
|
||||||
|
_collection = collection;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Collection<Type>* GetClone() const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
return (_collection) ? _collection->GetClone() : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public: virtual Locator<Type>* GetLocator() const
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
return (_collection) ? _collection->GetLocator() : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public: virtual unsigned GetSize() const
|
||||||
|
// *************************************
|
||||||
|
{
|
||||||
|
return (_collection) ? _collection->GetSize() : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
return _TName("GenericCollection");
|
||||||
|
};
|
||||||
|
|
||||||
|
public: virtual string _GetString() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
if (!_collection)
|
||||||
|
return "<" + _GetTypeName() + " unbound>";
|
||||||
|
else
|
||||||
|
return "<" + _GetTypeName()+ " " + GetString(_collection) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// ElementCollection declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
template<class Type> class ElementCollection : public Collection<Type> {
|
||||||
|
// *********************************************************************
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------
|
||||||
|
// Sub-Class : "::ElementCollection::Locator".
|
||||||
|
public: template<class ElType> class Locator : public Hurricane::Locator<ElType> {
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
protected: const ElType _element;
|
||||||
|
protected: bool _done;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
public: Locator ( const ElType _element ) : _element(_element), _done(false) {};
|
||||||
|
public: Locator ( const Locator &locator ) : _element(locator._element), _done(locator._done) {};
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
public: virtual ElType GetElement () const { return const_cast<ElType>(_element); };
|
||||||
|
public: virtual Locator<ElType>* GetClone () const { return new Locator(*this); };
|
||||||
|
public: virtual bool IsValid () const { return !_done; };
|
||||||
|
public: virtual void Progress () { _done = true; };
|
||||||
|
|
||||||
|
// Hurricane Management
|
||||||
|
// ********************
|
||||||
|
public: virtual string _GetString () const {
|
||||||
|
if (!_element)
|
||||||
|
return "<" + _TName("ElementCollection::Locator") + " unbound>";
|
||||||
|
else
|
||||||
|
return "<" + _TName("ElementCollection::Locator") + " " + GetString(_element) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Collection<Type> Inherit;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Type _element;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: ElementCollection()
|
||||||
|
// ***********************
|
||||||
|
: Inherit(),
|
||||||
|
_element(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public: ElementCollection(const Type element)
|
||||||
|
// **********************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_element(element)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public: ElementCollection(const ElementCollection<Type>& elementCollection)
|
||||||
|
// ************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_element(elementCollection._element)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Collection<Type>* GetClone() const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
return ( new ElementCollection (*this) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public: virtual Locator<Type>* GetLocator() const
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
return ( new Locator<Type> (_element) );
|
||||||
|
}
|
||||||
|
|
||||||
|
public: virtual unsigned GetSize() const
|
||||||
|
// *************************************
|
||||||
|
{
|
||||||
|
return (_element) ? 1 : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetString() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
if (!_element)
|
||||||
|
return "<" + _TName("ElementCollection") + " unbound>";
|
||||||
|
else
|
||||||
|
return "<" + _TName("ElementCollection") + " " + GetString(_element) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// SubTypeCollection declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
template<class Type, class SubType> class SubTypeCollection : public Collection<SubType> {
|
||||||
|
// *************************************************************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Collection<SubType> Inherit;
|
||||||
|
|
||||||
|
public: class Locator : public Hurricane::Locator<SubType> {
|
||||||
|
// *******************************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Hurricane::Locator<SubType> Inherit;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: GenericLocator<Type> _locator;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: Locator(const GenericCollection<Type>& collection)
|
||||||
|
// ********************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_locator(collection.GetLocator())
|
||||||
|
{
|
||||||
|
while (_locator.IsValid() && !is_a<SubType>(_locator.GetElement()))
|
||||||
|
_locator.Progress();
|
||||||
|
}
|
||||||
|
|
||||||
|
public: Locator(const GenericLocator<Type>& genericLocator)
|
||||||
|
// ********************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_locator(genericLocator.GetClone())
|
||||||
|
{
|
||||||
|
while (_locator.IsValid() && !is_a<SubType>(_locator.GetElement()))
|
||||||
|
_locator.Progress();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual SubType GetElement() const
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
return (_locator.IsValid()) ? (SubType)_locator.GetElement() : SubType();
|
||||||
|
}
|
||||||
|
|
||||||
|
public: virtual Hurricane::Locator<SubType>* GetClone() const
|
||||||
|
// **********************************************************
|
||||||
|
{
|
||||||
|
return new Locator(_locator);
|
||||||
|
}
|
||||||
|
|
||||||
|
public: virtual Hurricane::Locator<SubType>* GetLocator() // 21-10-03
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
return dynamic_cast<Hurricane::Locator<SubType>*> (
|
||||||
|
_locator.GetLocator()->GetLocator() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: virtual bool IsValid() const
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
return _locator.IsValid();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: virtual void Progress()
|
||||||
|
// ****************************
|
||||||
|
{
|
||||||
|
if (_locator.IsValid()) {
|
||||||
|
do {
|
||||||
|
_locator.Progress();
|
||||||
|
} while (_locator.IsValid() && !is_a<SubType>(_locator.GetElement()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: GenericCollection<Type> _collection;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: SubTypeCollection()
|
||||||
|
// ********************
|
||||||
|
: Inherit(),
|
||||||
|
_collection()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public: SubTypeCollection(const Collection<Type>* collection)
|
||||||
|
// **********************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_collection(collection->GetClone())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public: SubTypeCollection(const GenericCollection<Type>& collection)
|
||||||
|
// *****************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_collection(collection)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public: SubTypeCollection(const SubTypeCollection& subTypeCollection)
|
||||||
|
// ******************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_collection(subTypeCollection._collection)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: SubTypeCollection& operator=(const SubTypeCollection& subTypeCollection)
|
||||||
|
// *****************************************************************************
|
||||||
|
{
|
||||||
|
_collection = subTypeCollection._collection;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Collection<SubType>* GetClone() const
|
||||||
|
// **************************************************
|
||||||
|
{
|
||||||
|
return new SubTypeCollection(_collection);
|
||||||
|
}
|
||||||
|
|
||||||
|
public: virtual Hurricane::Locator<SubType>* GetLocator() const
|
||||||
|
// ************************************************************
|
||||||
|
{
|
||||||
|
return new Locator(_collection);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual string _GetString() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
return "<" + _TName("SubTypeCollection") + " " + GetString(_collection) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// SubSetCollection implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
template<class Type> class SubSetCollection : public Collection<Type> {
|
||||||
|
// ******************************************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Collection<Type> Inherit;
|
||||||
|
|
||||||
|
public: class Locator : public Hurricane::Locator<Type> {
|
||||||
|
// ****************************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Hurricane::Locator<Type> Inherit;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: GenericLocator<Type> _locator;
|
||||||
|
private: GenericFilter<Type> _filter;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: Locator(const SubSetCollection<Type>& collection, const Filter<Type>& filter)
|
||||||
|
// **********************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_locator(collection.GetLocator()),
|
||||||
|
_filter(filter)
|
||||||
|
{
|
||||||
|
while (_locator.IsValid() && !_filter.Accept(_locator.GetElement()))
|
||||||
|
_locator.Progress();
|
||||||
|
}
|
||||||
|
|
||||||
|
public: Locator(const Collection<Type>& collection, const Filter<Type>& filter)
|
||||||
|
// ****************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_locator(collection.GetLocator()),
|
||||||
|
_filter(filter)
|
||||||
|
{
|
||||||
|
while (_locator.IsValid() && !_filter.Accept(_locator.GetElement()))
|
||||||
|
_locator.Progress();
|
||||||
|
}
|
||||||
|
|
||||||
|
public: Locator(const GenericCollection<Type>& genericCollection, const Filter<Type>& filter)
|
||||||
|
// ******************************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_locator(genericCollection.GetLocator()),
|
||||||
|
_filter(filter)
|
||||||
|
{
|
||||||
|
while (_locator.IsValid() && !_filter.Accept(_locator.GetElement()))
|
||||||
|
_locator.Progress();
|
||||||
|
}
|
||||||
|
|
||||||
|
public: Locator(const GenericLocator<Type>& genericLocator, const Filter<Type>& filter)
|
||||||
|
// ************************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_locator(genericLocator),
|
||||||
|
_filter(filter)
|
||||||
|
{
|
||||||
|
while (_locator.IsValid() && !_filter.Accept(_locator.GetElement()))
|
||||||
|
_locator.Progress();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Type GetElement() const
|
||||||
|
// ************************************
|
||||||
|
{
|
||||||
|
return (_locator.IsValid()) ? _locator.GetElement() : Type();
|
||||||
|
}
|
||||||
|
|
||||||
|
public: virtual Hurricane::Locator<Type>* GetClone() const
|
||||||
|
// *******************************************************
|
||||||
|
{
|
||||||
|
return new Locator(_locator, _filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public: virtual Hurricane::Locator<Type>* GetLocator() // 21-10-03
|
||||||
|
// ***************************************************
|
||||||
|
{
|
||||||
|
return ( _locator.GetLocator()->GetLocator() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: virtual bool IsValid() const
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
return _locator.IsValid();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: virtual void Progress()
|
||||||
|
// ****************************
|
||||||
|
{
|
||||||
|
if (_locator.IsValid()) {
|
||||||
|
do {
|
||||||
|
_locator.Progress();
|
||||||
|
} while (_locator.IsValid() && !_filter.Accept(_locator.GetElement()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: GenericCollection<Type> _collection;
|
||||||
|
private: GenericFilter<Type> _filter;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: SubSetCollection()
|
||||||
|
// ***********************
|
||||||
|
: Inherit(),
|
||||||
|
_collection(),
|
||||||
|
_filter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public: SubSetCollection(const Collection<Type>& collection, const Filter<Type>& filter)
|
||||||
|
// *************************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_collection(collection),
|
||||||
|
_filter(filter)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public: SubSetCollection(const SubSetCollection& subSetCollection)
|
||||||
|
// ***************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_collection(subSetCollection._collection),
|
||||||
|
_filter(subSetCollection._filter)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: SubSetCollection& operator=(const SubSetCollection& subSetCollection)
|
||||||
|
// **************************************************************************
|
||||||
|
{
|
||||||
|
_collection = subSetCollection._collection;
|
||||||
|
_filter = subSetCollection._filter;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Collection<Type>* GetClone() const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
return new SubSetCollection(_collection, _filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
public: virtual Hurricane::Locator<Type>* GetLocator() const
|
||||||
|
// *********************************************************
|
||||||
|
{
|
||||||
|
return new Locator(_collection, _filter);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual string _GetString() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
return "<" + _TName("SubSetCollection") + " " + GetString(_collection) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Macros declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define end_for\
|
||||||
|
/**************/\
|
||||||
|
}\
|
||||||
|
}
|
||||||
|
|
||||||
|
#define for_each_object(Type, element, collection)\
|
||||||
|
/*************************************************/\
|
||||||
|
{\
|
||||||
|
GenericLocator<Type> _locator = collection.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
Type element = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
#define for_each_element(Type, element, collection)\
|
||||||
|
/*************************************************/\
|
||||||
|
{\
|
||||||
|
ElementCollection<Type>::Locator<Type>* _locator = collection.GetLocator();\
|
||||||
|
while (_locator->IsValid()) {\
|
||||||
|
Type element = _locator->GetElement();\
|
||||||
|
_locator->Progress();
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class IsNestedSlotAdapter<const Hurricane::GenericCollection<T> > {
|
||||||
|
public:
|
||||||
|
enum { True=1, False=0 };
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#include "MultisetCollection.h"
|
||||||
|
#include "SetCollection.h"
|
||||||
|
#include "MapCollection.h"
|
||||||
|
#include "ListCollection.h"
|
||||||
|
#include "VectorCollection.h"
|
||||||
|
|
||||||
|
#endif // HURRICANE_COLLECTION
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,221 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Commons.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBIBERTY
|
||||||
|
# include "demangle.h"
|
||||||
|
# include "libiberty.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "Commons.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Tracing tools
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
static long TRACE_LEVEL = 0;
|
||||||
|
static unsigned int TRACE_SHOW_LEVEL = (unsigned int)-1;
|
||||||
|
|
||||||
|
bool in_trace()
|
||||||
|
// ************
|
||||||
|
{
|
||||||
|
return (0 < TRACE_LEVEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void trace_on()
|
||||||
|
// ************
|
||||||
|
{
|
||||||
|
TRACE_LEVEL++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void trace_off()
|
||||||
|
// *************
|
||||||
|
{
|
||||||
|
if (0 < TRACE_LEVEL) TRACE_LEVEL--;
|
||||||
|
}
|
||||||
|
|
||||||
|
void trace_in()
|
||||||
|
// ************
|
||||||
|
{
|
||||||
|
if (0 < TRACE_LEVEL) tab++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void trace_out()
|
||||||
|
// *************
|
||||||
|
{
|
||||||
|
if (0 < TRACE_LEVEL) tab--;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool inltrace ( unsigned int level )
|
||||||
|
//***********************************
|
||||||
|
{
|
||||||
|
return TRACE_SHOW_LEVEL <= level;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int ltracelevel ( unsigned int level )
|
||||||
|
//**********************************************
|
||||||
|
{
|
||||||
|
unsigned int previousLevel = TRACE_SHOW_LEVEL;
|
||||||
|
TRACE_SHOW_LEVEL = level;
|
||||||
|
|
||||||
|
return previousLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ltracein (unsigned int level, unsigned int count )
|
||||||
|
//******************************************************
|
||||||
|
{
|
||||||
|
if ( inltrace(level) ) while ( count-- ) tab++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ltraceout (unsigned int level, unsigned int count )
|
||||||
|
//*******************************************************
|
||||||
|
{
|
||||||
|
if ( inltrace(level) ) while ( count-- ) tab--;
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Function : "Demangle ()".
|
||||||
|
|
||||||
|
string Demangle ( const char* symbol )
|
||||||
|
{
|
||||||
|
string mangled = "_Z";
|
||||||
|
mangled += symbol;
|
||||||
|
|
||||||
|
# ifdef HAVE_LIBIBERTY
|
||||||
|
char* result = cplus_demangle ( mangled.c_str(), DMGL_PARAMS|DMGL_ANSI|DMGL_TYPES );
|
||||||
|
|
||||||
|
if ( result ) {
|
||||||
|
mangled = result;
|
||||||
|
free ( result );
|
||||||
|
return mangled;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
|
||||||
|
return mangled;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
bool Scan(const string& s, unsigned& u)
|
||||||
|
// ************************************
|
||||||
|
{
|
||||||
|
unsigned v, n;
|
||||||
|
sscanf(s.c_str(), "%u%n", &v, &n);
|
||||||
|
if (n != s.size()) return false;
|
||||||
|
u = v;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Scan(const string& s, unsigned short& u)
|
||||||
|
// ******************************************
|
||||||
|
{
|
||||||
|
unsigned short v;
|
||||||
|
unsigned n;
|
||||||
|
sscanf(s.c_str(), "%hu%n", &v, &n);
|
||||||
|
if (n != s.size()) return false;
|
||||||
|
u = v;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Scan(const string& s, double& d)
|
||||||
|
// **********************************
|
||||||
|
{
|
||||||
|
unsigned n;
|
||||||
|
double v;
|
||||||
|
sscanf(s.c_str(), "%lf%n", &v, &n);
|
||||||
|
if (n != s.size()) return false;
|
||||||
|
d = v;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Scan(const string& s, int& i)
|
||||||
|
// *******************************
|
||||||
|
{
|
||||||
|
int v;
|
||||||
|
unsigned n;
|
||||||
|
sscanf(s.c_str(), "%d%n", &v, &n);
|
||||||
|
if (n != s.size()) return false;
|
||||||
|
i = v;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Function : "Scan()".
|
||||||
|
|
||||||
|
/*! \overload bool Scan ( const string &s, string &pattern )
|
||||||
|
* \param s string to interpret.
|
||||||
|
* \param pattern a stipple pattern for a layer.
|
||||||
|
* \return true if the conversion was correct.
|
||||||
|
*
|
||||||
|
* Look for a stipple patern. Checks the string length (must be
|
||||||
|
* equal to 16) and only made of hexadecimal characters.
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool Scan ( const string &s, string &pattern )
|
||||||
|
{
|
||||||
|
if ( s.size() != 16 ) return ( false );
|
||||||
|
|
||||||
|
string validChars = "0123456789ABCDEFabcdef";
|
||||||
|
for ( unsigned i=0 ; i<16 ; i++ ) {
|
||||||
|
if ( validChars.find(s[i]) == string::npos ) return ( false );
|
||||||
|
}
|
||||||
|
pattern = s;
|
||||||
|
|
||||||
|
return ( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Function : "Scan()".
|
||||||
|
|
||||||
|
/*! \overload bool Scan ( const string &s, unsigned short &redValue, unsigned short &greenValue, unsigned short &blueValue )
|
||||||
|
* \param s string to interpret.
|
||||||
|
* \param redValue the red color's component.
|
||||||
|
* \param greenValue the green color's component.
|
||||||
|
* \param blueValue the blue color's component.
|
||||||
|
* \return true if the conversion was correct.
|
||||||
|
*
|
||||||
|
* Split a string of the form \c "RRR,GGG,BBB" into its numerical
|
||||||
|
* components (between 0 and 255).
|
||||||
|
*/
|
||||||
|
|
||||||
|
bool Scan ( const string &s
|
||||||
|
, unsigned short &redValue
|
||||||
|
, unsigned short &greenValue
|
||||||
|
, unsigned short &blueValue )
|
||||||
|
{
|
||||||
|
unsigned n;
|
||||||
|
unsigned short red;
|
||||||
|
unsigned short green;
|
||||||
|
unsigned short blue;
|
||||||
|
|
||||||
|
sscanf ( s.c_str(), "%hu,%hu,%hu%n", &red, &green, &blue, &n );
|
||||||
|
if ( n != s.size() ) return ( false );
|
||||||
|
|
||||||
|
redValue = red;
|
||||||
|
greenValue = green;
|
||||||
|
blueValue = blue;
|
||||||
|
|
||||||
|
return ( true );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,174 @@
|
||||||
|
|
||||||
|
|
||||||
|
// -*- C++ -*-
|
||||||
|
//
|
||||||
|
// This file is part of the Hurricane Software.
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
//
|
||||||
|
// ===================================================================
|
||||||
|
//
|
||||||
|
// $Id: Commons.h,v 1.19 2007/07/29 15:24:52 jpc 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 : Remy Escassut |
|
||||||
|
// | E-mail : Jean-Paul.Chaput@lip6.fr |
|
||||||
|
// | =============================================================== |
|
||||||
|
// | C++ Header : "./Commons.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ifndef __HURRICANE_COMMONS__
|
||||||
|
# define __HURRICANE_COMMONS__
|
||||||
|
|
||||||
|
|
||||||
|
# include <stdio.h>
|
||||||
|
# include <assert.h>
|
||||||
|
|
||||||
|
# include <string>
|
||||||
|
# include <list>
|
||||||
|
# include <set>
|
||||||
|
# include <map>
|
||||||
|
# include <stack>
|
||||||
|
# include <vector>
|
||||||
|
# include <iostream>
|
||||||
|
# include <fstream>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | Macros Definition |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
# define Hurricane H
|
||||||
|
# define BEGIN_NAMESPACE_HURRICANE namespace Hurricane {
|
||||||
|
# define END_NAMESPACE_HURRICANE }
|
||||||
|
# define USING_NAMESPACE_HURRICANE using namespace std; using namespace Hurricane;
|
||||||
|
|
||||||
|
|
||||||
|
# define is_a (bool)dynamic_cast
|
||||||
|
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// Forward Declarations.
|
||||||
|
|
||||||
|
class Slot;
|
||||||
|
class Record;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// x-------------------------------------------------------------x
|
||||||
|
// | Tracing/Debugging Utilites |
|
||||||
|
// x-------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
bool in_trace ();
|
||||||
|
void trace_on ();
|
||||||
|
void trace_off ();
|
||||||
|
void trace_in ();
|
||||||
|
void trace_out ();
|
||||||
|
bool inltrace ( unsigned int level );
|
||||||
|
unsigned int ltracelevel ( unsigned int level );
|
||||||
|
void ltracein ( unsigned int level, unsigned int count=1 );
|
||||||
|
void ltraceout ( unsigned int level, unsigned int count=1 );
|
||||||
|
|
||||||
|
# define trace if (in_trace() ) cerr << tab
|
||||||
|
# define ltrace(level) if (inltrace(level)) cerr << tab
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// x-------------------------------------------------------------x
|
||||||
|
// | Miscellaneous Utilites |
|
||||||
|
// x-------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
inline string _TName ( const string& s ) { return s; }
|
||||||
|
inline string _PName ( const string& s ) { return "Hurricane::" + s; }
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
inline Type abs ( const Type& value ) { return (value<0) ? -value : value; }
|
||||||
|
|
||||||
|
string Demangle ( const char* symbol );
|
||||||
|
inline string Demangle ( const type_info& info ) { return Demangle(info.name()); }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | Generic Functions Definition |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | GetString() Overloads for POD/STL types |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
// Note: we are outside the Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
# include "SlotAdapter.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | Scan() Overloads for POD/STL types |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
// Note: we are outside the Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
bool Scan ( const string& s, int& i );
|
||||||
|
bool Scan ( const string& s, unsigned& u );
|
||||||
|
bool Scan ( const string& s, unsigned short& u );
|
||||||
|
bool Scan ( const string& s, double& d );
|
||||||
|
bool Scan ( const string& s, string& pattern );
|
||||||
|
bool Scan ( const string& s, unsigned short& redValue
|
||||||
|
, unsigned short& greenValue
|
||||||
|
, unsigned short& blueValue );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
// | Record & Tabulation Types Definitions |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
// Note: Record & Tabulation are not templates, so they can be defined
|
||||||
|
// early.
|
||||||
|
|
||||||
|
# include "Tabulation.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# endif
|
|
@ -0,0 +1,946 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Component.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Component.h"
|
||||||
|
#include "Net.h"
|
||||||
|
#include "Cell.h"
|
||||||
|
#include "Rubber.h"
|
||||||
|
#include "Slice.h"
|
||||||
|
#include "BasicLayer.h"
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Filters declaration & implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Component_IsUnderFilter : public Filter<Component*> {
|
||||||
|
// ******************************************************
|
||||||
|
|
||||||
|
public: Box _area;
|
||||||
|
|
||||||
|
public: Component_IsUnderFilter(const Box& area)
|
||||||
|
// *********************************************
|
||||||
|
: _area(area)
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
public: Component_IsUnderFilter(const Component_IsUnderFilter& filter)
|
||||||
|
// *******************************************************************
|
||||||
|
: _area(filter._area)
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
public: Component_IsUnderFilter& operator=(const Component_IsUnderFilter& filter)
|
||||||
|
// ******************************************************************************
|
||||||
|
{
|
||||||
|
_area = filter._area;
|
||||||
|
return *this;
|
||||||
|
};
|
||||||
|
|
||||||
|
public: virtual Filter<Component*>* GetClone() const
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
return new Component_IsUnderFilter(*this);
|
||||||
|
};
|
||||||
|
|
||||||
|
public: virtual bool Accept(Component* component) const
|
||||||
|
// ****************************************************
|
||||||
|
{
|
||||||
|
return _area.Intersect(component->GetBoundingBox());
|
||||||
|
};
|
||||||
|
|
||||||
|
public: virtual string _GetString() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
return "<" + _TName("Component::IsUnderFilter") + " " + GetString(_area) + ">";
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Component_Hooks declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Component_Hooks : public Collection<Hook*> {
|
||||||
|
// *********************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Collection<Hook*> Inherit;
|
||||||
|
|
||||||
|
public: class Locator : public Hurricane::Locator<Hook*> {
|
||||||
|
// *****************************************************
|
||||||
|
|
||||||
|
public: typedef Hurricane::Locator<Hook*> Inherit;
|
||||||
|
|
||||||
|
private: const Component* _component;
|
||||||
|
private: Hook* _hook;
|
||||||
|
|
||||||
|
public: Locator(const Component* component = NULL);
|
||||||
|
public: Locator(const Locator& locator);
|
||||||
|
|
||||||
|
public: Locator& operator=(const Locator& locator);
|
||||||
|
|
||||||
|
public: virtual Hook* GetElement() const;
|
||||||
|
public: virtual Hurricane::Locator<Hook*>* GetClone() const;
|
||||||
|
|
||||||
|
public: virtual bool IsValid() const;
|
||||||
|
|
||||||
|
public: virtual void Progress();
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: const Component* _component;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: Component_Hooks(const Component* component = NULL);
|
||||||
|
public: Component_Hooks(const Component_Hooks& hooks);
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: Component_Hooks& operator=(const Component_Hooks& hooks);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Collection<Hook*>* GetClone() const;
|
||||||
|
public: virtual Hurricane::Locator<Hook*>* GetLocator() const;
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Component_ConnexComponents declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Component_ConnexComponents : public Collection<Component*> {
|
||||||
|
// *************************************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Collection<Component*> Inherit;
|
||||||
|
|
||||||
|
public: class Locator : public Hurricane::Locator<Component*> {
|
||||||
|
// **********************************************************
|
||||||
|
|
||||||
|
public: typedef Hurricane::Locator<Component*> Inherit;
|
||||||
|
|
||||||
|
private: const Component* _component;
|
||||||
|
private: set<Component*> _componentSet;
|
||||||
|
private: stack<Component*> _componentStack;
|
||||||
|
|
||||||
|
public: Locator(const Component* component = NULL);
|
||||||
|
public: Locator(const Locator& locator);
|
||||||
|
|
||||||
|
public: Locator& operator=(const Locator& locator);
|
||||||
|
|
||||||
|
public: virtual Component* GetElement() const;
|
||||||
|
public: virtual Hurricane::Locator<Component*>* GetClone() const;
|
||||||
|
|
||||||
|
public: virtual bool IsValid() const;
|
||||||
|
|
||||||
|
public: virtual void Progress();
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: const Component* _component;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: Component_ConnexComponents(const Component* component = NULL);
|
||||||
|
public: Component_ConnexComponents(const Component_ConnexComponents& connexComponents);
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: Component_ConnexComponents& operator=(const Component_ConnexComponents& connexComponents);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Collection<Component*>* GetClone() const;
|
||||||
|
public: virtual Hurricane::Locator<Component*>* GetLocator() const;
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Component_SlaveComponents declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Component_SlaveComponents : public Collection<Component*> {
|
||||||
|
// ************************************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Collection<Component*> Inherit;
|
||||||
|
|
||||||
|
public: class Locator : public Hurricane::Locator<Component*> {
|
||||||
|
// **********************************************************
|
||||||
|
|
||||||
|
public: typedef Hurricane::Locator<Component*> Inherit;
|
||||||
|
|
||||||
|
private: const Component* _component;
|
||||||
|
private: set<Component*> _componentSet;
|
||||||
|
private: stack<Component*> _componentStack;
|
||||||
|
|
||||||
|
public: Locator(const Component* component = NULL);
|
||||||
|
public: Locator(const Locator& locator);
|
||||||
|
|
||||||
|
public: Locator& operator=(const Locator& locator);
|
||||||
|
|
||||||
|
public: virtual Component* GetElement() const;
|
||||||
|
public: virtual Hurricane::Locator<Component*>* GetClone() const;
|
||||||
|
|
||||||
|
public: virtual bool IsValid() const;
|
||||||
|
|
||||||
|
public: virtual void Progress();
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: const Component* _component;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: Component_SlaveComponents(const Component* component = NULL);
|
||||||
|
public: Component_SlaveComponents(const Component_SlaveComponents& slaveComponents);
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: Component_SlaveComponents& operator=(const Component_SlaveComponents& slaveComponents);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Collection<Component*>* GetClone() const;
|
||||||
|
public: virtual Hurricane::Locator<Component*>* GetLocator() const;
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Component implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Component::Component(Net* net, bool inPlugCreate)
|
||||||
|
// **********************************************
|
||||||
|
: Inherit(),
|
||||||
|
_net(net),
|
||||||
|
_rubber(NULL),
|
||||||
|
_bodyHook(this),
|
||||||
|
_nextOfNetComponentSet(NULL)
|
||||||
|
{
|
||||||
|
if (!inPlugCreate && !_net)
|
||||||
|
throw Error("Can't create " + _TName("Component") + " : null net");
|
||||||
|
}
|
||||||
|
|
||||||
|
Cell* Component::GetCell() const
|
||||||
|
// *****************************
|
||||||
|
{
|
||||||
|
return _net->GetCell();
|
||||||
|
}
|
||||||
|
|
||||||
|
Hooks Component::GetHooks() const
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
return Component_Hooks(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Components Component::GetConnexComponents() const
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
return Component_ConnexComponents(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Components Component::GetSlaveComponents() const
|
||||||
|
// *********************************************
|
||||||
|
{
|
||||||
|
return Component_SlaveComponents(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
ComponentFilter Component::GetIsUnderFilter(const Box& area)
|
||||||
|
// *********************************************************
|
||||||
|
{
|
||||||
|
return Component_IsUnderFilter(area);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Component::Materialize()
|
||||||
|
// **************************
|
||||||
|
{
|
||||||
|
// trace << "Materialize() - " << this << endl;
|
||||||
|
|
||||||
|
if (!IsMaterialized()) {
|
||||||
|
Cell* cell = GetCell();
|
||||||
|
Layer* layer = GetLayer();
|
||||||
|
if (cell && layer) {
|
||||||
|
Slice* slice = cell->GetSlice(layer);
|
||||||
|
if (!slice) slice = Slice::_Create(cell, layer);
|
||||||
|
QuadTree* quadTree = slice->_GetQuadTree();
|
||||||
|
quadTree->Insert(this);
|
||||||
|
cell->_Fit(quadTree->GetBoundingBox());
|
||||||
|
} else {
|
||||||
|
//cerr << "[WARNING] " << this << " not inserted into QuadTree." << endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Component::Unmaterialize()
|
||||||
|
// ****************************
|
||||||
|
{
|
||||||
|
// trace << "Unmaterializing " << this << endl;
|
||||||
|
|
||||||
|
if (IsMaterialized()) {
|
||||||
|
Cell* cell = GetCell();
|
||||||
|
Slice* slice = cell->GetSlice(GetLayer());
|
||||||
|
if (slice) {
|
||||||
|
cell->_Unfit(GetBoundingBox());
|
||||||
|
slice->_GetQuadTree()->Remove(this);
|
||||||
|
if (slice->IsEmpty()) slice->_Delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Component::Invalidate(bool propagateFlag)
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
Inherit::Invalidate(false);
|
||||||
|
|
||||||
|
if (propagateFlag) {
|
||||||
|
Rubber* rubber = GetRubber();
|
||||||
|
if (rubber) rubber->Invalidate();
|
||||||
|
for_each_component(component, GetSlaveComponents()) {
|
||||||
|
component->Invalidate(false);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Component::_PostCreate()
|
||||||
|
// **************************
|
||||||
|
{
|
||||||
|
if (_net) _net->_GetComponentSet()._Insert(this);
|
||||||
|
|
||||||
|
Inherit::_PostCreate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Component::_PreDelete()
|
||||||
|
// *************************
|
||||||
|
{
|
||||||
|
// trace << "entering Component::_PreDelete: " << this << endl;
|
||||||
|
// trace_in();
|
||||||
|
|
||||||
|
ClearProperties();
|
||||||
|
|
||||||
|
set<Component*> componentSet;
|
||||||
|
GetSlaveComponents().Fill(componentSet);
|
||||||
|
|
||||||
|
set<Hook*> masterHookSet;
|
||||||
|
componentSet.insert(this);
|
||||||
|
for_each_component(component, GetCollection(componentSet)) {
|
||||||
|
component->Unmaterialize();
|
||||||
|
for_each_hook(hook, component->GetHooks()) {
|
||||||
|
for_each_hook(hook, hook->GetHooks()) {
|
||||||
|
if (hook->IsMaster() && (componentSet.find(hook->GetComponent()) == componentSet.end()))
|
||||||
|
masterHookSet.insert(hook);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
if (!hook->IsMaster()) hook->Detach();
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
componentSet.erase(this);
|
||||||
|
for_each_component(component, GetCollection(componentSet)) {
|
||||||
|
component->Delete();
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
set<Rubber*> rubberSet;
|
||||||
|
set<Hook*> mainMasterHookSet;
|
||||||
|
for_each_hook(hook, GetCollection(masterHookSet)) {
|
||||||
|
Rubber* rubber = hook->GetComponent()->GetRubber();
|
||||||
|
if (!rubber)
|
||||||
|
mainMasterHookSet.insert(hook);
|
||||||
|
else {
|
||||||
|
if (rubberSet.find(rubber) == rubberSet.end()) {
|
||||||
|
rubberSet.insert(rubber);
|
||||||
|
mainMasterHookSet.insert(hook);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
Hook* masterHook = NULL;
|
||||||
|
for_each_hook(hook, GetCollection(mainMasterHookSet)) {
|
||||||
|
if (!masterHook)
|
||||||
|
masterHook = hook;
|
||||||
|
else
|
||||||
|
hook->Merge(masterHook);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
/**/
|
||||||
|
|
||||||
|
_bodyHook.Detach();
|
||||||
|
|
||||||
|
Inherit::_PreDelete();
|
||||||
|
|
||||||
|
if (_net) _net->_GetComponentSet()._Remove(this);
|
||||||
|
|
||||||
|
|
||||||
|
// trace << "exiting Component::_PreDelete:" << endl;
|
||||||
|
// trace_out();
|
||||||
|
}
|
||||||
|
|
||||||
|
string Component::_GetString() const
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
string s = Inherit::_GetString();
|
||||||
|
if (!_net)
|
||||||
|
s.insert(s.length() - 1, " UNCONNECTED");
|
||||||
|
else
|
||||||
|
s.insert(s.length() - 1, " " + GetString(_net->GetName()));
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* Component::_GetRecord() const
|
||||||
|
// ****************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
if (record) {
|
||||||
|
record->Add(GetSlot("Net", _net));
|
||||||
|
record->Add(GetSlot("Rubber", _rubber));
|
||||||
|
record->Add(GetSlot("BodyHook", &_bodyHook));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Component::_SetNet(Net* net)
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
if (net != _net) {
|
||||||
|
if (_net) _net->_GetComponentSet()._Remove(this);
|
||||||
|
_net = net;
|
||||||
|
if (_net) _net->_GetComponentSet()._Insert(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Component::_SetRubber(Rubber* rubber)
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
if (rubber != _rubber) {
|
||||||
|
if (_rubber) _rubber->_Release();
|
||||||
|
_rubber = rubber;
|
||||||
|
if (_rubber) _rubber->_Capture();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//bool Component::_IsInterceptedBy(View* view, const Point& point, const Unit& aperture) const
|
||||||
|
//// *****************************************************************************************
|
||||||
|
//{
|
||||||
|
// Box area(point);
|
||||||
|
// area.Inflate(aperture);
|
||||||
|
// for_each_basic_layer(basicLayer, GetLayer()->GetBasicLayers()) {
|
||||||
|
// if (view->IsVisible(basicLayer) && GetBoundingBox(basicLayer).Intersect(area))
|
||||||
|
// return true;
|
||||||
|
// end_for;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return false;
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Component::_Highlight(View* view, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// ************************************************************************************************
|
||||||
|
//{
|
||||||
|
// for_each_basic_layer(basicLayer, GetLayer()->GetBasicLayers()) {
|
||||||
|
// _Draw(view, basicLayer, updateArea, transformation);
|
||||||
|
// end_for;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Component::BodyHook implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
static int BODY_HOOK_OFFSET = -1;
|
||||||
|
|
||||||
|
Component::BodyHook::BodyHook(Component* component)
|
||||||
|
// ************************************************
|
||||||
|
: Inherit()
|
||||||
|
{
|
||||||
|
if (!component)
|
||||||
|
throw Error("Can't create " + _TName("Component::BodyHook") + " : null component");
|
||||||
|
|
||||||
|
if (BODY_HOOK_OFFSET == -1)
|
||||||
|
BODY_HOOK_OFFSET = (unsigned long)this - (unsigned long)component;
|
||||||
|
}
|
||||||
|
|
||||||
|
Component* Component::BodyHook::GetComponent() const
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
return (Component*)((unsigned long)this - BODY_HOOK_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
string Component::BodyHook::_GetString() const
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
return "<" + _TName("Component::BodyHook") + " " + GetString(GetComponent()) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Component_Hooks implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Component_Hooks::Component_Hooks(const Component* component)
|
||||||
|
// *********************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_component(component)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Component_Hooks::Component_Hooks(const Component_Hooks& hooks)
|
||||||
|
// ***********************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_component(hooks._component)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Component_Hooks& Component_Hooks::operator=(const Component_Hooks& hooks)
|
||||||
|
// **********************************************************************
|
||||||
|
{
|
||||||
|
_component = hooks._component;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Collection<Hook*>* Component_Hooks::GetClone() const
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
return new Component_Hooks(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<Hook*>* Component_Hooks::GetLocator() const
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
return new Locator(_component);
|
||||||
|
}
|
||||||
|
|
||||||
|
string Component_Hooks::_GetString() const
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("Component::Hooks");
|
||||||
|
if (_component) s += " " + GetString(_component);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Component_Hooks::Locator implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Component_Hooks::Locator::Locator(const Component* component)
|
||||||
|
// **********************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_component(component),
|
||||||
|
_hook(NULL)
|
||||||
|
{
|
||||||
|
if (_component) _hook = ((Component*)_component)->GetBodyHook();
|
||||||
|
}
|
||||||
|
|
||||||
|
Component_Hooks::Locator::Locator(const Locator& locator)
|
||||||
|
// ******************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_component(locator._component),
|
||||||
|
_hook(locator._hook)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Component_Hooks::Locator& Component_Hooks::Locator::operator=(const Locator& locator)
|
||||||
|
// **********************************************************************************
|
||||||
|
{
|
||||||
|
_component = locator._component;
|
||||||
|
_hook = locator._hook;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook* Component_Hooks::Locator::GetElement() const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
return _hook;
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<Hook*>* Component_Hooks::Locator::GetClone() const
|
||||||
|
// *******************************************************
|
||||||
|
{
|
||||||
|
return new Locator(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Component_Hooks::Locator::IsValid() const
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
return (_hook != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Component_Hooks::Locator::Progress()
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
_hook = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
string Component_Hooks::Locator::_GetString() const
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("Component::Hooks::Locator");
|
||||||
|
if (_component) s += " " + GetString(_component);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Component_ConnexComponents implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Component_ConnexComponents::Component_ConnexComponents(const Component* component)
|
||||||
|
// *******************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_component(component)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Component_ConnexComponents::Component_ConnexComponents(const Component_ConnexComponents& connexComponents)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_component(connexComponents._component)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Component_ConnexComponents&
|
||||||
|
Component_ConnexComponents::operator=(const Component_ConnexComponents& connexComponents)
|
||||||
|
// *****************************************************************************************
|
||||||
|
{
|
||||||
|
_component = connexComponents._component;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Collection<Component*>* Component_ConnexComponents::GetClone() const
|
||||||
|
// *****************************************************************
|
||||||
|
{
|
||||||
|
return new Component_ConnexComponents(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<Component*>* Component_ConnexComponents::GetLocator() const
|
||||||
|
// ****************************************************************
|
||||||
|
{
|
||||||
|
return new Locator(_component);
|
||||||
|
}
|
||||||
|
|
||||||
|
string Component_ConnexComponents::_GetString() const
|
||||||
|
// **************************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("Component::ConnexComponents");
|
||||||
|
if (_component) s += " " + GetString(_component);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Component_ConnexComponents::Locator implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Component_ConnexComponents::Locator::Locator(const Component* component)
|
||||||
|
// *********************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_component(component),
|
||||||
|
_componentSet(),
|
||||||
|
_componentStack()
|
||||||
|
{
|
||||||
|
if (_component) {
|
||||||
|
_componentSet.insert((Component*)_component);
|
||||||
|
_componentStack.push((Component*)_component);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component_ConnexComponents::Locator::Locator(const Locator& locator)
|
||||||
|
// *****************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_component(locator._component),
|
||||||
|
_componentSet(locator._componentSet),
|
||||||
|
_componentStack(locator._componentStack)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Component_ConnexComponents::Locator& Component_ConnexComponents::Locator::operator=(const Locator& locator)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
{
|
||||||
|
_component = locator._component;
|
||||||
|
_componentSet = locator._componentSet;
|
||||||
|
_componentStack = locator._componentStack;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Component* Component_ConnexComponents::Locator::GetElement() const
|
||||||
|
// ***************************************************************
|
||||||
|
{
|
||||||
|
return _componentStack.top();
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<Component*>* Component_ConnexComponents::Locator::GetClone() const
|
||||||
|
// ***********************************************************************
|
||||||
|
{
|
||||||
|
return new Locator(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Component_ConnexComponents::Locator::IsValid() const
|
||||||
|
// ******************************************************
|
||||||
|
{
|
||||||
|
return !_componentStack.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Component_ConnexComponents::Locator::Progress()
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
if (!_componentStack.empty()) {
|
||||||
|
Component* component = _componentStack.top();
|
||||||
|
_componentStack.pop();
|
||||||
|
for_each_hook(componentHook, component->GetHooks()) {
|
||||||
|
Hook* masterHook = componentHook->GetMasterHook();
|
||||||
|
if (masterHook) {
|
||||||
|
for_each_hook(slaveHook, masterHook->GetSlaveHooks()) {
|
||||||
|
Component* component = slaveHook->GetComponent();
|
||||||
|
if (_componentSet.find(component) == _componentSet.end()) {
|
||||||
|
_componentSet.insert(component);
|
||||||
|
_componentStack.push(component);
|
||||||
|
}
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
Component* component = masterHook->GetComponent();
|
||||||
|
if (_componentSet.find(component) == _componentSet.end()) {
|
||||||
|
_componentSet.insert(component);
|
||||||
|
_componentStack.push(component);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string Component_ConnexComponents::Locator::_GetString() const
|
||||||
|
// ***********************************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("Component::ConnexComponents::Locator");
|
||||||
|
if (_component) s += " " + GetString(_component);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Component_SlaveComponents implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Component_SlaveComponents::Component_SlaveComponents(const Component* component)
|
||||||
|
// *****************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_component(component)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Component_SlaveComponents::Component_SlaveComponents(const Component_SlaveComponents& slaveComponents)
|
||||||
|
// ***************************************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_component(slaveComponents._component)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Component_SlaveComponents&
|
||||||
|
Component_SlaveComponents::operator=(const Component_SlaveComponents& slaveComponents)
|
||||||
|
// **************************************************************************************
|
||||||
|
{
|
||||||
|
_component = slaveComponents._component;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Collection<Component*>* Component_SlaveComponents::GetClone() const
|
||||||
|
// ****************************************************************
|
||||||
|
{
|
||||||
|
return new Component_SlaveComponents(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<Component*>* Component_SlaveComponents::GetLocator() const
|
||||||
|
// ***************************************************************
|
||||||
|
{
|
||||||
|
return new Locator(_component);
|
||||||
|
}
|
||||||
|
|
||||||
|
string Component_SlaveComponents::_GetString() const
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("Component::SlaveComponents");
|
||||||
|
if (_component) s += " " + GetString(_component);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Component_SlaveComponents::Locator implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Component_SlaveComponents::Locator::Locator(const Component* component)
|
||||||
|
// ********************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_component(component),
|
||||||
|
_componentSet(),
|
||||||
|
_componentStack()
|
||||||
|
{
|
||||||
|
if (_component) {
|
||||||
|
_componentSet.insert((Component*)_component);
|
||||||
|
Hook* masterHook = ((Component*)_component)->GetBodyHook();
|
||||||
|
for_each_hook(slaveHook, masterHook->GetSlaveHooks()) {
|
||||||
|
Component* component = slaveHook->GetComponent();
|
||||||
|
if (_componentSet.find(component) == _componentSet.end()) {
|
||||||
|
_componentSet.insert(component);
|
||||||
|
_componentStack.push(component);
|
||||||
|
}
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component_SlaveComponents::Locator::Locator(const Locator& locator)
|
||||||
|
// ****************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_component(locator._component),
|
||||||
|
_componentSet(locator._componentSet),
|
||||||
|
_componentStack(locator._componentStack)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Component_SlaveComponents::Locator&
|
||||||
|
Component_SlaveComponents::Locator::operator=(const Locator& locator)
|
||||||
|
// *********************************************************************
|
||||||
|
{
|
||||||
|
_component = locator._component;
|
||||||
|
_componentSet = locator._componentSet;
|
||||||
|
_componentStack = locator._componentStack;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Component* Component_SlaveComponents::Locator::GetElement() const
|
||||||
|
// **************************************************************
|
||||||
|
{
|
||||||
|
return _componentStack.top();
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<Component*>* Component_SlaveComponents::Locator::GetClone() const
|
||||||
|
// **********************************************************************
|
||||||
|
{
|
||||||
|
return new Locator(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Component_SlaveComponents::Locator::IsValid() const
|
||||||
|
// *****************************************************
|
||||||
|
{
|
||||||
|
return !_componentStack.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Component_SlaveComponents::Locator::Progress()
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
if (!_componentStack.empty()) {
|
||||||
|
Component* component = _componentStack.top();
|
||||||
|
_componentStack.pop();
|
||||||
|
Hook* masterHook = component->GetBodyHook();
|
||||||
|
for_each_hook(slaveHook, masterHook->GetSlaveHooks()) {
|
||||||
|
Component* component = slaveHook->GetComponent();
|
||||||
|
if (_componentSet.find(component) == _componentSet.end()) {
|
||||||
|
_componentSet.insert(component);
|
||||||
|
_componentStack.push(component);
|
||||||
|
}
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string Component_SlaveComponents::Locator::_GetString() const
|
||||||
|
// **********************************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("Component::SlaveComponents::Locator");
|
||||||
|
if (_component) s += " " + GetString(_component);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
double GetArea ( Component* component )
|
||||||
|
//**************************************
|
||||||
|
{
|
||||||
|
Box bb = component->GetBoundingBox ();
|
||||||
|
|
||||||
|
return GetValue(bb.GetWidth()) * GetValue(bb.GetHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,132 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Component.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_COMPONENT
|
||||||
|
#define HURRICANE_COMPONENT
|
||||||
|
|
||||||
|
#include "Go.h"
|
||||||
|
#include "Components.h"
|
||||||
|
#include "Hook.h"
|
||||||
|
#include "Hooks.h"
|
||||||
|
#include "Interval.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Net;
|
||||||
|
class Rubber;
|
||||||
|
class Layer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Component declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Component : public Go {
|
||||||
|
// ************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Go Inherit;
|
||||||
|
|
||||||
|
public: class BodyHook : public Hook {
|
||||||
|
// *********************************
|
||||||
|
|
||||||
|
friend class Component;
|
||||||
|
|
||||||
|
public: typedef Hook Inherit;
|
||||||
|
|
||||||
|
private: BodyHook(Component* component);
|
||||||
|
|
||||||
|
public: virtual Component* GetComponent() const;
|
||||||
|
|
||||||
|
public: virtual bool IsMaster() const {return true;};
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const { return _TName("Component::BodyHook"); };
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Net* _net;
|
||||||
|
private: Rubber* _rubber;
|
||||||
|
private: BodyHook _bodyHook;
|
||||||
|
private: Component* _nextOfNetComponentSet;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: Component(Net* net, bool inPlugCreate = false);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Cell* GetCell() const;
|
||||||
|
public: Net* GetNet() const {return _net;};
|
||||||
|
public: Rubber* GetRubber() const {return _rubber;};
|
||||||
|
public: Hook* GetBodyHook() {return &_bodyHook;};
|
||||||
|
public: virtual Hooks GetHooks() const;
|
||||||
|
public: virtual Unit GetX() const = 0;
|
||||||
|
public: virtual Unit GetY() const = 0;
|
||||||
|
public: virtual Point GetPosition() const {return Point(GetX(), GetY());};
|
||||||
|
public: virtual Point GetCenter() const {return GetPosition();};
|
||||||
|
public: virtual Layer* GetLayer() const = 0;
|
||||||
|
public: virtual Box GetBoundingBox() const = 0;
|
||||||
|
public: virtual Box GetBoundingBox(BasicLayer* basicLayer) const = 0;
|
||||||
|
public: Components GetConnexComponents() const;
|
||||||
|
public: Components GetSlaveComponents() const;
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: virtual void Materialize();
|
||||||
|
public: virtual void Unmaterialize();
|
||||||
|
public: virtual void Invalidate(bool propagateFlag = true);
|
||||||
|
|
||||||
|
// Filters
|
||||||
|
// *******
|
||||||
|
|
||||||
|
public: static ComponentFilter GetIsUnderFilter(const Box& area);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
protected: virtual void _PostCreate();
|
||||||
|
|
||||||
|
protected: virtual void _PreDelete();
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
public: Component* _GetNextOfNetComponentSet() const {return _nextOfNetComponentSet;};
|
||||||
|
|
||||||
|
public: void _SetNet(Net* net);
|
||||||
|
public: void _SetRubber(Rubber* rubber);
|
||||||
|
public: void _SetNextOfNetComponentSet(Component* component) {_nextOfNetComponentSet = component;};
|
||||||
|
|
||||||
|
//public: virtual bool _IsInterceptedBy(View* view, const Point& point, const Unit& aperture) const;
|
||||||
|
//public: virtual void _Highlight(View* view, const Box& updateArea, const Transformation& transformation);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
double GetArea ( Component* component );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::Component)
|
||||||
|
SetNestedSlotAdapter(Hurricane::Component::BodyHook)
|
||||||
|
|
||||||
|
#endif // HURRICANE_COMPONENT
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,62 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Components.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_COMPONENTS
|
||||||
|
#define HURRICANE_COMPONENTS
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Component;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Components declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<Component*> Components;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// ComponentLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<Component*> ComponentLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// ComponentFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<Component*> ComponentFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_component declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_component(component, components)\
|
||||||
|
/************************************************/\
|
||||||
|
{\
|
||||||
|
ComponentLocator _locator = components.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
Component* component = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_COMPONENTS
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,270 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: CompositeLayer.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "CompositeLayer.h"
|
||||||
|
#include "Technology.h"
|
||||||
|
#include "BasicLayer.h"
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// CompositeLayer implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
CompositeLayer::CompositeLayer(Technology* technology, const Name& name, const Type& type, const Unit& minimalSize, const Unit& minimalSpacing)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
: Inherit(technology, name, minimalSize, minimalSpacing),
|
||||||
|
_type(type),
|
||||||
|
_basicLayerList(),
|
||||||
|
_contactSizeMap(),
|
||||||
|
_segmentSizeMap(),
|
||||||
|
_segmentExtentionMap(),
|
||||||
|
_padSizeMap(),
|
||||||
|
_maximalContactSize(0),
|
||||||
|
_maximalSegmentSize(0),
|
||||||
|
_maximalSegmentExtention(0),
|
||||||
|
_maximalPadSize(0),
|
||||||
|
_symbolicBasicLayer(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CompositeLayer* CompositeLayer::Create(Technology* technology, const Name& name, const Type& type, const Unit& minimalSize, const Unit& minimalSpacing)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
{
|
||||||
|
CompositeLayer* compositeLayer =
|
||||||
|
new CompositeLayer(technology, name, type, minimalSize, minimalSpacing);
|
||||||
|
|
||||||
|
compositeLayer->_PostCreate();
|
||||||
|
|
||||||
|
return compositeLayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
BasicLayers CompositeLayer::GetBasicLayers() const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
return GetCollection(_basicLayerList);
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit CompositeLayer::GetContactSize(BasicLayer* basicLayer) const
|
||||||
|
// **************************************************************
|
||||||
|
{
|
||||||
|
SizeMap::const_iterator it = _contactSizeMap.find(basicLayer);
|
||||||
|
return ((it == _contactSizeMap.end()) ? 0 : (*it).second);
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit CompositeLayer::GetSegmentSize(BasicLayer* basicLayer) const
|
||||||
|
// **************************************************************
|
||||||
|
{
|
||||||
|
SizeMap::const_iterator it = _segmentSizeMap.find(basicLayer);
|
||||||
|
return ((it == _segmentSizeMap.end()) ? 0 : (*it).second);
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit CompositeLayer::GetSegmentExtention(BasicLayer* basicLayer) const
|
||||||
|
// *******************************************************************
|
||||||
|
{
|
||||||
|
SizeMap::const_iterator it = _segmentExtentionMap.find(basicLayer);
|
||||||
|
return ((it == _segmentExtentionMap.end()) ? 0 : (*it).second);
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit CompositeLayer::GetPadSize(BasicLayer* basicLayer) const
|
||||||
|
// **********************************************************
|
||||||
|
{
|
||||||
|
SizeMap::const_iterator it = _padSizeMap.find(basicLayer);
|
||||||
|
return ((it == _padSizeMap.end()) ? 0 : (*it).second);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CompositeLayer::Add(BasicLayer* basicLayer, const Unit& contactSize, const Unit& segmentSize, const Unit& segmentExtention, const Unit& padSize)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
{
|
||||||
|
if (!basicLayer)
|
||||||
|
throw Error("Can't add basic layer : null basic layer");
|
||||||
|
|
||||||
|
if (Contains(basicLayer))
|
||||||
|
throw Error("Can't add basic layer : already done");
|
||||||
|
|
||||||
|
_basicLayerList.push_back(basicLayer);
|
||||||
|
|
||||||
|
_SetMask(GetMask() | basicLayer->GetMask());
|
||||||
|
_SetExtractMask(GetExtractMask() | basicLayer->GetExtractMask());
|
||||||
|
|
||||||
|
if (contactSize != 0) _contactSizeMap[basicLayer] = contactSize;
|
||||||
|
if (segmentSize != 0) _segmentSizeMap[basicLayer] = segmentSize;
|
||||||
|
if (segmentExtention != 0) _segmentExtentionMap[basicLayer] = segmentExtention;
|
||||||
|
if (padSize != 0) _padSizeMap[basicLayer] = padSize;
|
||||||
|
|
||||||
|
_maximalContactSize = max(contactSize, _maximalContactSize);
|
||||||
|
_maximalSegmentSize = max(segmentSize, _maximalSegmentSize);
|
||||||
|
_maximalSegmentExtention = max(segmentExtention, _maximalSegmentExtention);
|
||||||
|
_maximalPadSize = max(padSize, _maximalPadSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CompositeLayer::Remove(BasicLayer* basicLayer)
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
if (!basicLayer)
|
||||||
|
throw Error("Can't remove basic layer : null basic layer");
|
||||||
|
|
||||||
|
if (!Contains(basicLayer))
|
||||||
|
throw Error("Can't remove basic layer : not contained");
|
||||||
|
|
||||||
|
_basicLayerList.remove(basicLayer);
|
||||||
|
|
||||||
|
_contactSizeMap.erase(basicLayer);
|
||||||
|
_segmentSizeMap.erase(basicLayer);
|
||||||
|
_segmentExtentionMap.erase(basicLayer);
|
||||||
|
_padSizeMap.erase(basicLayer);
|
||||||
|
|
||||||
|
_maximalContactSize = 0;
|
||||||
|
_maximalSegmentSize = 0;
|
||||||
|
_maximalSegmentExtention = 0;
|
||||||
|
_maximalPadSize = 0;
|
||||||
|
|
||||||
|
Mask mask = 0;
|
||||||
|
Mask extractMask = 0;
|
||||||
|
|
||||||
|
for_each_basic_layer(basicLayer, GetBasicLayers()) {
|
||||||
|
mask |= basicLayer->GetMask();
|
||||||
|
extractMask |= basicLayer->GetExtractMask();
|
||||||
|
_maximalContactSize = max(GetContactSize(basicLayer), _maximalContactSize);
|
||||||
|
_maximalSegmentSize = max(GetSegmentSize(basicLayer), _maximalSegmentSize);
|
||||||
|
_maximalSegmentExtention = max(GetSegmentExtention(basicLayer), _maximalSegmentExtention);
|
||||||
|
_maximalPadSize = max(GetPadSize(basicLayer), _maximalPadSize);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
_SetMask(mask);
|
||||||
|
_SetExtractMask(extractMask);
|
||||||
|
}
|
||||||
|
|
||||||
|
string CompositeLayer::_GetString() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
string s = Inherit::_GetString();
|
||||||
|
/*
|
||||||
|
s.insert(s.length() - 1, " " + GetString(_type));
|
||||||
|
s.insert(s.length() - 1, " {");
|
||||||
|
string separator = "";
|
||||||
|
for_each_basic_layer(basicLayer, GetBasicLayers()) {
|
||||||
|
s.insert(s.length() - 1, separator + GetString(basicLayer->GetName()));
|
||||||
|
separator = "|";
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
s.insert(s.length() - 1, "}");
|
||||||
|
*/
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* CompositeLayer::_GetRecord() const
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
if (record) {
|
||||||
|
record->Add(GetSlot("Type", &_type));
|
||||||
|
record->Add(GetSlot("BasicLayers", &_basicLayerList));
|
||||||
|
record->Add(GetSlot("ContactSizes", &_contactSizeMap));
|
||||||
|
record->Add(GetSlot("SegmentSizes", &_segmentSizeMap));
|
||||||
|
record->Add(GetSlot("SegmentExtentions", &_segmentExtentionMap));
|
||||||
|
record->Add(GetSlot("PadSizes", &_padSizeMap));
|
||||||
|
record->Add(GetSlot("MaximalContactSize", &_maximalContactSize));
|
||||||
|
record->Add(GetSlot("MaximalSegmentSize", &_maximalSegmentSize));
|
||||||
|
record->Add(GetSlot("MaximalSegmentExtention", &_maximalSegmentExtention));
|
||||||
|
record->Add(GetSlot("MaximalPadSize", &_maximalPadSize));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CompositeLayer::_UpdateSymbolicBasicLayer(const Layer::Mask& visibleBasicLayersMask)
|
||||||
|
// **************************************************************************************
|
||||||
|
{
|
||||||
|
_symbolicBasicLayer = NULL;
|
||||||
|
BasicLayer* symbolicBasicLayer = NULL;
|
||||||
|
for_each_basic_layer(basicLayer, GetBasicLayers()) {
|
||||||
|
if (basicLayer->GetMask() & visibleBasicLayersMask) {
|
||||||
|
symbolicBasicLayer = basicLayer;
|
||||||
|
if (basicLayer->GetType() == BasicLayer::Type::CONTACT)
|
||||||
|
_symbolicBasicLayer = basicLayer;
|
||||||
|
}
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
if (!_symbolicBasicLayer) _symbolicBasicLayer = symbolicBasicLayer;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// CompositeLayer::Type implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
CompositeLayer::Type::Type(const Code& code)
|
||||||
|
// *****************************************
|
||||||
|
: _code(code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CompositeLayer::Type::Type(const Type& type)
|
||||||
|
// *****************************************
|
||||||
|
: _code(type._code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CompositeLayer::Type& CompositeLayer::Type::operator=(const Type& type)
|
||||||
|
// ********************************************************************
|
||||||
|
{
|
||||||
|
_code = type._code;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
string CompositeLayer::Type::_GetString() const
|
||||||
|
// ********************************************
|
||||||
|
{
|
||||||
|
switch (_code) {
|
||||||
|
case UNDEFINED : return "UNDEFINED";
|
||||||
|
case METAL : return "METAL";
|
||||||
|
case VIA : return "VIA";
|
||||||
|
}
|
||||||
|
return "ABNORMAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* CompositeLayer::Type::_GetRecord() const
|
||||||
|
// *********************************************
|
||||||
|
{
|
||||||
|
Record* record = new Record(GetString(this));
|
||||||
|
record->Add(GetSlot("Code", (int)_code));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
bool Scan(const string& s, H::CompositeLayer::Type& type)
|
||||||
|
// ***************************************************
|
||||||
|
{
|
||||||
|
if (s == "UNDEFINED") {
|
||||||
|
type = H::CompositeLayer::Type::UNDEFINED;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (s == "METAL") {
|
||||||
|
type = H::CompositeLayer::Type::METAL;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (s == "VIA") {
|
||||||
|
type = H::CompositeLayer::Type::VIA;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,129 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: CompositeLayer.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_COMPOSITE_LAYER
|
||||||
|
#define HURRICANE_COMPOSITE_LAYER
|
||||||
|
|
||||||
|
#include "Layer.h"
|
||||||
|
#include "CompositeLayers.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// CompositeLayer declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class CompositeLayer : public Layer {
|
||||||
|
// ********************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Layer Inherit;
|
||||||
|
|
||||||
|
public: class Type {
|
||||||
|
// ***************
|
||||||
|
|
||||||
|
public: enum Code {UNDEFINED=0, METAL=1, VIA=2};
|
||||||
|
|
||||||
|
private: Code _code;
|
||||||
|
|
||||||
|
public: Type(const Code& code = UNDEFINED);
|
||||||
|
public: Type(const Type& type);
|
||||||
|
|
||||||
|
public: Type& operator=(const Type& type);
|
||||||
|
|
||||||
|
public: operator const Code&() const {return _code;};
|
||||||
|
|
||||||
|
public: const Code& GetCode() const {return _code;};
|
||||||
|
|
||||||
|
public: string _GetTypeName() const { return _TName("CompositeLayer::Type"); };
|
||||||
|
public: string _GetString() const;
|
||||||
|
public: Record* _GetRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
public: typedef list<BasicLayer*> BasicLayerList;
|
||||||
|
|
||||||
|
public: typedef map<BasicLayer*, Unit> SizeMap;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Type _type;
|
||||||
|
private: BasicLayerList _basicLayerList;
|
||||||
|
private: SizeMap _contactSizeMap;
|
||||||
|
private: SizeMap _segmentSizeMap;
|
||||||
|
private: SizeMap _segmentExtentionMap;
|
||||||
|
private: SizeMap _padSizeMap;
|
||||||
|
private: Unit _maximalContactSize;
|
||||||
|
private: Unit _maximalSegmentSize;
|
||||||
|
private: Unit _maximalSegmentExtention;
|
||||||
|
private: Unit _maximalPadSize;
|
||||||
|
private: BasicLayer* _symbolicBasicLayer;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: CompositeLayer(Technology* technology, const Name& name, const Type& type, const Unit& minimalSize = 0, const Unit& minimalSpacing = 0);
|
||||||
|
|
||||||
|
public: static CompositeLayer* Create(Technology* technology, const Name& name, const Type& type, const Unit& minimalSize = 0, const Unit& minimalSpacing = 0);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: const Type& GetType() const {return _type;};
|
||||||
|
public: virtual BasicLayers GetBasicLayers() const;
|
||||||
|
public: Unit GetContactSize(BasicLayer* basicLayer) const;
|
||||||
|
public: Unit GetSegmentSize(BasicLayer* basicLayer) const;
|
||||||
|
public: Unit GetSegmentExtention(BasicLayer* basicLayer) const;
|
||||||
|
public: Unit GetPadSize(BasicLayer* basicLayer) const;
|
||||||
|
public: const Unit& GetMaximalContactSize() const {return _maximalContactSize;};
|
||||||
|
public: const Unit& GetMaximalSegmentSize() const {return _maximalSegmentSize;};
|
||||||
|
public: const Unit& GetMaximalSegmentExtention() const {return _maximalSegmentExtention;};
|
||||||
|
public: const Unit& GetMaximalPadSize() const {return _maximalPadSize;};
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: void Add(BasicLayer* basicLayer, const Unit& contactSize, const Unit& segmentSize, const Unit& segmentExtention, const Unit& padSize);
|
||||||
|
public: void Remove(BasicLayer* basicLayer);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const {return _TName("CompositeLayer");};
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
public: virtual BasicLayer* _GetSymbolicBasicLayer() {return _symbolicBasicLayer;};
|
||||||
|
public: BasicLayerList& _GetBasicLayerList() {return _basicLayerList;};
|
||||||
|
|
||||||
|
public: void _UpdateSymbolicBasicLayer(const Layer::Mask& visibleBasicLayersMask);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::CompositeLayer)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
bool Scan(const string& s, H::CompositeLayer::Type& type);
|
||||||
|
|
||||||
|
#endif // HURRICANE_COMPOSITE_LAYER
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,62 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: CompositeLayers.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_COMPOSITE_LAYERS
|
||||||
|
#define HURRICANE_COMPOSITE_LAYERS
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class CompositeLayer;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// CompositeLayers declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<CompositeLayer*> CompositeLayers;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// CompositeLayerLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<CompositeLayer*> CompositeLayerLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// CompositeLayerFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<CompositeLayer*> CompositeLayerFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_composite_layer declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_composite_layer(compositeLayer, compositeLayers)\
|
||||||
|
/****************************************************************/\
|
||||||
|
{\
|
||||||
|
CompositeLayerLocator _locator = compositeLayers.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
CompositeLayer* compositeLayer = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_COMPOSITE_LAYERS
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,575 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Contact.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Contact.h"
|
||||||
|
#include "Net.h"
|
||||||
|
#include "BasicLayer.h"
|
||||||
|
#include "CompositeLayer.h"
|
||||||
|
#include "Plug.h"
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Contact_Hooks declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Contact_Hooks : public Collection<Hook*> {
|
||||||
|
// *******************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Collection<Hook*> Inherit;
|
||||||
|
|
||||||
|
public: class Locator : public Hurricane::Locator<Hook*> {
|
||||||
|
// *****************************************************
|
||||||
|
|
||||||
|
public: typedef Hurricane::Locator<Hook*> Inherit;
|
||||||
|
|
||||||
|
private: const Contact* _contact;
|
||||||
|
private: Hook* _hook;
|
||||||
|
|
||||||
|
public: Locator(const Contact* contact = NULL);
|
||||||
|
public: Locator(const Locator& locator);
|
||||||
|
|
||||||
|
public: Locator& operator=(const Locator& locator);
|
||||||
|
|
||||||
|
public: virtual Hook* GetElement() const;
|
||||||
|
public: virtual Hurricane::Locator<Hook*>* GetClone() const;
|
||||||
|
|
||||||
|
public: virtual bool IsValid() const;
|
||||||
|
|
||||||
|
public: virtual void Progress();
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: const Contact* _contact;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: Contact_Hooks(const Contact* contact = NULL);
|
||||||
|
public: Contact_Hooks(const Contact_Hooks& hooks);
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: Contact_Hooks& operator=(const Contact_Hooks& hooks);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// ********^
|
||||||
|
|
||||||
|
public: virtual Collection<Hook*>* GetClone() const;
|
||||||
|
public: virtual Hurricane::Locator<Hook*>* GetLocator() const;
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Contact implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Contact::Contact(Net* net, Layer* layer, const Unit& x, const Unit& y, const Unit& width, const Unit& height)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
: Inherit(net),
|
||||||
|
_anchorHook(this),
|
||||||
|
_layer(layer),
|
||||||
|
_dx(x),
|
||||||
|
_dy(y),
|
||||||
|
_width(width),
|
||||||
|
_height(height)
|
||||||
|
{
|
||||||
|
if (!_layer)
|
||||||
|
throw Error("Can't create " + _TName("Contact") + " : null layer");
|
||||||
|
}
|
||||||
|
|
||||||
|
Contact::Contact(Net* net, Component* anchor, Layer* layer, const Unit& dx, const Unit& dy, const Unit& width, const Unit& height)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
: Inherit(net),
|
||||||
|
_anchorHook(this),
|
||||||
|
_layer(layer),
|
||||||
|
_dx(dx),
|
||||||
|
_dy(dy),
|
||||||
|
_width(width),
|
||||||
|
_height(height)
|
||||||
|
{
|
||||||
|
if (!anchor)
|
||||||
|
throw Error("Can't create " + _TName("Contact") + " : null anchor");
|
||||||
|
|
||||||
|
if (!anchor->GetNet())
|
||||||
|
throw Error("Can't create " + _TName("Contact") + " : unconnected anchor");
|
||||||
|
|
||||||
|
if (anchor->GetNet() != GetNet())
|
||||||
|
throw Error("Can't create " + _TName("Contact") + " : incompatible anchor");
|
||||||
|
|
||||||
|
if (!_layer)
|
||||||
|
throw Error("Can't create " + _TName("Contact") + " : null layer");
|
||||||
|
|
||||||
|
_anchorHook.Attach(anchor->GetBodyHook());
|
||||||
|
}
|
||||||
|
|
||||||
|
Contact* Contact::Create(Net* net, Layer* layer, const Unit& x, const Unit& y, const Unit& width, const Unit& height)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
{
|
||||||
|
Contact* contact = new Contact(net, layer, x, y, width, height);
|
||||||
|
|
||||||
|
contact->_PostCreate();
|
||||||
|
|
||||||
|
return contact;
|
||||||
|
}
|
||||||
|
|
||||||
|
Contact* Contact::Create(Component* anchor, Layer* layer, const Unit& dx, const Unit& dy, const Unit& width, const Unit& height)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
{
|
||||||
|
if (!anchor)
|
||||||
|
throw Error("Can't create " + _TName("Contact") + " : null anchor");
|
||||||
|
|
||||||
|
Contact* contact = new Contact(anchor->GetNet(), anchor, layer, dx, dy, width, height);
|
||||||
|
|
||||||
|
contact->_PostCreate();
|
||||||
|
|
||||||
|
return contact;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hooks Contact::GetHooks() const
|
||||||
|
// ****************************
|
||||||
|
{
|
||||||
|
return Contact_Hooks(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit Contact::GetX() const
|
||||||
|
// ***********************
|
||||||
|
{
|
||||||
|
Component* anchor = GetAnchor();
|
||||||
|
return (!anchor) ? _dx : anchor->GetX() + _dx;
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit Contact::GetY() const
|
||||||
|
// ***********************
|
||||||
|
{
|
||||||
|
Component* anchor = GetAnchor();
|
||||||
|
return (!anchor) ? _dy : anchor->GetY() + _dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
Point Contact::GetPosition() const
|
||||||
|
// *******************************
|
||||||
|
{
|
||||||
|
Component* anchor = GetAnchor();
|
||||||
|
return (!anchor) ? Point(_dx, _dy) : anchor->GetPosition().Translate(_dx, _dy);
|
||||||
|
}
|
||||||
|
|
||||||
|
Box Contact::GetBoundingBox() const
|
||||||
|
// ********************************
|
||||||
|
{
|
||||||
|
Unit size = _GetSize();
|
||||||
|
|
||||||
|
return Box(GetPosition()).Inflate(GetHalfWidth() + size, GetHalfHeight() + size);
|
||||||
|
}
|
||||||
|
|
||||||
|
Box Contact::GetBoundingBox(BasicLayer* basicLayer) const
|
||||||
|
// ******************************************************
|
||||||
|
{
|
||||||
|
if (!_layer->Contains(basicLayer)) return Box();
|
||||||
|
|
||||||
|
Unit size = _GetSize(basicLayer);
|
||||||
|
|
||||||
|
return Box(GetPosition()).Inflate(GetHalfWidth() + size, GetHalfHeight() + size);
|
||||||
|
}
|
||||||
|
|
||||||
|
Component* Contact::GetAnchor() const
|
||||||
|
// **********************************
|
||||||
|
{
|
||||||
|
Hook* masterHook = _anchorHook.GetMasterHook();
|
||||||
|
return (masterHook) ? masterHook->GetComponent() : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact::Translate(const Unit& dx, const Unit& dy)
|
||||||
|
// ****************************************************
|
||||||
|
{
|
||||||
|
if ((dx != 0) || (dy != 0)) {
|
||||||
|
Invalidate(true);
|
||||||
|
_dx += dx;
|
||||||
|
_dy += dy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact::SetLayer(Layer* layer)
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
if (!layer)
|
||||||
|
throw Error("Can't set layer : null layer");
|
||||||
|
|
||||||
|
if (layer != _layer) {
|
||||||
|
Invalidate(false);
|
||||||
|
_layer = layer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact::SetWidth(const Unit& width)
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
if (width != _width) {
|
||||||
|
Invalidate(false);
|
||||||
|
_width = width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact::SetHeight(const Unit& height)
|
||||||
|
// ****************************************
|
||||||
|
{
|
||||||
|
if (height != _height) {
|
||||||
|
Invalidate(false);
|
||||||
|
_height = height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact::SetSizes(const Unit& width, const Unit& height)
|
||||||
|
// **********************************************************
|
||||||
|
{
|
||||||
|
if ((width != _width) || (height != _height)) {
|
||||||
|
Invalidate(false);
|
||||||
|
_width = width;
|
||||||
|
_height = height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact::SetX(const Unit& x)
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
SetPosition(x, GetY());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact::SetY(const Unit& y)
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
SetPosition(GetX(), y);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact::SetPosition(const Unit& x, const Unit& y)
|
||||||
|
// ****************************************************
|
||||||
|
{
|
||||||
|
Component* anchor = GetAnchor();
|
||||||
|
if (!anchor)
|
||||||
|
SetOffset(x, y);
|
||||||
|
else
|
||||||
|
SetOffset(x - anchor->GetX(), y - anchor->GetY());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact::SetPosition(const Point& position)
|
||||||
|
// *********************************************
|
||||||
|
{
|
||||||
|
SetPosition(position.GetX(), position.GetY());
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact::SetDx(const Unit& dx)
|
||||||
|
// ********************************
|
||||||
|
{
|
||||||
|
SetOffset(dx, _dy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact::SetDy(const Unit& dy)
|
||||||
|
// ********************************
|
||||||
|
{
|
||||||
|
SetOffset(_dx, dy);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact::SetOffset(const Unit& dx, const Unit& dy)
|
||||||
|
// ****************************************************
|
||||||
|
{
|
||||||
|
if ((dx != _dx) || (dy != _dy)) {
|
||||||
|
Invalidate(true);
|
||||||
|
_dx = dx;
|
||||||
|
_dy = dy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact::_PreDelete()
|
||||||
|
// ***********************
|
||||||
|
{
|
||||||
|
// trace << "entering Contact::PreDelete: " << this << endl;
|
||||||
|
// trace_in();
|
||||||
|
|
||||||
|
Inherit::_PreDelete();
|
||||||
|
|
||||||
|
_anchorHook.Detach();
|
||||||
|
|
||||||
|
// trace << "exiting Contact::PreDelete:" << endl;
|
||||||
|
// trace_out();
|
||||||
|
}
|
||||||
|
|
||||||
|
string Contact::_GetString() const
|
||||||
|
// *******************************
|
||||||
|
{
|
||||||
|
string s = Inherit::_GetString();
|
||||||
|
s.insert(s.length() - 1, " " + GetString(_layer->GetName()));
|
||||||
|
s.insert(s.length() - 1, " [" + GetValueString(GetX()));
|
||||||
|
s.insert(s.length() - 1, " " + GetValueString(GetY()));
|
||||||
|
s.insert(s.length() - 1, "] " + GetValueString(_width));
|
||||||
|
s.insert(s.length() - 1, "x" + GetValueString(_height));
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* Contact::_GetRecord() const
|
||||||
|
// **************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
if (record) {
|
||||||
|
record->Add(GetSlot("AnchorHook", &_anchorHook));
|
||||||
|
record->Add(GetSlot("Anchor", GetAnchor()));
|
||||||
|
record->Add(GetSlot("Layer", _layer));
|
||||||
|
record->Add(GetSlot("Dx", &_dx));
|
||||||
|
record->Add(GetSlot("Dy", &_dy));
|
||||||
|
record->Add(GetSlot("Width", &_width));
|
||||||
|
record->Add(GetSlot("Height", &_height));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit Contact::_GetSize() const
|
||||||
|
// ***************************
|
||||||
|
{
|
||||||
|
Unit size = 0;
|
||||||
|
|
||||||
|
Layer* layer = GetLayer();
|
||||||
|
if (is_a<CompositeLayer*>(layer))
|
||||||
|
size = ((CompositeLayer*)layer)->GetMaximalContactSize();
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit Contact::_GetSize(BasicLayer* basicLayer) const
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
Layer* layer = GetLayer();
|
||||||
|
|
||||||
|
if (!layer->Contains(basicLayer)) return 0;
|
||||||
|
|
||||||
|
Unit size = 0;
|
||||||
|
|
||||||
|
if (is_a<CompositeLayer*>(layer))
|
||||||
|
size = ((CompositeLayer*)layer)->GetContactSize(basicLayer);
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
//void Contact::_Draw(View* view, BasicLayer* basicLayer, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// ****************************************************************************************************
|
||||||
|
//{
|
||||||
|
// if (_width && _height) {
|
||||||
|
// if (1 < view->GetScreenSize(max(_width, _height)))
|
||||||
|
// basicLayer->_Fill(view, transformation.GetBox(GetBoundingBox(basicLayer)));
|
||||||
|
// }
|
||||||
|
// if (basicLayer == _layer->_GetSymbolicBasicLayer()) {
|
||||||
|
// if (view->CutPointsAreVisible() && (3 < view->GetScale())) {
|
||||||
|
// Point position = GetPosition();
|
||||||
|
// view->DrawPoint(transformation.GetPoint(position), 3);
|
||||||
|
// if (_width) {
|
||||||
|
// Box box = transformation.GetBox(Box(position).Inflate(GetHalfWidth(), 0));
|
||||||
|
// view->DrawLine(box.GetXMin(), box.GetYMin(), box.GetXMax(), box.GetYMax());
|
||||||
|
// }
|
||||||
|
// if (_height) {
|
||||||
|
// Box box = transformation.GetBox(Box(position).Inflate(0, GetHalfHeight()));
|
||||||
|
// view->DrawLine(box.GetXMin(), box.GetYMin(), box.GetXMax(), box.GetYMax());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Contact::_Highlight(View* view, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// **********************************************************************************************
|
||||||
|
//{
|
||||||
|
// if (_width && _height) {
|
||||||
|
// if (1 < view->GetScreenSize(max(_width, _height))) {
|
||||||
|
// for_each_basic_layer(basicLayer, GetLayer()->GetBasicLayers()) {
|
||||||
|
// basicLayer->_Fill(view, transformation.GetBox(GetBoundingBox(basicLayer)));
|
||||||
|
// end_for;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// if (view->GetScale() <= 1)
|
||||||
|
// view->DrawPoint(transformation.GetPoint(GetPosition()), 1);
|
||||||
|
// else if (view->GetScale() <= 3)
|
||||||
|
// view->DrawPoint(transformation.GetPoint(GetPosition()), 2);
|
||||||
|
// else {
|
||||||
|
// Point position = GetPosition();
|
||||||
|
// view->DrawPoint(transformation.GetPoint(position), 3);
|
||||||
|
// if (_width) {
|
||||||
|
// Box box = transformation.GetBox(Box(position).Inflate(GetHalfWidth(), 0));
|
||||||
|
// view->DrawLine(box.GetXMin(), box.GetYMin(), box.GetXMax(), box.GetYMax());
|
||||||
|
// }
|
||||||
|
// if (_height) {
|
||||||
|
// Box box = transformation.GetBox(Box(position).Inflate(0, GetHalfHeight()));
|
||||||
|
// view->DrawLine(box.GetXMin(), box.GetYMin(), box.GetXMax(), box.GetYMax());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Contact::AnchorHook implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
static int ANCHOR_HOOK_OFFSET = -1;
|
||||||
|
|
||||||
|
Contact::AnchorHook::AnchorHook(Contact* contact)
|
||||||
|
// **********************************************
|
||||||
|
: Inherit()
|
||||||
|
{
|
||||||
|
if (!contact)
|
||||||
|
throw Error("Can't create " + _TName("Contact::AnchorHook") + " : null contact");
|
||||||
|
|
||||||
|
if (ANCHOR_HOOK_OFFSET == -1)
|
||||||
|
ANCHOR_HOOK_OFFSET = (unsigned long)this - (unsigned long)contact;
|
||||||
|
}
|
||||||
|
|
||||||
|
Component* Contact::AnchorHook::GetComponent() const
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
return (Component*)((unsigned long)this - ANCHOR_HOOK_OFFSET);
|
||||||
|
}
|
||||||
|
|
||||||
|
string Contact::AnchorHook::_GetString() const
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
return "<" + _TName("Contact::AnchorHook") + " " + GetString(GetComponent()) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Contact_Hooks implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Contact_Hooks::Contact_Hooks(const Contact* contact)
|
||||||
|
// *************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_contact(contact)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Contact_Hooks::Contact_Hooks(const Contact_Hooks& hooks)
|
||||||
|
// *****************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_contact(hooks._contact)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Contact_Hooks& Contact_Hooks::operator=(const Contact_Hooks& hooks)
|
||||||
|
// ****************************************************************
|
||||||
|
{
|
||||||
|
_contact = hooks._contact;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Collection<Hook*>* Contact_Hooks::GetClone() const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
return new Contact_Hooks(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<Hook*>* Contact_Hooks::GetLocator() const
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
return new Locator(_contact);
|
||||||
|
}
|
||||||
|
|
||||||
|
string Contact_Hooks::_GetString() const
|
||||||
|
// *************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("Contact::Hooks");
|
||||||
|
if (_contact) s += " " + GetString(_contact);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Contact_Hooks::Locator implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Contact_Hooks::Locator::Locator(const Contact* contact)
|
||||||
|
// ****************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_contact(contact),
|
||||||
|
_hook(NULL)
|
||||||
|
{
|
||||||
|
if (_contact) _hook = ((Contact*)_contact)->GetBodyHook();
|
||||||
|
}
|
||||||
|
|
||||||
|
Contact_Hooks::Locator::Locator(const Locator& locator)
|
||||||
|
// ****************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_contact(locator._contact),
|
||||||
|
_hook(locator._hook)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Contact_Hooks::Locator& Contact_Hooks::Locator::operator=(const Locator& locator)
|
||||||
|
// ******************************************************************************
|
||||||
|
{
|
||||||
|
_contact = locator._contact;
|
||||||
|
_hook = locator._hook;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook* Contact_Hooks::Locator::GetElement() const
|
||||||
|
// *********************************************
|
||||||
|
{
|
||||||
|
return _hook;
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<Hook*>* Contact_Hooks::Locator::GetClone() const
|
||||||
|
// *****************************************************
|
||||||
|
{
|
||||||
|
return new Locator(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Contact_Hooks::Locator::IsValid() const
|
||||||
|
// *****************************************
|
||||||
|
{
|
||||||
|
return (_hook != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Contact_Hooks::Locator::Progress()
|
||||||
|
// ************************************
|
||||||
|
{
|
||||||
|
if (_hook) {
|
||||||
|
if (_hook == ((Contact*)_contact)->GetBodyHook())
|
||||||
|
_hook = ((Contact*)_contact)->GetAnchorHook();
|
||||||
|
else
|
||||||
|
_hook = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string Contact_Hooks::Locator::_GetString() const
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("Contact::Hooks::Locator");
|
||||||
|
if (_contact) s += " " + GetString(_contact);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,128 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Contact.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_CONTACT
|
||||||
|
#define HURRICANE_CONTACT
|
||||||
|
|
||||||
|
#include "Component.h"
|
||||||
|
#include "Contacts.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Contact declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Contact : public Component {
|
||||||
|
// *****************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Component Inherit;
|
||||||
|
|
||||||
|
public: class AnchorHook : public Hook {
|
||||||
|
// ***********************************
|
||||||
|
|
||||||
|
friend class Contact;
|
||||||
|
|
||||||
|
public: typedef Hook Inherit;
|
||||||
|
|
||||||
|
private: AnchorHook(Contact* contact);
|
||||||
|
|
||||||
|
public: virtual Component* GetComponent() const;
|
||||||
|
|
||||||
|
public: virtual bool IsMaster() const {return false;};
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const { return _TName("Contact::AnchorHook"); };
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: AnchorHook _anchorHook;
|
||||||
|
private: Layer* _layer;
|
||||||
|
private: Unit _dx;
|
||||||
|
private: Unit _dy;
|
||||||
|
protected: Unit _width;
|
||||||
|
protected: Unit _height;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: Contact(Net* net, Layer* layer, const Unit& x, const Unit& y, const Unit& width = 0, const Unit& height = 0);
|
||||||
|
protected: Contact(Net* net, Component* anchor, Layer* layer, const Unit& dx, const Unit& dy, const Unit& width = 0, const Unit& height = 0);
|
||||||
|
|
||||||
|
public: static Contact* Create(Net* net, Layer* layer, const Unit& x, const Unit& y, const Unit& width = 0, const Unit& height = 0);
|
||||||
|
public: static Contact* Create(Component* anchor, Layer* layer, const Unit& dx, const Unit& dy, const Unit& width = 0, const Unit& height = 0);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Hooks GetHooks() const;
|
||||||
|
public: virtual Unit GetX() const;
|
||||||
|
public: virtual Unit GetY() const;
|
||||||
|
public: virtual Point GetPosition() const;
|
||||||
|
public: virtual Box GetBoundingBox() const;
|
||||||
|
public: virtual Layer* GetLayer() const {return _layer;};
|
||||||
|
public: virtual Box GetBoundingBox(BasicLayer* basicLayer) const;
|
||||||
|
public: Hook* GetAnchorHook() {return &_anchorHook;};
|
||||||
|
public: Component* GetAnchor() const;
|
||||||
|
public: const Unit& GetDx() const {return _dx;};
|
||||||
|
public: const Unit& GetDy() const {return _dy;};
|
||||||
|
public: const Unit& GetWidth() const {return _width;};
|
||||||
|
public: Unit GetHalfWidth() const {return (_width / 2);};
|
||||||
|
public: const Unit& GetHeight() const {return _height;};
|
||||||
|
public: Unit GetHalfHeight() const {return (_height / 2);};
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: virtual void Translate(const Unit& dx, const Unit& dy);
|
||||||
|
|
||||||
|
public: void SetLayer(Layer* layer);
|
||||||
|
public: void SetWidth(const Unit& width);
|
||||||
|
public: void SetHeight(const Unit& height);
|
||||||
|
public: void SetSizes(const Unit& width, const Unit& height);
|
||||||
|
public: void SetX(const Unit& x);
|
||||||
|
public: void SetY(const Unit& y);
|
||||||
|
public: void SetPosition(const Unit& x, const Unit& y);
|
||||||
|
public: void SetPosition(const Point& position);
|
||||||
|
public: void SetDx(const Unit& dx);
|
||||||
|
public: void SetDy(const Unit& dy);
|
||||||
|
public: void SetOffset(const Unit& dx, const Unit& dy);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
protected: virtual void _PreDelete();
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const {return _TName("Contact");};
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
|
||||||
|
public: Unit _GetSize() const;
|
||||||
|
public: Unit _GetSize(BasicLayer* basicLayer) const;
|
||||||
|
|
||||||
|
//public: virtual void _Draw(View* view, BasicLayer* basicLayer, const Box& updateArea, const Transformation& transformation);
|
||||||
|
//public: virtual void _Highlight(View* view, const Box& updateArea, const Transformation& transformation);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::Contact)
|
||||||
|
|
||||||
|
#endif // HURRICANE_CONTACT
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,62 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Contacts.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_CONTACTS
|
||||||
|
#define HURRICANE_CONTACTS
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Contact;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Contacts declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<Contact*> Contacts;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// ContactLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<Contact*> ContactLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// ContactFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<Contact*> ContactFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_contact declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_contact(contact, contacts)\
|
||||||
|
/******************************************/\
|
||||||
|
{\
|
||||||
|
ContactLocator _locator = contacts.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
Contact* contact = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_CONTACTS
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,162 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: DBo.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "DBo.h"
|
||||||
|
#include "Property.h"
|
||||||
|
#include "Quark.h"
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DBo implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
DBo::DBo()
|
||||||
|
// *******
|
||||||
|
: _propertySet()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
DBo::~DBo()
|
||||||
|
// ********
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void DBo::Delete()
|
||||||
|
// ***************
|
||||||
|
{
|
||||||
|
// trace << "entering DBo::Delete: " << this << endl;
|
||||||
|
// trace_in();
|
||||||
|
|
||||||
|
_PreDelete();
|
||||||
|
|
||||||
|
delete this;
|
||||||
|
|
||||||
|
// trace << "exiting DBo::Delete:" << endl;
|
||||||
|
// trace_out();
|
||||||
|
}
|
||||||
|
|
||||||
|
Property* DBo::GetProperty(const Name& name) const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
PropertySet::const_iterator iterator = _propertySet.begin();
|
||||||
|
while (iterator != _propertySet.end()) {
|
||||||
|
Property* property = *iterator;
|
||||||
|
if (property->GetName() == name) return property;
|
||||||
|
++iterator;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DBo::Put(Property* property)
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
if (!property)
|
||||||
|
throw Error("Can't put property : null property");
|
||||||
|
|
||||||
|
Property* oldProperty = GetProperty(property->GetName());
|
||||||
|
if (property != oldProperty) {
|
||||||
|
if (oldProperty) {
|
||||||
|
_propertySet.erase(oldProperty);
|
||||||
|
oldProperty->OnReleasedBy(this);
|
||||||
|
}
|
||||||
|
_propertySet.insert(property);
|
||||||
|
property->OnCapturedBy(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DBo::Remove(Property* property)
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
if (!property)
|
||||||
|
throw Error("Can't remove property : null property");
|
||||||
|
|
||||||
|
if (_propertySet.find(property) != _propertySet.end()) {
|
||||||
|
_propertySet.erase(property);
|
||||||
|
property->OnReleasedBy(this);
|
||||||
|
if (is_a<Quark*>(this) && _propertySet.empty()) Delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DBo::RemoveProperty(const Name& name)
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
Property* property = GetProperty(name);
|
||||||
|
if (property) {
|
||||||
|
_propertySet.erase(property);
|
||||||
|
property->OnReleasedBy(this);
|
||||||
|
if (is_a<Quark*>(this) && _propertySet.empty()) Delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DBo::ClearProperties()
|
||||||
|
// ************************
|
||||||
|
{
|
||||||
|
// trace << "entering DBo::ClearProperties: " << this << endl;
|
||||||
|
// trace_in();
|
||||||
|
|
||||||
|
while (!_propertySet.empty()) {
|
||||||
|
Property* property = *_propertySet.begin();
|
||||||
|
// trace << property << endl;
|
||||||
|
_propertySet.erase(property);
|
||||||
|
property->OnReleasedBy(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
// trace << "exiting DBo::ClearProperties:" << endl;
|
||||||
|
// trace_out();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DBo::_PostCreate()
|
||||||
|
// ********************
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void DBo::_PreDelete()
|
||||||
|
// *******************
|
||||||
|
{
|
||||||
|
// trace << "entering DBo::_PreDelete: " << this << endl;
|
||||||
|
// trace_in();
|
||||||
|
|
||||||
|
ClearProperties();
|
||||||
|
|
||||||
|
|
||||||
|
// trace << "exiting DBo::_PreDelete:" << endl;
|
||||||
|
// trace_out();
|
||||||
|
}
|
||||||
|
|
||||||
|
string DBo::_GetString() const
|
||||||
|
// ***************************
|
||||||
|
{
|
||||||
|
return "<" + _GetTypeName() + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* DBo::_GetRecord() const
|
||||||
|
// **********************
|
||||||
|
{
|
||||||
|
Record* record = new Record(GetString(this));
|
||||||
|
if (record) {
|
||||||
|
record->Add(GetSlot("Properties", &_propertySet));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DBo::_OnDeleted(Property* property)
|
||||||
|
// *************************************
|
||||||
|
{
|
||||||
|
if (property && (_propertySet.find(property) != _propertySet.end())) {
|
||||||
|
_propertySet.erase(property);
|
||||||
|
if (is_a<Quark*>(this) && _propertySet.empty()) Delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,107 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: DBo.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_DBO
|
||||||
|
#define HURRICANE_DBO
|
||||||
|
|
||||||
|
#include "DBos.h"
|
||||||
|
#include "Name.h"
|
||||||
|
#include "Property.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DBo declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class DBo : public NestedSlotAdapter {
|
||||||
|
// *********************************
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef set<Property*> PropertySet;
|
||||||
|
|
||||||
|
// Attributs
|
||||||
|
// *********
|
||||||
|
|
||||||
|
private: PropertySet _propertySet;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: DBo();
|
||||||
|
|
||||||
|
private: DBo(const DBo& dbo); // not implemented to forbid copy construction
|
||||||
|
|
||||||
|
// Destructors
|
||||||
|
// ***********
|
||||||
|
|
||||||
|
protected: virtual ~DBo();
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
private: DBo& operator=(const DBo& dbo); // not implemented to forbid assignment
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
protected: virtual void _PostCreate();
|
||||||
|
|
||||||
|
protected: virtual void _PreDelete();
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const = 0;
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
public: PropertySet& _GetPropertySet() {return _propertySet;};
|
||||||
|
|
||||||
|
public: void _OnDeleted(Property* property);
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Destructors
|
||||||
|
// ***********
|
||||||
|
|
||||||
|
public: virtual void Delete();
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: Property* GetProperty(const Name& name) const;
|
||||||
|
public: Properties GetProperties() const {return GetCollection(_propertySet);};
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: bool HasProperty() const {return !_propertySet.empty();};
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: void Put(Property* property);
|
||||||
|
public: void Remove(Property* property);
|
||||||
|
public: void RemoveProperty(const Name& name);
|
||||||
|
public: void ClearProperties();
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::DBo)
|
||||||
|
PointerIOStreamSupport(Hurricane::DBo)
|
||||||
|
|
||||||
|
#endif // HURRICANE_DBO
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,62 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: DBos.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_DBOS
|
||||||
|
#define HURRICANE_DBOS
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class DBo;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DBos declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<DBo*> DBos;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DBoLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<DBo*> DBoLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DBoFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<DBo*> DBoFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_dbo declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_dbo(dbo, dbos)\
|
||||||
|
/******************************/\
|
||||||
|
{\
|
||||||
|
DBoLocator _locator = dbos.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
DBo* dbo = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_DBOS
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,94 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: DRCError.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "DRCError.h"
|
||||||
|
#include "Cell.h"
|
||||||
|
#include "Slice.h"
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DRCError implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
DRCError::DRCError(Cell* cell, const Name& name, const Box& boundingBox)
|
||||||
|
// *********************************************************************
|
||||||
|
: Inherit(cell),
|
||||||
|
_name(name),
|
||||||
|
_boundingBox(boundingBox)
|
||||||
|
{
|
||||||
|
if (_name.IsEmpty())
|
||||||
|
throw Error("Can't create " + _TName("DRCError") + " : empty name");
|
||||||
|
|
||||||
|
if (_boundingBox.IsEmpty())
|
||||||
|
throw Error("Can't create " + _TName("DRCError") + " : empty bounding box");
|
||||||
|
}
|
||||||
|
|
||||||
|
DRCError* DRCError::Create(Cell* cell, const Name& name, const Box& boundingBox)
|
||||||
|
// *****************************************************************************
|
||||||
|
{
|
||||||
|
DRCError* drcError = new DRCError(cell, name, boundingBox);
|
||||||
|
|
||||||
|
drcError->_PostCreate();
|
||||||
|
|
||||||
|
return drcError;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DRCError::Translate(const Unit& dx, const Unit& dy)
|
||||||
|
// *****************************************************
|
||||||
|
{
|
||||||
|
if ((dx != 0) || (dy != 0)) {
|
||||||
|
Invalidate(false);
|
||||||
|
_boundingBox.Translate(dx, dy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string DRCError::_GetString() const
|
||||||
|
// ********************************
|
||||||
|
{
|
||||||
|
string s = Inherit::_GetString();
|
||||||
|
s.insert(s.length() - 1, " " + GetString(_name));
|
||||||
|
s.insert(s.length() - 1, " " + GetString(_boundingBox));
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* DRCError::_GetRecord() const
|
||||||
|
// ***************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
if (record) {
|
||||||
|
record->Add(GetSlot("Name", &_name));
|
||||||
|
record->Add(GetSlot("BoundingBox", &_boundingBox));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
//bool DRCError::_IsInterceptedBy(View* view, const Point& point, const Unit& aperture) const
|
||||||
|
//// ****************************************************************************************
|
||||||
|
//{
|
||||||
|
// return GetBoundingBox().Intersect(Box(point).Inflate(aperture));
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void DRCError::_Draw(View* view, BasicLayer* basicLayer, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// ****************************************************************************************************
|
||||||
|
//{
|
||||||
|
// assert(!basicLayer);
|
||||||
|
//
|
||||||
|
// view->DrawRectangle(transformation.GetBox(GetBoundingBox()));
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void DRCError::_Highlight(View* view, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// **********************************************************************************************
|
||||||
|
//{
|
||||||
|
// view->FillRectangle(transformation.GetBox(GetBoundingBox()));
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
|
@ -0,0 +1,72 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: DRCError.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_DRCERROR
|
||||||
|
#define HURRICANE_DRCERROR
|
||||||
|
|
||||||
|
#include "Marker.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DRCError declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class DRCError : public Marker {
|
||||||
|
// *****************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Marker Inherit;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: Name _name;
|
||||||
|
public: Box _boundingBox;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: DRCError(Cell* cell, const Name& name, const Box& boundingBox);
|
||||||
|
|
||||||
|
public: static DRCError* Create(Cell* cell, const Name& name, const Box& boundingBox);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Box GetBoundingBox() const {return _boundingBox;};
|
||||||
|
public: const Name& GetName() const {return _name;};
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: virtual void Translate(const Unit& dx, const Unit& dy);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const {return _TName("DRCError");};
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
|
||||||
|
// public: virtual bool _IsInterceptedBy(View* view, const Point& point, const Unit& aperture) const;
|
||||||
|
// public: virtual void _Draw(View* view, BasicLayer* basicLayer, const Box& updateArea, const Transformation& transformation);
|
||||||
|
// public: virtual void _Highlight(View* view, const Box& updateArea, const Transformation& transformation);
|
||||||
|
//
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_DRCERROR
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,102 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: DataBase.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "DataBase.h"
|
||||||
|
#include "Technology.h"
|
||||||
|
#include "Library.h"
|
||||||
|
#include "Cell.h"
|
||||||
|
#include "Timer.h"
|
||||||
|
#include "Error.h"
|
||||||
|
#include "UpdateSession.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DataBase implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
static DataBase* DATA_BASE = NULL;
|
||||||
|
|
||||||
|
DataBase::DataBase()
|
||||||
|
// *****************
|
||||||
|
: Inherit(),
|
||||||
|
_technology(NULL),
|
||||||
|
_rootLibrary(NULL)
|
||||||
|
{
|
||||||
|
if (DATA_BASE)
|
||||||
|
throw Error("Can't create " + _TName("DataBase") + " : already exists");
|
||||||
|
}
|
||||||
|
|
||||||
|
DataBase* DataBase::Create()
|
||||||
|
// *************************
|
||||||
|
{
|
||||||
|
DataBase* dataBase = new DataBase();
|
||||||
|
|
||||||
|
dataBase->_PostCreate();
|
||||||
|
|
||||||
|
return dataBase;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataBase::_PostCreate()
|
||||||
|
// *************************
|
||||||
|
{
|
||||||
|
Inherit::_PostCreate();
|
||||||
|
|
||||||
|
DATA_BASE = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataBase::_PreDelete()
|
||||||
|
// ************************
|
||||||
|
{
|
||||||
|
OpenUpdateSession();
|
||||||
|
Inherit::_PreDelete();
|
||||||
|
|
||||||
|
if (_rootLibrary) _rootLibrary->Delete();
|
||||||
|
if (_technology) _technology->Delete();
|
||||||
|
CloseUpdateSession ();
|
||||||
|
|
||||||
|
DATA_BASE = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
string DataBase::_GetString() const
|
||||||
|
// ********************************
|
||||||
|
{
|
||||||
|
return Inherit::_GetString();
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* DataBase::_GetRecord() const
|
||||||
|
// ***************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
if (record) {
|
||||||
|
record->Add(GetSlot("Technology", _technology));
|
||||||
|
record->Add(GetSlot("RootLibrary", _rootLibrary));
|
||||||
|
record->Add(GetSlot("Precision", GetPrecision()));
|
||||||
|
record->Add(GetSlot("Resolution", GetValueString(1)));
|
||||||
|
record->Add(GetSlot("GridStep", GetValueString(GetGridStep())));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
DataBase* GetDataBase()
|
||||||
|
// ********************
|
||||||
|
{
|
||||||
|
return DATA_BASE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,89 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: DataBase.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_DATA_BASE
|
||||||
|
#define HURRICANE_DATA_BASE
|
||||||
|
|
||||||
|
#include "DBo.h"
|
||||||
|
#include "Unit.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Library;
|
||||||
|
class Technology;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DataBase declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class DataBase : public DBo {
|
||||||
|
// ************************
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef DBo Inherit;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Technology* _technology;
|
||||||
|
private: Library* _rootLibrary;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: DataBase();
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
protected: virtual void _PostCreate();
|
||||||
|
|
||||||
|
protected: virtual void _PreDelete();
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const {return _TName("DataBase");};
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
|
||||||
|
public: void _SetTechnology(Technology* technology) {_technology = technology;};
|
||||||
|
public: void _SetRootLibrary(Library* rootLibrary) {_rootLibrary = rootLibrary;};
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
public: static DataBase* Create();
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: Technology* GetTechnology() const {return _technology;};
|
||||||
|
public: Library* GetRootLibrary() const {return _rootLibrary;};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
DataBase* GetDataBase();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::DataBase)
|
||||||
|
|
||||||
|
#endif // HURRICANE_DATA_BASE
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,175 @@
|
||||||
|
|
||||||
|
|
||||||
|
// -*- 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.3 2007/06/27 21:13:25 jpc 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
|
@ -0,0 +1,108 @@
|
||||||
|
|
||||||
|
|
||||||
|
// -*- 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.h,v 1.3 2007/06/27 21:13:25 jpc 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.h" |
|
||||||
|
// | *************************************************************** |
|
||||||
|
// | U p d a t e s |
|
||||||
|
// | |
|
||||||
|
// x-----------------------------------------------------------------x
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ifndef __HURRICANE_DEEPNET__
|
||||||
|
# define __HURRICANE_DEEPNET__
|
||||||
|
|
||||||
|
# include "Net.h"
|
||||||
|
# include "HyperNet.h"
|
||||||
|
# include "Occurrence.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
class DeepNet : public Net {
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
|
||||||
|
// Attributes.
|
||||||
|
protected:
|
||||||
|
Occurrence _netOccurrence;
|
||||||
|
|
||||||
|
// Constructors.
|
||||||
|
protected:
|
||||||
|
DeepNet ( Occurrence& netOccurrence );
|
||||||
|
|
||||||
|
// Inspector Management.
|
||||||
|
public:
|
||||||
|
virtual Record* _GetRecord () const;
|
||||||
|
virtual string _GetTypeName() const { return "DeepNet"; };
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Constructors.
|
||||||
|
public:
|
||||||
|
static DeepNet* Create ( HyperNet& hyperNet );
|
||||||
|
|
||||||
|
// Accessors.
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Predicates.
|
||||||
|
public:
|
||||||
|
virtual bool IsDeepNet () const { return true; };
|
||||||
|
|
||||||
|
// Internal Modifiers.
|
||||||
|
public:
|
||||||
|
size_t _CreateRoutingPads ( bool buildRings=false );
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# endif
|
|
@ -0,0 +1,199 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
//
|
||||||
|
// This file is part of the Tsunami Project.
|
||||||
|
// Copyright (c) 2001-2004 Laboratoire LIP6 - Departement ASIM
|
||||||
|
// Universite Pierre et Marie Curie.
|
||||||
|
//
|
||||||
|
// File: DisplaySlot.cpp
|
||||||
|
// Author: C. Alexandre
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Error.h"
|
||||||
|
#include "UserGo.h"
|
||||||
|
#include "Relation.h"
|
||||||
|
#include "Cell.h"
|
||||||
|
#include "UpdateSession.h"
|
||||||
|
|
||||||
|
#include "DisplaySlot.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
static Name DisplaySlotsCellRelationName("DisplaySlotsCellRelation");
|
||||||
|
|
||||||
|
static StandardRelation* GetDisplaySlotRelation(const Cell* cell)
|
||||||
|
{
|
||||||
|
Property* property = cell->GetProperty(DisplaySlotsCellRelationName);
|
||||||
|
if (!property)
|
||||||
|
return NULL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
StandardRelation* relation = dynamic_cast<StandardRelation*>(property);
|
||||||
|
if (!relation)
|
||||||
|
throw Error("Bad Property type: Must be a Standard Relation");
|
||||||
|
return relation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DisplaySlot implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
DisplaySlot::DisplaySlot(Cell* cell,const Name& name, unsigned short red1, unsigned short green1, unsigned short blue1, const string& pattern1, unsigned linewidth1, unsigned short red2, unsigned short green2, unsigned short blue2, const string& pattern2, unsigned linewidth2)
|
||||||
|
// ***********************
|
||||||
|
: Inherit()
|
||||||
|
, _cell(cell)
|
||||||
|
, _name(name)
|
||||||
|
, _quadTree()
|
||||||
|
//, _drawGC(NULL)
|
||||||
|
//, _fillGC(NULL)
|
||||||
|
, _isVisible(true)
|
||||||
|
{
|
||||||
|
//_drawGC = gtk_gc_new(red1, green1, blue1, pattern1, linewidth1);
|
||||||
|
//_fillGC = gtk_gc_new(red2, green2, blue2, pattern2, linewidth2);
|
||||||
|
}
|
||||||
|
|
||||||
|
DisplaySlot* DisplaySlot::Create(Cell* cell, const Name& name, unsigned short red1, unsigned short green1, unsigned short blue1, const string& pattern1, unsigned linewidth1, unsigned short red2, unsigned short green2, unsigned short blue2, const string& pattern2, unsigned linewidth2)
|
||||||
|
// ******************************************
|
||||||
|
{
|
||||||
|
DisplaySlot* displaySlot = new DisplaySlot(cell, name, red1, green1, blue1, pattern1, linewidth1, red2, green2, blue2, pattern2, linewidth2);
|
||||||
|
|
||||||
|
displaySlot->_PostCreate();
|
||||||
|
|
||||||
|
return displaySlot;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplaySlot::_PostCreate()
|
||||||
|
// ***********************
|
||||||
|
{
|
||||||
|
Inherit::_PostCreate();
|
||||||
|
StandardRelation* relation = GetDisplaySlotRelation(_cell);
|
||||||
|
if (!relation)
|
||||||
|
relation = StandardRelation::Create(_cell, DisplaySlotsCellRelationName);
|
||||||
|
Put(relation);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplaySlot::Show()
|
||||||
|
// *********************
|
||||||
|
{
|
||||||
|
if (!_isVisible) {
|
||||||
|
_isVisible = true;
|
||||||
|
//for_each_view(view, _cell->GetViews())
|
||||||
|
//{
|
||||||
|
// view->Invalidate();
|
||||||
|
// end_for;
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplaySlot::Hide()
|
||||||
|
// *********************
|
||||||
|
{
|
||||||
|
if (_isVisible) {
|
||||||
|
_isVisible = false;
|
||||||
|
//for_each_view(view, _cell->GetViews())
|
||||||
|
//{
|
||||||
|
// view->Invalidate();
|
||||||
|
// end_for;
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void DisplaySlot::Flush()
|
||||||
|
// **********************
|
||||||
|
{
|
||||||
|
OpenUpdateSession();
|
||||||
|
vector<Go*> govect;
|
||||||
|
_quadTree.GetGos().Fill(govect);
|
||||||
|
for (unsigned i = 0 ; i < govect.size() ; i++)
|
||||||
|
{
|
||||||
|
govect[i]->Delete();
|
||||||
|
}
|
||||||
|
CloseUpdateSession();
|
||||||
|
}
|
||||||
|
|
||||||
|
//void DisplaySlot::_Draw(View* view, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// *********************************************************************************************
|
||||||
|
//{
|
||||||
|
// if (GetBoundingBox().Intersect(updateArea)) {
|
||||||
|
// for_each_go(go, _quadTree.GetGos())
|
||||||
|
// {
|
||||||
|
// go->_Draw(view, NULL, updateArea, transformation);
|
||||||
|
// end_for;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
void DisplaySlot::_PreDelete()
|
||||||
|
// ***************************
|
||||||
|
{
|
||||||
|
Inherit::_PreDelete();
|
||||||
|
//gdk_gc_destroy(_drawGC);
|
||||||
|
//gdk_gc_destroy(_fillGC);
|
||||||
|
}
|
||||||
|
|
||||||
|
UserGos DisplaySlot::GetUserGos() const
|
||||||
|
// ************************************
|
||||||
|
{
|
||||||
|
return _quadTree.GetGos().GetSubSet<UserGo*>();
|
||||||
|
}
|
||||||
|
|
||||||
|
UserGos DisplaySlot::GetUserGosUnder(const Box& area) const
|
||||||
|
// ********************************************************
|
||||||
|
{
|
||||||
|
return _quadTree.GetGosUnder(area).GetSubSet<UserGo*>();
|
||||||
|
}
|
||||||
|
|
||||||
|
string DisplaySlot::_GetString() const
|
||||||
|
// ***********************************
|
||||||
|
{
|
||||||
|
string s = Inherit::_GetString();
|
||||||
|
s.insert(s.length() - 1, " " + GetString(GetName()));
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* DisplaySlot::_GetRecord() const
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
if (record) {
|
||||||
|
record->Add(GetSlot("Cell", _cell));
|
||||||
|
record->Add(GetSlot("Name", _name));
|
||||||
|
record->Add(GetSlot("QuadTree", &_quadTree));
|
||||||
|
record->Add(GetSlot("Is Visible", _isVisible));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
DisplaySlots GetDisplaySlots(const Cell* cell)
|
||||||
|
{
|
||||||
|
if (!cell)
|
||||||
|
throw Error("Null pointer on cell while getting display slots");
|
||||||
|
|
||||||
|
StandardRelation* relation = GetDisplaySlotRelation(cell);
|
||||||
|
if (!relation)
|
||||||
|
return DisplaySlots();
|
||||||
|
return relation->GetSlaveOwners().GetSubSet<DisplaySlot*>();
|
||||||
|
}
|
||||||
|
|
||||||
|
DisplaySlot* GetDisplaySlot(const Cell* cell,const Name& name)
|
||||||
|
{
|
||||||
|
if (!cell)
|
||||||
|
throw Error("Null pointer on cell while getting display slots");
|
||||||
|
|
||||||
|
StandardRelation* relation = GetDisplaySlotRelation(cell);
|
||||||
|
if (!relation)
|
||||||
|
return NULL;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for_each_display_slot(displaySlot,relation->GetSlaveOwners().GetSubSet<DisplaySlot*>())
|
||||||
|
{
|
||||||
|
if (displaySlot->GetName() == name)
|
||||||
|
return displaySlot;
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
|
@ -0,0 +1,94 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
//
|
||||||
|
// This file is part of the Tsunami Project.
|
||||||
|
// Copyright (c) 2001-2004 Laboratoire LIP6 - Departement ASIM
|
||||||
|
// Universite Pierre et Marie Curie.
|
||||||
|
//
|
||||||
|
// File: DisplaySlot.h
|
||||||
|
// Author: C. Alexandre
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_DISPLAY_SLOT
|
||||||
|
#define HURRICANE_DISPLAY_SLOT
|
||||||
|
|
||||||
|
#include "QuadTree.h"
|
||||||
|
#include "UserGos.h"
|
||||||
|
#include "DisplaySlots.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DisplaySlot declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class DisplaySlot : public DBo {
|
||||||
|
// ***************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef DBo Inherit;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
private: Cell* _cell;
|
||||||
|
private: Name _name;
|
||||||
|
private: QuadTree _quadTree;
|
||||||
|
//private: GdkGC* _drawGC;
|
||||||
|
//private: GdkGC* _fillGC;
|
||||||
|
private: bool _isVisible;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: DisplaySlot(Cell* cell,const Name& name, unsigned short red1, unsigned short green1, unsigned short blue1, const string& pattern1, unsigned linewidth1, unsigned short red2, unsigned short green2, unsigned short blue2, const string& pattern2, unsigned linewidth2);
|
||||||
|
public: static DisplaySlot* Create(Cell* cell, const Name& name, unsigned short red1, unsigned short green1, unsigned short blue1, const string& pattern1 = "FFFFFFFFFFFFFFFF", unsigned linewidth1=0, unsigned short red2 = 0, unsigned short green2 = 0, unsigned short blue2 = 0, const string& pattern2 = "FFFFFFFFFFFFFFFF", unsigned linewidth2=0);
|
||||||
|
protected: virtual void _PostCreate();
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
// **********
|
||||||
|
|
||||||
|
protected: virtual void _PreDelete();
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: const Name& GetName() const {return _name;};
|
||||||
|
public: const Box& GetBoundingBox() const {return _quadTree.GetBoundingBox();};
|
||||||
|
public: UserGos GetUserGos() const;
|
||||||
|
public: UserGos GetUserGosUnder(const Box& area) const;
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: bool IsVisible() const {return _isVisible;};
|
||||||
|
public: void Show();
|
||||||
|
public: void Hide();
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
public: void Flush();
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
//public: GdkGC* _GetDrawGC() const { return _drawGC; }
|
||||||
|
//public: GdkGC* _GetFillGC() const { return _fillGC; }
|
||||||
|
public: QuadTree& _GetQuadTree() { return _quadTree; }
|
||||||
|
//public: virtual void _Draw(View* view, const Box& updateArea, const Transformation& transformation);
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const {return _TName("DisplaySlot");};
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
DisplaySlots GetDisplaySlots(const Cell* cell);
|
||||||
|
|
||||||
|
DisplaySlot* GetDisplaySlot(const Cell* cell, const Name& name);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_DISPLAY_SLOT
|
|
@ -0,0 +1,62 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
//
|
||||||
|
// This file is part of the Tsunami Project.
|
||||||
|
// Copyright (c) 2001-2004 Laboratoire LIP6 - Departement ASIM
|
||||||
|
// Universite Pierre et Marie Curie.
|
||||||
|
//
|
||||||
|
// File: DisplaySlots.h
|
||||||
|
// Author: C. Alexandre
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_DISPLAY_SLOTS
|
||||||
|
#define HURRICANE_DISPLAY_SLOTS
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class DisplaySlot;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DisplaySlots declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<DisplaySlot*> DisplaySlots;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DisplaySlotLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<DisplaySlot*> DisplaySlotLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// DisplaySlotFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<DisplaySlot*> DisplaySlotFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_view declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_display_slot(displaySlot, displaySlots)\
|
||||||
|
/******************************************************/\
|
||||||
|
{\
|
||||||
|
DisplaySlotLocator _locator = displaySlots.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
DisplaySlot* displaySlot = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_DISPLAY_SLOTS
|
|
@ -0,0 +1,62 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Entities.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_ENTITIES
|
||||||
|
#define HURRICANE_ENTITIES
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Entity;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Entities declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<Entity*> Entities;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// EntityLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<Entity*> EntityLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// EntityFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<Entity*> EntityFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_entity declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_entity(entity, entities)\
|
||||||
|
/****************************************/\
|
||||||
|
{\
|
||||||
|
EntityLocator _locator = entities.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
Entity* entity = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_ENTITIES
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,96 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Entity.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Entity.h"
|
||||||
|
#include "Quark.h"
|
||||||
|
#include "Cell.h"
|
||||||
|
#include "Instance.h"
|
||||||
|
#include "SharedPath.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Entity implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Entity::Entity()
|
||||||
|
// *************
|
||||||
|
: Inherit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Entity::_PreDelete()
|
||||||
|
// **********************
|
||||||
|
{
|
||||||
|
// trace << "entering Entity::_PreDelete: " << this << endl;
|
||||||
|
// trace_in();
|
||||||
|
|
||||||
|
vector<Entity*> slaveEntities;
|
||||||
|
SlaveEntityMap::iterator it;
|
||||||
|
SlaveEntityMap::iterator end;
|
||||||
|
GetCell()->_GetSlaveEntities(this,it,end);
|
||||||
|
for(; it != end ; it++)
|
||||||
|
slaveEntities.push_back(it->second);
|
||||||
|
for(; slaveEntities.size() ; slaveEntities.pop_back()) {
|
||||||
|
cerr << "Erasing " << slaveEntities.back() << endl;
|
||||||
|
slaveEntities.back()->Delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
Quark* quark = _GetQuark();
|
||||||
|
if (quark) quark->Delete();
|
||||||
|
|
||||||
|
stack<SharedPath*> sharedPathStack;
|
||||||
|
for_each_instance(instance, GetCell()->GetSlaveInstances()) {
|
||||||
|
SharedPath* sharedPath = instance->_GetSharedPath(NULL);
|
||||||
|
if (sharedPath) sharedPathStack.push(sharedPath);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
while (!sharedPathStack.empty()) {
|
||||||
|
SharedPath* sharedPath = sharedPathStack.top();
|
||||||
|
sharedPathStack.pop();
|
||||||
|
Quark* quark = _GetQuark(sharedPath);
|
||||||
|
if (quark) quark->Delete();
|
||||||
|
Cell* cell = sharedPath->GetOwnerCell();
|
||||||
|
for_each_instance(instance, cell->GetSlaveInstances()) {
|
||||||
|
SharedPath* sharedPath2 = instance->_GetSharedPath(sharedPath);
|
||||||
|
if (sharedPath2) sharedPathStack.push(sharedPath2);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Inherit::_PreDelete();
|
||||||
|
|
||||||
|
// trace << "exiting Entity::_PreDelete:" << endl;
|
||||||
|
// trace_out();
|
||||||
|
}
|
||||||
|
|
||||||
|
string Entity::_GetString() const
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
return Inherit::_GetString();
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* Entity::_GetRecord() const
|
||||||
|
// *************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
if (record) {
|
||||||
|
Occurrence occurrence = Occurrence(this);
|
||||||
|
if (occurrence.HasProperty())
|
||||||
|
record->Add(GetSlot("Occurrence", occurrence));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,70 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Entity.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_ENTITY
|
||||||
|
#define HURRICANE_ENTITY
|
||||||
|
|
||||||
|
#include "DBo.h"
|
||||||
|
#include "Entities.h"
|
||||||
|
#include "Box.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Cell;
|
||||||
|
class Quark;
|
||||||
|
class SharedPath;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Entity declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Entity : public DBo {
|
||||||
|
// **********************
|
||||||
|
|
||||||
|
# if !defined(__DOXYGEN_PROCESSOR__)
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef DBo Inherit;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: Entity();
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
protected: virtual void _PreDelete();
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
public: Quark* _GetQuark(SharedPath* sharedPath = NULL) const;
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Cell* GetCell() const = 0;
|
||||||
|
public: virtual Box GetBoundingBox() const = 0;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::Entity)
|
||||||
|
|
||||||
|
#endif // HURRICANE_ENTITY
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,56 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Error.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Error implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Error::Error(const string& reason, int code)
|
||||||
|
// *****************************************
|
||||||
|
: Inherit(),
|
||||||
|
_reason(reason),
|
||||||
|
_code(code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Error::Error(const Error& error)
|
||||||
|
// *****************************
|
||||||
|
: Inherit(),
|
||||||
|
_reason(error._reason),
|
||||||
|
_code(error._code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Error& Error::operator=(const Error& error)
|
||||||
|
// ****************************************
|
||||||
|
{
|
||||||
|
_reason = error._reason;
|
||||||
|
_code = error._code;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
string Error::_GetString() const
|
||||||
|
// *****************************
|
||||||
|
{
|
||||||
|
if (!_code) return "[ERROR] " + _reason;
|
||||||
|
|
||||||
|
return "[ERROR:" + GetString(_code) + "] " + _reason;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,75 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Error.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_ERROR
|
||||||
|
#define HURRICANE_ERROR
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Error declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Error : public Exception {
|
||||||
|
// ***************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Exception Inherit;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: string _reason;
|
||||||
|
private: int _code;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: Error(const string& reason, int code = 0);
|
||||||
|
|
||||||
|
public: Error(const Error& error);
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: Error& operator=(const Error& error);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: string GetReason() const {return _reason;};
|
||||||
|
public: int GetCode() const {return _code;};
|
||||||
|
|
||||||
|
// Modifiers
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: void SetReason ( const string& reason ) { _reason = reason; };
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const { return _TName("Error"); };
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::Error)
|
||||||
|
|
||||||
|
#endif // HURRICANE_ERROR
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,39 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Exception.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Exception implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Exception::Exception()
|
||||||
|
// *******************
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Exception::~Exception()
|
||||||
|
// ********************
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,63 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Exception.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_EXCEPTION
|
||||||
|
#define HURRICANE_EXCEPTION
|
||||||
|
|
||||||
|
#include "Commons.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Exception declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Exception : public NestedSlotAdapter {
|
||||||
|
// ***************************************
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: Exception();
|
||||||
|
|
||||||
|
private: Exception(const Exception& exception); // not implemented to forbid copy construction
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: virtual ~Exception();
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
private: Exception& operator=(const Exception& exception); // not implemented to forbid assignment
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: string What() const { return _GetString(); };
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetString() const = 0;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::Exception)
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HURRICANE_EXCEPTION
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,304 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Filter.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_FILTER
|
||||||
|
#define HURRICANE_FILTER
|
||||||
|
|
||||||
|
#include "Commons.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
template<class Type> class GenericFilter;
|
||||||
|
template<class Type> class NotFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Filter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
template<class Type> class Filter : public NestedSlotAdapter {
|
||||||
|
// *********************************************************
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: Filter() {};
|
||||||
|
|
||||||
|
private: Filter(const Filter& filter); // not implemented to forbid copie
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: virtual ~Filter() {};
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
private: Filter& operator=(const Filter& filter); // not implemented to forbid assigment
|
||||||
|
|
||||||
|
public: GenericFilter<Type> operator!() const
|
||||||
|
// ******************************************
|
||||||
|
{
|
||||||
|
return NotFilter<Type>(*this);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Filter<Type>* GetClone() const = 0;
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: virtual bool Accept(Type type) const = 0;
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const { return _TName("Filter"); };
|
||||||
|
public: virtual string _GetString() const = 0;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// GenericFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
template<class Type> class GenericFilter : public Filter<Type> {
|
||||||
|
// ***********************************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Filter<Type> Inherit;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Filter<Type>* _filter;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: GenericFilter()
|
||||||
|
// ********************
|
||||||
|
: Inherit(),
|
||||||
|
_filter(NULL)
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
public: GenericFilter(const Filter<Type>& filter)
|
||||||
|
// **********************************************
|
||||||
|
: Inherit(),
|
||||||
|
_filter(filter.GetClone())
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
public: GenericFilter(const GenericFilter<Type>& genericFilter)
|
||||||
|
// ************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_filter(genericFilter.GetClone())
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
public: GenericFilter(Filter<Type>* filter)
|
||||||
|
// *****************************************************
|
||||||
|
// CAUTION : filter will be deleted by the GenericFilter
|
||||||
|
// *****************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_filter(filter)
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: virtual ~GenericFilter()
|
||||||
|
// *****************************
|
||||||
|
{
|
||||||
|
if (_filter) delete _filter;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: GenericFilter& operator=(const Filter<Type>& filter)
|
||||||
|
// *********************************************************
|
||||||
|
{
|
||||||
|
if (_filter) delete _filter;
|
||||||
|
_filter = filter.GetClone();
|
||||||
|
return *this;
|
||||||
|
};
|
||||||
|
|
||||||
|
public: GenericFilter& operator=(const GenericFilter& genericFilter)
|
||||||
|
// *****************************************************************
|
||||||
|
{
|
||||||
|
if (_filter) delete _filter;
|
||||||
|
_filter = genericFilter.GetClone();
|
||||||
|
return *this;
|
||||||
|
};
|
||||||
|
|
||||||
|
public: GenericFilter& operator=(Filter<Type>* filter)
|
||||||
|
// *****************************************************
|
||||||
|
// CAUTION : filter will be deleted by the GenericFilter
|
||||||
|
// *****************************************************
|
||||||
|
{
|
||||||
|
if (_filter) delete _filter;
|
||||||
|
_filter = filter;
|
||||||
|
return *this;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Filter<Type>* GetClone() const
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
return (_filter) ? _filter->GetClone() : NULL;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: virtual bool Accept(Type type) const
|
||||||
|
// *****************************************
|
||||||
|
{
|
||||||
|
return (_filter) ? _filter->Accept(type) : false;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
return _TName("GenericFilter");
|
||||||
|
}
|
||||||
|
|
||||||
|
public: virtual string _GetString() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
if (!_filter)
|
||||||
|
return "<" + _GetTypeName() + " unbound>";
|
||||||
|
else
|
||||||
|
return "<" + _GetTypeName() + " " + GetString(_filter) + ">";
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// NotFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
template<class Type> class NotFilter : public Filter<Type> {
|
||||||
|
// *******************************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Filter<Type> Inherit;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: GenericFilter<Type> _genericFilter;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: NotFilter()
|
||||||
|
// ****************
|
||||||
|
: Inherit(),
|
||||||
|
_genericFilter()
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
public: NotFilter(const Filter<Type>& filter)
|
||||||
|
// ******************************************
|
||||||
|
: Inherit(),
|
||||||
|
_genericFilter(filter)
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
public: NotFilter(const NotFilter<Type>& notFilter)
|
||||||
|
// ************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_genericFilter(notFilter._genericFilter)
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: NotFilter& operator=(const NotFilter<Type>& notFilter)
|
||||||
|
// ***********************************************************
|
||||||
|
{
|
||||||
|
_genericFilter = notFilter._genericFilter;
|
||||||
|
return *this;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Filter<Type>* GetClone() const
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
return new NotFilter(*this);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: virtual bool Accept(Type type) const
|
||||||
|
// *****************************************
|
||||||
|
{
|
||||||
|
return !_genericFilter.Accept(type);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
return _TName("GenericNotFilter");
|
||||||
|
}
|
||||||
|
|
||||||
|
public: virtual string _GetString() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
return "<" + _GetTypeName() + " " + GetString(_genericFilter) + ">";
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class IsNestedSlotAdapter<const Hurricane::GenericFilter<T> > {
|
||||||
|
public:
|
||||||
|
enum { True=1, False=0 };
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HURRICANE_FILTER
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,90 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Go.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Go.h"
|
||||||
|
#include "QuadTree.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Go implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
static bool AUTO_MATERIALIZATION_IS_ENABLED = true;
|
||||||
|
|
||||||
|
Go::Go()
|
||||||
|
// *****
|
||||||
|
: Inherit(),
|
||||||
|
_quadTree(NULL),
|
||||||
|
_nextOfQuadTreeGoSet(NULL)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Go::AutoMaterializationIsDisabled()
|
||||||
|
// *************************************
|
||||||
|
{
|
||||||
|
return !AUTO_MATERIALIZATION_IS_ENABLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Go::EnableAutoMaterialization()
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
AUTO_MATERIALIZATION_IS_ENABLED = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Go::DisableAutoMaterialization()
|
||||||
|
// **********************************
|
||||||
|
{
|
||||||
|
AUTO_MATERIALIZATION_IS_ENABLED = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Go::_PostCreate()
|
||||||
|
// *******************
|
||||||
|
{
|
||||||
|
Inherit::_PostCreate();
|
||||||
|
|
||||||
|
if (!AutoMaterializationIsDisabled()) Materialize(); // materialized after entire post creation
|
||||||
|
}
|
||||||
|
|
||||||
|
void Go::_PreDelete()
|
||||||
|
// ******************
|
||||||
|
{
|
||||||
|
// trace << "entering Go::_PreDelete: " << this << endl;
|
||||||
|
// trace_in();
|
||||||
|
|
||||||
|
Unmaterialize(); // unmaterialized before starting pre destruction
|
||||||
|
|
||||||
|
Inherit::_PreDelete();
|
||||||
|
|
||||||
|
// trace << "exiting Go::_PreDelete:" << endl;
|
||||||
|
// trace_out();
|
||||||
|
}
|
||||||
|
|
||||||
|
string Go::_GetString() const
|
||||||
|
// **************************
|
||||||
|
{
|
||||||
|
return Inherit::_GetString();
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* Go::_GetRecord() const
|
||||||
|
// *********************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
if (record) {
|
||||||
|
record->Add(GetSlot("QuadTree", _quadTree));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,100 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Go.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_GO
|
||||||
|
#define HURRICANE_GO
|
||||||
|
|
||||||
|
#include "Entity.h"
|
||||||
|
#include "Gos.h"
|
||||||
|
#include "Transformation.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
//class View;
|
||||||
|
class BasicLayer;
|
||||||
|
class QuadTree;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Go declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Go : public Entity {
|
||||||
|
// *********************
|
||||||
|
|
||||||
|
// Friends
|
||||||
|
// *******
|
||||||
|
|
||||||
|
friend class QuadTree;
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Entity Inherit;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: QuadTree* _quadTree;
|
||||||
|
private: Go* _nextOfQuadTreeGoSet;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: Go();
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: static bool AutoMaterializationIsDisabled();
|
||||||
|
|
||||||
|
public: bool IsMaterialized() const {return (_quadTree != NULL);};
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: static void EnableAutoMaterialization();
|
||||||
|
public: static void DisableAutoMaterialization();
|
||||||
|
|
||||||
|
public: virtual void Materialize() = 0;
|
||||||
|
public: virtual void Unmaterialize() = 0;
|
||||||
|
|
||||||
|
public: virtual void Invalidate(bool propagateFlag = true);
|
||||||
|
// implementation located on file UpdateSession.cpp to access local variables
|
||||||
|
|
||||||
|
public: virtual void Translate(const Unit& dx, const Unit& dy) = 0;
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
protected: virtual void _PostCreate();
|
||||||
|
|
||||||
|
protected: virtual void _PreDelete();
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
public: Go* _GetNextOfQuadTreeGoSet() const {return _nextOfQuadTreeGoSet;};
|
||||||
|
|
||||||
|
public: void _SetNextOfQuadTreeGoSet(Go* go) {_nextOfQuadTreeGoSet = go;};
|
||||||
|
|
||||||
|
//public: virtual bool _IsInterceptedBy(View* view, const Point& point, const Unit& aperture) const = 0;
|
||||||
|
//public: virtual void _Draw(View* view, BasicLayer* basicLayer, const Box& updateArea, const Transformation& transformation) = 0;
|
||||||
|
//public: virtual void _Highlight(View* view, const Box& updateArea, const Transformation& transformation) = 0;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::Go)
|
||||||
|
|
||||||
|
#endif // HURRICANE_GO
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,62 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Gos.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_GOS
|
||||||
|
#define HURRICANE_GOS
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Go;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Gos declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<Go*> Gos;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// GoLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<Go*> GoLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// GoFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<Go*> GoFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_go declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_go(go, gos)\
|
||||||
|
/***************************/\
|
||||||
|
{\
|
||||||
|
GoLocator _locator = gos.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
Go* go = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_GOS
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,618 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Hook.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Hook.h"
|
||||||
|
#include "Component.h"
|
||||||
|
#include "Rubber.h"
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Filters declaration & implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Hook_IsMasterFilter : public Filter<Hook*> {
|
||||||
|
// *********************************************
|
||||||
|
|
||||||
|
public: Hook_IsMasterFilter() {};
|
||||||
|
|
||||||
|
public: Hook_IsMasterFilter(const Hook_IsMasterFilter& filter) {};
|
||||||
|
|
||||||
|
public: Hook_IsMasterFilter& operator=(const Hook_IsMasterFilter& filter) {return *this;};
|
||||||
|
|
||||||
|
public: virtual Filter<Hook*>* GetClone() const {return new Hook_IsMasterFilter(*this);};
|
||||||
|
|
||||||
|
public: virtual bool Accept(Hook* hook) const {return hook->IsMaster();};
|
||||||
|
|
||||||
|
public: virtual string _GetString() const {return "<" + _TName("Hook::IsMasterFilter>");};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Hook_Hooks implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Hook_Hooks : public Collection<Hook*> {
|
||||||
|
// ****************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Collection<Hook*> Inherit;
|
||||||
|
|
||||||
|
public: class Locator : public Hurricane::Locator<Hook*> {
|
||||||
|
// *****************************************************
|
||||||
|
|
||||||
|
public: typedef Hurricane::Locator<Hook*> Inherit;
|
||||||
|
|
||||||
|
private: const Hook* _hook;
|
||||||
|
private: Hook* _currentHook;
|
||||||
|
|
||||||
|
public: Locator(const Hook* hook = NULL);
|
||||||
|
public: Locator(const Locator& locator);
|
||||||
|
|
||||||
|
public: Locator& operator=(const Locator& locator);
|
||||||
|
|
||||||
|
public: virtual Hook* GetElement() const;
|
||||||
|
public: virtual Hurricane::Locator<Hook*>* GetClone() const;
|
||||||
|
|
||||||
|
public: virtual bool IsValid() const;
|
||||||
|
|
||||||
|
public: virtual void Progress();
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: const Hook* _hook;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: Hook_Hooks(const Hook* hook = NULL);
|
||||||
|
public: Hook_Hooks(const Hook_Hooks& hooks);
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: Hook_Hooks& operator=(const Hook_Hooks& hooks);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Collection<Hook*>* GetClone() const;
|
||||||
|
public: virtual Hurricane::Locator<Hook*>* GetLocator() const;
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Hook_SlaveHooks implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Hook_SlaveHooks : public Collection<Hook*> {
|
||||||
|
// *********************************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Collection<Hook*> Inherit;
|
||||||
|
|
||||||
|
public: class Locator : public Hurricane::Locator<Hook*> {
|
||||||
|
// *****************************************************
|
||||||
|
|
||||||
|
public: typedef Hurricane::Locator<Hook*> Inherit;
|
||||||
|
|
||||||
|
private: const Hook* _hook;
|
||||||
|
private: Hook* _currentHook;
|
||||||
|
|
||||||
|
public: Locator(const Hook* hook = NULL);
|
||||||
|
public: Locator(const Locator& locator);
|
||||||
|
|
||||||
|
public: Locator& operator=(const Locator& locator);
|
||||||
|
|
||||||
|
public: virtual Hook* GetElement() const;
|
||||||
|
public: virtual Hurricane::Locator<Hook*>* GetClone() const;
|
||||||
|
|
||||||
|
public: virtual bool IsValid() const;
|
||||||
|
|
||||||
|
public: virtual void Progress();
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: const Hook* _hook;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: Hook_SlaveHooks(const Hook* hook = NULL);
|
||||||
|
public: Hook_SlaveHooks(const Hook_SlaveHooks& hooks);
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: Hook_SlaveHooks& operator=(const Hook_SlaveHooks& hooks);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Collection<Hook*>* GetClone() const;
|
||||||
|
public: virtual Hurricane::Locator<Hook*>* GetLocator() const;
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Hook implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Hook::Hook()
|
||||||
|
// *********
|
||||||
|
: _nextHook(this)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook::~Hook()
|
||||||
|
// **********
|
||||||
|
{
|
||||||
|
if (_nextHook != this)
|
||||||
|
throw Error("Abnormal deletion of hook : always attached");
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook* Hook::GetNextHook() const
|
||||||
|
// ****************************
|
||||||
|
{
|
||||||
|
return _nextHook;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook* Hook::GetPreviousHook() const
|
||||||
|
// ********************************
|
||||||
|
{
|
||||||
|
Hook* hook = (Hook*)this;
|
||||||
|
while (hook->_nextHook != this) hook = hook->_nextHook;
|
||||||
|
return hook;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook* Hook::GetMasterHook() const
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
Hook* hook = (Hook*)this;
|
||||||
|
do {
|
||||||
|
if (hook->IsMaster()) return hook;
|
||||||
|
hook = hook->_nextHook;
|
||||||
|
} while (hook != this);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook* Hook::GetNextMasterHook() const
|
||||||
|
// **********************************
|
||||||
|
{
|
||||||
|
return _nextHook->GetMasterHook();
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook* Hook::GetPreviousMasterHook() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
Hook* previousMasterHook = NULL;
|
||||||
|
Hook* hook = (Hook*)this;
|
||||||
|
do {
|
||||||
|
if (hook->IsMaster()) previousMasterHook = hook;
|
||||||
|
hook = hook->_nextHook;
|
||||||
|
} while (hook != this);
|
||||||
|
return previousMasterHook;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hooks Hook::GetHooks() const
|
||||||
|
// *************************
|
||||||
|
{
|
||||||
|
return Hook_Hooks(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Hooks Hook::GetSlaveHooks() const
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
return Hook_SlaveHooks(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
HookFilter Hook::GetIsMasterFilter()
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
return Hook_IsMasterFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Hook::IsAttached() const
|
||||||
|
// **************************
|
||||||
|
{
|
||||||
|
if (!IsMaster())
|
||||||
|
return (GetMasterHook() != NULL);
|
||||||
|
else
|
||||||
|
return (GetNextMasterHook() != this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook* Hook::Detach()
|
||||||
|
// *****************
|
||||||
|
{
|
||||||
|
Hook* previousHook = NULL;
|
||||||
|
Hook* hook = _nextHook;
|
||||||
|
while (hook != this) {
|
||||||
|
if (!IsMaster() || hook->IsMaster()) previousHook = hook;
|
||||||
|
hook = hook->_nextHook;
|
||||||
|
}
|
||||||
|
if (previousHook) {
|
||||||
|
Hook* nextHook = _nextHook;
|
||||||
|
_nextHook = previousHook->_nextHook;
|
||||||
|
previousHook->_nextHook = nextHook;
|
||||||
|
|
||||||
|
// /*
|
||||||
|
if (IsMaster()) {
|
||||||
|
assert(previousHook->IsMaster());
|
||||||
|
Component* component = GetComponent();
|
||||||
|
Rubber* rubber = component->GetRubber();
|
||||||
|
if (rubber) {
|
||||||
|
rubber->_SetHook(previousHook);
|
||||||
|
component->_SetRubber(NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// */
|
||||||
|
|
||||||
|
}
|
||||||
|
return previousHook;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook* Hook::Attach(Hook* hook)
|
||||||
|
// ***************************
|
||||||
|
{
|
||||||
|
if (IsAttached())
|
||||||
|
throw Error("Can't attach : already attached");
|
||||||
|
|
||||||
|
if (!hook)
|
||||||
|
throw Error("Can't attach : null hook");
|
||||||
|
|
||||||
|
if (!hook->IsMaster())
|
||||||
|
throw Error("Can't attach : not a master hook");
|
||||||
|
|
||||||
|
if (hook == this)
|
||||||
|
throw Error("Can't attach : itself");
|
||||||
|
|
||||||
|
Hook* masterHook = hook->GetPreviousMasterHook();
|
||||||
|
Hook* nextHook = masterHook->_nextHook;
|
||||||
|
masterHook->_nextHook = _nextHook;
|
||||||
|
_nextHook = nextHook;
|
||||||
|
|
||||||
|
// /*
|
||||||
|
if (IsMaster()) {
|
||||||
|
Rubber* rubber = hook->GetComponent()->GetRubber();
|
||||||
|
if (rubber)
|
||||||
|
GetComponent()->_SetRubber(rubber);
|
||||||
|
else
|
||||||
|
Rubber::_Create(this);
|
||||||
|
}
|
||||||
|
// */
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Hook::_SetNextHook(Hook* hook)
|
||||||
|
{
|
||||||
|
if (IsMaster())
|
||||||
|
{
|
||||||
|
Rubber* rubber = hook->GetComponent()->GetRubber();
|
||||||
|
if (rubber)
|
||||||
|
rubber->_Delete();
|
||||||
|
}
|
||||||
|
_nextHook = hook;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook* Hook::Merge(Hook* hook)
|
||||||
|
// **************************
|
||||||
|
{
|
||||||
|
if (!IsMaster())
|
||||||
|
throw Error("Can't merge : not a master");
|
||||||
|
|
||||||
|
if (!hook)
|
||||||
|
throw Error("Can't merge : null hook");
|
||||||
|
|
||||||
|
if (!hook->IsMaster())
|
||||||
|
throw Error("Can't merge : not a master hook");
|
||||||
|
|
||||||
|
if (hook == this)
|
||||||
|
throw Error("Can't merge : itself");
|
||||||
|
|
||||||
|
Hook* masterHook = hook->GetPreviousMasterHook();
|
||||||
|
Hook* nextHook = masterHook->_nextHook;
|
||||||
|
masterHook->_nextHook = _nextHook;
|
||||||
|
_nextHook = nextHook;
|
||||||
|
|
||||||
|
Rubber* rubber = GetComponent()->GetRubber();
|
||||||
|
if (rubber) rubber->_Delete();
|
||||||
|
rubber = hook->GetComponent()->GetRubber();
|
||||||
|
if (rubber) rubber->_Delete();
|
||||||
|
Rubber::_Create(this);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* Hook::_GetRecord() const
|
||||||
|
// ***********************
|
||||||
|
{
|
||||||
|
Record* record = NULL;
|
||||||
|
if (_nextHook != this) {
|
||||||
|
record = new Record(GetString(this));
|
||||||
|
record->Add(GetSlot("Component", GetComponent()));
|
||||||
|
record->Add(GetSlot("NextHook", _nextHook));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Hook_Hooks implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Hook_Hooks::Hook_Hooks(const Hook* hook)
|
||||||
|
// *************************************
|
||||||
|
: Inherit(),
|
||||||
|
_hook(hook)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook_Hooks::Hook_Hooks(const Hook_Hooks& hooks)
|
||||||
|
// ********************************************
|
||||||
|
: Inherit(),
|
||||||
|
_hook(hooks._hook)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook_Hooks& Hook_Hooks::operator=(const Hook_Hooks& hooks)
|
||||||
|
// *******************************************************
|
||||||
|
{
|
||||||
|
_hook = hooks._hook;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Collection<Hook*>* Hook_Hooks::GetClone() const
|
||||||
|
// ********************************************
|
||||||
|
{
|
||||||
|
return new Hook_Hooks(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<Hook*>* Hook_Hooks::GetLocator() const
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
return new Locator(_hook);
|
||||||
|
}
|
||||||
|
|
||||||
|
string Hook_Hooks::_GetString() const
|
||||||
|
// **********************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("Hook::Hooks");
|
||||||
|
if (_hook) s += " " + GetString(_hook);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Hook_Hooks::Locator implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Hook_Hooks::Locator::Locator(const Hook* hook)
|
||||||
|
// *******************************************
|
||||||
|
: Inherit(),
|
||||||
|
_hook(hook),
|
||||||
|
_currentHook((Hook*)hook)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook_Hooks::Locator::Locator(const Locator& locator)
|
||||||
|
// *************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_hook(locator._hook),
|
||||||
|
_currentHook(locator._currentHook)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook_Hooks::Locator& Hook_Hooks::Locator::operator=(const Locator& locator)
|
||||||
|
// ************************************************************************
|
||||||
|
{
|
||||||
|
_hook = locator._hook;
|
||||||
|
_currentHook = locator._currentHook;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook* Hook_Hooks::Locator::GetElement() const
|
||||||
|
// ******************************************
|
||||||
|
{
|
||||||
|
return _currentHook;
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<Hook*>* Hook_Hooks::Locator::GetClone() const
|
||||||
|
// **************************************************
|
||||||
|
{
|
||||||
|
return new Locator(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Hook_Hooks::Locator::IsValid() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
return (_currentHook != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Hook_Hooks::Locator::Progress()
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
if (_currentHook) {
|
||||||
|
_currentHook = _currentHook->GetNextHook();
|
||||||
|
if (_currentHook == _hook) _currentHook = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string Hook_Hooks::Locator::_GetString() const
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("Hook::Hooks::Locator");
|
||||||
|
if (_hook) s += " " + GetString(_hook);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Hook_SlaveHooks implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Hook_SlaveHooks::Hook_SlaveHooks(const Hook* hook)
|
||||||
|
// ***********************************************
|
||||||
|
: Inherit(),
|
||||||
|
_hook(hook)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook_SlaveHooks::Hook_SlaveHooks(const Hook_SlaveHooks& slaveHooks)
|
||||||
|
// ****************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_hook(slaveHooks._hook)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook_SlaveHooks& Hook_SlaveHooks::operator=(const Hook_SlaveHooks& slaveHooks)
|
||||||
|
// ***************************************************************************
|
||||||
|
{
|
||||||
|
_hook = slaveHooks._hook;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Collection<Hook*>* Hook_SlaveHooks::GetClone() const
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
return new Hook_SlaveHooks(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<Hook*>* Hook_SlaveHooks::GetLocator() const
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
return new Locator(_hook);
|
||||||
|
}
|
||||||
|
|
||||||
|
string Hook_SlaveHooks::_GetString() const
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("Hook::SlaveHooks");
|
||||||
|
if (_hook) s += " " + GetString(_hook);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Hook_SlaveHooks::Locator implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Hook_SlaveHooks::Locator::Locator(const Hook* hook)
|
||||||
|
// ************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_hook(hook),
|
||||||
|
_currentHook(NULL)
|
||||||
|
{
|
||||||
|
if (_hook && _hook->IsMaster()) {
|
||||||
|
_currentHook = _hook->GetPreviousMasterHook();
|
||||||
|
if (_currentHook) {
|
||||||
|
_currentHook = _currentHook->GetNextHook();
|
||||||
|
if (_currentHook == _hook) _currentHook = NULL;
|
||||||
|
}
|
||||||
|
assert(!_currentHook || !_currentHook->IsMaster());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook_SlaveHooks::Locator::Locator(const Locator& locator)
|
||||||
|
// ******************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_hook(locator._hook),
|
||||||
|
_currentHook(locator._currentHook)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook_SlaveHooks::Locator& Hook_SlaveHooks::Locator::operator=(const Locator& locator)
|
||||||
|
// **********************************************************************************
|
||||||
|
{
|
||||||
|
_hook = locator._hook;
|
||||||
|
_currentHook = locator._currentHook;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hook* Hook_SlaveHooks::Locator::GetElement() const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
return _currentHook;
|
||||||
|
}
|
||||||
|
|
||||||
|
Locator<Hook*>* Hook_SlaveHooks::Locator::GetClone() const
|
||||||
|
// *******************************************************
|
||||||
|
{
|
||||||
|
return new Locator(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Hook_SlaveHooks::Locator::IsValid() const
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
return (_currentHook != NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Hook_SlaveHooks::Locator::Progress()
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
if (_currentHook) {
|
||||||
|
_currentHook = _currentHook->GetNextHook();
|
||||||
|
if (_currentHook == _hook) _currentHook = NULL;
|
||||||
|
assert(!_currentHook || !_currentHook->IsMaster());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string Hook_SlaveHooks::Locator::_GetString() const
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
string s = "<" + _TName("Hook::SlaveHooks::Locator");
|
||||||
|
if (_hook) s += " " + GetString(_hook);
|
||||||
|
s += ">";
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,101 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Hook.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_HOOK
|
||||||
|
#define HURRICANE_HOOK
|
||||||
|
|
||||||
|
#include "Hooks.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Component;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Hook declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Hook : public NestedSlotAdapter {
|
||||||
|
// **********************************
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Hook* _nextHook;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: Hook();
|
||||||
|
|
||||||
|
private: Hook(const Hook& hook); // not implemented to forbid copy construction
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
// **********
|
||||||
|
|
||||||
|
protected: virtual ~Hook();
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
private: Hook& operator=(const Hook& hook); // not implemented to forbid assignment
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Component* GetComponent() const = 0;
|
||||||
|
|
||||||
|
public: Hook* GetNextHook() const;
|
||||||
|
public: Hook* GetPreviousHook() const;
|
||||||
|
|
||||||
|
public: Hook* GetMasterHook() const;
|
||||||
|
public: Hook* GetNextMasterHook() const;
|
||||||
|
public: Hook* GetPreviousMasterHook() const;
|
||||||
|
|
||||||
|
public: Hooks GetHooks() const;
|
||||||
|
public: Hooks GetSlaveHooks() const;
|
||||||
|
|
||||||
|
// Filters
|
||||||
|
// *******
|
||||||
|
|
||||||
|
public: static HookFilter GetIsMasterFilter();
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: virtual bool IsMaster() const = 0;
|
||||||
|
|
||||||
|
public: bool IsAttached() const;
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: Hook* Detach();
|
||||||
|
public: Hook* Attach(Hook* hook);
|
||||||
|
public: Hook* Merge(Hook* hook);
|
||||||
|
public: void _SetNextHook(Hook* hook);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetString() const = 0;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::Hook)
|
||||||
|
|
||||||
|
#endif // HURRICANE_HOOK
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,62 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Hooks.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_HOOKS
|
||||||
|
#define HURRICANE_HOOKS
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Hook;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Hooks declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<Hook*> Hooks;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// HookLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<Hook*> HookLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// HookFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<Hook*> HookFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_hook declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_hook(hook, hooks)\
|
||||||
|
/*********************************/\
|
||||||
|
{\
|
||||||
|
HookLocator _locator = hooks.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
Hook* hook = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_HOOKS
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,174 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Horizontal.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Horizontal.h"
|
||||||
|
#include "Net.h"
|
||||||
|
#include "BasicLayer.h"
|
||||||
|
#include "CompositeLayer.h"
|
||||||
|
#include "Plug.h"
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Horizontal implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Horizontal::Horizontal(Net* net, Component* source, Component* target, Layer* layer, const Unit& y, const Unit& width, const Unit& dxSource, const Unit& dxTarget)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
: Inherit(net, source, target, layer, width),
|
||||||
|
_y(y),
|
||||||
|
_dxSource(dxSource),
|
||||||
|
_dxTarget(dxTarget)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Horizontal* Horizontal::Create(Net* net, Layer* layer, const Unit& y, const Unit& width, const Unit& dxSource, const Unit& dxTarget)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
{
|
||||||
|
if (!net)
|
||||||
|
throw Error("Can't create " + _TName("Horizontal") + " : null net");
|
||||||
|
|
||||||
|
Horizontal* horizontal = new Horizontal(net, NULL, NULL, layer, y, width, dxSource, dxTarget);
|
||||||
|
|
||||||
|
horizontal->_PostCreate();
|
||||||
|
|
||||||
|
return horizontal;
|
||||||
|
}
|
||||||
|
|
||||||
|
Horizontal* Horizontal::Create(Component* source, Component* target, Layer* layer, const Unit& y, const Unit& width, const Unit& dxSource, const Unit& dxTarget)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
{
|
||||||
|
if (!source)
|
||||||
|
throw Error("Can't create " + _TName("Horizontal") + " : null source");
|
||||||
|
|
||||||
|
if (!target)
|
||||||
|
throw Error("Can't create " + _TName("Horizontal") + " : null target");
|
||||||
|
|
||||||
|
Horizontal* horizontal =
|
||||||
|
new Horizontal(source->GetNet(), source, target, layer, y, width, dxSource, dxTarget);
|
||||||
|
|
||||||
|
horizontal->_PostCreate();
|
||||||
|
|
||||||
|
return horizontal;
|
||||||
|
}
|
||||||
|
|
||||||
|
Box Horizontal::GetBoundingBox() const
|
||||||
|
// ***********************************
|
||||||
|
{
|
||||||
|
Unit size = GetHalfWidth() + _GetSize();
|
||||||
|
Unit extention = _GetExtention();
|
||||||
|
|
||||||
|
return Box(GetSourceX(), _y, GetTargetX(), _y).Inflate(extention, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
Box Horizontal::GetBoundingBox(BasicLayer* basicLayer) const
|
||||||
|
// *********************************************************
|
||||||
|
{
|
||||||
|
if (!GetLayer()->Contains(basicLayer)) return Box();
|
||||||
|
|
||||||
|
Unit size = GetHalfWidth() + _GetSize(basicLayer);
|
||||||
|
Unit extention = _GetExtention(basicLayer);
|
||||||
|
|
||||||
|
return Box(GetSourceX(), _y, GetTargetX(), _y).Inflate(extention, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit Horizontal::GetSourceX() const
|
||||||
|
// ********************************
|
||||||
|
{
|
||||||
|
Component* source = GetSource();
|
||||||
|
return (source) ? source->GetX() + _dxSource : _dxSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit Horizontal::GetTargetX() const
|
||||||
|
// ********************************
|
||||||
|
{
|
||||||
|
Component* target = GetTarget();
|
||||||
|
return (target) ? target->GetX() + _dxTarget : _dxTarget;
|
||||||
|
}
|
||||||
|
|
||||||
|
Unit Horizontal::GetLength() const
|
||||||
|
// *******************************
|
||||||
|
{
|
||||||
|
return abs(GetSourceX() - GetTargetX());
|
||||||
|
}
|
||||||
|
|
||||||
|
Point Horizontal::GetCenter() const
|
||||||
|
// *******************************
|
||||||
|
{
|
||||||
|
return Point ( (GetSourceX()+GetTargetX())/2, GetY() );
|
||||||
|
}
|
||||||
|
|
||||||
|
void Horizontal::Translate(const Unit& dx, const Unit& dy)
|
||||||
|
// *******************************************************
|
||||||
|
{
|
||||||
|
if (dy != 0) {
|
||||||
|
Invalidate(true);
|
||||||
|
_y += dy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Horizontal::SetY(const Unit& y)
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
if (y != _y) {
|
||||||
|
Invalidate(true);
|
||||||
|
_y = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Horizontal::SetDxSource(const Unit& dxSource)
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
if (dxSource != _dxSource) {
|
||||||
|
Invalidate(false);
|
||||||
|
_dxSource = dxSource;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Horizontal::SetDxTarget(const Unit& dxTarget)
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
if (dxTarget != _dxTarget) {
|
||||||
|
Invalidate(false);
|
||||||
|
_dxTarget = dxTarget;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Horizontal::Translate(const Unit& dy)
|
||||||
|
// ***************************************
|
||||||
|
{
|
||||||
|
if (dy != 0) {
|
||||||
|
Invalidate(true);
|
||||||
|
_y += dy;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
string Horizontal::_GetString() const
|
||||||
|
// **********************************
|
||||||
|
{
|
||||||
|
return Inherit::_GetString();
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* Horizontal::_GetRecord() const
|
||||||
|
// *****************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
if (record) {
|
||||||
|
record->Add(GetSlot("Y", &_y));
|
||||||
|
record->Add(GetSlot("DxSource", &_dxSource));
|
||||||
|
record->Add(GetSlot("DxTarget", &_dxTarget));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,88 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Horizontal.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_HORIZONTAL
|
||||||
|
#define HURRICANE_HORIZONTAL
|
||||||
|
|
||||||
|
#include "Segment.h"
|
||||||
|
#include "Horizontals.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Horizontal declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Horizontal : public Segment {
|
||||||
|
// ******************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Segment Inherit;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Unit _y;
|
||||||
|
private: Unit _dxSource;
|
||||||
|
private: Unit _dxTarget;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: Horizontal(Net* net, Component* source, Component* target, Layer* layer, const Unit& y, const Unit& width = 0, const Unit& dxSource = 0, const Unit& dxTarget = 0);
|
||||||
|
|
||||||
|
public: static Horizontal* Create(Net* net, Layer* layer, const Unit& y, const Unit& width = 0, const Unit& dxSource = 0, const Unit& dxTarget = 0);
|
||||||
|
public: static Horizontal* Create(Component* source, Component* target, Layer* layer, const Unit& y, const Unit& width = 0, const Unit& dxSource = 0, const Unit& dxTarget = 0);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Unit GetY() const {return _y;};
|
||||||
|
public: virtual Point GetCenter() const;
|
||||||
|
public: virtual Box GetBoundingBox() const;
|
||||||
|
public: virtual Box GetBoundingBox(BasicLayer* basicLayer) const;
|
||||||
|
public: virtual Unit GetSourceX() const;
|
||||||
|
public: virtual Unit GetSourceY() const {return GetY();};
|
||||||
|
public: virtual Unit GetTargetX() const;
|
||||||
|
public: virtual Unit GetTargetY() const {return GetY();};
|
||||||
|
public: virtual Unit GetLength() const;
|
||||||
|
public: const Unit& GetDxSource() const {return _dxSource;};
|
||||||
|
public: const Unit& GetDxTarget() const {return _dxTarget;};
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: virtual void Translate(const Unit& dx, const Unit& dy);
|
||||||
|
|
||||||
|
public: void SetY(const Unit& y);
|
||||||
|
public: void SetDxSource(const Unit& dxSource);
|
||||||
|
public: void SetDxTarget(const Unit& dxSource);
|
||||||
|
public: void Translate(const Unit& dy);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const {return _TName("Horizontal");};
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::Horizontal)
|
||||||
|
|
||||||
|
#endif // HURRICANE_HORIZONTAL
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,62 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Horizontals.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_HORIZONTALS
|
||||||
|
#define HURRICANE_HORIZONTALS
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Horizontal;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Horizontals declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<Horizontal*> Horizontals;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// HorizontalLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<Horizontal*> HorizontalLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// HorizontalFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<Horizontal*> HorizontalFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_horizontal declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_horizontal(horizontal, horizontals)\
|
||||||
|
/***************************************************/\
|
||||||
|
{\
|
||||||
|
HorizontalLocator _locator = horizontals.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
Horizontal* horizontal = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_HORIZONTALS
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,65 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Hurricane.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// 21-10-2003 Alignment BULL-LIP6
|
||||||
|
|
||||||
|
#ifndef HURRICANE_ALL
|
||||||
|
#define HURRICANE_ALL
|
||||||
|
|
||||||
|
#include "Error.h"
|
||||||
|
#include "Warning.h"
|
||||||
|
#include "Interruption.h"
|
||||||
|
|
||||||
|
#include "Tag.h"
|
||||||
|
|
||||||
|
#include "Timer.h"
|
||||||
|
|
||||||
|
#include "Region.h"
|
||||||
|
|
||||||
|
#include "Property.h"
|
||||||
|
#include "Relation.h"
|
||||||
|
#include "Selector.h"
|
||||||
|
#include "UpdateSession.h"
|
||||||
|
|
||||||
|
#include "DataBase.h"
|
||||||
|
#include "Technology.h"
|
||||||
|
#include "Layer.h"
|
||||||
|
#include "BasicLayer.h"
|
||||||
|
#include "CompositeLayer.h"
|
||||||
|
#include "Library.h"
|
||||||
|
#include "Cell.h"
|
||||||
|
#include "Instance.h"
|
||||||
|
#include "Marker.h"
|
||||||
|
#include "DRCError.h"
|
||||||
|
#include "Reference.h"
|
||||||
|
#include "Net.h"
|
||||||
|
#include "Rubber.h"
|
||||||
|
#include "Component.h"
|
||||||
|
#include "Plug.h"
|
||||||
|
#include "Pin.h"
|
||||||
|
#include "Contact.h"
|
||||||
|
#include "Vertical.h"
|
||||||
|
#include "Horizontal.h"
|
||||||
|
#include "Pad.h"
|
||||||
|
#include "MainView.h"
|
||||||
|
#include "MapView.h"
|
||||||
|
|
||||||
|
#include "Symbol.h"
|
||||||
|
#include "Primitive.h"
|
||||||
|
|
||||||
|
#include "Path.h"
|
||||||
|
#include "SharedPath.h"
|
||||||
|
#include "Occurrence.h"
|
||||||
|
#include "Quark.h"
|
||||||
|
|
||||||
|
#include "HyperNet.h"
|
||||||
|
#include "DisplaySlot.h"
|
||||||
|
#include "UserGo.h"
|
||||||
|
|
||||||
|
#endif // HURRICANE_ALL
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,87 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: HyperNet.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// 21-10-2003 Alignment BULL-LIP6
|
||||||
|
|
||||||
|
#ifndef HURRICANE_HYPER_NET
|
||||||
|
#define HURRICANE_HYPER_NET
|
||||||
|
|
||||||
|
#include "Occurrences.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// HyperNet declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class HyperNet {
|
||||||
|
// ***********
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Occurrence _netOccurrence;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: HyperNet(const Occurrence& occurrence);
|
||||||
|
|
||||||
|
private: HyperNet(const HyperNet& hyperNet); // not implemented to forbid copy construction
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
private: HyperNet& operator=(const HyperNet& hyperNet); // not implemented to forbid assignment
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: const Occurrence& GetNetOccurrence() const {return _netOccurrence;};
|
||||||
|
public: Cell* GetCell() const {return _netOccurrence.GetOwnerCell();};
|
||||||
|
public: Occurrences GetNetOccurrences(bool doExtraction = false, bool allowInterruption = false) const;
|
||||||
|
public: Occurrences GetNetOccurrencesUnder(Box area, bool doExtraction = false,
|
||||||
|
bool allowInterruption = false) const;
|
||||||
|
public: Occurrences GetLeafPlugOccurrences(bool doExtraction = false , bool allowInterruption = false) const;
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: bool IsValid() const {return _netOccurrence.IsValid();};
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: string _GetTypeName() const { return _TName("HyperNet"); };
|
||||||
|
public: string _GetString() const;
|
||||||
|
public: Record* _GetRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
Occurrence GetHyperNetRootNetOccurrence(const Occurrence& netoccurrence);
|
||||||
|
|
||||||
|
bool IsHyperNetRootNetOccurrence(Occurrence netoccurrence);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
PointerIOStreamSupport(Hurricane::HyperNet)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Generic functions
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#endif // HURRICANE_HYPER_NET
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,708 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Instance.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// 21-10-2003 Alignment BULL-LIP6
|
||||||
|
|
||||||
|
#include "Instance.h"
|
||||||
|
#include "Cell.h"
|
||||||
|
#include "Net.h"
|
||||||
|
#include "Plug.h"
|
||||||
|
#include "SharedPath.h"
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Filters declaration & implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Instance_IsUnderFilter : public Filter<Instance*> {
|
||||||
|
// ****************************************************
|
||||||
|
|
||||||
|
public: Box _area;
|
||||||
|
|
||||||
|
public: Instance_IsUnderFilter(const Box& area)
|
||||||
|
// ********************************************
|
||||||
|
: _area(area)
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
public: Instance_IsUnderFilter(const Instance_IsUnderFilter& filter)
|
||||||
|
// *****************************************************************
|
||||||
|
: _area(filter._area)
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
public: Instance_IsUnderFilter& operator=(const Instance_IsUnderFilter& filter)
|
||||||
|
// ****************************************************************************
|
||||||
|
{
|
||||||
|
_area = filter._area;
|
||||||
|
return *this;
|
||||||
|
};
|
||||||
|
|
||||||
|
public: virtual Filter<Instance*>* GetClone() const
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
return new Instance_IsUnderFilter(*this);
|
||||||
|
};
|
||||||
|
|
||||||
|
public: virtual bool Accept(Instance* instance) const
|
||||||
|
// **************************************************
|
||||||
|
{
|
||||||
|
return _area.Intersect(instance->GetBoundingBox());
|
||||||
|
};
|
||||||
|
|
||||||
|
public: virtual string _GetString() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
return "<" + _TName("Instance::IsUnderFilter") + " " + GetString(_area) + ">";
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class Instance_IsTerminalFilter : public Filter<Instance*> {
|
||||||
|
// *******************************************************
|
||||||
|
|
||||||
|
public: Instance_IsTerminalFilter() {};
|
||||||
|
|
||||||
|
public: Instance_IsTerminalFilter(const Instance_IsTerminalFilter& filter) {};
|
||||||
|
|
||||||
|
public: Instance_IsTerminalFilter& operator=(const Instance_IsTerminalFilter& filter) {return *this;};
|
||||||
|
|
||||||
|
public: virtual Filter<Instance*>* GetClone() const {return new Instance_IsTerminalFilter(*this);};
|
||||||
|
|
||||||
|
public: virtual bool Accept(Instance* instance) const {return instance->IsTerminal();};
|
||||||
|
|
||||||
|
public: virtual string _GetString() const {return "<" + _TName("Instance::IsTerminalFilter") + ">";};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class Instance_IsLeafFilter : public Filter<Instance*> {
|
||||||
|
// *******************************************************
|
||||||
|
|
||||||
|
public: Instance_IsLeafFilter() {};
|
||||||
|
|
||||||
|
public: Instance_IsLeafFilter(const Instance_IsLeafFilter& filter) {};
|
||||||
|
|
||||||
|
public: Instance_IsLeafFilter& operator=(const Instance_IsLeafFilter& filter) {return *this;};
|
||||||
|
|
||||||
|
public: virtual Filter<Instance*>* GetClone() const {return new Instance_IsLeafFilter(*this);};
|
||||||
|
|
||||||
|
public: virtual bool Accept(Instance* instance) const {return instance->IsLeaf();};
|
||||||
|
|
||||||
|
public: virtual string _GetString() const {return "<" + _TName("Instance::IsLeafFilter") + ">";};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class Instance_IsUnplacedFilter : public Filter<Instance*> {
|
||||||
|
// *******************************************************
|
||||||
|
|
||||||
|
public: Instance_IsUnplacedFilter() {};
|
||||||
|
|
||||||
|
public: Instance_IsUnplacedFilter(const Instance_IsUnplacedFilter& filter) {};
|
||||||
|
|
||||||
|
public: Instance_IsUnplacedFilter& operator=(const Instance_IsUnplacedFilter& filter) {return *this;};
|
||||||
|
|
||||||
|
public: virtual Filter<Instance*>* GetClone() const {return new Instance_IsUnplacedFilter(*this);};
|
||||||
|
|
||||||
|
public: virtual bool Accept(Instance* instance) const {return instance->IsUnplaced();};
|
||||||
|
|
||||||
|
public: virtual string _GetString() const {return "<" + _TName("Net::IsUnplacedFilter>");};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class Instance_IsPlacedFilter : public Filter<Instance*> {
|
||||||
|
// *****************************************************
|
||||||
|
|
||||||
|
public: Instance_IsPlacedFilter() {};
|
||||||
|
|
||||||
|
public: Instance_IsPlacedFilter(const Instance_IsPlacedFilter& filter) {};
|
||||||
|
|
||||||
|
public: Instance_IsPlacedFilter& operator=(const Instance_IsPlacedFilter& filter) {return *this;};
|
||||||
|
|
||||||
|
public: virtual Filter<Instance*>* GetClone() const {return new Instance_IsPlacedFilter(*this);};
|
||||||
|
|
||||||
|
public: virtual bool Accept(Instance* instance) const {return instance->IsPlaced();};
|
||||||
|
|
||||||
|
public: virtual string _GetString() const {return "<" + _TName("Net::IsPlacedFilter>");};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class Instance_IsFixedFilter : public Filter<Instance*> {
|
||||||
|
// *****************************************************
|
||||||
|
|
||||||
|
public: Instance_IsFixedFilter() {};
|
||||||
|
|
||||||
|
public: Instance_IsFixedFilter(const Instance_IsFixedFilter& filter) {};
|
||||||
|
|
||||||
|
public: Instance_IsFixedFilter& operator=(const Instance_IsFixedFilter& filter) {return *this;};
|
||||||
|
|
||||||
|
public: virtual Filter<Instance*>* GetClone() const {return new Instance_IsFixedFilter(*this);};
|
||||||
|
|
||||||
|
public: virtual bool Accept(Instance* instance) const {return instance->IsFixed();};
|
||||||
|
|
||||||
|
public: virtual string _GetString() const {return "<" + _TName("Net::IsFixedFilter>");};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Instance implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Instance::Instance(Cell* cell, const Name& name, Cell* masterCell, const Transformation& transformation, const PlacementStatus& placementstatus, bool secureFlag)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_cell(cell),
|
||||||
|
_name(name),
|
||||||
|
_masterCell(masterCell),
|
||||||
|
_transformation(transformation),
|
||||||
|
_placementStatus(placementstatus),
|
||||||
|
_plugMap(),
|
||||||
|
_sharedPathMap(),
|
||||||
|
_nextOfCellInstanceMap(NULL),
|
||||||
|
_nextOfCellSlaveInstanceSet(NULL)
|
||||||
|
{
|
||||||
|
if (!_cell)
|
||||||
|
throw Error("Can't create " + _TName("Instance") + " : null cell");
|
||||||
|
|
||||||
|
if (name.IsEmpty())
|
||||||
|
throw Error("Can't create " + _TName("Instance") + " : empty name");
|
||||||
|
|
||||||
|
if (_cell->GetInstance(_name))
|
||||||
|
throw Error("Can't create " + _TName("Instance") + " : already exists");
|
||||||
|
|
||||||
|
if (!_masterCell)
|
||||||
|
throw Error("Can't create " + _TName("Instance") + " : null master cell");
|
||||||
|
|
||||||
|
if (secureFlag && _cell->IsCalledBy(_masterCell))
|
||||||
|
throw Error("Can't create " + _TName("Instance") + " : cyclic construction");
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance* Instance::Create(Cell* cell, const Name& name, Cell* masterCell, bool secureFlag)
|
||||||
|
// ****************************************************************************************
|
||||||
|
{
|
||||||
|
Instance* instance =
|
||||||
|
new Instance(cell, name, masterCell, Transformation(), PlacementStatus(), secureFlag);
|
||||||
|
|
||||||
|
instance->_PostCreate();
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance* Instance::Create(Cell* cell, const Name& name, Cell* masterCell, const Transformation& transformation, const PlacementStatus& placementstatus, bool secureFlag)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
{
|
||||||
|
Instance* instance =
|
||||||
|
new Instance(cell, name, masterCell, transformation, placementstatus, secureFlag);
|
||||||
|
|
||||||
|
instance->_PostCreate();
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
Box Instance::GetBoundingBox() const
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
return _transformation.GetBox(_masterCell->GetBoundingBox());
|
||||||
|
}
|
||||||
|
|
||||||
|
Plugs Instance::GetConnectedPlugs() const
|
||||||
|
// **************************************
|
||||||
|
{
|
||||||
|
return GetPlugs().GetSubSet(Plug::GetIsConnectedFilter());
|
||||||
|
}
|
||||||
|
|
||||||
|
Plugs Instance::GetUnconnectedPlugs() const
|
||||||
|
// ****************************************
|
||||||
|
{
|
||||||
|
return GetPlugs().GetSubSet(Plug::GetIsUnconnectedFilter());
|
||||||
|
}
|
||||||
|
|
||||||
|
Path Instance::GetPath(const Path& tailPath) const
|
||||||
|
// ***********************************************
|
||||||
|
{
|
||||||
|
return Path((Instance*)this, tailPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
Box Instance::GetAbutmentBox() const
|
||||||
|
// *********************************
|
||||||
|
{
|
||||||
|
return _transformation.GetBox(_masterCell->GetAbutmentBox());
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Instance::IsTerminal() const
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
return GetMasterCell()->IsTerminal();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Instance::IsLeaf() const
|
||||||
|
// **************************
|
||||||
|
{
|
||||||
|
return GetMasterCell()->IsLeaf();
|
||||||
|
}
|
||||||
|
|
||||||
|
InstanceFilter Instance::GetIsUnderFilter(const Box& area)
|
||||||
|
// *******************************************************
|
||||||
|
{
|
||||||
|
return Instance_IsUnderFilter(area);
|
||||||
|
}
|
||||||
|
|
||||||
|
InstanceFilter Instance::GetIsTerminalFilter()
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
return Instance_IsTerminalFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
InstanceFilter Instance::GetIsLeafFilter()
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
return Instance_IsLeafFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
InstanceFilter Instance::GetIsUnplacedFilter()
|
||||||
|
// *******************************************
|
||||||
|
{
|
||||||
|
return Instance_IsUnplacedFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
InstanceFilter Instance::GetIsPlacedFilter()
|
||||||
|
// *****************************************
|
||||||
|
{
|
||||||
|
return Instance_IsPlacedFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
InstanceFilter Instance::GetIsFixedFilter()
|
||||||
|
// ****************************************
|
||||||
|
{
|
||||||
|
return Instance_IsFixedFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
InstanceFilter Instance::GetIsNotUnplacedFilter()
|
||||||
|
// **********************************************
|
||||||
|
{
|
||||||
|
return !Instance_IsUnplacedFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::Materialize()
|
||||||
|
// *************************
|
||||||
|
{
|
||||||
|
if (!IsMaterialized()) {
|
||||||
|
Box boundingBox = GetBoundingBox();
|
||||||
|
if (!boundingBox.IsEmpty()) {
|
||||||
|
QuadTree* quadTree = _cell->_GetQuadTree();
|
||||||
|
quadTree->Insert(this);
|
||||||
|
_cell->_Fit(quadTree->GetBoundingBox());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::Unmaterialize()
|
||||||
|
// ***************************
|
||||||
|
{
|
||||||
|
if (IsMaterialized()) {
|
||||||
|
_cell->_Unfit(GetBoundingBox());
|
||||||
|
_cell->_GetQuadTree()->Remove(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::Invalidate(bool propagateFlag)
|
||||||
|
// ******************************************
|
||||||
|
{
|
||||||
|
Inherit::Invalidate(false);
|
||||||
|
|
||||||
|
if (propagateFlag) {
|
||||||
|
for_each_plug(plug, GetConnectedPlugs()) {
|
||||||
|
plug->Invalidate(true);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::Translate(const Unit& dx, const Unit& dy)
|
||||||
|
// *****************************************************
|
||||||
|
{
|
||||||
|
if ((dx != 0) || (dy !=0)) {
|
||||||
|
Point translation = _transformation.GetTranslation();
|
||||||
|
Unit x = translation.GetX() + dx;
|
||||||
|
Unit y = translation.GetY() + dy;
|
||||||
|
Transformation::Orientation orientation = _transformation.GetOrientation();
|
||||||
|
SetTransformation(Transformation(x, y, orientation));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::SetName(const Name& name)
|
||||||
|
// *************************************
|
||||||
|
{
|
||||||
|
if (name != _name) {
|
||||||
|
if (name.IsEmpty())
|
||||||
|
throw Error("Can't change instance name : empty name");
|
||||||
|
|
||||||
|
if (_cell->GetInstance(name))
|
||||||
|
throw Error("Can't change instance name : already exists");
|
||||||
|
|
||||||
|
_cell->_GetInstanceMap()._Remove(this);
|
||||||
|
_name = name;
|
||||||
|
_cell->_GetInstanceMap()._Insert(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::SetTransformation(const Transformation& transformation)
|
||||||
|
// *******************************************************************
|
||||||
|
{
|
||||||
|
if (transformation != _transformation) {
|
||||||
|
Invalidate(true);
|
||||||
|
_transformation = transformation;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::SetPlacementStatus(const PlacementStatus& placementstatus)
|
||||||
|
// **********************************************************************
|
||||||
|
{
|
||||||
|
// if (placementstatus != _placementStatus) {
|
||||||
|
// Invalidate(true);
|
||||||
|
_placementStatus = placementstatus;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::SetMasterCell(Cell* masterCell, bool secureFlag)
|
||||||
|
// ************************************************************
|
||||||
|
{
|
||||||
|
if (masterCell != _masterCell) {
|
||||||
|
|
||||||
|
if (!masterCell)
|
||||||
|
throw Error("Can't set master : null master cell");
|
||||||
|
|
||||||
|
if (secureFlag && _cell->IsCalledBy(masterCell))
|
||||||
|
throw Error("Can't set master : cyclic construction");
|
||||||
|
|
||||||
|
list<Plug*> connectedPlugList;
|
||||||
|
list<Net*> masterNetList;
|
||||||
|
for_each_plug(plug, GetConnectedPlugs()) {
|
||||||
|
Net* masterNet = masterCell->GetNet(plug->GetMasterNet()->GetName());
|
||||||
|
if (!masterNet || !masterNet->IsExternal())
|
||||||
|
throw Error("Can't set master (bad master net matching)");
|
||||||
|
connectedPlugList.push_back(plug);
|
||||||
|
masterNetList.push_back(masterNet);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
for_each_shared_path(sharedPath, _GetSharedPathes()) {
|
||||||
|
if (!sharedPath->GetTailSharedPath())
|
||||||
|
// if the tail is empty the SharedPath isn't impacted by the change
|
||||||
|
delete sharedPath;
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
Invalidate(true);
|
||||||
|
|
||||||
|
for_each_plug(plug, GetUnconnectedPlugs()) {
|
||||||
|
plug->_Delete();
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!connectedPlugList.empty() && !masterNetList.empty()) {
|
||||||
|
Plug* plug = connectedPlugList.front();
|
||||||
|
Net* masterNet = masterNetList.front();
|
||||||
|
_plugMap._Remove(plug);
|
||||||
|
plug->_SetMasterNet(masterNet);
|
||||||
|
_plugMap._Insert(plug);
|
||||||
|
connectedPlugList.pop_front();
|
||||||
|
masterNetList.pop_front();
|
||||||
|
}
|
||||||
|
|
||||||
|
_masterCell->_GetSlaveInstanceSet()._Remove(this);
|
||||||
|
_masterCell = masterCell;
|
||||||
|
_masterCell->_GetSlaveInstanceSet()._Insert(this);
|
||||||
|
|
||||||
|
for_each_net(externalNet, _masterCell->GetExternalNets()) {
|
||||||
|
if (!GetPlug(externalNet)) Plug::_Create(this, externalNet);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::_PostCreate()
|
||||||
|
// *************************
|
||||||
|
{
|
||||||
|
_cell->_GetInstanceMap()._Insert(this);
|
||||||
|
_masterCell->_GetSlaveInstanceSet()._Insert(this);
|
||||||
|
|
||||||
|
for_each_net(externalNet, _masterCell->GetExternalNets()) {
|
||||||
|
Plug::_Create(this, externalNet);
|
||||||
|
end_for;
|
||||||
|
}
|
||||||
|
|
||||||
|
Inherit::_PostCreate();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::_PreDelete()
|
||||||
|
// ************************
|
||||||
|
{
|
||||||
|
for_each_shared_path(sharedPath, _GetSharedPathes()) delete sharedPath; end_for;
|
||||||
|
|
||||||
|
Inherit::_PreDelete();
|
||||||
|
|
||||||
|
for_each_plug(plug, GetPlugs()) plug->_Delete(); end_for;
|
||||||
|
|
||||||
|
_masterCell->_GetSlaveInstanceSet()._Remove(this);
|
||||||
|
_cell->_GetInstanceMap()._Remove(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
string Instance::_GetString() const
|
||||||
|
// ********************************
|
||||||
|
{
|
||||||
|
string s = Inherit::_GetString();
|
||||||
|
s.insert(s.length() - 1, " " + GetString(_name));
|
||||||
|
s.insert(s.length() - 1, " " + GetString(_masterCell->GetName()));
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* Instance::_GetRecord() const
|
||||||
|
// ***************************
|
||||||
|
{
|
||||||
|
Record* record = Inherit::_GetRecord();
|
||||||
|
if (record) {
|
||||||
|
record->Add(GetSlot("Cell", _cell));
|
||||||
|
record->Add(GetSlot("Name", &_name));
|
||||||
|
record->Add(GetSlot("MasterCell", _masterCell));
|
||||||
|
record->Add(GetSlot("Transformation", &_transformation));
|
||||||
|
record->Add(GetSlot("PlacementStatus", _placementStatus));
|
||||||
|
record->Add(GetSlot("XCenter", GetValue(GetAbutmentBox().GetXCenter())));
|
||||||
|
record->Add(GetSlot("YCenter", GetValue(GetAbutmentBox().GetYCenter())));
|
||||||
|
record->Add(GetSlot("Plugs", &_plugMap));
|
||||||
|
record->Add(GetSlot("SharedPathes", &_sharedPathMap));
|
||||||
|
}
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
//void Instance::_DrawPhantoms(View* view, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// **************************************************************************************************
|
||||||
|
//{
|
||||||
|
// Symbol* symbol = _masterCell->GetSymbol();
|
||||||
|
// if (!symbol) {
|
||||||
|
// Box masterArea = updateArea;
|
||||||
|
// Transformation masterTransformation = _transformation;
|
||||||
|
// _transformation.GetInvert().ApplyOn(masterArea);
|
||||||
|
// transformation.ApplyOn(masterTransformation);
|
||||||
|
// _masterCell->_DrawPhantoms(view, masterArea, masterTransformation);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Instance::_DrawBoundaries(View* view, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// ****************************************************************************************************
|
||||||
|
//{
|
||||||
|
// Box masterArea = updateArea;
|
||||||
|
// Transformation masterTransformation = _transformation;
|
||||||
|
// _transformation.GetInvert().ApplyOn(masterArea);
|
||||||
|
// transformation.ApplyOn(masterTransformation);
|
||||||
|
// Symbol* symbol = _masterCell->GetSymbol();
|
||||||
|
// if (!symbol)
|
||||||
|
// _masterCell->_DrawBoundaries(view, masterArea, masterTransformation);
|
||||||
|
// else
|
||||||
|
// _masterCell->GetSymbol()->_Draw(view, masterArea, masterTransformation);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Instance::_DrawRubbers(View* view, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// *************************************************************************************************
|
||||||
|
//{
|
||||||
|
// Box masterArea = updateArea;
|
||||||
|
// Transformation masterTransformation = _transformation;
|
||||||
|
// _transformation.GetInvert().ApplyOn(masterArea);
|
||||||
|
// transformation.ApplyOn(masterTransformation);
|
||||||
|
// _masterCell->_DrawRubbers(view, masterArea, masterTransformation);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Instance::_DrawMarkers(View* view, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// *************************************************************************************************
|
||||||
|
//{
|
||||||
|
// Box masterArea = updateArea;
|
||||||
|
// Transformation masterTransformation = _transformation;
|
||||||
|
// _transformation.GetInvert().ApplyOn(masterArea);
|
||||||
|
// transformation.ApplyOn(masterTransformation);
|
||||||
|
// _masterCell->_DrawMarkers(view, masterArea, masterTransformation);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Instance::_DrawDisplaySlots(View* view, const Box& area, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// ***********************************************************************************************************************
|
||||||
|
//{
|
||||||
|
// Box masterArea = updateArea;
|
||||||
|
// Transformation masterTransformation = _transformation;
|
||||||
|
// _transformation.GetInvert().ApplyOn(masterArea);
|
||||||
|
// transformation.ApplyOn(masterTransformation);
|
||||||
|
// _masterCell->_DrawDisplaySlots(view, area, masterArea, masterTransformation);
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//bool Instance::_IsInterceptedBy(View* view, const Point& point, const Unit& aperture) const
|
||||||
|
//// ****************************************************************************************
|
||||||
|
//{
|
||||||
|
// Symbol* symbol = _masterCell->GetSymbol();
|
||||||
|
// if (!symbol)
|
||||||
|
// return (view->PhantomsAreVisible() || view->BoundariesAreVisible()) &&
|
||||||
|
// GetAbutmentBox().Intersect(Box(point).Inflate(aperture));
|
||||||
|
// else {
|
||||||
|
// Point masterPoint = point;
|
||||||
|
// _transformation.GetInvert().ApplyOn(masterPoint);
|
||||||
|
// return (view->BoundariesAreVisible() && symbol->_IsInterceptedBy(view, masterPoint, aperture));
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Instance::_Draw(View* view, BasicLayer* basicLayer, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// ****************************************************************************************************
|
||||||
|
//{
|
||||||
|
// Symbol* symbol = _masterCell->GetSymbol();
|
||||||
|
// if (!symbol) {
|
||||||
|
// Box masterArea = updateArea;
|
||||||
|
// Transformation masterTransformation = _transformation;
|
||||||
|
// _transformation.GetInvert().ApplyOn(masterArea);
|
||||||
|
// transformation.ApplyOn(masterTransformation);
|
||||||
|
// _masterCell->_DrawContent(view, basicLayer, masterArea, masterTransformation);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//void Instance::_Highlight(View* view, const Box& updateArea, const Transformation& transformation)
|
||||||
|
//// ***********************************************************************************************
|
||||||
|
//{
|
||||||
|
// Symbol* symbol = _masterCell->GetSymbol();
|
||||||
|
// if (!symbol) {
|
||||||
|
// Box abutmentBox = transformation.GetBox(GetAbutmentBox());
|
||||||
|
// view->FillRectangle(abutmentBox);
|
||||||
|
// view->DrawRectangle(abutmentBox);
|
||||||
|
//
|
||||||
|
// if ( view->GetScale() > 1 )
|
||||||
|
// {
|
||||||
|
// if ( view->IsTextVisible() )
|
||||||
|
// {
|
||||||
|
// string text = GetString ( _name ) + " ("
|
||||||
|
// + GetString ( GetValue ( abutmentBox.GetXCenter () ) ) + ","
|
||||||
|
// + GetString ( GetValue ( abutmentBox.GetYCenter () ) ) + ")";
|
||||||
|
// view->DrawString ( text, abutmentBox.GetXMin(), abutmentBox.GetYMax() );
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// Box masterArea = updateArea;
|
||||||
|
// Transformation masterTransformation = _transformation;
|
||||||
|
// _transformation.GetInvert().ApplyOn(masterArea);
|
||||||
|
// transformation.ApplyOn(masterTransformation);
|
||||||
|
// symbol->_Highlight(view, masterArea, masterTransformation);
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Instance::PlugMap implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Instance::PlugMap::PlugMap()
|
||||||
|
// *************************
|
||||||
|
: Inherit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const Net* Instance::PlugMap::_GetKey(Plug* plug) const
|
||||||
|
// ****************************************************
|
||||||
|
{
|
||||||
|
return plug->GetMasterNet();
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned Instance::PlugMap::_GetHashValue(const Net* masterNet) const
|
||||||
|
// ******************************************************************
|
||||||
|
{
|
||||||
|
return ( (unsigned int)( (unsigned long)masterNet ) ) / 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
Plug* Instance::PlugMap::_GetNextElement(Plug* plug) const
|
||||||
|
// *******************************************************
|
||||||
|
{
|
||||||
|
return plug->_GetNextOfInstancePlugMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::PlugMap::_SetNextElement(Plug* plug, Plug* nextPlug) const
|
||||||
|
// **********************************************************************
|
||||||
|
{
|
||||||
|
plug->_SetNextOfInstancePlugMap(nextPlug);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Instance::SharedPathMap implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Instance::SharedPathMap::SharedPathMap()
|
||||||
|
// *************************************
|
||||||
|
: Inherit()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
const SharedPath* Instance::SharedPathMap::_GetKey(SharedPath* sharedPath) const
|
||||||
|
// *****************************************************************************
|
||||||
|
{
|
||||||
|
return sharedPath->GetTailSharedPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned Instance::SharedPathMap::_GetHashValue(const SharedPath* tailSharedPath) const
|
||||||
|
// ************************************************************************************
|
||||||
|
{
|
||||||
|
return ( (unsigned int)( (unsigned long)tailSharedPath ) ) / 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
SharedPath* Instance::SharedPathMap::_GetNextElement(SharedPath* sharedPath) const
|
||||||
|
// *******************************************************************************
|
||||||
|
{
|
||||||
|
return sharedPath->_GetNextOfInstanceSharedPathMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Instance::SharedPathMap::_SetNextElement(SharedPath* sharedPath, SharedPath* nextSharedPath) const
|
||||||
|
// ****************************************************************************************************
|
||||||
|
{
|
||||||
|
sharedPath->_SetNextOfInstanceSharedPathMap(nextSharedPath);
|
||||||
|
};
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Instance::PlacementStatus implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Instance::PlacementStatus::PlacementStatus(const Code& code)
|
||||||
|
// *********************************************************
|
||||||
|
: _code(code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance::PlacementStatus::PlacementStatus(const PlacementStatus& placementstatus)
|
||||||
|
// *******************************************************************************
|
||||||
|
: _code(placementstatus._code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Instance::PlacementStatus& Instance::PlacementStatus::operator=(const PlacementStatus& placementstatus)
|
||||||
|
// ****************************************************************************************************
|
||||||
|
{
|
||||||
|
_code = placementstatus._code;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
string Instance::PlacementStatus::_GetString() const
|
||||||
|
// *************************************************
|
||||||
|
{
|
||||||
|
return GetString(&_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* Instance::PlacementStatus::_GetRecord() const
|
||||||
|
// ********************************************
|
||||||
|
{
|
||||||
|
Record* record = new Record(GetString(this));
|
||||||
|
record->Add(GetSlot("Code", &_code));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,231 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Instance.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// 21-10-2003 Alignment BULL-LIP6
|
||||||
|
|
||||||
|
#ifndef HURRICANE_INSTANCE
|
||||||
|
#define HURRICANE_INSTANCE
|
||||||
|
|
||||||
|
#include "Go.h"
|
||||||
|
#include "Instances.h"
|
||||||
|
#include "Transformation.h"
|
||||||
|
#include "Plug.h"
|
||||||
|
#include "Path.h"
|
||||||
|
#include "SharedPath.h"
|
||||||
|
#include "IntrusiveMap.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Net;
|
||||||
|
//class View;
|
||||||
|
class BasicLayer;
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Instance declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Instance : public Go {
|
||||||
|
// ***********************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Go Inherit;
|
||||||
|
|
||||||
|
public: class PlacementStatus {
|
||||||
|
// **************************
|
||||||
|
|
||||||
|
public: enum Code {UNPLACED=0, PLACED=1, FIXED=2};
|
||||||
|
|
||||||
|
private: Code _code;
|
||||||
|
|
||||||
|
public: PlacementStatus(const Code& code = UNPLACED);
|
||||||
|
public: PlacementStatus(const PlacementStatus& placementstatus);
|
||||||
|
|
||||||
|
public: PlacementStatus& operator=(const PlacementStatus& placementstatus);
|
||||||
|
|
||||||
|
public: operator const Code&() const {return _code;};
|
||||||
|
|
||||||
|
public: const Code& GetCode() const {return _code;};
|
||||||
|
|
||||||
|
public: string _GetTypeName() const { return _TName("Instance::PlacementStatus"); };
|
||||||
|
public: string _GetString() const;
|
||||||
|
public: Record* _GetRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
public: class PlugMap : public IntrusiveMap<const Net*, Plug> {
|
||||||
|
// **********************************************************
|
||||||
|
|
||||||
|
public: typedef IntrusiveMap<const Net*, Plug> Inherit;
|
||||||
|
|
||||||
|
public: PlugMap();
|
||||||
|
|
||||||
|
public: virtual const Net* _GetKey(Plug* plug) const;
|
||||||
|
public: virtual unsigned _GetHashValue(const Net* masterNet) const;
|
||||||
|
public: virtual Plug* _GetNextElement(Plug* plug) const;
|
||||||
|
public: virtual void _SetNextElement(Plug* plug, Plug* nextPlug) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
public: class SharedPathMap : public IntrusiveMap<const SharedPath*, SharedPath> {
|
||||||
|
// *****************************************************************************
|
||||||
|
|
||||||
|
public: typedef IntrusiveMap<const SharedPath*, SharedPath> Inherit;
|
||||||
|
|
||||||
|
public: SharedPathMap();
|
||||||
|
|
||||||
|
public: virtual const SharedPath* _GetKey(SharedPath* sharedPath) const;
|
||||||
|
public: virtual unsigned _GetHashValue(const SharedPath* tailSharedPath) const;
|
||||||
|
public: virtual SharedPath* _GetNextElement(SharedPath* sharedPath) const;
|
||||||
|
public: virtual void _SetNextElement(SharedPath* sharedPath, SharedPath* nextSharedPath) const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Cell* _cell;
|
||||||
|
private: Name _name;
|
||||||
|
private: Cell* _masterCell;
|
||||||
|
private: Transformation _transformation;
|
||||||
|
private: PlacementStatus _placementStatus;
|
||||||
|
private: PlugMap _plugMap;
|
||||||
|
private: SharedPathMap _sharedPathMap;
|
||||||
|
private: Instance* _nextOfCellInstanceMap;
|
||||||
|
private: Instance* _nextOfCellSlaveInstanceSet;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
protected: Instance(Cell* cell, const Name& name, Cell* masterCell, const Transformation& transformation, const PlacementStatus& placementstatus, bool secureFlag);
|
||||||
|
|
||||||
|
public: static Instance* Create(Cell* cell, const Name& name, Cell* masterCell, bool secureFlag = true);
|
||||||
|
public: static Instance* Create(Cell* cell, const Name& name, Cell* masterCell, const Transformation& transformation, const PlacementStatus& placementstatus, bool secureFlag = true);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: virtual Cell* GetCell() const {return _cell;};
|
||||||
|
public: virtual Box GetBoundingBox() const;
|
||||||
|
public: const Name& GetName() const {return _name;};
|
||||||
|
public: Cell* GetMasterCell() const {return _masterCell;};
|
||||||
|
public: const Transformation& GetTransformation() const {return _transformation;};
|
||||||
|
public: const PlacementStatus& GetPlacementStatus() const {return _placementStatus;};
|
||||||
|
public: Plug* GetPlug(const Net* masterNet) const {return _plugMap.GetElement(masterNet);};
|
||||||
|
public: Plugs GetPlugs() const {return _plugMap.GetElements();};
|
||||||
|
public: Plugs GetConnectedPlugs() const;
|
||||||
|
public: Plugs GetUnconnectedPlugs() const;
|
||||||
|
public: Path GetPath(const Path& tailPath = Path()) const;
|
||||||
|
public: Box GetAbutmentBox() const;
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: bool IsUnplaced() const {return _placementStatus == PlacementStatus::UNPLACED;};
|
||||||
|
public: bool IsPlaced() const {return _placementStatus == PlacementStatus::PLACED;};
|
||||||
|
public: bool IsFixed() const {return _placementStatus == PlacementStatus::FIXED;};
|
||||||
|
public: bool IsTerminal() const;
|
||||||
|
public: bool IsLeaf() const;
|
||||||
|
|
||||||
|
// Filters
|
||||||
|
// *******
|
||||||
|
|
||||||
|
public: static InstanceFilter GetIsUnderFilter(const Box& area);
|
||||||
|
public: static InstanceFilter GetIsTerminalFilter();
|
||||||
|
public: static InstanceFilter GetIsLeafFilter();
|
||||||
|
public: static InstanceFilter GetIsUnplacedFilter();
|
||||||
|
public: static InstanceFilter GetIsPlacedFilter();
|
||||||
|
public: static InstanceFilter GetIsFixedFilter();
|
||||||
|
public: static InstanceFilter GetIsNotUnplacedFilter();
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: virtual void Materialize();
|
||||||
|
public: virtual void Unmaterialize();
|
||||||
|
public: virtual void Invalidate(bool propagateFlag = true);
|
||||||
|
public: virtual void Translate(const Unit& dx, const Unit& dy);
|
||||||
|
|
||||||
|
public: void SetName(const Name& name);
|
||||||
|
public: void SetTransformation(const Transformation& transformation);
|
||||||
|
public: void SetPlacementStatus(const PlacementStatus& placementstatus);
|
||||||
|
public: void SetMasterCell(Cell* masterCell, bool secureFlag = true);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
protected: virtual void _PostCreate();
|
||||||
|
|
||||||
|
protected: virtual void _PreDelete();
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const {return _TName("Instance");};
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
public: virtual Record* _GetRecord() const;
|
||||||
|
public: PlugMap& _GetPlugMap() {return _plugMap;};
|
||||||
|
public: SharedPath* _GetSharedPath(const SharedPath* tailSharedPath) const {return _sharedPathMap.GetElement(tailSharedPath);}
|
||||||
|
public: SharedPathes _GetSharedPathes() const {return _sharedPathMap.GetElements();};
|
||||||
|
public: SharedPathMap& _GetSharedPathMap() {return _sharedPathMap;};
|
||||||
|
public: Instance* _GetNextOfCellInstanceMap() const {return _nextOfCellInstanceMap;};
|
||||||
|
public: Instance* _GetNextOfCellSlaveInstanceSet() const {return _nextOfCellSlaveInstanceSet;};
|
||||||
|
|
||||||
|
public: void _SetNextOfCellInstanceMap(Instance* instance) {_nextOfCellInstanceMap = instance;};
|
||||||
|
public: void _SetNextOfCellSlaveInstanceSet(Instance* instance) {_nextOfCellSlaveInstanceSet = instance;};
|
||||||
|
|
||||||
|
//public: void _DrawPhantoms(View* view, const Box& updateArea, const Transformation& transformation);
|
||||||
|
//public: void _DrawBoundaries(View* view, const Box& updateArea, const Transformation& transformation);
|
||||||
|
//public: void _DrawRubbers(View* view, const Box& updateArea, const Transformation& transformation);
|
||||||
|
//public: void _DrawMarkers(View* view, const Box& updateArea, const Transformation& transformation);
|
||||||
|
//public: void _DrawDisplaySlots(View* view, const Box& area, const Box& updateArea, const Transformation& transformation);
|
||||||
|
|
||||||
|
//public: virtual bool _IsInterceptedBy(View* view, const Point& point, const Unit& aperture) const;
|
||||||
|
//public: virtual void _Draw(View* view, BasicLayer* basicLayer, const Box& updateArea, const Transformation& transformation);
|
||||||
|
//public: virtual void _Highlight(View* view, const Box& updateArea, const Transformation& transformation);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Class : "Proxy...<const Instance::PlacementStatus::Code*>".
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyTypeName<Instance::PlacementStatus::Code>
|
||||||
|
( const Instance::PlacementStatus::Code* object )
|
||||||
|
{ return "<PointerSlotAdapter<Instance::PlacementStatus::Code>>"; }
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline string ProxyString <Instance::PlacementStatus::Code>
|
||||||
|
( const Instance::PlacementStatus::Code* object )
|
||||||
|
{
|
||||||
|
switch ( *object ) {
|
||||||
|
case Instance::PlacementStatus::UNPLACED: return "PLACED";
|
||||||
|
case Instance::PlacementStatus::PLACED: return "PLACED";
|
||||||
|
case Instance::PlacementStatus::FIXED: return "FIXED";
|
||||||
|
}
|
||||||
|
return "ABNORMAL";
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
inline Record* ProxyRecord <Instance::PlacementStatus::Code>
|
||||||
|
( const Instance::PlacementStatus::Code* object )
|
||||||
|
{
|
||||||
|
Record* record = new Record(GetString(object));
|
||||||
|
record->Add(GetSlot("Code", (unsigned int*)object));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::Instance)
|
||||||
|
|
||||||
|
#endif // HURRICANE_INSTANCE
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,62 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Instances.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_INSTANCES
|
||||||
|
#define HURRICANE_INSTANCES
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
class Instance;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Instances declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<Instance*> Instances;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// InstanceLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<Instance*> InstanceLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// InstanceFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<Instance*> InstanceFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_instance declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_instance(instance, instances)\
|
||||||
|
/*********************************************/\
|
||||||
|
{\
|
||||||
|
InstanceLocator _locator = instances.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
Instance* instance = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_INSTANCES
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,55 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Interruption.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Interruption.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Interruption implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Interruption::Interruption(const string& reason, int code)
|
||||||
|
// *******************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_reason(reason),
|
||||||
|
_code(code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Interruption::Interruption(const Interruption& interruption)
|
||||||
|
// *********************************************************
|
||||||
|
: Inherit(),
|
||||||
|
_reason(interruption._reason),
|
||||||
|
_code(interruption._code)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Interruption& Interruption::operator=(const Interruption& interruption)
|
||||||
|
// ********************************************************************
|
||||||
|
{
|
||||||
|
_reason = interruption._reason;
|
||||||
|
_code = interruption._code;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
string Interruption::_GetString() const
|
||||||
|
// ************************************
|
||||||
|
{
|
||||||
|
if (!_code) return "[INTERRUPTION] " + _reason;
|
||||||
|
|
||||||
|
return "[INTERRUPTION:" + GetString(_code) + "] " + _reason;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,71 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Interruption.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_INTERRUPTION
|
||||||
|
#define HURRICANE_INTERRUPTION
|
||||||
|
|
||||||
|
#include "Exception.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Interruption declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Interruption : public Exception {
|
||||||
|
// **********************************
|
||||||
|
|
||||||
|
// Types
|
||||||
|
// *****
|
||||||
|
|
||||||
|
public: typedef Exception Inherit;
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: string _reason;
|
||||||
|
private: int _code;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: Interruption(const string& reason, int code = 0);
|
||||||
|
|
||||||
|
public: Interruption(const Interruption& interruption);
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: Interruption& operator=(const Interruption& interruption);
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: string GetReason() const {return _reason;};
|
||||||
|
public: int GetCode() const {return _code;};
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: virtual string _GetTypeName() const { return _TName("Interruption"); };
|
||||||
|
public: virtual string _GetString() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
SetNestedSlotAdapter(Hurricane::Interruption)
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HURRICANE_INTERRUPTION
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,232 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Interval.cpp
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#include "Interval.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Interval implementation
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
Interval::Interval(bool makeEmpty)
|
||||||
|
// *******************************
|
||||||
|
: _vMin(1),
|
||||||
|
_vMax(-1)
|
||||||
|
{
|
||||||
|
if (!makeEmpty) {
|
||||||
|
_vMin = UNIT_MIN;
|
||||||
|
_vMax = UNIT_MAX;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval::Interval(const Unit& value)
|
||||||
|
// **********************************
|
||||||
|
: _vMin(value),
|
||||||
|
_vMax(value)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval::Interval(const Unit& v1, const Unit& v2)
|
||||||
|
// ***********************************************
|
||||||
|
: _vMin(min(v1, v2)),
|
||||||
|
_vMax(max(v1, v2))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval::Interval(const Interval& interval)
|
||||||
|
// *****************************************
|
||||||
|
: _vMin(interval._vMin),
|
||||||
|
_vMax(interval._vMax)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval& Interval::operator=(const Interval& interval)
|
||||||
|
// ****************************************************
|
||||||
|
{
|
||||||
|
_vMin = interval._vMin;
|
||||||
|
_vMax = interval._vMax;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Interval::operator==(const Interval& interval) const
|
||||||
|
// ******************************************************
|
||||||
|
{
|
||||||
|
return !IsEmpty() && !interval.IsEmpty() && (_vMin == interval._vMin) && (_vMax == interval._vMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Interval::operator!=(const Interval& interval) const
|
||||||
|
// ******************************************************
|
||||||
|
{
|
||||||
|
return IsEmpty() || interval.IsEmpty() || (_vMin != interval._vMin) || (_vMax != interval._vMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval Interval::GetUnion(const Interval& interval) const
|
||||||
|
// ********************************************************
|
||||||
|
{
|
||||||
|
if (IsEmpty() && interval.IsEmpty()) return Interval();
|
||||||
|
return Interval(min(_vMin, interval._vMin), max(_vMax, interval._vMax));
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval Interval::GetIntersection(const Interval& interval) const
|
||||||
|
// ***************************************************************
|
||||||
|
{
|
||||||
|
if (!Intersect(interval)) return Interval();
|
||||||
|
return Interval(max(_vMin, interval._vMin), min(_vMax, interval._vMax));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Interval::IsEmpty() const
|
||||||
|
// ***************************
|
||||||
|
{
|
||||||
|
return (_vMax < _vMin);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Interval::IsPonctual() const
|
||||||
|
// ******************************
|
||||||
|
{
|
||||||
|
return (_vMax == _vMin);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Interval::Contains(const Unit& v) const
|
||||||
|
// *****************************************
|
||||||
|
{
|
||||||
|
return !IsEmpty() && (_vMin <= v) && (v <= _vMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Interval::Contains(const Interval& interval) const
|
||||||
|
// ****************************************************
|
||||||
|
{
|
||||||
|
return !IsEmpty() && !interval.IsEmpty() && (_vMin <= interval._vMin) && (interval._vMax <= _vMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Interval::Intersect(const Interval& interval) const
|
||||||
|
// *****************************************************
|
||||||
|
{
|
||||||
|
return !IsEmpty() && !interval.IsEmpty() && !((_vMax < interval._vMin) || (interval._vMax < _vMin));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Interval::Inferior(const Interval& interval, bool strict) const
|
||||||
|
// *****************************************************************
|
||||||
|
{
|
||||||
|
if (_vMax < interval._vMin) return true;
|
||||||
|
return !strict && (_vMax == interval._vMin);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Interval::Superior(const Interval& interval, bool strict) const
|
||||||
|
// *****************************************************************
|
||||||
|
{
|
||||||
|
if (_vMin > interval._vMax) return true;
|
||||||
|
return !strict && (_vMin == interval._vMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Interval::IsConstrainedBy(const Interval& interval) const
|
||||||
|
// ***********************************************************
|
||||||
|
{
|
||||||
|
return (!IsEmpty() &&
|
||||||
|
!interval.IsEmpty() &&
|
||||||
|
((_vMin == interval.GetVMin()) || (_vMax == interval.GetVMax())));
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval& Interval::MakeEmpty()
|
||||||
|
// ****************************
|
||||||
|
{
|
||||||
|
_vMin = 1;
|
||||||
|
_vMax = -1;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval& Interval::Inflate(const Unit& dv)
|
||||||
|
// ****************************************
|
||||||
|
{
|
||||||
|
return Inflate(dv, dv);
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval& Interval::Inflate(const Unit& dvMin, const Unit& dvMax)
|
||||||
|
// **************************************************************
|
||||||
|
{
|
||||||
|
if (!IsEmpty()) {
|
||||||
|
_vMin -= dvMin;
|
||||||
|
_vMax += dvMax;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval& Interval::Merge(const Unit& v)
|
||||||
|
// *************************************
|
||||||
|
{
|
||||||
|
if (IsEmpty()) {
|
||||||
|
_vMin = v;
|
||||||
|
_vMax = v;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_vMin = min(_vMin, v);
|
||||||
|
_vMax = max(_vMax, v);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval& Interval::Merge(const Interval& interval)
|
||||||
|
// ************************************************
|
||||||
|
{
|
||||||
|
if (!interval.IsEmpty()) {
|
||||||
|
_vMin = min(_vMin, interval._vMin);
|
||||||
|
_vMax = max(_vMax, interval._vMax);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval& Interval::Intersection(const Unit& vMin, const Unit& vMax)
|
||||||
|
// *****************************************************************
|
||||||
|
{
|
||||||
|
return Intersection(Interval(vMin,vMax));
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval& Interval::Intersection(const Interval& interval)
|
||||||
|
// *******************************************************
|
||||||
|
{
|
||||||
|
if (!Intersect(interval)) MakeEmpty();
|
||||||
|
else {
|
||||||
|
_vMin = max(_vMin, interval._vMin);
|
||||||
|
_vMax = min(_vMax, interval._vMax);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Interval& Interval::Translate(const Unit& dv)
|
||||||
|
// ******************************************
|
||||||
|
{
|
||||||
|
if (!IsEmpty()) {
|
||||||
|
_vMin += dv;
|
||||||
|
_vMax += dv;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
string Interval::_GetString() const
|
||||||
|
// ********************************
|
||||||
|
{
|
||||||
|
return "<" + _TName("Interval") + " " + GetValueString(_vMin) + " " + GetValueString(_vMax) + ">";
|
||||||
|
}
|
||||||
|
|
||||||
|
Record* Interval::_GetRecord() const
|
||||||
|
// ***************************
|
||||||
|
{
|
||||||
|
Record* record = new Record(GetString(this));
|
||||||
|
record->Add(GetSlot("VMin", &_vMin));
|
||||||
|
record->Add(GetSlot("VMin", &_vMax));
|
||||||
|
return record;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,103 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Interval.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_INTERVAL
|
||||||
|
#define HURRICANE_INTERVAL
|
||||||
|
|
||||||
|
#include "Unit.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Interval declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
class Interval {
|
||||||
|
// ***********
|
||||||
|
|
||||||
|
// Attributes
|
||||||
|
// **********
|
||||||
|
|
||||||
|
private: Unit _vMin;
|
||||||
|
private: Unit _vMax;
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
// ************
|
||||||
|
|
||||||
|
public: Interval(bool makeEmpty=true);
|
||||||
|
public: Interval(const Unit& v);
|
||||||
|
public: Interval(const Unit& v1, const Unit& v2);
|
||||||
|
public: Interval(const Interval& interval);
|
||||||
|
|
||||||
|
// Operators
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: Interval& operator=(const Interval& interval);
|
||||||
|
|
||||||
|
public: bool operator==(const Interval& interval) const;
|
||||||
|
public: bool operator!=(const Interval& interval) const;
|
||||||
|
|
||||||
|
// Accessors
|
||||||
|
// *********
|
||||||
|
|
||||||
|
public: const Unit& GetVMin() const {return _vMin;};
|
||||||
|
public: const Unit& GetVMax() const {return _vMax;};
|
||||||
|
public: Unit& GetVMin() {return _vMin;};
|
||||||
|
public: Unit& GetVMax() {return _vMax;};
|
||||||
|
public: Unit GetCenter() const {return ((_vMin + _vMax) / 2);};
|
||||||
|
public: Unit GetSize() const {return (_vMax - _vMin);};
|
||||||
|
public: Unit GetHalfSize() const {return (GetSize() / 2);};
|
||||||
|
public: Interval GetUnion(const Interval& interval) const;
|
||||||
|
public: Interval GetIntersection(const Interval& interval) const;
|
||||||
|
|
||||||
|
// Predicates
|
||||||
|
// **********
|
||||||
|
|
||||||
|
public: bool IsEmpty() const;
|
||||||
|
public: bool IsPonctual() const;
|
||||||
|
public: bool Contains(const Unit& v) const;
|
||||||
|
public: bool Contains(const Interval& interval) const;
|
||||||
|
public: bool Intersect(const Interval& interval) const;
|
||||||
|
public: bool Inferior(const Interval& interval, bool strict=true) const;
|
||||||
|
public: bool Superior(const Interval& interval, bool strict=true) const;
|
||||||
|
public: bool IsConstrainedBy(const Interval& interval) const;
|
||||||
|
|
||||||
|
// Updators
|
||||||
|
// ********
|
||||||
|
|
||||||
|
public: Interval& MakeEmpty();
|
||||||
|
public: Interval& Inflate(const Unit& dv);
|
||||||
|
public: Interval& Inflate(const Unit& dvMin, const Unit& dvMax);
|
||||||
|
public: Interval& Merge(const Unit& v);
|
||||||
|
public: Interval& Merge(const Interval& interval);
|
||||||
|
public: Interval& Intersection(const Unit& vMin, const Unit& vMax);
|
||||||
|
public: Interval& Intersection(const Interval& interval);
|
||||||
|
public: Interval& Translate(const Unit& dv);
|
||||||
|
|
||||||
|
// Others
|
||||||
|
// ******
|
||||||
|
|
||||||
|
public: string _GetTypeName() const { return _TName("Interval"); };
|
||||||
|
public: string _GetString() const;
|
||||||
|
public: Record* _GetRecord() const;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
|
||||||
|
ValueIOStreamSupport(Hurricane::Interval)
|
||||||
|
|
||||||
|
|
||||||
|
#endif // HURRICANE_INTERVAL
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
|
@ -0,0 +1,61 @@
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// File: Intervals.h
|
||||||
|
// Authors: R. Escassut
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#ifndef HURRICANE_INTERVALS
|
||||||
|
#define HURRICANE_INTERVALS
|
||||||
|
|
||||||
|
#include "Collection.h"
|
||||||
|
#include "Interval.h"
|
||||||
|
|
||||||
|
namespace Hurricane {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Intervals declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericCollection<Interval> Intervals;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// IntervalLocator declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericLocator<Interval> IntervalLocator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// IntervalFilter declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
typedef GenericFilter<Interval> IntervalFilter;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// for_each_interval declaration
|
||||||
|
// ****************************************************************************************************
|
||||||
|
|
||||||
|
#define for_each_interval(interval, intervals)\
|
||||||
|
/*********************************************/\
|
||||||
|
{\
|
||||||
|
IntervalLocator _locator = intervals.GetLocator();\
|
||||||
|
while (_locator.IsValid()) {\
|
||||||
|
Interval interval = _locator.GetElement();\
|
||||||
|
_locator.Progress();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} // End of Hurricane namespace.
|
||||||
|
|
||||||
|
#endif // HURRICANE_INTERVALS
|
||||||
|
|
||||||
|
// ****************************************************************************************************
|
||||||
|
// Copyright (c) BULL S.A. 2000-2004, All Rights Reserved
|
||||||
|
// ****************************************************************************************************
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue