* ./hurricane/src/hviewer,

./coriolis/src/crlcore,
     ./coriolis/src/knik,
     ./coriolis/src/katabatic,
     ./coriolis/src/kite,
     ./coriolis/src/equinox,
     ./coriolis/src/solstice,
     ./coriolis/src/ispd:
     - SVN MOVE: Source tree simplification & uniformisation. Now all tools
         are at the same level, directly under the root of the repository.
         No more "coriolis/src".
This commit is contained in:
Jean-Paul Chaput 2010-03-09 15:23:58 +00:00
parent c5d8077730
commit 5f59d39713
119 changed files with 945036 additions and 0 deletions

40
knik/CMakeLists.txt Normal file
View File

@ -0,0 +1,40 @@
PROJECT(KNIK)
CMAKE_MINIMUM_REQUIRED(VERSION 2.4.0)
IF(APPLE)
EXECUTE_PROCESS(
COMMAND sw_vers -productVersion
OUTPUT_VARIABLE OSX_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE)
MESSAGE(STATUS "OSX_VERSION='${OSX_VERSION}'")
IF(${OSX_VERSION} MATCHES "^10\\.[012345]\\.?")
MESSAGE(STATUS "OSX < 10.6")
ELSE(${OSX_VERSION} MATCHES "^10\\.[012345]\\.?")
SET(CMAKE_OSX_ARCHITECTURES "i386;ppc") # for QT4.5 32bits on snow leopard
ENDIF(${OSX_VERSION} MATCHES "^10\\.[012345]\\.?")
ENDIF(APPLE)
SET(CMAKE_C_FLAGS_DEBUG "-g -Wall" CACHE STRING "Debug options." FORCE)
SET(CMAKE_CXX_FLAGS_DEBUG "-g -Wall" CACHE STRING "Debug options." FORCE)
#SET(CMAKE_LINKER_FLAGS_DEBUG "-pg" CACHE STRING "Debug options." FORCE)
#SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "-pg" CACHE STRING "Debug options." FORCE)
#SET(CMAKE_MODULE_LINKER_FLAGS_DEBUG "-pg" CACHE STRING "Debug options." FORCE)
#SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "-pg" CACHE STRING "Debug options." FORCE)
IF(COMMAND CMAKE_POLICY)
CMAKE_POLICY(SET CMP0003 NEW)
ENDIF(COMMAND CMAKE_POLICY)
SET(CMAKE_MODULE_PATH "$ENV{HURRICANE_TOP}/share/cmake_modules/")
SET(QT_USE_QTXML "true")
FIND_PACKAGE(Qt4 REQUIRED) # find and setup Qt4 for this project
FIND_PACKAGE(HURRICANE REQUIRED)
FIND_PACKAGE(CORIOLIS REQUIRED)
SET_LIB_LINK_MODE()
ADD_SUBDIRECTORY(src)
ADD_SUBDIRECTORY(cmake_modules)

View File

@ -0,0 +1 @@
install ( FILES FindKNIK.cmake DESTINATION /share/cmake_modules )

View File

@ -0,0 +1,64 @@
# - Find the Knik includes and libraries.
# The following variables are set if Coriolis is found. If KNIK is not
# found, KNIK_FOUND is set to false.
# KNIK_FOUND - True when the Coriolis include directory is found.
# KNIK_INCLUDE_DIR - the path to where the Coriolis include files are.
# KNIK_LIBRARIES - The path to where the Coriolis library files are.
SET(KNIK_INCLUDE_PATH_DESCRIPTION "directory containing the Knik/flute include files. E.g /usr/local/include/coriolis or /asim/coriolis/include/coriolis")
SET(KNIK_DIR_MESSAGE "Set the KNIK_INCLUDE_DIR cmake cache entry to the ${KNIK_INCLUDE_PATH_DESCRIPTION}")
# don't even bother under WIN32
IF(UNIX)
SET(KNIK_DIR_SEARCH $ENV{CORIOLIS_TOP} $ENV{HURRICANE_TOP})
#
# Look for an installation.
#
FIND_PATH(KNIK_INCLUDE_PATH NAMES knik/KnikEngine.h PATHS
# Look in other places.
${KNIK_DIR_SEARCH}
PATH_SUFFIXES include/coriolis
# Help the user find it if we cannot.
DOC "The ${KNIK_INCLUDE_PATH_DESCRIPTION}"
)
FIND_LIBRARY(KNIK_LIBRARY_PATH
NAMES knik
PATHS ${KNIK_DIR_SEARCH}
PATH_SUFFIXES lib
# Help the user find it if we cannot.
DOC "The ${KNIK_INCLUDE_PATH_DESCRIPTION}"
)
FIND_LIBRARY(KNIK_STATIC_LIBRARY_PATH
NAMES knik-static
PATHS ${KNIK_DIR_SEARCH}
PATH_SUFFIXES lib
# Help the user find it if we cannot.
DOC "The ${KNIK_INCLUDE_PATH_DESCRIPTION}"
)
FIND_LIBRARY(FLUTE_LIBRARY_PATH
NAMES flute
PATHS ${KNIK_DIR_SEARCH}
PATH_SUFFIXES lib
# Help the user find it if we cannot.
DOC "The ${KNIK_INCLUDE_PATH_DESCRIPTION}"
)
FIND_LIBRARY(FLUTE_STATIC_LIBRARY_PATH
NAMES flute-static
PATHS ${KNIK_DIR_SEARCH}
PATH_SUFFIXES lib
# Help the user find it if we cannot.
DOC "The ${KNIK_INCLUDE_PATH_DESCRIPTION}"
)
SET_LIBRARIES_PATH(KNIK FLUTE)
SET_LIBRARIES_PATH(KNIK KNIK)
HURRICANE_CHECK_LIBRARIES(KNIK)
ENDIF(UNIX)

428
knik/doc/ASIM.css Normal file
View File

@ -0,0 +1,428 @@
/*
* x-----------------------------------------------------------------x
* | HTML Standart Tags |
* x-----------------------------------------------------------------x
*/
html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 {
font-size: 96%;
font-family: verdana, sans-serif;
}
body {
color: black;
background: white;
background-color: white;
background-position: top left;
background-attachment: fixed;
background-repeat: no-repeat;
margin-top: 2em;
margin-right: 8%;
margin-left: 8%;
}
hr {
height: 1px;
border: 0;
color: #004400;
background-color: #004400;
}
h1, h2, h3, h4, h5, h6 {
font-family: verdana, sans-serif;
}
h1 { text-align: center; }
h2, h3, h4, h5, h6 { text-align: left;
padding-top: 2em;
}
h1, h2, h3 { font-family: "Trebuchet MS", sans-serif;
color: #09550B;
}
h1 { font-weight: bold; font-size: 170%; }
h2 { font-weight: bold; font-size: 140%; }
h3 { font-weight: bold; font-size: 118%; }
h4 { font-weight: bold; font-size: 100%; }
h5 { font-style: italic; font-size: 100%; }
h6 { font-variant: small-caps; font-size: 100%; }
.hide {
display: none;
color: white;
}
p {
margin-top: 0.6em;
margin-bottom: 0.6em;
margin-left: 0.0em;
margin-right: 0.0em;
}
address {
text-align: right;
font-weight: bold;
font-style: italic;
font-size: 80%;
}
caption { font-weight: bold }
blockquote {
margin-left: 4em;
margin-right: 4em;
margin-top: 0.8em;
margin-bottom: 0.8em;
font-style: italic;
color: #003300;
}
blockquote p {
margin-bottom: 0;
}
blockquote address {
margin: 0;
}
table {
border-collapse: collapse;
}
dt, dd { margin-top: 0; margin-bottom: 0; }
dt { font-weight: bold; }
pre, tt, code {
font-family: "andale mono", monospace;
font-size: 100%;
white-space: pre;
}
pre {
font-size: 80%;
border: solid;
border-width: thin;
border-color: #003300;
background-color: #EEEEEE;
padding: 0.5em;
margin-left: 2em;
margin-right: 2em
}
tt { color: green; }
em { font-style: italic; font-weight: bold; }
strong { font-weight: bold; }
span.textit { font-style: italic; }
span.textbf { font-weight: bold; }
.small { font-size: 90%; }
.white { color: #FFFFFF; }
ul.toc {
list-style: disc;
list-style: none;
}
a:link img, a:visited img { border-style: none; }
a img { color: white; }
a:link, a:active, a:visited {
color: #09550B;
text-decoration: none;
}
a:hover, a:focus {
color: #FF9900;
text-decoration: underline;
}
/*
* x-----------------------------------------------------------------x
* | Doxygen Specific Classes |
* x-----------------------------------------------------------------x
*/
/* -------------------------------------------------------------------
* Header & Footer Classes (customized top page navigation bar).
*/
h1.header {
font-size: 200%;
font-family: times, verdana, sans-serif;
}
center.header {
background-color: #CCE6CA;
}
table.header {
/*width: 100%;*/
/*background-color: #EEEEEE;*/
background-color: #CCE6CA;
}
table.header td {
padding: 2px 14px;
text-align: center;
font-weight: bold;
font-family: verdana, sans-serif;
font-size: 110%;
}
table.footer1, table.footer2 { width: 100%; }
td.LFooter { text-align: left; }
td.RFooter { text-align: right; }
td.CFooter { text-align: center;}
table.footer2 td.RFooter { font-weight: bold; width: 35% }
table.footer2 td.CFooter { width: 30% }
table.footer2 td.LFooter { font-weight: bold; width: 35%; font-family: time; }
div.ah {
font-family: time;
font-size: 250%;
}
/* -------------------------------------------------------------------
* Quick Index Class (top page navigation bar).
*/
div.qindex, div.nav {
width: 100%-4px;
/*background-color: #DADAEF;*/
/*background-color: #eeeeff;*/
/*background-color: #EEEEEE;*/
background-color: #CCE6CA;
border: 0px solid #003300;
text-align: center;
margin: 0px;
padding: 2px;
line-height: 140%;
}
a.qindex, a.qindex:visited, a.qindex:hover, a.qindexHL, a.el, a.elRef {
text-decoration: none;
font-weight: bold;
}
a.qindex, a.qindex:visited {
color: #09550B;
}
a.qindex:hover {
background-color: #ddddff;
}
a.qindexHL, a.qindexHL:hover, a.qindexHL:visited {
background-color: #0c780c;
color: #ffffff;
border: 1px double #9295C2;
}
a.code:link, a.code:visited, a.codeRef:link, a.codeRef:visited {
text-decoration: none;
font-weight: normal;
color: #0000ff;
}
.indexkey {
background-color: #eeeeff;
border: 1px solid #b0b0b0;
padding: 2px 15px;
}
.indexkey, .indexvalue {
background-color: #eeeeff;
border: 1px solid #b0b0b0;
padding: 2px 15px;
}
.indexkey {
width: 40%;
}
.indexvalue {
width: 80%;
}
h3 a[name="index__"],
h3 a[name="index_a"],
h3 a[name="index_b"],
h3 a[name="index_c"],
h3 a[name="index_d"],
h3 a[name="index_e"],
h3 a[name="index_f"],
h3 a[name="index_g"],
h3 a[name="index_h"],
h3 a[name="index_i"],
h3 a[name="index_j"],
h3 a[name="index_k"],
h3 a[name="index_l"],
h3 a[name="index_m"],
h3 a[name="index_n"],
h3 a[name="index_o"],
h3 a[name="index_p"],
h3 a[name="index_q"],
h3 a[name="index_r"],
h3 a[name="index_s"],
h3 a[name="index_t"],
h3 a[name="index_u"],
h3 a[name="index_v"],
h3 a[name="index_w"],
h3 a[name="index_x"],
h3 a[name="index_y"],
h3 a[name="index_z"],
h3 a[name="index_0"],
h3 a[name="index_1"],
h3 a[name="index_2"],
h3 a[name="index_3"],
h3 a[name="index_4"],
h3 a[name="index_5"],
h3 a[name="index_6"],
h3 a[name="index_7"],
h3 a[name="index_8"],
h3 a[name="index_9"]
{
font-family: time;
font-size: 250%;
}
/* -------------------------------------------------------------------
* Verbatim Source Code / Examples.
*/
pre.fragment { background-color: #EEEEEE; }
span.keyword { color: #008000 }
span.keywordtype { color: #604020 }
span.keywordflow { color: #e08000 }
span.comment { color: #800000 }
span.preprocessor { color: #806020 }
span.stringliteral { color: #002080 }
span.charliteral { color: #008080 }
/* -------------------------------------------------------------------
* Attributes Listing.
*/
.mdTable {
/*border: 1px solid #868686;*/
/*background-color: #DADAEF;*/
/*background-color: #F4F4FB;*/
border: 1px none #008500;
border-left-width: 4px;
border-left-style: solid;
/*background-color: #B8E6B8;*/
background-color: #CCE6CA;
margin-top: 25px;
font-size: 105%;
}
.mdRow {
padding: 5px 10px;
}
/* This Mozilla/Firefox bug has been corrected from v1.5.
* .mdname1 {
* padding: 3px 0px 0px 0px;
* }
*/
.mdescLeft, .mdescRight {
padding: 0px 8px 4px 8px;
font-size: 11px;
font-style: italic;
/*background-color: #FAFAFA;*/
border-top: 1px none #E0E0E0;
border-right: 1px none #E0E0E0;
border-bottom: 1px none #E0E0E0;
border-left: 1px none #E0E0E0;
margin: 0px;
}
.memitem {
margin-bottom: 30px;
border: 1px none #008500;
border-left-width: 4px;
border-left-style: solid;
background-color: #ECFFEC;
}
.memproto {
background-color: #CCE6CA;
}
.memname {
white-space: nowrap;
padding-left: 5px;
font-size: 105%;
}
.memdoc{
padding-left: 20px;
}
.memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight {
padding: 1px 0px 0px 8px;
margin: 4px;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
border-top-color: #0c0c0c;
border-right-color: #0c0c0c;
border-bottom-color: #0c0c0c;
border-left-color: #0c0c0c;
border-top-style: solid;
border-right-style: none;
border-bottom-style: none;
border-left-style: none;
/*background-color: #DADAEF;*/
/*background-color: #eeeeff;*/
/*background-color: #EEEEEE;*/
background-color: #CCE6CA;
}
.memTemplItemLeft, .memTemplItemRight {
border-bottom-width: 2px;
border-bottom-style: solid;
font-weight: bold;
}
.memItemLeft { font-size: 11px; }
.memItemRight { font-size: 12px; }
.memTemplItemLeft { font-size: 11px; }
.memTemplItemRight { font-size: 12px; }
.memTemplParams {
color: #FFFFFF;
background-color: #000000;
font-size: 11px;
font-weight: bold;
}
.groupText, .groupHeader {
color: #09550B;
margin-top: 15px;
font-size: 130%;
font-weight: bold;
}

347
knik/doc/Edge.dox Normal file
View File

@ -0,0 +1,347 @@
// -*- C++ -*-
namespace KNIK {
/*! \class Edge
* \brief A routing graph edge.\n
* - \ref EdgeAttributes "Attributes"
* - \ref EdgeAccessors "Accessors"
* - \ref EdgeModifiers "Modifiers"
* - \ref EdgePredicates "Predicates"
*
* The Edge was written to be a light object which simplifies the way the routing graph is covered.
* Edges are thus separated into two sub-classes : VEdge and HEdge respectively representing vertical edge and
* horizontal edge.
*
* Considering one vertex \b V, we define 4 types of edge :
* <ul>
* <li> HEdgeOut: a Horizontal Edge linking \b V to a vertex \e w
* <li> VEdgeOut: a Vertical Edge linking \b V to a vertex \e x
* <li> HEdgeIn: a Horizontal Edge linking a vertex \e y to \b V
* <li> VEdgeIn: a Vertical Edge linking a vertex \e z to \b V
* </ul>
*
* \section secEdgeImplementation Edge Implementation
* The Global Router CEngine uses a technique based on routing graph and thus relies on another
* CEngine : Nimbus.
*/
/*! \anchor EdgeAttributes Attributes
* \name
*/
// \{
/*! \var Fence* Edge::_fence
* The corresponding fence in the partitionning
*
* \Initial by constructor
*/
/*! \var Splitter* Edge::_splitter
* The fence may already have a splitter associted with current net
*
* \Initial \NULL
*/
/*! \var Vertex* Edge::_from
* The source vertex
*
* \Initial by constructor
*/
/*! \var Edge* Edge::_nextFrom
* Next edge of the same type and with the same source vertex
*
* \Initial \NULL
*/
/*! \var Vertex* Edge::_to
* The target vertex
*
* \Initial by constructor
*/
/*! \var Edge* Edge::_nextTo
* Next edge of the same type and with the same target vertex
*
* \Initial \NULL
*/
/*! \var int Edge::_connexID
* The identification flag for connex component
*
* \Initial \p -1
* \see \ref grpConnexID
*/
/*! \var float Edge::_cost
* The cost of the edge
*
* \Initial \p 0.0
* \see Edge::GetCost
*/
/*! \var unsigned Edge::_capacity
* The capacity of the edge which is the copy of the fence capacity based on the routing ressources
*
* \Initial \p 0
*/
/*! \var unsigned Edge::_realOccupancy
* The occupancy of the edge based on the routed nets
*
* \Initial \p 0
*/
/*! \var float Edge::_estimateOccupancy
* The estimated occupancy of the edge based on the estimation technique
*
* \Initial \p 0.0
* \see Graph::UpdateEstimateCongestion
*/
/*! \var unsigned Edge::_netStamp
* The net stamp associated with the current net
*
* \Initial \p 0
* \see \ref grpNetStamp
*/
// \}
/*! \anchor EdgeAccessors Accessors
* \name
*/
// \{
/*! \function Nimbus::Fence* Edge::GetFence();
* \Return The corresponding Fence in the partitionning.
*/
/*! \function Vertex* Edge::GetFrom() const;
* \Return The source vertex of the edge.
*/
/*! \function Edge* Edge::GetNextFrom() const;
* \Return The next edge of the same type with the same source vertex if one exists, \NULL else.
*/
/*! \function Vertex* Edge::GetTo() const;
* \Return The target vertex of the edge.
*/
/*! \function Edge* Edge::GetNextTo() const;
* \Return The next edge of the same type with the same target vertex if one exists, \NULL else.
*/
/*! \function Edge* Edge::GetSplitter() const;
* \Return The splitter associated with the edge if one exists, \NULL else.
*/
/*! \function int* Edge::GetConnexID() const;
* \Return The ConnexID of the edge.
*/
/*! \function float* Edge::GetCapacity() const;
* \Return The capacity of the edge.
*/
/*! \function unsigned Edge::GetRealOccupancy() const;
* \return The occupancy of the edge based on the class member Edge::_realOccupancy
* \exception assert that Edge::_realOccupancy equals Edge::_fence->GetOccupancy()
*/
/*! \function unsigned Edge::GetNetStamp() const;
* \return The netStamp of the edge
* \see \ref grpNetStamp
*/
/*! \function Vertex* Edge::GetOpposite(const Vertex* v) const;
* \return The opposite vertex of the edge considering the one given as argument.
* \param v is the vertex of which we want to get the opposite one
* \exception assert that \e v is one of the 2 vertexes of the edge
*/
/*! \function float Edge::GetEstimateOccupancy() const;
* \return The estimated occupancy of the edge
* \note Althought the Edge::_realOccupancy is an \p unsigned \p int, the Edge::_estimateOccupancy is a \p float.
* \see Edge::GetCost
*/
/*! \function float Edge::GetCost ( Edge* arrivalEdge );
* \param arrivalEdge
* \return The cost of the edge Edge::_cost
*
* Edge::_cost is computed considering several variables:
* <ul>
* <li>\ref KNIK_USECONGESTION "__USE_CONGESTION__"
* <li>\ref KNIK_USESTATIC "__USE_STATIC_PRECONGESTION__"
* <li>\ref KNIK_USEDYNAMIC "__USE_DYNAMIC_PRECONGESTION__"
* </ul>
*
* <b>1st case: </b> None of the previous variables is defined :
*
* \code _cost = 1.0
* \endcode
*
* For <b>2nd</b> and <b>3rd case</b> the \ref KNIK_USECONGESTION "__USE_CONGESTION__" variable is defined which means that when
* computing the Edge::_cost the existing congestion is taken into account.
*
* The Edge::_cost is so computed according to a cost function such as the following exemple :
* \image html FonctionCout.png "Cost function for _cost"
* \image latex FonctionCout.pdf "Cost function for _cost" width=0.7\textwidth
*
* The corresponding code:
* \code
* float edge_capacity =(float)1.0;
* float edge_occupancy;
* float h = 9.0;
* float k = 30.0;
* ...
* _cost = 1.0 + (h / (1.0 + exp(-k * (edge_occupancy - edge_capacity))));
* \endcode
* The way \p edge_occupancy is computed depends on the variables defined :
*
* <b>2nd case: </b> only \ref KNIK_USECONGESTION "__USE_CONGESTION__" is defined :
* \code edge_occupancy = (float)GetRealOccupancy() / (float)_capacity;
* \endcode
*
* <b>3rd case: </b> \ref KNIK_USESTATIC "__USE_STATIC_PRECONGESTION__"
* or \ref KNIK_USEDYNAMIC "__USE_DYNAMIC_PRECONGESTION__" is defined :
* \code edge_occupancy = ((float)GetRealOccupancy() + GetEstimateOccupancy()) / (float)_capacity;
* \endcode
*
*/
/*! \function virtual Hook* Edge::GetSplitterHook ( Vertex* vertex ) = 0;
* \param vertex the vertex of the edge from which we want to get the splitter's hook
* \return The splitter's hook of the specified vertex
* \exception assert that Edge::_splitter exists
* \exception assert that the given vertex is Edge::_from or Edge::_to
* \note This function is pure virtual.
*/
// \}
/*! \anchor EdgeModifiers Modifiers
* \name
*/
// \{
/*! \function void Edge::SetNextFrom ( Edge* edge );
* \param edge is the next edge of the same type with the same source vertex
*/
/*! \function void Edge::SetNextTo ( Edge* edge );
* \param edge is the next edge of the same type with the same target vertex
*/
/*! \function void Edge::SetSplitter ( Splitter* splitter );
* \param splitter is the splitter associated to the edge for the current net
*/
/*! \function void Edge::SetConnexID ( int connexID );
* \param connexID is the connexID of the edge
* \see \ref grpConnexID
*/
/*! \function void Edge::SetCost ( float cost );
* \param cost is the new cost for the edge
*/
/*! \function void Edge::IncCost ( float inc );
* \param inc is an increment, it is added to the current Edge::_cost
*/
/*! \function void Edge::SetNetStamp ( unsigned netStamp );
* \param netStamp is the netStamp of the edge for the current net
* \see \ref grpNetStamp
*/
/*! \function void Edge::AddSubEstimateOccupancy ( float increment, bool add );
* \param increment is the value added / substracted to the estimate occupancy
* \param add is a boolean : if set to \True an addition is performed whether if set to \False a substraction is performed
*/
/*! \function virtual void Edge::CreateSplitter ( Net* net ) = 0;
* \param net the current net for which we want to create a splitter on the Edge
* \note This function is pure virtual.
*/
// \}
/*! \anchor EdgePredicates Predicates
* \name
*/
// \{
/*! \function virtual bool Edge::IsVertical ();
* \return Return \True if the edge is a vertical edge, else \False
* \note This function is pure virtual.
*/
/*! \function virtual bool Edge::IsHorizontal ();
* \return Return \True if the edge is a horizontal edge, else \False
* \note This function is pure virtual.
*/
// \}
/*! \defgroup grpConnexComponent What is a Connex Component ?
*
* \section secDefinition Definition
*
* A connex component is a set of vertexes and edges representing a connex part of a net, such as :
* <ul>
* <li> a connector contained in a GCell
* <li> a connector spread over several GCells
* <li> a pre-routed part of a net
* <li> an already routed part of a net (by previous steps)
* </ul>
*
* \image html ConnexComp.png "Connex components exemples for connectors (left) and a routed net (right)"
* \image latex ConnexComp.pdf "Connex components exemples for connectors (left) and a routed net (right)" width=0.7\textwidth
*
* It is also important to note that a connex component has a treelike topology, i.e without any cycle.
*
* \section secUse Use
* Global routing a net consists in transforming a list of several connex components into a unique connex component.
*
* \see \ref grpConnexID
*/
/*! \defgroup grpConnexID What is a ConnexID ?
*
* \section secDefinition Definition
*
* A ConnexID is closely linked with the Connex Component concept.
* In fact, for a given net, each connex component has its own ConnexID
*
* \section secImplementation Implementation
*
* A ConnexID is represented as an \p int. All positive values from 0, may represent a connex component, whereas a connexID
* set to \p -1 means that the element (vertex or edge) isn't part of any connex component.
*
* By construction each element has its connexID set to \p -1
*
* \section secUse Use
* When global routing and thus merging connex components it is always the smaller ConnexID that is kept.
* This implies that the last unique connex component will have a ConnexID equal to 0 (when global routing is finished
* for the net)
*
* \see \ref grpConnexComponent
*
*/
/*! \defgroup grpNetStamp What is a netStamp ?
*
* \section secDefinition Definition
*
* blablabla
*
*
*
*/
}

80
knik/doc/Global.dox Normal file
View File

@ -0,0 +1,80 @@
// -*- C++ -*-
namespace KNIK {
/*! \namespace KNIK
* \brief The namespace dedicated to Knik.
*
* \section secUsefulDefines Useful defines
*
*
* \anchor KNIK_USECONGESTION
* \define __USE_CONGESTION__
* \defineD if defined, algorithms will use congestion, useful for edge cost
* \defineEND
*
* \anchor KNIK_USESTATIC
* \define __USE_STATIC_PRECONGESTION__
* \defineD if defined, algorithms will use static precongestion which means that precongestion will
* be computed but NOT UPDATED
* \defineEND
*
* \anchor KNIK_USEDYNAMIC
* \define __USE_DYNAMIC_PRECONGESTION__
* \defineD if defined, algorithms will use dynamic precongestion which means taht precongestion,
* once computed, will be updated considering the current routing congestion
* \defineEND
* \note The 2 last variables are mutually exclusive
*/
/*! \mainpage Global Router Documentation
*
* This is the documentation of \c Knik which is a global router for Coriolis platform.
*
* \section secGlobalDesciption Description
* This global router is written to be (I hope) a fast and efficient algorithm so it can be use is a refinment loop.
* To solve the global routing problem, it uses monotonic routing algorithm (for bi-point nets) and Dijkstra's algorithm.
* It also uses an efficient congestion estimation based on Steiner trees generation.
*
* \section secGlobalOverview Overview
* Let's have an overview of the general algorithm of \c Knik :
* \code
* Knik::InitGlobalRouting ();
* // This function prepares everything that the global routing algorithms will need :
* // - creates the routing graph
* // - fills the _nets_to_route vector by selecting nets that have to be routed
*
* Graph::SetNetStamp (1);
* // initializes the netStamp of the first net that will be routed on the routingGraph
*
* for each net in Knik::_nets_to_route :
* netDegree = Graph::InitRouting ( net );
* // this function works on the routingGraph and prepares it for routing a specific net
* // - creates each connex component of the net and add a vertex of each connex component to the Graph::_vertexes_to_route vector
* // - it returns _vertexes_to_route.size() which is the degree of the net
*
* // the choice of the global routing algorithm is done based on the degree of the net
* switch ( netDegree )
* // if netDegree is equal to 0 or 1 : there is nothing to be done
* case 0:
* case 1:
* break;
* // if netDegree is equal to 2 : the Monotonic routing algorithm will be used
* case 2:
* Graph::Monotonic ();
* break;
* // if netDegree is equal to 3 or more : the Dijkstra's algorithm will be used
* default:
* Graph::Dijkstra ();
* break;
*
* Graph::IncNetStamp (); // Increments Graph::_netStamp
* Graph::CleanRoutingState (); // Cleans the routing graph structure so it can be propoerly reuse with next net
* \endcode
*
*/
}

622
knik/doc/Graph.dox Normal file
View File

@ -0,0 +1,622 @@
// -*- C++ -*-
namespace KNIK {
/*! \class Graph
* \brief The routing graph.\n
* - \ref GraphAttributes "Attributes"
* - \ref GraphConstructors "Constructors"
* - \ref GraphAccessors "Accessors"
* - \ref GraphModifiers "Modifiers"
* - \ref GraphTupleQueue "Tuple Priority Queue Methods"
*
* \section secGraphImplementation Graph Implementation
* CEngine : Nimbus.
*
* \section secGraphUseful Useful defines
*
* \define EPSILON 10e-4
* \defineD EPSILON is used two avoid several float roudness problems
* \defineEND
*
* \anchor GRAPH_FLUTELIMIT
* \define FLUTE_LIMIT 150
* \defineD When using congestion, <a href="http://class.ee.iastate.edu/cnchu/flute.html">FLUTE</a> algorithm will not work properly if number
* of pins exceed a limit : MAXD.\n
* Knik algorithm must not pass net with more than FLUTE_LIMIT pins to FLUTE.\n
* \n
* Flute.h:
* \code #define MAXD 150 // Setting MAXD to more than 150 is not recommended
* \endcode
* \defineEND
*
* \define __USE_SLICINGTREE__
* \defineD if defined, the search of a vertex givenits position will be done using a slicingtree instead of using nimbus methods.\n
* Using the slicing tree really faster
* \defineEND
*/
/*! \anchor GraphAttributes Attributes
* \name
*/
// \{
/*! \var Nimbus* Graph::_nimbus
* The corresponding partitionning
*
* \Initial by constructor
*/
/*! \var SlicingTree* Graph::_slicingTree;
* The slicing tree, useful for searching a vertex given its position
*
* \Initial \NULL
*/
/*! \var Net* Graph::_working_net;
* The curret working net, all algorithms in Graph will refer to this net
*
* \Initial \NULL
*/
/*! \var VertexSet Graph::_vertexes_to_route;
* The set of vertexes to route, given a working net to route we can create this set
*
* \Initial empty
* \see Graph::InitRouting
*/
/*! \var Vertex* Graph::_lowerLeftVertex;
* The lower left vertex of the graph, useful to skim through the graph
*/
/*! \var VertexVector Graph::_all_vertexes;
* The vector of all the vertexes
*/
/*! \var EdgeVector Graph::_all_edges;
* The vector of all the edges
*/
/*! \var TuplePriorityQueue Graph::_tuplePriorityQueue;
* The tuple priority queue for Dijkstra's algorithm implementation
*/
/*! \var Box Graph::_searchingArea;
* The _searchingArea limits the Dijkstra's algorithm toa certain range
*/
/*! \var unsigned Graph::_netStamp
* The net stamp associated with the working net
*
* \Initial \p 0
* \see \ref grpNetStamp
*/
// \}
/*! \anchor GraphConstructors Constructors
* \name
*/
// \{
/*! \function static Graph* Graph::Create ( Nimbus* nimbus, RoutingGrid* routingGrid, bool benchMode, bool useSegments );
* \param nimbus the partionning needed to create the routing graph
* \param routingGrid the routingGrid, may be \NULL
* \param benchMode for ispd global routing benchmarks
* \param useSegments defines if routing is done with segments or splitters
* \return the newly created graph
*/
// \}
/*! \anchor GraphAccessors Accessors
* \name
*/
// \{
/*! \function Hurricane::Cell* Graph::GetCell();
* \Return the current top cell
*/
/*! \function unsigned Graph::GetNetStamp();
* \Return the net stamp of the current working net
*/
/*! \function Vertex* Graph::GetPredecessor ( const Vertex* vertex )
* \param vertex is the vertex from which we want to get the predecessor
* \return the predecessor vertex
*/
/*! \function Vertex* Graph::GetCentralVertex ();
* \Return the most central vertex of Graph::_vertexes_to_route
*/
/*! \function Vertex* Graph::GetVertex ( Point p );
* \param p a position
* \return the vertex which corresponds to the position
*/
/*! \function Vertex* Graph::GetVertex ( Unit x, Unit y );
* \param x is the x coordinate of the position
* \param y is the y coordinate of the position
* \return the vertex which corresponds to the position
*/
// \}
/*! \anchor GraphModifiers Modifiers
* \name
*/
// \{
/*! \function void Graph::CreateHEdge ( Vertex* from, Vertex* to, Fence* fence, DisplaySlot* displaySlot );
* \param from the source vertex
* \param to the target vertex
* \param fence the corresponding fence
* \param displaySlot the GTK displaytSlot for edges' graphical display
*/
/*! \function void Graph::CreateVEdge ( Vertex* from, Vertex* to, Fence* fence, DisplaySlot* displaySlot );
* \param from the source vertex
* \param to the target vertex
* \param fence the corresponding fence
* \param displaySlot the GTK displaytSlot for edges' graphical display
*/
/*! \function void Graph::InitConnexComp ( Vertex* vertex, int newConnexID = -1 );
* This function initialize a connex component as the source on for Dijkstra's algorithm implementation, the connex component
* is considered based on the connexID of given vertex.\n
* The connexID of the connex component may be changed by specifiing it as argument, if not the connexID will not be changed.
* \param vertex one vertex of the connex component
* \param newConnexID the new connexID for the connex component (optional)
* \see \ref grpConnexID, \ref grpConnexComponent
*/
/*! \function void Graph::InitConnexComp ( Vertex* vertex, Edge* arrivalEdge, int newConnexID );
* This is the recusive part of Graph::InitConnexComp
* \param vertex one vertex of the connex component
* \param arrivalEdge the edge that leads to the current vertex (in order not to skim through it again)
* \param newConnexID the new connexID for the connex component
* \see \ref grpConnexID, \ref grpConnexComponent
*/
/*! \function void Graph::UpdateConnexComp ( VertexList reachedVertexes, Vertex* firstVertex );
* This function create the new connex component from a reached vertex to the first source vertex thanks to the path
* found by global routing.
* \param reachedVertexes is the list of reachedVertexes (see <b>Bug</b>)
* \param firstVertex is the source vertex
* \see \ref grpConnexID, \ref grpConnexComponent
* \bug The parameter VertexList reachedVertexes should be a simple Vertex* reachedVertex !
*/
/*! \function void Graph::MaterializeRouting ( Vertex* vertex );
* This function materializes the routing of a net. Global routing algorithms have routed the net so there is only one connex
* component. Starting with one vertex of the connex component and using connexID, it's easy to skim through all the connex
* component.
* \param vertex is a representant of the connex component to materialize
*/
/*! \function void Graph::MaterializeRouting ( Vertex* vertex, Edge* arrivalEdge, Contact* initialContact );
* This recursive function starts from a \e vertex and skim through all its edges (except the \e arrivalEdge) to check the ConnexID
* and materialize routing between 2 vertexes if the ConnexID match.
*
* <b>\n What does "MaterializeRouting" means:</b>
*
* The result of the global routing algorithms (Monotonic or Dijkstra) is a connex composant which is respresented by a set of
* vertexes and edges that have the same ConnexID.
*
* Each edge of the connex component represents a crossing of the corresponding fence. Thus for the _working_net a Splitter is
* created and attached to the LocalRingHook of each vertex of the edge.
*
* <b>\n Overview:</b>
*
* \code
* for each edge of vertex:
* // if edge and vertex have the same connexID
* if Vertex::GetConnexID equals Edge::GetConnexID :
* // creates the splitter (if not exist)
* edge-> Edge::CreateSplitter ( _working_net );
* // get the hook of the splitter corresponding to the vertex
* hook = edge-> Edge::GetSplitterHook ( vertex );
* // if the vertex has a LocalRingHook set
* if previousHook = Vertex::GetLocalRingHook exists:
* // attaches the 2 hooks
* hook->Attach ( previousHook );
* // sets the _localRingHook of the vertex
* Vertex::SetLocalRingHook ( hook );
*
* if edge is not arrivalEdge:
* // recursive call
* MaterializeRouting ( edge-> Edge::GetOpposite ( vertex ), edge );
* \endcode
* \param vertex starting vertex
* \param arrivalEdge the edge that leaded to the starting vertex
* \param initialContact optional
* \see \ref grpConnexID
*/
/*! \function void Graph::ResetVertexes ();
* This function clears the Graph::_vertexes_to_route set.
*/
/*! \function void Graph::SetNetStamp ( unsigned netStamp );
* \param netStamp is the netStamp corresponding to the Graph::_working_net
* \see \ref grpNetStamp
*/
/*! \function void Graph::IncNetStamp ();
* Increments GRaph::_netStamp by 1.
* \see \ref grpNetStamp
*/
/*! \function int Graph::CountVertexes ( Net* net );
* This function count the number of connex components that have to be routed for the given net.
*
* It is very similar to the Graph::InitRouting function but is simpler since it just have to count and not initialize the routing
* graph.
* \param net is the Graph::_working_net
* \return the number of connex components
*/
/*! \function int Graph::InitRouting ( Net* net );
* This function prepares everything needed to properly global route a given net on the routing graph. It creates all the connex
* components (with connexID) and fills the _vertexes_to_route set which represents all the connex components that have to be routed.
* The set contains only one unique representant vertex for each connex components.
* \param net the new Graph::_working_net
* \return _vertexes_to_route.size()
*
* \overview
* \code
* _working_net = net;
* // first sets the new _working_net
*
* currentConnexID = 0;
* // initializes the connexID for the first connex component
*
* for each component in net->GetComponents()
* if the component is a routingPad
* vertex = Graph::GetVertex ( component->GetCenter() );
*
* if vertex not in _vertexes_to_route
* _vertexes_to_route.Insert ( vertex );
* _searchingArea.Merge ( area of Vertex::_gcell );
* Vertex::SetConnexID ( currentConnexID );
* Vertex::SetNetStamp ( _netStamp );
* currentConnexID++;
*
* Vertex::AttachToLocalRing ( component );
*
* for each other_vertex that component would cover
* _searchingArea.Merge ( area of Vertex::_gcell );
* Vertex::SetConnexID ( currentConnexID - 1 );
* Vertex::SetNetStamp ( _netStamp );
* Vertex::LinkToVertex ( vertex );
* \endcode
* \exception assert that the parameter \e net does exist
* \bug the <em>for each other vertex that component would cover</em> part is not implemented right now !
* \see \ref grpConnexID
*/
/*! \function void Graph::Dijkstra ();
* This is the implementation of Dijkstra's algorithm.
*/
/*! \function void Graph::Monotonic ();
* This is the implementation of Monotonic routing.
*
* \b Definition:
*
* The Monotonic routing is a very simple algorithm that found the shortest path between a single source and a single target
* whithin the bouding box of S and T. The idea is that the path always directs towards T, it implies a very important property
* of monotonic routing : each vertex within the bounding box has only one or two vertexes that can be its predecessor.
*
* Thus it is easy to understand how the distance will be propagated from S to T in order to find the shortest path.
*
* In order not to treat too many cases, the algorithm orders source and target vertexes so that the source is the leftest vertex
* (or most bottom if same x coordinate).
*
* \overview
* \code
* // first gets the source and target vertexes
* source = (*_vertexes_to_route.begin()); // gets the first element of the set
* target = (*_vertexes_to_route.rbegin()); // gets the last (second) element of the set
*
* // then their x and y coordinates
* sourceX, sourceY, targetX and targetY with Vertex::GetPosition
*
* // the source vertex will be the bottom-leftest one :
* if sourceX is greater than targetX:
* exchange source with target
* else if sourceX equals targetX:
* if sourceY is greater than target Y:
* exchange source with target
*
* // now source and target vertex have been ordered, reinitializes x and y coordinates
* sourceX, sourceY, targetX and targetY with Vertex::GetPosition
*
* // sets the source vertex distance to 0
* source-> Vertex::SetDistance (0);
*
* // find the shortest path from source
* FindShortestPath();
*
* // creates the new connex component
* while currentVertex has a predecessor:
* // set connexID
* currentVertex-> Vertex::SetConnexID ( sourceID );
* predecessor-> Edge::SetConnexID ( sourceID );
* // get next vertex
* currentVertex = predecessor-> Edge::GetOpposite ( currentVertex );
*
* // now materializes the routing
* Graph::MaterializeRouting ( source );
*
* // since the net is now routed, substracts its contribution to estimated congestion
* #if defined ( __USE_DYNAMIC_PRECONGESTION__ )
* Graph::UpdateEstimateCongestion();
* #endif
* \endcode
*
* <b>\n How to find the shortest path:</b>
*
* There are 2 cases to consider :
*
* - 1st case:
* \image html MonotonicRouting1.png "Monotonic routing first case"
* \image latex MonotonicRouting1.pdf "Monotonic routing first case" width=0.7\textwidth
*
* \code
* if sourceY is lesser than or equal to targetY:
* // propagates distance for all vertexes which y coordinate is sourceY and x coordinate is lesser than or equal to targetX (1)
* // propagates distance for all vertexes which x corrdinate is sourceX and y coordinate is greater than or equal to targetY (2)
* // propagates distance for all other vertexes by column order
* \endcode
* <CENTER>
* <TABLE width=75% border=0>
* <TR>
* <TD>
* \image html MonotonicRouting1-1.png "(1)"
* \image latex MonotonicRouting1-1.png "(1)" width=0.5\textwidth
* </TD>
* <TD>
* \image html MonotonicRouting1-2.png "(2)"
* \image latex MonotonicRouting1-2.png "(2)" width=0.5\textwidth
* </TD>
* </TR>
* </TABLE>
* </CENTER>
*
* When all the distances of all vertexes have been set, it's easy to find the shortest path following the predecessor from target
* to source vertex.
* <CENTER>
* <TABLE width=75% border=0>
* <TR>
* <TD>
* \image html MonotonicRouting1-3.png "Example of monotonic shortest path"
* \image latex MonotonicRouting1-3.png "Example of monotonic shortest path" width=0.5\textwidth
* </TD>
* <TD>
* \image html MonotonicRouting1-4.png "Monotonic default shortest path (when all edge costs are equal)"
* \image latex MonotonicRouting1-4.png "Monotonic default shortest path (when all edge costs are equal)" width=0.5\textwidth
* </TD>
* </TR>
* </TABLE>
* </CENTER>
*
* - 2nd case:
* \image html MonotonicRouting2.png "Monotonic routing second case"
* \image latex MonotonicRouting2.pdf "Monotonic routing second case" width=0.7\textwidth
*
* \code
* if sourceY is greater than targetY:
* // propagates distance for all vertexes which y coordinate is sourceY and x coordinate is lesser than or equal to targetX (1)
* // propagates distance for all vertexes which x corrdinate is sourceX and y coordinate is lesser than or equal to targetY (2)
* // propagates distance for all other vertexes by column order
* \endcode
* <CENTER>
* <TABLE width=75% border=0>
* <TR>
* <TD>
* \image html MonotonicRouting2-1.png "(1)"
* \image latex MonotonicRouting2-1.png "(1)" width=0.5\textwidth
* </TD>
* <TD>
* \image html MonotonicRouting2-2.png "(2)"
* \image latex MonotonicRouting2-2.png "(2)" width=0.5\textwidth
* </TD>
* </TR>
* </TABLE>
* </CENTER>
*
* When all the distances of all vertexes have been set, it's easy to find the shortest path following the predecessor from target
* to source vertex.
* <CENTER>
* <TABLE width=75% border=0>
* <TR>
* <TD>
* \image html MonotonicRouting2-3.png "Example of monotonic shortest path"
* \image latex MonotonicRouting2-3.png "Example of monotonic shortest path" width=0.5\textwidth
* </TD>
* <TD>
* \image html MonotonicRouting2-4.png "Monotonic default shortest path (when all edge costs are equal)"
* \image latex MonotonicRouting2-4.png "Monotonic default shortest path (when all edge costs are equal)" width=0.5\textwidth
* </TD>
* </TR>
* </TABLE>
* </CENTER>
*
* \exception assert that Graph::_vertexes_to_route set size is equal to 2
* \exception assert that the 2 vertexes present in Graph::_vertexes_to_route set are different
* \bug For the moment Monotonic routing works only with a regular routing graph !
*/
/*! \function FTree Graph::CreateFluteTree ();
* \Return the newly created FLUTE Tree
*/
/*! \function void Graph::CleanRoutingState ();
* This function cleans everything left by Monotonic, Dijkstra and MaterializeRouting functions
*/
/*! \function void Graph::UpdateEstimateCongestion ( bool create = false );
* This function manages the estimated congestion. It can either create or update it depending on the value of the \e create parameter.
*
* <b>\n How to compute estimated congestion:</b>
*
* The idea is that for each net a rectilinear Steiner minimal tree will be constructed and estimations will be done based on this
* Steiner tree. The important point is that when updating estimated congestion, we must be able to reconstruct the same Steiner tree.
* Thus the algorithm that creates the Steiner tree have to be determinist, it is also a good point if it is fast because the algorithm
* may be called many times.
*
* Such an algorithm exists in FLUTE
* (<a href='http://class.ee.iastate.edu/cnchu/flute.html'>http://class.ee.iastate.edu/cnchu/flute.hml</a>).
*
* Based on the Graph::_vertexes_to_route set, the Graph::CreateFluteTree function creates and returns the Steiner tree.
*
* Let's consider a simple example to illustrates what FLUTE does :
* \image html Steiner1.png "A simple example of a net with 4 pins"
* \image latex Steiner1.pdf "A simple example of a net with 4 pins" width=0.7\textwidth
*
* To works, FLUTE needs the x and y coordinates of each pin (vertex), just like :
* \code
* // FLUTE Input
* 100 400
* 200 100
* 200 400
* 300 200
* \endcode
*
* And then FLUTE will return a Steiner tree. The Steiner tree is described based on its branches :
* \code
* // FLUTE Output
* 200 100
* 200 200
*
* 300 200
* 200 200
*
* 100 400
* 200 400
*
* 200 200
* 200 400
* \endcode
* \image html Steiner2.png "Representation of the resulting Steiner tree with intermediate Steiner node"
* \image latex Steiner2.pdf "Representation of the resulting Steiner tree with intermediate Steiner node" width=0.7\textwidth
*
* \n As said before, FLUTE creates a rectilinear Steiner minimal tree, but it is important to understand that when several rectilinear
* Steiner minimal sub-trees of the same length exist, FLUTE returns the different possibilities :
* <CENTER>
* <TABLE width=100% border=0>
* <TR>
* <TD width=70%>
* \image html Steiner3.png "A net with 4 pins"
* \image latex Steiner3.pdf "A net with 4 pins" width=0.7\textwidth
* </TD>
* <TD width=30%>
* \code
* // FLUTE Input
* 100 100
* 200 200
* 400 200
* 500 400
* \endcode
* </TD>
* </TR>
* </TABLE>
* <TABLE width=100% border=0>
* <TR>
* <TD width=35%>
* \image html Steiner4.png "All rectilinear Steiner minimal trees"
* \image latex Steiner4.pdf "All rectilinear Steiner minimal trees" width=0.7\textwidth
* </TD>
* <TD width=35%>
* \image html Steiner5.png "Representation of FLUTE result"
* \image latex Steiner5.pdf "Representation of FLUTE result" width=0.7\textwidth
* </TD>
* <TD width=30%>
* \code
* // FLUTE Output
* 100 100
* 200 200
*
* 500 400
* 400 200
*
* 200 200
* 400 200
* \endcode
* </TD>
* </TR>
* </TABLE>
* </CENTER>
*
* \n Since we exactly know what FLUTE returns, we can now define how estimated congestion is computed. FLUTE returns a set of branches.
* Each branch is represented by 2 vertexes and the estimate congestion depends on 2 cases :
*
* - the 2 vertexes are vertically or horizontally aligned:
* <CENTER>
* <TABLE width=75% border=0>
* <TR>
* <TD>
* \image html SteinerCongestion1.png "Horizontally aligned"
* \image latex SteinerCongestion1.pdf "Horizontally aligned" width=0.7\textwidth
* </TD>
* <TD>
* \image html SteinerCongestion2.png "Vertically aligned"
* \image latex SteinerCongestion2.pdf "Vertically aligned" width=0.7\textwidth
* </TD>
* </TR>
* </TABLE>
* </CENTER>
*
* For all the edges between the 2 vertexes the estimate congestion is incremented by 1.
*
* - the 2 vertexes are not aligned:
* <CENTER>
* <TABLE width=75% border=0>
* <TR>
* <TD>
* \image html SteinerCongestion3.png ""
* \image latex SteinerCongestion3.pdf "" width=0.7\textwidth
* </TD>
* <TD>
* \image html SteinerCongestion4.png ""
* \image latex SteinerCongestion4.pdf "" width=0.7\textwidth
* </TD>
* </TR>
* </TABLE>
* </CENTER>
*
* There are 2 possible L-pathes, the algorithm consider that each path has a 50% probability, that means that the estimated
* congestion of each edge on a path is incremented by 0.5.
*
* <b>\n Create or Update estimated congestion:</b>
*
* The \e create parameter determines wether to create or update the estimated congestion, in fact it affects the
* Edge::AddSubEstimateOccupancy function. So depending on it, the estimated congestion computed just as bellow is
* added or substracted.
*
* When creating the estimated congestion (during Knik::InitGlobalRouting) \e create is \True while during the global routing step,
* in Graph::Monotonic or Graph::Dijkstra, as the Graph::_working_net is routed it does not contribute to the estimated congestion
* and thus \e create is \False.
*
*
* \param create specifies whether to create or to update the estimated congestion
* \exception return if Graph::_vertexes_to_route size is lesser than 2
* \exception return if Graph::_vertexes_to_route size is greater than or equal to \ref GRAPH_FLUTELIMIT
*/
// \}
/*! \anchor GraphTupleQueue Tuple Priority Queue Methods
* \name
*/
// \{
/*! \function Vertex* Graph::ExtractMinFromPriorityQueue();
* \Return the vertex in tuple priority queue which has the minimum priority
*/
// \}
}

76
knik/doc/HEdge.dox Normal file
View File

@ -0,0 +1,76 @@
// -*- C++ -*-
namespace KNIK {
/*! \class HEdge
* \brief A routing graph horizontal edge.\n
* - \ref HEdgeConstructors "Constructors"
* - \ref HEdgeAccessors "Accessors"
* - \ref HEdgeModifiers "Modifiers"
* - \ref HEdgePredicates "Predicates"
*
* The HEdge represents a horizontal edge of the routing graph. The class is derivated from KNIK::Edge and can be instanciated.
*
* \section secHEdgeImplementation HEdge Implementation
* This class exists only because it simplifies a lot the way specific functions are written
*/
/*! \anchor HEdgeConstructors Constructors
* \name
*/
// \{
/*! \function static HEdge* HEdge::Create( Fence* fence, Vertex* from, Vertex* to, DisplaySlot* displaySlot );
* \param fence is the fence associated to the edge
* \param from is the source vertex
* \param to is the target vertex
* \param displaySlot is the displaySlot used by GTK for graphical display
* \return The newly created HEdge
* \exception error if \e from or \e to are \NULL
* \exception error if the object can not be allocated
*/
// \}
/*! \anchor HEdgeAccessors Accessors
* \name
*/
// \{
/*! \function virtual Hook* HEdge::GetSplitterHook ( Vertex* vertex );
* \param vertex the vertex of the edge from which we want to get the splitter's hook
* \return The splitter's hook of the specified vertex
* \exception assert that Edge::_splitter exists
* \exception assert that the given vertex is Edge::_from or Edge::_to
*/
// \}
/*! \anchor HEdgeModifiers Modifiers
* \name
*/
// \{
/*! \function virtual void HEdge::CreateSplitter ( Net* net );
* \param net the current net for which we want to create a splitter on the Edge
*/
// \}
/*! \anchor HEdgePredicates Predicates
* \name
*/
// \{
/*! \function virtual bool HEdge::IsVertical ();
* \return Return \False
*/
/*! \function virtual bool HEdge::IsHorizontal ();
* \return Return \True
*/
// \}
}

130
knik/doc/Knik.dox Normal file
View File

@ -0,0 +1,130 @@
// -*- C++ -*-
namespace KNIK {
/*! \class Knik
* \brief The Global Router CEngine itself.\n
* - \ref KnikTypes "Types"
* - \ref KnikAttributes "Attributes"
* - \ref KnikConstructors "Constructors"
* - \ref KnikModifiers "Modifiers"
*
* \section secKnikImplementation Knik Implementation
* The Global Router CEngine uses a technique based on routing graph and thus relies on another
* CEngine : Nimbus.
*/
/* \struct Knik::NetRecord
*
* \brief A NetRecord in Knik
*
* blablablabla
*/
/*! \anchor KnikAttributes Attributes
* \name
*/
// \{
//
/*! \var NIMBUS::Nimbus* Knik::_nimbus
* The CEngine Nimbus corresponding to the partitionning
*
* \Initial \NULL
*/
/*! \var Graph* Knik::_routingGraph
* The routing graph for Knik
*
* \Initial \NULL
*/
/*! \var CRLCORE::CTimer Knik::_timer
* A useful timer to measure execution time
*/
/*! \var Knik::NetVector Knik::_nets_to_route
* The \STL vector of nets to route by Knik
*
* \Initial empty
*/
// \}
/*! \anchor KnikConstructors Constructors
* \name
*/
// \{
/*! \function static Knik* Knik::Create ( Cell* cell, unsigned congestion, unsigned precongestion, bool benchMode, bool useSegments, float edgeCost );
* \param cell is the cell on which the Knik CEngine will work
* \param congestion 0: None, 1: Congestion
* \param precongestion 0: None, 1: Static, 2: Dynamic
* \param benchMode for ispr 2007 global routing benchmarks
* \param useSegments defines whether routing is done with segments or splitters
* \param edgeCost
* \return the newly created Knik CEngine
*/
// \}
/*! \anchor KnikModifiers Modifiers
* \name
*/
// \{
/*! \function void Knik::InitGlobalRouting();
* This function initializes several thngs that the global routing algorithms will need :
* - creates the routing graph
* - lists the net that will be routed (filters supply and clock nets and also nets with too many pins)
* - creates the estimated congestion (if needed)
*
* \overview
* \code
* if no routing graph exists:
* // creates the routing graph
* Graph::Create ( Knik::_nimbus );
*
* for each net of cell:
* // filters net
* if net->IsGlobal() or net->IsSupply() or net->IsClock() :
* continue;
*
* // get netDegree
* netDegree = Graph::CountVertexes ();
* // still filtering
* if netDegree > 1 and netDegree < 1000
* Knik::_nets_to_route .push_back ( net );
*
* #if defined __USE_STATIC_PRECONGESTION__ or __USE_DYNAMIC_PRECONGESTION__
* // creates the estimate congestion on the routing graph
* Graph::UpdateEstimateCongestion ( true );
*
* // cleans routing graph
* Graph::ResetVertexes ();
* \endcode
*
* \b Note \b 1:
* The <em>for each net of cell</em> loop is in fact a loop on net occurrences which allows to get all nets of the hierarchy
* of the cell. The first thing done in the loop is then to get the net corresponding to the occurrence.
*
* \b Note\b 2:
* The Knik::_nets_to_route vector does not contains Net but NetRecord which is a structure that associates a Net with a value that
* measures it's size. The cost function of the size is :
* \code cost = ( netBoundingBoxWidth + 1 ) * ( netBoundingBoxHeight + 1 )
* \endcode
* This cost function allows to sort nets so flat and small nets will be routed first.
* \exception error if the routing graph already exists
* \exception asserts that Knik::_nets_to_route is empty when the function is called
* \see \ref KNIK_USESTATIC "__USE_STATIC_PRECONGESTION__", \ref KNIK_USEDYNAMIC "__USE_DYNAMIC_PRECONGESTION__"
*/
// \}
/*! \anchor KnikTypes Types
* \name
*/
// \{
/* \typedef vector<Knik::NetRecord> Knik::NetVector;
*/
// \}
}

76
knik/doc/VEdge.dox Normal file
View File

@ -0,0 +1,76 @@
// -*- C++ -*-
namespace KNIK {
/*! \class VEdge
* \brief A routing graph vertical edge.\n
* - \ref VEdgeConstructors "Constructors"
* - \ref VEdgeAccessors "Accessors"
* - \ref VEdgeModifiers "Modifiers"
* - \ref VEdgePredicates "Predicates"
*
* The VEdge represents a horizontal edge of the routing graph. The class is derivated from KNIK::Edge and can be instanciated.
*
* \section secVEdgeImplementation VEdge Implementation
* This class exists only because it simplifies a lot the way specific functions are written
*/
/*! \anchor VEdgeConstructors Constructors
* \name
*/
// \{
/*! \function static VEdge* VEdge::Create( Fence* fence, Vertex* from, Vertex* to, DisplaySlot* displaySlot );
* \param fence is the fence associated to the edge
* \param from is the source vertex
* \param to is the target vertex
* \param displaySlot is the displaySlot used by GTK for graphical display
* \return The newly created VEdge
* \exception error if \e from or \e to are \NULL
* \exception error if the object can not be allocated
*/
// \}
/*! \anchor VEdgeAccessors Accessors
* \name
*/
// \{
/*! \function virtual Hook* VEdge::GetSplitterHook ( Vertex* vertex );
* \param vertex the vertex of the edge from which we want to get the splitter's hook
* \return The splitter's hook of the specified vertex
* \exception assert that Edge::_splitter exists
* \exception assert that the given vertex is Edge::_from or Edge::_to
*/
// \}
/*! \anchor VEdgeModifiers Modifiers
* \name
*/
// \{
/*! \function virtual void VEdge::CreateSplitter ( Net* net );
* \param net the current net for which we want to create a splitter on the Edge
*/
// \}
/*! \anchor VEdgePredicates Predicates
* \name
*/
// \{
/*! \function virtual bool VEdge::IsVertical ();
* \return Return \True
*/
/*! \function virtual bool VEdge::IsHorizontal ();
* \return Return \False
*/
// \}
}

242
knik/doc/Vertex.dox Normal file
View File

@ -0,0 +1,242 @@
// -*- C++ -*-
namespace KNIK {
/*! \class Vertex
* \brief A routing graph vertex.\n
* - \ref VertexAttributes "Attributes"
* - \ref VertexConstructors "Constructors"
* - \ref VertexAccessors "Accessors"
* - \ref VertexModifiers "Modifiers"
* - \ref VertexPredicates "Predicates"
*
* The Edge was written to be a light object which simplifies the way the routing graph is covered.
* Edges are thus separated into two sub-classes : VEdge and HEdge respectively representing vertical edge and
* horizontal edge.
*
* \section secVertexImplementation Edge Implementation
* The Global Router CEngine uses a technique based on routing graph and thus relies on another
* CEngine : Nimbus.
*/
/*! \anchor VertexAttributes Attributes
* \name
*/
// \{
/*! \var Graph* Vertex::_routingGraph
* The routingGraph to which current vertex belongs
*
* \Initial by constructor
*/
/*! \var GCell* Vertex::_gcell
* The gcell associated with current vertex
*
* \Initial by constructor
*/
/*! \var Edge* Vertex::_firstEdges[4]
* This array regroups the first edge of each type, it is ordered as follow :
* - _firstEdges[0] = first horizontal edge out
* - _firstEdges[1] = first vertical edge out
* - _firstEdges[2] = first horizontal edge in
* - _firstEdges[3] = first vertical edge in
*
* \Initial empty
*
* \note Not all the firstEdges need to be defined. For example some vertex may only have 2 edges
*/
/*! \var Edge* Vertex::_predecessor
* When global routing one needs to know what was the predecessor vertex, instead of the vertex, the vertex hold the edge between
* the 2 vertexes
*
* \Initial \NULL
*/
/*! \var Point* Vertex::_position
* The position of the vertex
*
* \Initial _gcell->GetCenter()
*/
/*! \var Tuple* Vertex::_tuple
* In Dijkstra's algortihm implementation a priority stack is used to ordered vertexes, the stack contains Tuple and each vertex
* may have an associated Tuple
*
* \Initial \NULL
*/
/*! \var float Vertex::_distance
* In Dijkstra's algorithm implementation each vertex has a distance from source vertex
*
* \Initial (float)(HUGE)
*/
/*! \var int Vertex::_connexID
* The identification flag for connex component
*
* \Initial \p -1
* \see \ref grpConnexID
*/
/*! \var unsigned Vertex::_netStamp
* The net stamp associated with the current net
*
* \Initial \p 0
* \see \ref grpNetStamp
*/
/*! \var Unit Vertex::_halfWidth
* The half width of the correspoding gcell, it is useful for all graphic parts
*
* \Initial _gcell->GetHalfWidth()
*/
/*! \var Unit Vertex::_halfHeight
* The half height of the corresponding gcell, it is useful for all graphic parts
*
* \Initial _gcell->GetHalfHeight()
*/
// \}
/*! \anchor VertexConstructors Constructors
* \name
*/
// \{
/*! \function static Vertex* Vertex::Create ( GCell* gcell, DisplaySlot* displaySlot, Graph* routingGraph );
* \param gcell the corresponding gcell in the partitionning
* \param displaySlot the GTK displaySlot for vertexes' graphical display
* \param routingGraph the routingGraph to which current vertex belongs
* \return the newly created vertex
* \exception error if the vertex cannot be allocated
*/
// \}
/*! \anchor VertexAccessors Accessors
* \name
*/
// \{
/*! \function GCell* Vertex::GetGCell();
* \Return The corresponding GCell
*/
/*! \function Edge* Vertex::GetHEdgeOut() const;
* \Return The first horizontal edge out : Vertex::_firstEdges[0]
*/
/*! \function Edge* Vertex::GetVEdgeOut() const;
* \Return The first vertical edge out : Vertex::_firstEdges[1]
*/
/*! \function Edge* Vertex::GetHEdgeIn() const;
* \Return The first horizontal edge in : Vertex::_firstEdges[2]
*/
/*! \function Edge* Vertex::GetVEdgeIn() const;
* \Return The first vertical edge in : Vertex::_firstEdges[3]
*/
/*! \function Edges* Vertex::GetAdjacentEdges() const;
* \Return The collection of all edges attached to thecurrent vertex
*/
/*! \function Edge* Vertex::GetPredecessor() const;
* \Return The predecessor edge : Vertex::_predecessor
*/
/*! \function int* Vertex::GetConnexID() const;
* \Return The ConnexID of the vertex : Vertex::_connexID
*/
/*! \function float* Vertex::GetDistance() const;
* \Return The distance from the source vertex : Vertex::_distance
*/
/*! \function unsigned Vertex::GetNetStamp() const;
* \return The netStamp of the vertex : Vertex::_netStamp
* \see \ref grpNetStamp
*/
/*! \function Point* Vertex::GetPosition() const;
* \Return The position of the vertex : Vertex::_position
*/
/*! \function Tuple* Vertex::GetTuple() const;
* \Return The tuple associated with the vertex : Vertex::_tuple
*/
/*! \function Graph* Vertex::GetRoutingGraph() const;
* \Return The routing graph
*/
// \}
/*! \anchor VertexModifiers Modifiers
* \name
*/
// \{
/*! \function void Vertex::SetHEdgeOut ( Edge* edge );
* \param edge is the first horizontal edge out
*/
/*! \function void Vertex::SetVEdgeOut ( Edge* edge );
* \param edge is the first vertical edge out
*/
/*! \function void Vertex::SetHEdgeIn ( Edge* edge );
* \param edge is the first horizontal edge in
*/
/*! \function void Vertex::SetVEdgeIn ( Edge* edge );
* \param edge is the first vertical edge in
*/
/*! \function void Vertex::SetPredecessor ( Edge* edge );
* \param edge is the predecessor of the vertex
*/
/*! \function void Vertex::SetConnexID ( int connexID );
* \param connexID is the connexID of the vertex
* \see \ref grpConnexID
*/
/*! \function void Vertex::SetDistance ( float distance );
* \param distance is the distance from the source vertex (in Dijkstra's algorithm implementation)
*/
/*! \function void Vertex::SetNetStamp ( unsigned netStamp );
* \param netStamp is the netStamp of the edge for the current net
* \see \ref grpNetStamp
*/
/*! \function void Vertex::SetTuple ( Tuple* tuple );
* \param tuple the tuple associated with the vertex
*/
/*! \function void Vertex::AttachToLocalRing ( Component* component );
* \param component the component which has a master hook to add to the local ring
* \exception assert if component does not exist
*/
// \}
/*! \anchor VertexPredicates Predicates
* \name
*/
// \{
/*! \function bool Vertex::IsVerticallyAligned ( Vertex* vertex );
* \return Return \True if current vertex y coordinate is equal to vertex's one, else \False
*/
/*! \function bool Vertex::IsHorizontallyAligned ( Vertex* vertex);
* \return Return \True if current vertex x coordinate is equal to vertex's one, else \False
*/
// \}
}

798
knik/doc/asimbook.cls Normal file
View File

@ -0,0 +1,798 @@
%%
%% This is file `book.cls',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% classes.dtx (with options: `book')
%%
%% This is a generated file.
%%
%% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001
%% The LaTeX3 Project and any individual authors listed elsewhere
%% in this file.
%%
%% This file was generated from file(s) of the LaTeX base system.
%% --------------------------------------------------------------
%%
%% It may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.2
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%% http://www.latex-project.org/lppl.txt
%% and version 1.2 or later is part of all distributions of LaTeX
%% version 1999/12/01 or later.
%%
%% This file may only be distributed together with a copy of the LaTeX
%% base system. You may however distribute the LaTeX base system without
%% such generated files.
%%
%% The list of all files belonging to the LaTeX base distribution is
%% given in the file `manifest.txt'. See also `legal.txt' for additional
%% information.
%%
%% \CharacterTable
%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%% Digits \0\1\2\3\4\5\6\7\8\9
%% Exclamation \! Double quote \" Hash (number) \#
%% Dollar \$ Percent \% Ampersand \&
%% Acute accent \' Left paren \( Right paren \)
%% Asterisk \* Plus \+ Comma \,
%% Minus \- Point \. Solidus \/
%% Colon \: Semicolon \; Less than \<
%% Equals \= Greater than \> Question mark \?
%% Commercial at \@ Left bracket \[ Backslash \\
%% Right bracket \] Circumflex \^ Underscore \_
%% Grave accent \` Left brace \{ Vertical bar \|
%% Right brace \} Tilde \~}
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{asimbook}
[2005/11/21 v1.0
ASIM LaTeX document class]
\newcommand\@ptsize{}
\newif\if@restonecol
\newif\if@titlepage
\@titlepagetrue
\newif\if@openright
\newif\if@mainmatter \@mainmattertrue
\if@compatibility\else
\DeclareOption{a4paper}
{\setlength\paperheight {297mm}%
\setlength\paperwidth {210mm}}
\DeclareOption{a5paper}
{\setlength\paperheight {210mm}%
\setlength\paperwidth {148mm}}
\DeclareOption{b5paper}
{\setlength\paperheight {250mm}%
\setlength\paperwidth {176mm}}
\DeclareOption{letterpaper}
{\setlength\paperheight {11in}%
\setlength\paperwidth {8.5in}}
\DeclareOption{legalpaper}
{\setlength\paperheight {14in}%
\setlength\paperwidth {8.5in}}
\DeclareOption{executivepaper}
{\setlength\paperheight {10.5in}%
\setlength\paperwidth {7.25in}}
\DeclareOption{landscape}
{\setlength\@tempdima {\paperheight}%
\setlength\paperheight {\paperwidth}%
\setlength\paperwidth {\@tempdima}}
\fi
\if@compatibility
\renewcommand\@ptsize{0}
\else
\DeclareOption{10pt}{\renewcommand\@ptsize{0}}
\fi
\DeclareOption{11pt}{\renewcommand\@ptsize{1}}
\DeclareOption{12pt}{\renewcommand\@ptsize{2}}
\if@compatibility\else
\DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse}
\fi
\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue}
\DeclareOption{draft}{\setlength\overfullrule{5pt}}
\if@compatibility\else
\DeclareOption{final}{\setlength\overfullrule{0pt}}
\fi
\DeclareOption{titlepage}{\@titlepagetrue}
\if@compatibility\else
\DeclareOption{notitlepage}{\@titlepagefalse}
\fi
\if@compatibility
\@openrighttrue
\else
\DeclareOption{openright}{\@openrighttrue}
\DeclareOption{openany}{\@openrightfalse}
\fi
\if@compatibility\else
\DeclareOption{onecolumn}{\@twocolumnfalse}
\fi
\DeclareOption{twocolumn}{\@twocolumntrue}
\DeclareOption{leqno}{\input{leqno.clo}}
\DeclareOption{fleqn}{\input{fleqn.clo}}
\DeclareOption{openbib}{%
\AtEndOfPackage{%
\renewcommand\@openbib@code{%
\advance\leftmargin\bibindent
\itemindent -\bibindent
\listparindent \itemindent
\parsep \z@
}%
\renewcommand\newblock{\par}}%
}
\ExecuteOptions{letterpaper,10pt,twoside,onecolumn,final,openright}
\ProcessOptions
\input{bk1\@ptsize.clo}
\setlength\lineskip{1\p@}
\setlength\normallineskip{1\p@}
\renewcommand\baselinestretch{}
\setlength\parskip{0\p@ \@plus \p@}
\@lowpenalty 51
\@medpenalty 151
\@highpenalty 301
\setcounter{topnumber}{2}
\renewcommand\topfraction{.7}
\setcounter{bottomnumber}{1}
\renewcommand\bottomfraction{.3}
\setcounter{totalnumber}{3}
\renewcommand\textfraction{.2}
\renewcommand\floatpagefraction{.5}
\setcounter{dbltopnumber}{2}
\renewcommand\dbltopfraction{.7}
\renewcommand\dblfloatpagefraction{.5}
%%%% Select Chapter font.
\newcommand \textchapter [1] {\textsf{\textbf{#1}}}
\newcommand \fontchapter {\sffamily \bfseries}
\if@twoside
\def\ps@headings{%
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{\thepage\hfil\slshape\leftmark}%
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
\let\@mkboth\markboth
\def\chaptermark##1{%
\markboth {\MakeUppercase{%
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\@chapapp\ \thechapter. \ %
\fi
\fi
##1}}{}}%
\def\sectionmark##1{%
\markright {\MakeUppercase{%
\ifnum \c@secnumdepth >\z@
\thesection. \ %
\fi
##1}}}}
\else
\def\ps@headings{%
\let\@oddfoot\@empty
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
\let\@mkboth\markboth
\def\chaptermark##1{%
\markright {\MakeUppercase{%
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\@chapapp\ \thechapter. \ %
\fi
\fi
##1}}}}
\fi
\def\ps@myheadings{%
\let\@oddfoot\@empty\let\@evenfoot\@empty
\def\@evenhead{\thepage\hfil\slshape\leftmark}%
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
\let\@mkboth\@gobbletwo
\let\chaptermark\@gobble
\let\sectionmark\@gobble
}
\if@titlepage
\newcommand\maketitle{\begin{titlepage}%
\let\footnotesize\small
\let\footnoterule\relax
\let \footnote \thanks
\null\vfil
\vskip 60\p@
\begin{center}%
{\LARGE \@title \par}%
\vskip 3em%
{\large
\lineskip .75em%
\begin{tabular}[t]{c}%
\@author
\end{tabular}\par}%
\vskip 1.5em%
{\large \@date \par}% % Set date in \large size.
\end{center}\par
\@thanks
\vfil\null
\end{titlepage}%
\setcounter{footnote}{0}%
\global\let\thanks\relax
\global\let\maketitle\relax
\global\let\@thanks\@empty
\global\let\@author\@empty
\global\let\@date\@empty
\global\let\@title\@empty
\global\let\title\relax
\global\let\author\relax
\global\let\date\relax
\global\let\and\relax
}
\else
\newcommand\maketitle{\par
\begingroup
\renewcommand\thefootnote{\@fnsymbol\c@footnote}%
\def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}%
\long\def\@makefntext##1{\parindent 1em\noindent
\hb@xt@1.8em{%
\hss\@textsuperscript{\normalfont\@thefnmark}}##1}%
\if@twocolumn
\ifnum \col@number=\@ne
\@maketitle
\else
\twocolumn[\@maketitle]%
\fi
\else
\newpage
\global\@topnum\z@ % Prevents figures from going at top of page.
\@maketitle
\fi
\thispagestyle{plain}\@thanks
\endgroup
\setcounter{footnote}{0}%
\global\let\thanks\relax
\global\let\maketitle\relax
\global\let\@maketitle\relax
\global\let\@thanks\@empty
\global\let\@author\@empty
\global\let\@date\@empty
\global\let\@title\@empty
\global\let\title\relax
\global\let\author\relax
\global\let\date\relax
\global\let\and\relax
}
\def\@maketitle{%
\newpage
\null
\vskip 2em%
\begin{center}%
\let \footnote \thanks
{\LARGE \@title \par}%
\vskip 1.5em%
{\large
\lineskip .5em%
\begin{tabular}[t]{c}%
\@author
\end{tabular}\par}%
\vskip 1em%
{\large \@date}%
\end{center}%
\par
\vskip 1.5em}
\fi
\newcommand*\chaptermark[1]{}
\setcounter{secnumdepth}{2}
\newcounter {part}
\newcounter {chapter}
\newcounter {section}[chapter]
\newcounter {subsection}[section]
\newcounter {subsubsection}[subsection]
\newcounter {paragraph}[subsubsection]
\newcounter {subparagraph}[paragraph]
\renewcommand \thepart {\@Roman\c@part}
\renewcommand \thechapter {\@arabic\c@chapter}
\renewcommand \thesection {\thechapter.\@arabic\c@section}
\renewcommand\thesubsection {\thesection.\@arabic\c@subsection}
\renewcommand\thesubsubsection{\thesubsection .\@arabic\c@subsubsection}
\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph}
\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph}
\newcommand\@chapapp{\chaptername}
\newcommand\frontmatter{%
\cleardoublepage
\@mainmatterfalse
\pagenumbering{roman}}
\newcommand\mainmatter{%
\cleardoublepage
\@mainmattertrue
\pagenumbering{arabic}}
\newcommand\backmatter{%
\if@openright
\cleardoublepage
\else
\clearpage
\fi
\@mainmatterfalse}
\newcommand\part{%
\if@openright
\cleardoublepage
\else
\clearpage
\fi
\thispagestyle{plain}%
\if@twocolumn
\onecolumn
\@tempswatrue
\else
\@tempswafalse
\fi
\null\vfil
\secdef\@part\@spart}
\def\@part[#1]#2{%
\ifnum \c@secnumdepth >-2\relax
\refstepcounter{part}%
\addcontentsline{toc}{part}{\thepart\hspace{1em}#1}%
\else
\addcontentsline{toc}{part}{#1}%
\fi
\markboth{}{}%
{\centering
\interlinepenalty \@M
\normalfont
\ifnum \c@secnumdepth >-2\relax
\huge\bfseries \partname\nobreakspace\thepart
\par
\vskip 20\p@
\fi
\Huge \bfseries #2\par}%
\@endpart}
\def\@spart#1{%
{\centering
\interlinepenalty \@M
\normalfont
\Huge \bfseries #1\par}%
\@endpart}
\def\@endpart{\vfil\newpage
\if@twoside
\if@openright
\null
\thispagestyle{empty}%
\newpage
\fi
\fi
\if@tempswa
\twocolumn
\fi}
\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi
\thispagestyle{plain}%
\global\@topnum\z@
\@afterindentfalse
\secdef\@chapter\@schapter}
\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\refstepcounter{chapter}%
\typeout{\@chapapp\space\thechapter.}%
\addcontentsline{toc}{chapter}%
{\protect\numberline{\thechapter}#1}%
\else
\addcontentsline{toc}{chapter}{#1}%
\fi
\else
\addcontentsline{toc}{chapter}{#1}%
\fi
\chaptermark{#1}%
\addtocontents{lof}{\protect\addvspace{10\p@}}%
\addtocontents{lot}{\protect\addvspace{10\p@}}%
\if@twocolumn
\@topnewpage[\@makechapterhead{#2}]%
\else
\@makechapterhead{#2}%
\@afterheading
\fi}
%%%%\def\@makechapterhead#1{%
%%%% \vspace*{50\p@}%
%%%% {\parindent \z@ \raggedright \normalfont
%%%% \ifnum \c@secnumdepth >\m@ne
%%%% \if@mainmatter
%%%% \huge\bfseries \@chapapp\space \thechapter
%%%% \par\nobreak
%%%% \vskip 20\p@
%%%% \fi
%%%% \fi
%%%% \interlinepenalty\@M
%%%% \Huge \bfseries #1\par\nobreak
%%%% \vskip 40\p@
%%%% }}
\newlength \titlewidth
\setlength \titlewidth {\textwidth}
\addtolength \titlewidth {\marginparwidth}
\addtolength \titlewidth {\marginparsep}
\def\@makechapterhead#1{%
\vspace*{50\p@}%
{\parindent \z@ \raggedleft \fontchapter
\ifnum \c@secnumdepth >\m@ne
\if@mainmatter
\huge \@chapapp\space \thechapter
\par\nobreak
\vskip 20\p@
\fi
\fi
\interlinepenalty\@M
\hsize=\titlewidth
\Huge #1 \par\nobreak
\hsize=\textwidth
\vskip 40\p@
}}
\def\@schapter#1{\if@twocolumn
\@topnewpage[\@makeschapterhead{#1}]%
\else
\@makeschapterhead{#1}%
\@afterheading
\fi}
%%%%\def\@makeschapterhead#1{%
%%%% \vspace*{50\p@}%
%%%% {\parindent \z@ \raggedright
%%%% \normalfont
%%%% \interlinepenalty\@M
%%%% \Huge \bfseries #1\par\nobreak
%%%% \vskip 40\p@
%%%% }}
\def\@makeschapterhead#1{%
\vspace*{50\p@}%
{\parindent \z@ \raggedright
\normalfont
\interlinepenalty\@M
\hsize=\titlewidth
\flushright
\Huge \bfseries #1\par\nobreak
\hsize=\textwidth
\vskip 40\p@
}}
\newcommand\section{\@startsection {section}{1}{\z@}%
{-3.5ex \@plus -1ex \@minus -.2ex}%
{2.3ex \@plus.2ex}%
{\normalfont\Large\bfseries}}
\newcommand\subsection{\@startsection{subsection}{2}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\large\bfseries}}
\newcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
{-3.25ex\@plus -1ex \@minus -.2ex}%
{1.5ex \@plus .2ex}%
{\normalfont\normalsize\bfseries}}
\newcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
{3.25ex \@plus1ex \@minus.2ex}%
{-1em}%
{\normalfont\normalsize\bfseries}}
\newcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}%
{3.25ex \@plus1ex \@minus .2ex}%
{-1em}%
{\normalfont\normalsize\bfseries}}
\if@twocolumn
\setlength\leftmargini {2em}
\else
\setlength\leftmargini {2.5em}
\fi
\leftmargin \leftmargini
\setlength\leftmarginii {2.2em}
\setlength\leftmarginiii {1.87em}
\setlength\leftmarginiv {1.7em}
\if@twocolumn
\setlength\leftmarginv {.5em}
\setlength\leftmarginvi {.5em}
\else
\setlength\leftmarginv {1em}
\setlength\leftmarginvi {1em}
\fi
\setlength \labelsep {.5em}
\setlength \labelwidth{\leftmargini}
\addtolength\labelwidth{-\labelsep}
\@beginparpenalty -\@lowpenalty
\@endparpenalty -\@lowpenalty
\@itempenalty -\@lowpenalty
\renewcommand\theenumi{\@arabic\c@enumi}
\renewcommand\theenumii{\@alph\c@enumii}
\renewcommand\theenumiii{\@roman\c@enumiii}
\renewcommand\theenumiv{\@Alph\c@enumiv}
\newcommand\labelenumi{\theenumi.}
\newcommand\labelenumii{(\theenumii)}
\newcommand\labelenumiii{\theenumiii.}
\newcommand\labelenumiv{\theenumiv.}
\renewcommand\p@enumii{\theenumi}
\renewcommand\p@enumiii{\theenumi(\theenumii)}
\renewcommand\p@enumiv{\p@enumiii\theenumiii}
\newcommand\labelitemi{\textbullet}
\newcommand\labelitemii{\normalfont\bfseries \textendash}
\newcommand\labelitemiii{\textasteriskcentered}
\newcommand\labelitemiv{\textperiodcentered}
\newenvironment{description}
{\list{}{\labelwidth\z@ \itemindent-\leftmargin
\let\makelabel\descriptionlabel}}
{\endlist}
\newcommand*\descriptionlabel[1]{\hspace\labelsep
\normalfont\bfseries #1}
\newenvironment{verse}
{\let\\\@centercr
\list{}{\itemsep \z@
\itemindent -1.5em%
\listparindent\itemindent
\rightmargin \leftmargin
\advance\leftmargin 1.5em}%
\item\relax}
{\endlist}
\newenvironment{quotation}
{\list{}{\listparindent 1.5em%
\itemindent \listparindent
\rightmargin \leftmargin
\parsep \z@ \@plus\p@}%
\item\relax}
{\endlist}
\newenvironment{quote}
{\list{}{\rightmargin\leftmargin}%
\item\relax}
{\endlist}
\if@compatibility
\newenvironment{titlepage}
{%
\cleardoublepage
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse\newpage
\fi
\thispagestyle{empty}%
\setcounter{page}\z@
}%
{\if@restonecol\twocolumn \else \newpage \fi
}
\else
\newenvironment{titlepage}
{%
\cleardoublepage
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse\newpage
\fi
\thispagestyle{empty}%
\setcounter{page}\@ne
}%
{\if@restonecol\twocolumn \else \newpage \fi
\if@twoside\else
\setcounter{page}\@ne
\fi
}
\fi
\newcommand\appendix{\par
\setcounter{chapter}{0}%
\setcounter{section}{0}%
\gdef\@chapapp{\appendixname}%
\gdef\thechapter{\@Alph\c@chapter}}
\setlength\arraycolsep{5\p@}
\setlength\tabcolsep{6\p@}
\setlength\arrayrulewidth{.4\p@}
\setlength\doublerulesep{2\p@}
\setlength\tabbingsep{\labelsep}
\skip\@mpfootins = \skip\footins
\setlength\fboxsep{3\p@}
\setlength\fboxrule{.4\p@}
\@addtoreset {equation}{chapter}
\renewcommand\theequation
{\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@equation}
\newcounter{figure}[chapter]
\renewcommand \thefigure
{\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@figure}
\def\fps@figure{tbp}
\def\ftype@figure{1}
\def\ext@figure{lof}
\def\fnum@figure{\figurename\nobreakspace\thefigure}
\newenvironment{figure}
{\@float{figure}}
{\end@float}
\newenvironment{figure*}
{\@dblfloat{figure}}
{\end@dblfloat}
\newcounter{table}[chapter]
\renewcommand \thetable
{\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@table}
\def\fps@table{tbp}
\def\ftype@table{2}
\def\ext@table{lot}
\def\fnum@table{\tablename\nobreakspace\thetable}
\newenvironment{table}
{\@float{table}}
{\end@float}
\newenvironment{table*}
{\@dblfloat{table}}
{\end@dblfloat}
\newlength\abovecaptionskip
\newlength\belowcaptionskip
\setlength\abovecaptionskip{10\p@}
\setlength\belowcaptionskip{0\p@}
\long\def\@makecaption#1#2{%
\vskip\abovecaptionskip
\sbox\@tempboxa{#1: #2}%
\ifdim \wd\@tempboxa >\hsize
#1: #2\par
\else
\global \@minipagefalse
\hb@xt@\hsize{\hfil\box\@tempboxa\hfil}%
\fi
\vskip\belowcaptionskip}
\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl}
\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc}
\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal}
\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal}
\newcommand\@pnumwidth{1.55em}
\newcommand\@tocrmarg{2.55em}
\newcommand\@dotsep{4.5}
\setcounter{tocdepth}{2}
\newcommand\tableofcontents{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\chapter*{\contentsname
\@mkboth{%
\MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
\@starttoc{toc}%
\if@restonecol\twocolumn\fi
}
\newcommand*\l@part[2]{%
\ifnum \c@tocdepth >-2\relax
\addpenalty{-\@highpenalty}%
\addvspace{2.25em \@plus\p@}%
\setlength\@tempdima{3em}%
\begingroup
\parindent \z@ \rightskip \@pnumwidth
\parfillskip -\@pnumwidth
{\leavevmode
\large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par
\nobreak
\global\@nobreaktrue
\everypar{\global\@nobreakfalse\everypar{}}%
\endgroup
\fi}
%%%%\newcommand*\l@chapter[2]{%
%%%% \ifnum \c@tocdepth >\m@ne
%%%% \addpenalty{-\@highpenalty}%
%%%% \vskip 1.0em \@plus\p@
%%%% \setlength\@tempdima{1.5em}%
%%%% \begingroup
%%%% \parindent \z@ \rightskip \@pnumwidth
%%%% \parfillskip -\@pnumwidth
%%%% \leavevmode \bfseries
%%%% \advance\leftskip\@tempdima
%%%% \hskip -\leftskip
%%%% #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
%%%% \penalty\@highpenalty
%%%% \endgroup
%%%% \fi}
\newcommand\l@chapter[2]{%
\ifnum \c@tocdepth >\m@ne
\addpenalty{-\@highpenalty}%
\vskip 1.0em \@plus\p@
\setlength\@tempdima{1.5em}%
\begingroup
\parindent \z@ \rightskip \@pnumwidth
\parfillskip -\@pnumwidth
\leavevmode \fontchapter
\advance\leftskip\@tempdima
\hskip -\leftskip
#1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
\penalty\@highpenalty
\endgroup
\fi}
\newcommand*\l@section{\@dottedtocline{1}{1.5em}{2.3em}}
\newcommand*\l@subsection{\@dottedtocline{2}{3.8em}{3.2em}}
\newcommand*\l@subsubsection{\@dottedtocline{3}{7.0em}{4.1em}}
\newcommand*\l@paragraph{\@dottedtocline{4}{10em}{5em}}
\newcommand*\l@subparagraph{\@dottedtocline{5}{12em}{6em}}
\newcommand\listoffigures{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\chapter*{\listfigurename}%
\@mkboth{\MakeUppercase\listfigurename}%
{\MakeUppercase\listfigurename}%
\@starttoc{lof}%
\if@restonecol\twocolumn\fi
}
\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}}
\newcommand\listoftables{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\chapter*{\listtablename}%
\@mkboth{%
\MakeUppercase\listtablename}%
{\MakeUppercase\listtablename}%
\@starttoc{lot}%
\if@restonecol\twocolumn\fi
}
\let\l@table\l@figure
\newdimen\bibindent
\setlength\bibindent{1.5em}
\newenvironment{thebibliography}[1]
{\chapter*{\bibname}%
\@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}%
\list{\@biblabel{\@arabic\c@enumiv}}%
{\settowidth\labelwidth{\@biblabel{#1}}%
\leftmargin\labelwidth
\advance\leftmargin\labelsep
\@openbib@code
\usecounter{enumiv}%
\let\p@enumiv\@empty
\renewcommand\theenumiv{\@arabic\c@enumiv}}%
\sloppy
\clubpenalty4000
\@clubpenalty \clubpenalty
\widowpenalty4000%
\sfcode`\.\@m}
{\def\@noitemerr
{\@latex@warning{Empty `thebibliography' environment}}%
\endlist}
\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em}
\let\@openbib@code\@empty
\newenvironment{theindex}
{\if@twocolumn
\@restonecolfalse
\else
\@restonecoltrue
\fi
\columnseprule \z@
\columnsep 35\p@
\twocolumn[\@makeschapterhead{\indexname}]%
\@mkboth{\MakeUppercase\indexname}%
{\MakeUppercase\indexname}%
\thispagestyle{plain}\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\let\item\@idxitem}
{\if@restonecol\onecolumn\else\clearpage\fi}
\newcommand\@idxitem{\par\hangindent 40\p@}
\newcommand\subitem{\@idxitem \hspace*{20\p@}}
\newcommand\subsubitem{\@idxitem \hspace*{30\p@}}
\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax}
\renewcommand\footnoterule{%
\kern-3\p@
\hrule\@width.4\columnwidth
\kern2.6\p@}
\@addtoreset{footnote}{chapter}
\newcommand\@makefntext[1]{%
\parindent 1em%
\noindent
\hb@xt@1.8em{\hss\@makefnmark}#1}
\newcommand\contentsname{Contents}
\newcommand\listfigurename{List of Figures}
\newcommand\listtablename{List of Tables}
\newcommand\bibname{Bibliography}
\newcommand\indexname{Index}
\newcommand\figurename{Figure}
\newcommand\tablename{Table}
\newcommand\partname{Part}
\newcommand\chaptername{Chapter}
\newcommand\appendixname{Appendix}
\def\today{\ifcase\month\or
January\or February\or March\or April\or May\or June\or
July\or August\or September\or October\or November\or December\fi
\space\number\day, \number\year}
\setlength\columnsep{10\p@}
\setlength\columnseprule{0\p@}
\pagestyle{headings}
\pagenumbering{arabic}
\if@twoside
\else
\raggedbottom
\fi
\if@twocolumn
\twocolumn
\sloppy
\flushbottom
\else
\onecolumn
\fi
\endinput
%%
%% End of file `book.cls'.

17
knik/doc/footer.html Normal file
View File

@ -0,0 +1,17 @@
<br>
<hr>
<table class="footer1">
<tr>
<td class="LFooter"><small>Generated by doxygen $doxygenversion on $date</small></td>
<td class="RFooter"><a href='#pagetop'><small>Return to top of page</small></a></td>
</tr>
</table>
<table class="footer2">
<tr>
<td class="LFooter">Knik - Global Router</td>
<td class="CFooter"><a href='mailto:damien.dupuis@lip6.fr'>Damien.Dupuis@lip6.fr</a></td>
<td class="RFooter"><small>Copyright &#169; 2006 LIP6. All rights reserved</small></td>
</tr>
</table>
</body>
</html>

23
knik/doc/header.html Normal file
View File

@ -0,0 +1,23 @@
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Knik - Global Router: Router Documentation</title>
<link href="ASIM.css" rel="stylesheet" type="text/css">
</head>
<h1 class="header">Knik - Global Router</h1>
<center class="header">
<table class="header">
<tr>
<td><a href="index.html">Summary</a></td>
<td><a href="modules.html">Concepts</a></td>
<td><a href="namespaces.html">Namespaces</a></td>
<td><a href="hierarchy.html">Class Hierarchy</a></td>
<td><a href="annotated.html">Classes</a></td>
<td><a href="functions.html">Member Index</a></td>
<!-- <td><a href="classes.html">Index2</a></td> -->
</tr>
</table>
</center>
<br>
<hr>
<body>

47
knik/doc/header.tex Normal file
View File

@ -0,0 +1,47 @@
\documentclass[a4paper]{asimbook}
\usepackage{a4wide}
\usepackage{makeidx}
\usepackage{fancyhdr}
\usepackage{graphicx}
\usepackage{multicol}
\usepackage{float}
\usepackage{textcomp}
\usepackage{alltt}
\usepackage{times}
\ifx\pdfoutput\undefined
\usepackage[ps2pdf,pagebackref=true,colorlinks=true,linkcolor=blue]{hyperref}
\usepackage{pspicture}
\else
\usepackage[pdftex,pagebackref=true,colorlinks=true,linkcolor=blue]{hyperref}
\fi
\usepackage{doxygen}
\makeindex
\setcounter{tocdepth}{1}
\renewcommand{\footrulewidth}{0.4pt}
\raggedbottom
\begin{document}
\begin{titlepage}
\vspace*{7cm}
\begin{center}
{\Large $projectname Reference Manual\\[1ex]\large $projectnumber }\\
\vspace*{1cm}
{\large Generated by Doxygen $doxygenversion}\\
\vspace*{0.5cm}
{\small $datetime}\\
\end{center}
\end{titlepage}
\clearemptydoublepage
\pagenumbering{roman}
\tableofcontents
\clearemptydoublepage
\pagenumbering{arabic}

1
knik/doc/html.entry Normal file
View File

@ -0,0 +1 @@
<LI><A CLASS="entry" HREF="knik/index.html">Knik</A><BR>Global Router<BR><BR>

View File

@ -0,0 +1,161 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
6 5925 5325 10875 10275
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 7800 6000 150 150 7800 6000 7950 6000
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 7800 7200 150 150 7800 7200 7950 7200
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 9000 7200 150 150 9000 7200 9150 7200
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 10200 7200 150 150 10200 7200 10350 7200
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 10200 6000 150 150 10200 6000 10350 6000
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 9000 6000 150 150 9000 6000 9150 6000
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 9000 8400 150 150 9000 8400 9150 8400
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 10200 8400 150 150 10200 8400 10350 8400
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 10200 9600 150 150 10200 9600 10350 9600
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 9000 9600 150 150 9000 9600 9150 9600
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 7800 9600 150 150 7800 9600 7950 9600
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 7800 8400 150 150 7800 8400 7950 8400
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 6600 8400 150 150 6600 8400 6750 8400
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 6600 9600 150 150 6600 9600 6750 9600
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 6600 7200 150 150 6600 7200 6750 7200
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 6600 6000 150 150 6600 6000 6750 6000
1 3 0 3 5 5 44 -1 20 8.000 1 0.0000 7800 9600 150 150 7800 9600 7950 9600
1 3 0 3 5 5 44 -1 20 8.000 1 0.0000 6600 6000 150 150 6600 6000 6750 6000
1 3 0 3 5 5 44 -1 20 8.000 1 0.0000 10200 7200 150 150 10200 7200 10350 7200
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 7800 9600 150 150 7800 9600 7950 9600
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 7800 8400 150 150 7800 8400 7950 8400
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 7800 7200 150 150 7800 7200 7950 7200
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 9000 7200 150 150 9000 7200 9150 7200
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 10200 7200 150 150 10200 7200 10350 7200
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 7800 6000 150 150 7800 6000 7950 6000
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 6600 6000 150 150 6600 6000 6750 6000
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 0 0 2
6000 10200 10800 10200
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 0 0 2
6000 5400 6000 10200
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 0 0 2
10800 10200 10800 5400
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 0 0 2
10800 5400 6000 5400
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
7200 5400 7200 10200
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
8400 10200 8400 5400
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
9600 5400 9600 10200
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
10800 7800 6000 7800
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
6000 6600 10800 6600
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
10800 9000 6000 9000
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
10200 6000 10200 9600
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
6600 9600 10200 9600
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
10200 8400 6600 8400
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
6600 6000 10200 6000
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
6600 6000 6600 9600
2 1 0 3 2 2 46 -1 20 8.000 0 0 -1 0 0 2
6600 7200 10200 7200
2 1 0 3 2 2 46 -1 20 8.000 0 0 -1 0 0 2
7800 6000 7800 9600
2 1 0 3 2 2 46 -1 20 8.000 0 0 -1 0 0 2
9000 9600 9000 6000
2 2 0 3 0 11 50 -1 20 0.000 0 0 -1 0 0 5
6000 5400 6750 5400 6750 6600 6000 6600 6000 5400
2 2 0 3 0 11 50 -1 20 0.000 0 0 -1 0 0 5
9600 6600 10200 6600 10200 7800 9600 7800 9600 6600
2 2 0 3 0 11 50 -1 20 0.000 0 0 -1 0 0 5
7800 9000 8400 9000 8400 10200 7800 10200 7800 9000
2 2 0 2 1 1 49 -1 20 6.000 0 0 -1 0 0 5
9825 7125 9675 7125 9675 7725 9825 7725 9825 7125
2 2 0 2 1 1 49 -1 20 6.000 0 0 -1 0 0 5
8250 9075 8100 9075 8100 9600 8250 9600 8250 9075
2 2 0 2 1 1 49 -1 20 6.000 0 0 -1 0 0 5
6225 5475 6075 5475 6075 6525 6225 6525 6225 5475
2 1 0 3 5 7 42 -1 -1 0.000 0 0 -1 0 0 3
6600 6000 7800 6000 7800 9600
2 1 0 3 5 7 42 -1 -1 0.000 0 0 -1 0 0 2
7800 7200 10200 7200
-6
6 -75 5325 4875 10275
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 1800 6000 150 150 1800 6000 1950 6000
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 1800 7200 150 150 1800 7200 1950 7200
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 3000 7200 150 150 3000 7200 3150 7200
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 4200 7200 150 150 4200 7200 4350 7200
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 4200 6000 150 150 4200 6000 4350 6000
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 3000 6000 150 150 3000 6000 3150 6000
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 3000 8400 150 150 3000 8400 3150 8400
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 4200 8400 150 150 4200 8400 4350 8400
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 4200 9600 150 150 4200 9600 4350 9600
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 3000 9600 150 150 3000 9600 3150 9600
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 1800 9600 150 150 1800 9600 1950 9600
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 1800 8400 150 150 1800 8400 1950 8400
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 600 8400 150 150 600 8400 750 8400
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 600 9600 150 150 600 9600 750 9600
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 600 7200 150 150 600 7200 750 7200
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 600 6000 150 150 600 6000 750 6000
1 3 0 3 5 5 44 -1 20 8.000 1 0.0000 1800 6000 150 150 1800 6000 1950 6000
1 3 0 3 5 5 44 -1 20 8.000 1 0.0000 3000 9600 150 150 3000 9600 3150 9600
1 3 0 3 5 5 44 -1 20 8.000 1 0.0000 4200 6000 150 150 4200 6000 4350 6000
1 3 0 3 5 5 44 -1 20 8.000 1 0.0000 1800 7200 150 150 1800 7200 1950 7200
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 0 0 2
0 10200 4800 10200
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 0 0 2
0 5400 0 10200
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 0 0 2
4800 10200 4800 5400
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 0 0 2
4800 5400 0 5400
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
1200 5400 1200 10200
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
2400 10200 2400 5400
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
3600 5400 3600 10200
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
4800 7800 0 7800
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
0 6600 4800 6600
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
4800 9000 0 9000
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
4200 6000 4200 9600
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
600 9600 4200 9600
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
4200 8400 600 8400
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
600 6000 4200 6000
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
600 6000 600 9600
2 1 0 3 2 2 46 -1 20 8.000 0 0 -1 0 0 2
600 7200 4200 7200
2 1 0 3 2 2 46 -1 20 8.000 0 0 -1 0 0 2
1800 6000 1800 9600
2 1 0 3 2 2 46 -1 20 8.000 0 0 -1 0 0 2
3000 9600 3000 6000
2 2 0 3 0 11 50 -1 20 0.000 0 0 -1 0 0 5
0 5400 1500 5400 1500 7800 0 7800 0 5400
2 2 0 2 1 1 49 -1 20 6.000 0 0 -1 0 0 5
1425 5475 1275 5475 1275 7125 1425 7125 1425 5475
2 2 0 3 0 11 50 -1 20 0.000 0 0 -1 0 0 5
4200 5400 4800 5400 4800 6600 4200 6600 4200 5400
2 2 0 2 1 1 49 -1 20 6.000 0 0 -1 0 0 5
4725 5925 4575 5925 4575 6525 4725 6525 4725 5925
2 2 0 2 1 1 49 -1 20 6.000 0 0 -1 0 0 5
2625 9075 2475 9075 2475 9600 2625 9600 2625 9075
2 2 0 3 0 11 50 -1 20 0.000 0 0 -1 0 0 5
2400 9000 3000 9000 3000 10200 2400 10200 2400 9000
2 1 0 3 5 7 44 -1 -1 0.000 0 0 -1 0 0 2
1800 7200 1800 6000
-6

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@ -0,0 +1,32 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
6 5400 7500 7425 8325
2 1 0 3 0 7 47 -1 -1 8.000 0 0 -1 0 0 2
5475 7875 7350 7875
4 1 0 47 -1 0 24 0.0000 4 300 1710 6450 7725 occupancy\001
4 1 0 47 -1 0 24 0.0000 4 375 1305 6450 8205 capacity\001
-6
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 3.00 180.00 360.00
0 7200 0 0
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 3.00 180.00 360.00
0 7200 6600 7200
2 1 0 3 0 7 49 -1 -1 8.000 0 0 -1 0 0 4
0 6600 2400 6600 4200 1200 6000 1200
2 1 1 3 1 7 48 -1 -1 8.000 0 0 -1 0 0 2
3000 7350 3000 300
4 2 0 47 -1 0 24 0.0000 4 270 195 -300 6600 1\001
4 2 0 47 -1 0 24 0.0000 4 330 855 -300 300 _cost\001
4 2 0 47 -1 0 24 0.0000 4 270 195 -300 4800 4\001
4 2 0 47 -1 0 24 0.0000 4 270 390 -300 1200 10\001
4 1 0 47 -1 0 24 0.0000 4 270 480 2400 7800 0.8\001
4 1 0 47 -1 0 24 0.0000 4 270 480 4200 7800 1.4\001
4 1 1 47 -1 0 24 0.0000 4 270 195 3000 7800 1\001

View File

@ -0,0 +1,72 @@
%PDF-1.3
%Çì<C387>¢
5 0 obj
<</Length 6 0 R/Filter /FlateDecode>>
stream
­SMkÜ0½Ï¯˜ãn`U<>4¬k¡zKbÈ!„°8ìnŠ<6E><C5A0>&¥äßg4²ãÝ ”¤4ŸïÍ<Y<>h ¡-ßxv|9K¸},Y $zÄ{†¦zØA
Ùäì<EFBFBD>sÎRÃhöÕL>ˆ™l<E284A2>¢(™@Å<>zjv'xÔà ¼U>gßßÚb²ÆZø(ús8•êí!àpL·?È!ó椲Όÿ´“Q>ªÇÄÒ‹‘â¸ÕIŽ5Ò3Ù£HtQ»F-æš çMÈ÷²qŒá°¹(w 0ü…äýh3­¨ø¿ ŠŽÓød}ÑÒëìêöà<C3B6>S—]*.{»ïžÃ¥àã•È~£·@åV]¨E¡™™"ÜÐÔ6÷èŸàå+N”«=<3D>(ìGJ[-ÿµ•Ë§j<C2A7>G7à×VÞRƒŽLÄvõ<>2a‡>˜PPÚ÷]÷ûa}×½,ÛŸc(sÀ•kLƒí ,ºõú»}ÖìʧlbÌÑxÍR ³I9yô©ö\w÷OÏ%3%VE a­TDv+ŠUîrY²âÊg _.¬iÂìB¦^^µ?à[«<>n”¶ŸÀÉ}Êþ$"Žûë
Š{
¯™ ë¶endstream
endobj
6 0 obj
446
endobj
4 0 obj
<</Type/Page/MediaBox [0 0 514 501]
/Parent 3 0 R
/Resources<</ProcSet[/PDF /Text]
/ExtGState 9 0 R
/Font 10 0 R
>>
/Contents 5 0 R
>>
endobj
3 0 obj
<< /Type /Pages /Kids [
4 0 R
] /Count 1
>>
endobj
1 0 obj
<</Type /Catalog /Pages 3 0 R
>>
endobj
7 0 obj
<</Type/ExtGState
/OPM 1>>endobj
9 0 obj
<</R7
7 0 R>>
endobj
10 0 obj
<</R8
8 0 R>>
endobj
8 0 obj
<</BaseFont/Times-Roman/Type/Font
/Subtype/Type1>>
endobj
2 0 obj
<</Producer(ESP Ghostscript 815.02)
/CreationDate(D:20080703182538)
/ModDate(D:20080703182538)>>endobj
xref
0 11
0000000000 65535 f
0000000759 00000 n
0000000973 00000 n
0000000700 00000 n
0000000550 00000 n
0000000015 00000 n
0000000531 00000 n
0000000807 00000 n
0000000907 00000 n
0000000848 00000 n
0000000877 00000 n
trailer
<< /Size 11 /Root 1 0 R /Info 2 0 R
/ID [(4™À\)õS´új ö3)(4™À\)õS´új ö3)]
>>
startxref
1084
%%EOF

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

View File

@ -0,0 +1,132 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 2700 7650 90 90 2700 7650 2790 7650
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 450 9450 90 90 450 9450 540 9450
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 900 9450 90 90 900 9450 990 9450
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 1350 9450 90 90 1350 9450 1440 9450
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 1800 9450 90 90 1800 9450 1890 9450
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 2250 9450 90 90 2250 9450 2340 9450
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 2700 9450 90 90 2700 9450 2790 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 8685 405 8820 495 8820 450 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8685 1305 8820 1395 8820 1350 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8685 2205 8820 2295 8820 2250 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 7785 2205 7920 2295 7920 2250 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 7785 1305 7920 1395 7920 1350 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 7785 405 7920 495 7920 450 7785
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
1215 9450 1080 9405 1080 9495 1215 9450
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
2115 9450 1980 9405 1980 9495 2115 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8550 1980 8505 1980 8595 2115 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8550 1080 8505 1080 8595 1215 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 7650 1080 7605 1080 7695 1215 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 7650 1980 7605 1980 7695 2115 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 7785 855 7920 945 7920 900 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 7785 1755 7920 1845 7920 1800 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 7785 2655 7920 2745 7920 2700 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 7650 2430 7605 2430 7695 2565 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 7650 1530 7605 1530 7695 1665 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 7650 630 7605 630 7695 765 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 8235 405 8370 495 8370 450 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8235 855 8370 945 8370 900 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8235 1305 8370 1395 8370 1350 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8235 1755 8370 1845 8370 1800 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8235 2205 8370 2295 8370 2250 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8235 2655 8370 2745 8370 2700 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8685 855 8820 945 8820 900 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8685 1755 8820 1845 8820 1800 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8685 2655 8820 2745 8820 2700 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 9135 405 9270 495 9270 450 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 9135 855 9270 945 9270 900 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 9135 1305 9270 1395 9270 1350 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 9135 1755 9270 1845 9270 1800 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 9135 2205 9270 2295 9270 2250 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 9135 2655 9270 2745 9270 2700 9135
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
765 9450 630 9405 630 9495 765 9450
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
1665 9450 1530 9405 1530 9495 1665 9450
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
2565 9450 2430 9405 2430 9495 2565 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8550 630 8505 630 8595 765 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8550 1530 8505 1530 8595 1665 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8550 2430 8505 2430 8595 2565 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 9000 630 8955 630 9045 765 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8100 630 8055 630 8145 765 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 9000 1080 8955 1080 9045 1215 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8100 1080 8055 1080 8145 1215 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 9000 1530 8955 1530 9045 1665 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8100 1530 8055 1530 8145 1665 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 9000 1980 8955 1980 9045 2115 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8100 1980 8055 1980 8145 2115 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8100 2430 8055 2430 8145 2565 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 9000 2430 8955 2430 9045 2565 9000
2 2 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 5
450 9450 2700 9450 2700 7650 450 7650 450 9450
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1350 9450 1350 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
900 9450 900 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 9000 2700 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8550 2700 8550
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8100 2700 8100
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1800 9450 1800 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
2250 9450 2250 7650
4 1 0 48 -1 0 12 0.0000 4 150 135 2835 7605 T\001
4 1 0 48 -1 0 12 0.0000 4 150 120 270 9585 S\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,136 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 2700 7650 90 90 2700 7650 2790 7650
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 450 9450 90 90 450 9450 540 9450
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 900 9450 90 90 900 9450 990 9450
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 1350 9450 90 90 1350 9450 1440 9450
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 1800 9450 90 90 1800 9450 1890 9450
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 2250 9450 90 90 2250 9450 2340 9450
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 2700 9450 90 90 2700 9450 2790 9450
1 3 0 1 1 0 47 -1 -1 4.000 1 0.0000 450 9000 90 90 450 9000 540 9000
1 3 0 1 1 0 47 -1 -1 4.000 1 0.0000 450 8550 90 90 450 8550 540 8550
1 3 0 1 1 0 47 -1 -1 4.000 1 0.0000 450 8100 90 90 450 8100 540 8100
1 3 0 1 1 0 47 -1 -1 4.000 1 0.0000 450 7650 90 90 450 7650 540 7650
2 1 0 1 1 1 49 -1 20 0.000 0 0 -1 0 0 4
450 8685 405 8820 495 8820 450 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8685 1305 8820 1395 8820 1350 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8685 2205 8820 2295 8820 2250 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 7785 2205 7920 2295 7920 2250 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 7785 1305 7920 1395 7920 1350 7785
2 1 0 1 1 1 49 -1 20 0.000 0 0 -1 0 0 4
450 7785 405 7920 495 7920 450 7785
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
1215 9450 1080 9405 1080 9495 1215 9450
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
2115 9450 1980 9405 1980 9495 2115 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8550 1980 8505 1980 8595 2115 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8550 1080 8505 1080 8595 1215 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 7650 1080 7605 1080 7695 1215 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 7650 1980 7605 1980 7695 2115 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 7785 855 7920 945 7920 900 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 7785 1755 7920 1845 7920 1800 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 7785 2655 7920 2745 7920 2700 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 7650 2430 7605 2430 7695 2565 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 7650 1530 7605 1530 7695 1665 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 7650 630 7605 630 7695 765 7650
2 1 0 1 1 1 49 -1 20 0.000 0 0 -1 0 0 4
450 8235 405 8370 495 8370 450 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8235 855 8370 945 8370 900 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8235 1305 8370 1395 8370 1350 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8235 1755 8370 1845 8370 1800 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8235 2205 8370 2295 8370 2250 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8235 2655 8370 2745 8370 2700 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8685 855 8820 945 8820 900 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8685 1755 8820 1845 8820 1800 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8685 2655 8820 2745 8820 2700 8685
2 1 0 1 1 1 49 -1 20 0.000 0 0 -1 0 0 4
450 9135 405 9270 495 9270 450 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 9135 855 9270 945 9270 900 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 9135 1305 9270 1395 9270 1350 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 9135 1755 9270 1845 9270 1800 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 9135 2205 9270 2295 9270 2250 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 9135 2655 9270 2745 9270 2700 9135
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
765 9450 630 9405 630 9495 765 9450
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
1665 9450 1530 9405 1530 9495 1665 9450
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
2565 9450 2430 9405 2430 9495 2565 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8550 630 8505 630 8595 765 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8550 1530 8505 1530 8595 1665 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8550 2430 8505 2430 8595 2565 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 9000 630 8955 630 9045 765 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8100 630 8055 630 8145 765 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 9000 1080 8955 1080 9045 1215 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8100 1080 8055 1080 8145 1215 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 9000 1530 8955 1530 9045 1665 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8100 1530 8055 1530 8145 1665 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 9000 1980 8955 1980 9045 2115 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8100 1980 8055 1980 8145 2115 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8100 2430 8055 2430 8145 2565 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 9000 2430 8955 2430 9045 2565 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1350 9450 1350 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
900 9450 900 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 9000 2700 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8550 2700 8550
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8100 2700 8100
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1800 9450 1800 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
2250 9450 2250 7650
2 2 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 5
450 9450 2700 9450 2700 7650 450 7650 450 9450
4 1 0 48 -1 0 12 0.0000 4 150 135 2835 7605 T\001
4 1 0 48 -1 0 12 0.0000 4 150 120 270 9585 S\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,135 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 2700 7650 90 90 2700 7650 2790 7650
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 450 9450 90 90 450 9450 540 9450
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 450 9000 90 90 450 9000 540 9000
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 450 8550 90 90 450 8550 540 8550
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 900 8550 90 90 900 8550 990 8550
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 1350 8550 90 90 1350 8550 1440 8550
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 1800 8550 90 90 1800 8550 1890 8550
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 1800 8100 90 90 1800 8100 1890 8100
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 2250 8100 90 90 2250 8100 2340 8100
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 2250 7650 90 90 2250 7650 2340 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8685 1305 8820 1395 8820 1350 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8685 2205 8820 2295 8820 2250 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 7785 1305 7920 1395 7920 1350 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 7785 405 7920 495 7920 450 7785
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
1215 9450 1080 9405 1080 9495 1215 9450
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
2115 9450 1980 9405 1980 9495 2115 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 7650 1080 7605 1080 7695 1215 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 7650 1980 7605 1980 7695 2115 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 7785 855 7920 945 7920 900 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 7785 1755 7920 1845 7920 1800 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 7785 2655 7920 2745 7920 2700 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 7650 1530 7605 1530 7695 1665 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 7650 630 7605 630 7695 765 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 8235 405 8370 495 8370 450 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8235 855 8370 945 8370 900 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8235 1305 8370 1395 8370 1350 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8235 2205 8370 2295 8370 2250 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8235 2655 8370 2745 8370 2700 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8685 855 8820 945 8820 900 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8685 1755 8820 1845 8820 1800 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8685 2655 8820 2745 8820 2700 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 9135 855 9270 945 9270 900 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 9135 1305 9270 1395 9270 1350 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 9135 1755 9270 1845 9270 1800 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 9135 2205 9270 2295 9270 2250 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 9135 2655 9270 2745 9270 2700 9135
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
765 9450 630 9405 630 9495 765 9450
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
1665 9450 1530 9405 1530 9495 1665 9450
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
2565 9450 2430 9405 2430 9495 2565 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 9000 630 8955 630 9045 765 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8100 630 8055 630 8145 765 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 9000 1080 8955 1080 9045 1215 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8100 1080 8055 1080 8145 1215 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 9000 1530 8955 1530 9045 1665 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8100 1530 8055 1530 8145 1665 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 9000 1980 8955 1980 9045 2115 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8100 2430 8055 2430 8145 2565 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 9000 2430 8955 2430 9045 2565 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1350 9450 1350 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
900 9450 900 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 9000 2700 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8550 2700 8550
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8100 2700 8100
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1800 9450 1800 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
2250 9450 2250 7650
2 2 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 5
450 9450 2700 9450 2700 7650 450 7650 450 9450
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
450 9135 405 9270 495 9270 450 9135
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
450 8685 405 8820 495 8820 450 8685
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
765 8550 630 8505 630 8595 765 8550
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
1215 8550 1080 8505 1080 8595 1215 8550
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
1665 8550 1530 8505 1530 8595 1665 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8550 2430 8505 2430 8595 2565 8550
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
1800 8235 1755 8370 1845 8370 1800 8235
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
2115 8100 1980 8055 1980 8145 2115 8100
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
2250 7785 2205 7920 2295 7920 2250 7785
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
2565 7650 2430 7605 2430 7695 2565 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8550 1980 8505 1980 8595 2115 8550
4 1 0 48 -1 0 12 0.0000 4 150 135 2835 7605 T\001
4 1 0 48 -1 0 12 0.0000 4 150 120 270 9585 S\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,135 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 2700 7650 90 90 2700 7650 2790 7650
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 450 9450 90 90 450 9450 540 9450
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 450 9000 90 90 450 9000 540 9000
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 450 8550 90 90 450 8550 540 8550
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 2250 7650 90 90 2250 7650 2340 7650
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 450 8100 90 90 450 8100 540 8100
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 1350 7650 90 90 1350 7650 1440 7650
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 1800 7650 90 90 1800 7650 1890 7650
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 450 7650 90 90 450 7650 540 7650
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 900 7650 90 90 900 7650 990 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8685 1305 8820 1395 8820 1350 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8685 2205 8820 2295 8820 2250 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 7785 1305 7920 1395 7920 1350 7785
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
1215 9450 1080 9405 1080 9495 1215 9450
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
2115 9450 1980 9405 1980 9495 2115 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 7785 855 7920 945 7920 900 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 7785 1755 7920 1845 7920 1800 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 7785 2655 7920 2745 7920 2700 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8235 855 8370 945 8370 900 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8235 1305 8370 1395 8370 1350 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8235 2205 8370 2295 8370 2250 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8235 2655 8370 2745 8370 2700 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8685 855 8820 945 8820 900 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8685 1755 8820 1845 8820 1800 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8685 2655 8820 2745 8820 2700 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 9135 855 9270 945 9270 900 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 9135 1305 9270 1395 9270 1350 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 9135 1755 9270 1845 9270 1800 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 9135 2205 9270 2295 9270 2250 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 9135 2655 9270 2745 9270 2700 9135
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
765 9450 630 9405 630 9495 765 9450
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
1665 9450 1530 9405 1530 9495 1665 9450
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
2565 9450 2430 9405 2430 9495 2565 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 9000 630 8955 630 9045 765 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8100 630 8055 630 8145 765 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 9000 1080 8955 1080 9045 1215 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8100 1080 8055 1080 8145 1215 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 9000 1530 8955 1530 9045 1665 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8100 1530 8055 1530 8145 1665 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 9000 1980 8955 1980 9045 2115 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8100 2430 8055 2430 8145 2565 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 9000 2430 8955 2430 9045 2565 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1350 9450 1350 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
900 9450 900 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 9000 2700 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8550 2700 8550
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8100 2700 8100
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1800 9450 1800 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
2250 9450 2250 7650
2 2 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 5
450 9450 2700 9450 2700 7650 450 7650 450 9450
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
450 9135 405 9270 495 9270 450 9135
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
450 8685 405 8820 495 8820 450 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8550 2430 8505 2430 8595 2565 8550
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
2565 7650 2430 7605 2430 7695 2565 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8550 1980 8505 1980 8595 2115 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8100 1980 8055 1980 8145 2115 8100
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
765 7650 630 7605 630 7695 765 7650
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
1215 7650 1080 7605 1080 7695 1215 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8550 1080 8505 1080 8595 1215 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8550 630 8505 630 8595 765 8550
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
2115 7650 1980 7605 1980 7695 2115 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 7785 2205 7920 2295 7920 2250 7785
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
450 7785 405 7920 495 7920 450 7785
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
450 8235 405 8370 495 8370 450 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8235 1755 8370 1845 8370 1800 8235
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
1665 7650 1530 7605 1530 7695 1665 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8550 1530 8505 1530 8595 1665 8550
4 1 0 48 -1 0 12 0.0000 4 150 135 2835 7605 T\001
4 1 0 48 -1 0 12 0.0000 4 150 120 270 9585 S\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,127 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 0 3 0 0 50 -1 20 0.000 1 0.0000 450 9450 142 142 450 9450 592 9450
1 3 0 3 0 0 50 -1 20 0.000 1 0.0000 4950 5850 142 142 4950 5850 5092 5850
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 8685 405 8820 495 8820 450 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8685 1305 8820 1395 8820 1350 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8685 2205 8820 2295 8820 2250 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3150 8685 3105 8820 3195 8820 3150 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4050 8685 4005 8820 4095 8820 4050 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4950 8685 4905 8820 4995 8820 4950 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4950 7785 4905 7920 4995 7920 4950 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4050 7785 4005 7920 4095 7920 4050 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3150 7785 3105 7920 3195 7920 3150 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 7785 2205 7920 2295 7920 2250 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 7785 1305 7920 1395 7920 1350 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 7785 405 7920 495 7920 450 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 6885 405 7020 495 7020 450 6885
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 6885 1305 7020 1395 7020 1350 6885
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 6885 2205 7020 2295 7020 2250 6885
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3150 6885 3105 7020 3195 7020 3150 6885
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4050 6885 4005 7020 4095 7020 4050 6885
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4950 6885 4905 7020 4995 7020 4950 6885
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4950 5985 4905 6120 4995 6120 4950 5985
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4050 5985 4005 6120 4095 6120 4050 5985
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3150 5985 3105 6120 3195 6120 3150 5985
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 5985 2205 6120 2295 6120 2250 5985
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 5985 1305 6120 1395 6120 1350 5985
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 5985 405 6120 495 6120 450 5985
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 9450 1080 9405 1080 9495 1215 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 9450 1980 9405 1980 9495 2115 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3015 9450 2880 9405 2880 9495 3015 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3915 9450 3780 9405 3780 9495 3915 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4815 9450 4680 9405 4680 9495 4815 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4815 8550 4680 8505 4680 8595 4815 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3915 8550 3780 8505 3780 8595 3915 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3015 8550 2880 8505 2880 8595 3015 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8550 1980 8505 1980 8595 2115 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8550 1080 8505 1080 8595 1215 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 7650 1080 7605 1080 7695 1215 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 6750 1080 6705 1080 6795 1215 6750
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 5850 1080 5805 1080 5895 1215 5850
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 5850 1980 5805 1980 5895 2115 5850
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3015 5850 2880 5805 2880 5895 3015 5850
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3915 5850 3780 5805 3780 5895 3915 5850
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4815 5850 4680 5805 4680 5895 4815 5850
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4815 6750 4680 6705 4680 6795 4815 6750
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3915 6750 3780 6705 3780 6795 3915 6750
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3015 6750 2880 6705 2880 6795 3015 6750
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 6750 1980 6705 1980 6795 2115 6750
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 7650 1980 7605 1980 7695 2115 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3015 7650 2880 7605 2880 7695 3015 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3915 7650 3780 7605 3780 7695 3915 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4815 7650 4680 7605 4680 7695 4815 7650
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1350 9450 1350 5850
2 2 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 5
450 9450 4950 9450 4950 5850 450 5850 450 9450
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8550 4950 8550
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 7650 4950 7650
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 6750 4950 6750
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
2250 9450 2250 5850
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
3150 9450 3150 5850
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
4050 9450 4050 5850
4 1 0 48 -1 0 24 0.0000 4 270 210 180 9810 S\001
4 1 0 48 -1 0 24 0.0000 4 270 255 5175 5850 T\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,132 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 450 7650 90 90 450 7650 540 7650
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 900 7650 90 90 900 7650 990 7650
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 1350 7650 90 90 1350 7650 1440 7650
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 1800 7650 90 90 1800 7650 1890 7650
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 2250 7650 90 90 2250 7650 2340 7650
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 2700 7650 90 90 2700 7650 2790 7650
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 2700 9450 90 90 2700 9450 2790 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 8685 405 8820 495 8820 450 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8685 1305 8820 1395 8820 1350 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8685 2205 8820 2295 8820 2250 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 7785 2205 7920 2295 7920 2250 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 7785 1305 7920 1395 7920 1350 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 7785 405 7920 495 7920 450 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8550 1980 8505 1980 8595 2115 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8550 1080 8505 1080 8595 1215 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 7785 855 7920 945 7920 900 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 7785 1755 7920 1845 7920 1800 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 7785 2655 7920 2745 7920 2700 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 8235 405 8370 495 8370 450 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8235 855 8370 945 8370 900 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8235 1305 8370 1395 8370 1350 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8235 1755 8370 1845 8370 1800 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8235 2205 8370 2295 8370 2250 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8235 2655 8370 2745 8370 2700 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8685 855 8820 945 8820 900 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8685 1755 8820 1845 8820 1800 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8685 2655 8820 2745 8820 2700 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 9135 405 9270 495 9270 450 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 9135 855 9270 945 9270 900 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 9135 1305 9270 1395 9270 1350 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 9135 1755 9270 1845 9270 1800 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 9135 2205 9270 2295 9270 2250 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 9135 2655 9270 2745 9270 2700 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8550 630 8505 630 8595 765 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8550 1530 8505 1530 8595 1665 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8550 2430 8505 2430 8595 2565 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 9000 630 8955 630 9045 765 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8100 630 8055 630 8145 765 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 9000 1080 8955 1080 9045 1215 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8100 1080 8055 1080 8145 1215 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 9000 1530 8955 1530 9045 1665 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8100 1530 8055 1530 8145 1665 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 9000 1980 8955 1980 9045 2115 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8100 1980 8055 1980 8145 2115 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8100 2430 8055 2430 8145 2565 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 9000 2430 8955 2430 9045 2565 9000
2 2 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 5
450 9450 2700 9450 2700 7650 450 7650 450 9450
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1350 9450 1350 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
900 9450 900 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 9000 2700 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8550 2700 8550
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8100 2700 8100
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1800 9450 1800 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
2250 9450 2250 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 9450 1080 9405 1080 9495 1215 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 9450 1980 9405 1980 9495 2115 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 9450 2430 9405 2430 9495 2565 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 9450 1530 9405 1530 9495 1665 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 9450 630 9405 630 9495 765 9450
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
1215 7650 1080 7605 1080 7695 1215 7650
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
2115 7650 1980 7605 1980 7695 2115 7650
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
765 7650 630 7605 630 7695 765 7650
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
1665 7650 1530 7605 1530 7695 1665 7650
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
2565 7650 2430 7605 2430 7695 2565 7650
4 1 0 48 -1 0 12 0.0000 4 150 120 270 7650 S\001
4 1 0 48 -1 0 12 0.0000 4 150 135 2880 9585 T\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -0,0 +1,140 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
6 630 9405 2565 9495
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 9450 1080 9405 1080 9495 1215 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 9450 1980 9405 1980 9495 2115 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 9450 2430 9405 2430 9495 2565 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 9450 1530 9405 1530 9495 1665 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 9450 630 9405 630 9495 765 9450
-6
6 630 7560 2790 7740
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 900 7650 90 90 900 7650 990 7650
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 1350 7650 90 90 1350 7650 1440 7650
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 1800 7650 90 90 1800 7650 1890 7650
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 2250 7650 90 90 2250 7650 2340 7650
1 3 0 1 2 0 47 -1 -1 4.000 1 0.0000 2700 7650 90 90 2700 7650 2790 7650
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
1215 7650 1080 7605 1080 7695 1215 7650
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
2115 7650 1980 7605 1980 7695 2115 7650
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
765 7650 630 7605 630 7695 765 7650
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
1665 7650 1530 7605 1530 7695 1665 7650
2 1 0 1 2 2 49 -1 20 0.000 0 0 -1 0 0 4
2565 7650 2430 7605 2430 7695 2565 7650
-6
1 3 0 1 1 0 47 -1 -1 4.000 1 0.0000 450 9000 90 90 450 9000 540 9000
1 3 0 1 1 0 47 -1 -1 4.000 1 0.0000 450 8550 90 90 450 8550 540 8550
1 3 0 1 1 0 47 -1 -1 4.000 1 0.0000 450 8100 90 90 450 8100 540 8100
1 3 0 1 1 0 47 -1 -1 4.000 1 0.0000 450 9450 90 90 450 9450 540 9450
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 450 7650 90 90 450 7650 540 7650
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 2700 9450 90 90 2700 9450 2790 9450
2 1 0 1 1 1 49 -1 20 0.000 0 0 -1 0 0 4
450 8685 405 8820 495 8820 450 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8685 1305 8820 1395 8820 1350 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8685 2205 8820 2295 8820 2250 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 7785 2205 7920 2295 7920 2250 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 7785 1305 7920 1395 7920 1350 7785
2 1 0 1 1 1 49 -1 20 0.000 0 0 -1 0 0 4
450 7785 405 7920 495 7920 450 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8550 1980 8505 1980 8595 2115 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8550 1080 8505 1080 8595 1215 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 7785 855 7920 945 7920 900 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 7785 1755 7920 1845 7920 1800 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 7785 2655 7920 2745 7920 2700 7785
2 1 0 1 1 1 49 -1 20 0.000 0 0 -1 0 0 4
450 8235 405 8370 495 8370 450 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8235 855 8370 945 8370 900 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8235 1305 8370 1395 8370 1350 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8235 1755 8370 1845 8370 1800 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8235 2205 8370 2295 8370 2250 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8235 2655 8370 2745 8370 2700 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8685 855 8820 945 8820 900 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8685 1755 8820 1845 8820 1800 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8685 2655 8820 2745 8820 2700 8685
2 1 0 1 1 1 49 -1 20 0.000 0 0 -1 0 0 4
450 9135 405 9270 495 9270 450 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 9135 855 9270 945 9270 900 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 9135 1305 9270 1395 9270 1350 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 9135 1755 9270 1845 9270 1800 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 9135 2205 9270 2295 9270 2250 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 9135 2655 9270 2745 9270 2700 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8550 630 8505 630 8595 765 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8550 1530 8505 1530 8595 1665 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8550 2430 8505 2430 8595 2565 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 9000 630 8955 630 9045 765 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8100 630 8055 630 8145 765 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 9000 1080 8955 1080 9045 1215 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8100 1080 8055 1080 8145 1215 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 9000 1530 8955 1530 9045 1665 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8100 1530 8055 1530 8145 1665 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 9000 1980 8955 1980 9045 2115 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8100 1980 8055 1980 8145 2115 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8100 2430 8055 2430 8145 2565 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 9000 2430 8955 2430 9045 2565 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1350 9450 1350 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
900 9450 900 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 9000 2700 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8550 2700 8550
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8100 2700 8100
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1800 9450 1800 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
2250 9450 2250 7650
2 2 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 5
450 9450 2700 9450 2700 7650 450 7650 450 9450
4 1 0 48 -1 0 12 0.0000 4 150 120 270 7650 S\001
4 1 0 48 -1 0 12 0.0000 4 150 135 2880 9585 T\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,135 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 450 8550 90 90 450 8550 540 8550
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 900 8550 90 90 900 8550 990 8550
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 1350 8550 90 90 1350 8550 1440 8550
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 450 7650 90 90 450 7650 540 7650
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 2700 9450 90 90 2700 9450 2790 9450
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 450 8100 90 90 450 8100 540 8100
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 1350 9000 90 90 1350 9000 1440 9000
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 1350 9450 90 90 1350 9450 1440 9450
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 1800 9450 90 90 1800 9450 1890 9450
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 2250 9450 90 90 2250 9450 2340 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8685 2205 8820 2295 8820 2250 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 7785 1305 7920 1395 7920 1350 7785
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
1215 9450 1080 9405 1080 9495 1215 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 7650 1080 7605 1080 7695 1215 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 7650 1980 7605 1980 7695 2115 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 7785 855 7920 945 7920 900 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 7785 1755 7920 1845 7920 1800 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 7785 2655 7920 2745 7920 2700 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 7650 1530 7605 1530 7695 1665 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 7650 630 7605 630 7695 765 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8235 855 8370 945 8370 900 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8235 1305 8370 1395 8370 1350 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8235 2205 8370 2295 8370 2250 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8235 2655 8370 2745 8370 2700 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8685 855 8820 945 8820 900 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8685 1755 8820 1845 8820 1800 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 8685 2655 8820 2745 8820 2700 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 9135 855 9270 945 9270 900 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 9135 1755 9270 1845 9270 1800 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 9135 2205 9270 2295 9270 2250 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2700 9135 2655 9270 2745 9270 2700 9135
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
765 9450 630 9405 630 9495 765 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 9000 630 8955 630 9045 765 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8100 630 8055 630 8145 765 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 9000 1080 8955 1080 9045 1215 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8100 1080 8055 1080 8145 1215 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 9000 1530 8955 1530 9045 1665 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8100 1530 8055 1530 8145 1665 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 9000 1980 8955 1980 9045 2115 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8100 2430 8055 2430 8145 2565 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 9000 2430 8955 2430 9045 2565 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1350 9450 1350 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
900 9450 900 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 9000 2700 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8550 2700 8550
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8100 2700 8100
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1800 9450 1800 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
2250 9450 2250 7650
2 2 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 5
450 9450 2700 9450 2700 7650 450 7650 450 9450
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
765 8550 630 8505 630 8595 765 8550
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
1215 8550 1080 8505 1080 8595 1215 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8550 2430 8505 2430 8595 2565 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8550 1980 8505 1980 8595 2115 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 7785 2205 7920 2295 7920 2250 7785
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
450 7785 405 7920 495 7920 450 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8235 1755 8370 1845 8370 1800 8235
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
450 8235 405 8370 495 8370 450 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 8685 405 8820 495 8820 450 8685
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
1350 8685 1305 8820 1395 8820 1350 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 9135 405 9270 495 9270 450 9135
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
1350 9135 1305 9270 1395 9270 1350 9135
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
1665 8550 1530 8505 1530 8595 1665 8550
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
1665 9450 1530 9405 1530 9495 1665 9450
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
2115 8100 1980 8055 1980 8145 2115 8100
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
2115 9450 1980 9405 1980 9495 2115 9450
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
2565 7650 2430 7605 2430 7695 2565 7650
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
2565 9450 2430 9405 2430 9495 2565 9450
4 1 0 48 -1 0 12 0.0000 4 150 135 2880 9585 T\001
4 1 0 48 -1 0 12 0.0000 4 150 120 270 7650 S\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,135 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 2250 7650 90 90 2250 7650 2340 7650
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 1350 7650 90 90 1350 7650 1440 7650
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 1800 7650 90 90 1800 7650 1890 7650
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 900 7650 90 90 900 7650 990 7650
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 2700 9450 90 90 2700 9450 2790 9450
1 3 0 1 0 0 51 -1 20 0.000 1 0.0000 450 7650 90 90 450 7650 540 7650
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 2700 9000 90 90 2700 9000 2790 9000
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 2700 8550 90 90 2700 8550 2790 8550
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 2700 8100 90 90 2700 8100 2790 8100
1 3 0 1 4 0 47 -1 -1 4.000 1 0.0000 2700 7650 90 90 2700 7650 2790 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8685 1305 8820 1395 8820 1350 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8685 2205 8820 2295 8820 2250 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 7785 1305 7920 1395 7920 1350 7785
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
1215 9450 1080 9405 1080 9495 1215 9450
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
2115 9450 1980 9405 1980 9495 2115 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 7785 855 7920 945 7920 900 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 7785 1755 7920 1845 7920 1800 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8235 855 8370 945 8370 900 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8235 1305 8370 1395 8370 1350 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8235 2205 8370 2295 8370 2250 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 8685 855 8820 945 8820 900 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8685 1755 8820 1845 8820 1800 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
900 9135 855 9270 945 9270 900 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 9135 1305 9270 1395 9270 1350 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 9135 1755 9270 1845 9270 1800 9135
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 9135 2205 9270 2295 9270 2250 9135
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
765 9450 630 9405 630 9495 765 9450
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
1665 9450 1530 9405 1530 9495 1665 9450
2 1 0 1 0 0 49 -1 20 0.000 0 0 -1 0 0 4
2565 9450 2430 9405 2430 9495 2565 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 9000 630 8955 630 9045 765 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8100 630 8055 630 8145 765 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 9000 1080 8955 1080 9045 1215 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8100 1080 8055 1080 8145 1215 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 9000 1530 8955 1530 9045 1665 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8100 1530 8055 1530 8145 1665 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 9000 1980 8955 1980 9045 2115 9000
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8100 2430 8055 2430 8145 2565 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 9000 2430 8955 2430 9045 2565 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1350 9450 1350 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
900 9450 900 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 9000 2700 9000
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8550 2700 8550
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1800 9450 1800 7650
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
2250 9450 2250 7650
2 2 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 5
450 9450 2700 9450 2700 7650 450 7650 450 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2565 8550 2430 8505 2430 8595 2565 8550
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
2565 7650 2430 7605 2430 7695 2565 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8550 1980 8505 1980 8595 2115 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8100 1980 8055 1980 8145 2115 8100
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
765 7650 630 7605 630 7695 765 7650
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
1215 7650 1080 7605 1080 7695 1215 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8550 1080 8505 1080 8595 1215 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
765 8550 630 8505 630 8595 765 8550
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
2115 7650 1980 7605 1980 7695 2115 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 7785 2205 7920 2295 7920 2250 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1800 8235 1755 8370 1845 8370 1800 8235
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
1665 7650 1530 7605 1530 7695 1665 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1665 8550 1530 8505 1530 8595 1665 8550
2 1 1 1 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8100 2700 8100
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 7785 405 7920 495 7920 450 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 8235 405 8370 495 8370 450 8235
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 8685 405 8820 495 8820 450 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 9135 405 9270 495 9270 450 9135
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
2700 9135 2655 9270 2745 9270 2700 9135
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
2700 8685 2655 8820 2745 8820 2700 8685
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
2700 7785 2655 7920 2745 7920 2700 7785
2 1 0 1 4 4 49 -1 20 4.000 0 0 -1 0 0 4
2700 8235 2655 8370 2745 8370 2700 8235
4 1 0 48 -1 0 12 0.0000 4 150 135 2880 9585 T\001
4 1 0 48 -1 0 12 0.0000 4 150 120 270 7650 S\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,127 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 0 3 0 0 50 -1 20 0.000 1 0.0000 450 5850 142 142 450 5850 592 5850
1 3 0 3 0 0 50 -1 20 0.000 1 0.0000 4950 9450 142 142 4950 9450 5092 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 8685 405 8820 495 8820 450 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 8685 1305 8820 1395 8820 1350 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 8685 2205 8820 2295 8820 2250 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3150 8685 3105 8820 3195 8820 3150 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4050 8685 4005 8820 4095 8820 4050 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4950 8685 4905 8820 4995 8820 4950 8685
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4950 7785 4905 7920 4995 7920 4950 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4050 7785 4005 7920 4095 7920 4050 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3150 7785 3105 7920 3195 7920 3150 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 7785 2205 7920 2295 7920 2250 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 7785 1305 7920 1395 7920 1350 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 7785 405 7920 495 7920 450 7785
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 6885 405 7020 495 7020 450 6885
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 6885 1305 7020 1395 7020 1350 6885
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 6885 2205 7020 2295 7020 2250 6885
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3150 6885 3105 7020 3195 7020 3150 6885
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4050 6885 4005 7020 4095 7020 4050 6885
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4950 6885 4905 7020 4995 7020 4950 6885
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4950 5985 4905 6120 4995 6120 4950 5985
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4050 5985 4005 6120 4095 6120 4050 5985
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3150 5985 3105 6120 3195 6120 3150 5985
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2250 5985 2205 6120 2295 6120 2250 5985
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1350 5985 1305 6120 1395 6120 1350 5985
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
450 5985 405 6120 495 6120 450 5985
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 9450 1080 9405 1080 9495 1215 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 9450 1980 9405 1980 9495 2115 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3015 9450 2880 9405 2880 9495 3015 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3915 9450 3780 9405 3780 9495 3915 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4815 9450 4680 9405 4680 9495 4815 9450
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4815 8550 4680 8505 4680 8595 4815 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3915 8550 3780 8505 3780 8595 3915 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3015 8550 2880 8505 2880 8595 3015 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 8550 1980 8505 1980 8595 2115 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 8550 1080 8505 1080 8595 1215 8550
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 7650 1080 7605 1080 7695 1215 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 6750 1080 6705 1080 6795 1215 6750
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
1215 5850 1080 5805 1080 5895 1215 5850
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 5850 1980 5805 1980 5895 2115 5850
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3015 5850 2880 5805 2880 5895 3015 5850
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3915 5850 3780 5805 3780 5895 3915 5850
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4815 5850 4680 5805 4680 5895 4815 5850
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4815 6750 4680 6705 4680 6795 4815 6750
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3915 6750 3780 6705 3780 6795 3915 6750
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3015 6750 2880 6705 2880 6795 3015 6750
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 6750 1980 6705 1980 6795 2115 6750
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
2115 7650 1980 7605 1980 7695 2115 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3015 7650 2880 7605 2880 7695 3015 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
3915 7650 3780 7605 3780 7695 3915 7650
2 1 0 1 0 0 49 -1 20 4.000 0 0 -1 0 0 4
4815 7650 4680 7605 4680 7695 4815 7650
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
1350 9450 1350 5850
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 8550 4950 8550
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 7650 4950 7650
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
450 6750 4950 6750
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
2250 9450 2250 5850
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
3150 9450 3150 5850
2 1 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
4050 9450 4050 5850
2 2 1 2 0 7 50 -1 -1 8.000 0 0 -1 0 0 5
450 9450 4950 9450 4950 5850 450 5850 450 9450
4 1 0 48 -1 0 24 0.0000 4 270 210 180 5940 S\001
4 1 0 48 -1 0 24 0.0000 4 270 255 5265 9675 T\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,87 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 1800 6000 150 150 1800 6000 1950 6000
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 1800 7200 150 150 1800 7200 1950 7200
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 3000 7200 150 150 3000 7200 3150 7200
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 4200 7200 150 150 4200 7200 4350 7200
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 4200 6000 150 150 4200 6000 4350 6000
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 3000 6000 150 150 3000 6000 3150 6000
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 3000 8400 150 150 3000 8400 3150 8400
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 4200 8400 150 150 4200 8400 4350 8400
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 4200 9600 150 150 4200 9600 4350 9600
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 3000 9600 150 150 3000 9600 3150 9600
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 1800 9600 150 150 1800 9600 1950 9600
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 1800 8400 150 150 1800 8400 1950 8400
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 600 8400 150 150 600 8400 750 8400
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 600 9600 150 150 600 9600 750 9600
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 600 7200 150 150 600 7200 750 7200
1 3 0 2 2 2 46 -1 20 0.000 1 0.0000 600 6000 150 150 600 6000 750 6000
1 3 0 3 5 5 44 -1 20 8.000 1 0.0000 1800 9600 150 150 1800 9600 1950 9600
1 3 0 3 5 5 44 -1 20 8.000 1 0.0000 600 6000 150 150 600 6000 750 6000
1 3 0 3 5 5 44 -1 20 8.000 1 0.0000 4200 7200 150 150 4200 7200 4350 7200
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 1800 9600 150 150 1800 9600 1950 9600
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 1800 8400 150 150 1800 8400 1950 8400
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 1800 7200 150 150 1800 7200 1950 7200
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 3000 7200 150 150 3000 7200 3150 7200
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 4200 7200 150 150 4200 7200 4350 7200
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 1800 6000 150 150 1800 6000 1950 6000
1 3 0 3 5 5 42 -1 20 0.000 1 0.0000 600 6000 150 150 600 6000 750 6000
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 0 0 2
0 10200 4800 10200
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 0 0 2
0 5400 0 10200
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 0 0 2
4800 10200 4800 5400
2 1 0 3 0 7 50 -1 -1 0.000 0 0 7 0 0 2
4800 5400 0 5400
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
1200 5400 1200 10200
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
2400 10200 2400 5400
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
3600 5400 3600 10200
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
4800 7800 0 7800
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
0 6600 4800 6600
2 1 1 3 0 7 48 -1 -1 6.000 0 0 7 0 0 2
4800 9000 0 9000
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
4200 6000 4200 9600
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
600 9600 4200 9600
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
4200 8400 600 8400
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
600 6000 4200 6000
2 1 0 3 2 2 46 -1 20 0.000 0 0 -1 0 0 2
600 6000 600 9600
2 1 0 3 2 2 46 -1 20 8.000 0 0 -1 0 0 2
600 7200 4200 7200
2 1 0 3 2 2 46 -1 20 8.000 0 0 -1 0 0 2
1800 6000 1800 9600
2 1 0 3 2 2 46 -1 20 8.000 0 0 -1 0 0 2
3000 9600 3000 6000
2 2 0 3 0 11 50 -1 20 0.000 0 0 -1 0 0 5
0 5400 750 5400 750 6600 0 6600 0 5400
2 2 0 3 0 11 50 -1 20 0.000 0 0 -1 0 0 5
3600 6600 4200 6600 4200 7800 3600 7800 3600 6600
2 2 0 3 0 11 50 -1 20 0.000 0 0 -1 0 0 5
1800 9000 2400 9000 2400 10200 1800 10200 1800 9000
2 2 0 2 1 1 49 -1 20 6.000 0 0 -1 0 0 5
3825 7125 3675 7125 3675 7725 3825 7725 3825 7125
2 2 0 2 1 1 49 -1 20 6.000 0 0 -1 0 0 5
2250 9075 2100 9075 2100 9600 2250 9600 2250 9075
2 2 0 2 1 1 49 -1 20 6.000 0 0 -1 0 0 5
225 5475 75 5475 75 6525 225 6525 225 5475
2 1 0 3 5 7 42 -1 -1 0.000 0 0 -1 0 0 3
600 6000 1800 6000 1800 9600
2 1 0 3 5 7 42 -1 -1 0.000 0 0 -1 0 0 2
1800 7200 4200 7200

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -0,0 +1,34 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 1800 1800 127 127 1800 1800 1890 1710
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 2700 1800 127 127 2700 1800 2790 1710
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 2700 4500 127 127 2700 4500 2790 4410
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 3600 3600 127 127 3600 3600 3690 3510
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 1800 4050 1800
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 2700 4050 2700
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 3600 4050 3600
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 4500 4050 4500
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1800 4950 1800 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
2700 4950 2700 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
3600 4950 3600 1350
4 1 0 50 -1 0 12 0.0000 4 150 315 1800 5175 100\001
4 1 0 50 -1 0 12 0.0000 4 150 315 2700 5175 200\001
4 1 0 50 -1 0 12 0.0000 4 150 315 3600 5175 300\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 4500 100\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 3600 200\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 2700 300\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 1800 400\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,41 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 1800 1800 127 127 1800 1800 1890 1710
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 2700 1800 127 127 2700 1800 2790 1710
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 2700 4500 127 127 2700 4500 2790 4410
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 3600 3600 127 127 3600 3600 3690 3510
1 3 1 1 4 4 48 -1 20 4.000 1 0.0000 2700 3600 127 127 2700 3600 2827 3600
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 1800 4050 1800
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 2700 4050 2700
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 4500 4050 4500
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1800 4950 1800 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
3600 4950 3600 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
2700 4950 2700 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 3600 4050 3600
2 1 0 4 1 1 49 -1 -1 8.000 0 0 -1 0 0 3
1800 1800 2700 1800 2700 3510
2 1 0 4 1 1 49 -1 -1 8.000 0 0 -1 0 0 2
3600 3600 2790 3600
2 1 0 4 1 1 49 -1 -1 8.000 0 0 -1 0 0 2
2700 4500 2700 3690
4 1 0 50 -1 0 12 0.0000 4 150 315 1800 5175 100\001
4 1 0 50 -1 0 12 0.0000 4 150 315 2700 5175 200\001
4 1 0 50 -1 0 12 0.0000 4 150 315 3600 5175 300\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 4500 100\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 3600 200\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 2700 300\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 1800 400\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -0,0 +1,40 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 1800 4500 127 127 1800 4500 1890 4410
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 2700 3600 127 127 2700 3600 2790 3510
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 4500 3600 127 127 4500 3600 4590 3510
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 5400 1800 127 127 5400 1800 5490 1710
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 2700 5850 2700
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 4500 5850 4500
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1800 4950 1800 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
3600 4950 3600 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
2700 4950 2700 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 3600 5850 3600
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
4500 4950 4500 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
5400 4950 5400 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 1800 5850 1800
4 1 0 50 -1 0 12 0.0000 4 150 315 1800 5175 100\001
4 1 0 50 -1 0 12 0.0000 4 150 315 2700 5175 200\001
4 1 0 50 -1 0 12 0.0000 4 150 315 3600 5175 300\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 4500 100\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 3600 200\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 2700 300\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 1800 400\001
4 1 0 50 -1 0 12 0.0000 4 150 315 5400 5175 500\001
4 1 0 50 -1 0 12 0.0000 4 150 315 4500 5175 400\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,48 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 1800 4500 127 127 1800 4500 1890 4410
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 2700 3600 127 127 2700 3600 2790 3510
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 4500 3600 127 127 4500 3600 4590 3510
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 5400 1800 127 127 5400 1800 5490 1710
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 2700 5850 2700
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 4500 5850 4500
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1800 4950 1800 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
3600 4950 3600 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
2700 4950 2700 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 3600 5850 3600
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
4500 4950 4500 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
5400 4950 5400 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 1800 5850 1800
2 1 0 2 4 1 49 -1 -1 6.000 0 0 -1 0 0 5
1755 4500 1755 3555 4455 3555 4455 1755 5400 1755
2 1 0 2 2 1 49 -1 -1 6.000 0 0 -1 0 0 4
1800 4500 1800 3600 5400 3600 5400 1800
2 1 0 2 22 1 49 -1 -1 6.000 0 0 -1 0 0 6
1845 4500 2700 4500 2700 3645 4500 3645 4500 1800 5400 1800
2 1 0 2 31 1 49 -1 -1 6.000 0 0 -1 0 0 5
1845 4545 2745 4545 2745 3690 5445 3690 5445 1800
4 1 0 50 -1 0 12 0.0000 4 150 315 1800 5175 100\001
4 1 0 50 -1 0 12 0.0000 4 150 315 2700 5175 200\001
4 1 0 50 -1 0 12 0.0000 4 150 315 3600 5175 300\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 4500 100\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 3600 200\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 2700 300\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 1800 400\001
4 1 0 50 -1 0 12 0.0000 4 150 315 5400 5175 500\001
4 1 0 50 -1 0 12 0.0000 4 150 315 4500 5175 400\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,42 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 1800 4500 127 127 1800 4500 1890 4410
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 2700 3600 127 127 2700 3600 2790 3510
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 4500 3600 127 127 4500 3600 4590 3510
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 5400 1800 127 127 5400 1800 5490 1710
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 2700 5850 2700
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 4500 5850 4500
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1800 4950 1800 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
3600 4950 3600 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
2700 4950 2700 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 3600 5850 3600
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
4500 4950 4500 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
5400 4950 5400 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 1800 5850 1800
2 1 0 4 1 1 49 -1 -1 10.000 0 0 -1 0 0 4
1800 4500 2700 3600 4500 3600 5400 1800
4 1 0 50 -1 0 12 0.0000 4 150 315 1800 5175 100\001
4 1 0 50 -1 0 12 0.0000 4 150 315 2700 5175 200\001
4 1 0 50 -1 0 12 0.0000 4 150 315 3600 5175 300\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 4500 100\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 3600 200\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 2700 300\001
4 2 0 50 -1 0 12 0.0000 4 150 315 1260 1800 400\001
4 1 0 50 -1 0 12 0.0000 4 150 315 5400 5175 500\001
4 1 0 50 -1 0 12 0.0000 4 150 315 4500 5175 400\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -0,0 +1,33 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 1800 3600 127 127 1800 3600 1890 3510
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 5400 3600 127 127 5400 3600 5490 3510
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 2700 5850 2700
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 4500 5850 4500
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1800 4950 1800 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
3600 4950 3600 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
4500 4950 4500 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
5400 4950 5400 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 1800 5850 1800
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
2700 4950 2700 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 3600 5850 3600
4 1 1 49 -1 0 12 0.0000 4 150 225 2250 3510 +1\001
4 1 1 49 -1 0 12 0.0000 4 150 225 3150 3510 +1\001
4 1 1 49 -1 0 12 0.0000 4 150 225 4050 3510 +1\001
4 1 1 49 -1 0 12 0.0000 4 150 225 4950 3510 +1\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@ -0,0 +1,32 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 2700 4500 127 127 2700 4500 2790 4410
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 2700 1800 127 127 2700 1800 2790 1710
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 2700 5850 2700
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 4500 5850 4500
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1800 4950 1800 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
3600 4950 3600 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
4500 4950 4500 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
5400 4950 5400 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 1800 5850 1800
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
2700 4950 2700 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 3600 5850 3600
4 1 1 49 -1 0 12 0.0000 4 150 225 2520 4140 +1\001
4 1 1 49 -1 0 12 0.0000 4 150 225 2520 3240 +1\001
4 1 1 49 -1 0 12 0.0000 4 150 225 2520 2340 +1\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

View File

@ -0,0 +1,43 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 1800 4500 127 127 1800 4500 1890 4410
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 5400 1800 127 127 5400 1800 5490 1710
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 2700 5850 2700
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 4500 5850 4500
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1800 4950 1800 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
3600 4950 3600 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
4500 4950 4500 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
5400 4950 5400 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 1800 5850 1800
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
2700 4950 2700 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 3600 5850 3600
4 1 1 49 -1 0 12 0.0000 4 150 390 1530 4050 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 1530 3150 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 1530 2250 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 2250 1710 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 3150 1710 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 4050 1710 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 4950 1710 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 2250 4410 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 3150 4410 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 3960 4410 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 4860 4410 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 5130 4050 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 5130 3150 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 5130 2250 +0.5\001

View File

@ -0,0 +1,72 @@
%PDF-1.3
%Çì<C387>¢
5 0 obj
<</Length 6 0 R/Filter /FlateDecode>>
stream
xœÝT»n1 ìõ*c¡Å‡l4q¶3\­a'A®pRä÷M­¤=<3D>q‰{c]Ž†‡;à“€>Ô§¿×ƒ»ºÉþñ<C3BE>»õ1ARôwß;ý_‡þ‡Û2üÍ'‡ œ2yF ìŽŠdÐ#òË}ÛY¤$òÄHe&(–È š°’@T´J¡~I9a©•<C2A9>qfudfQL’æ ;rRk(T-€eVØÊ*‰!óTªç*»„Ó<…<>TV,úß<C3BA>Ž³©ÇÔF$jô‰\'Ëž°ÍoŒª‡«I!»w"`%ÈÈÝÃ^Ü:bU!úQ€seÄqÃWÇÓáèl$¿ì}u—f(Î<>Uº¡2 UG5É榷%ù{õXæ±£{v$Z/)”ÍΊÛñnÉP92¤Lé{ ƒÞ
Bf)?Ò)ä“ Fl½…<C2BD>ÑûÛ+¼P°ýÊ·(«þ®'‡mµõ×[ˆÖ(³™aypmQšÏ€•P},4$¿Ü»÷âÅòÓ,Ý—çrÿ
(8nÖ†€æ+;»m‡KúßçÝòÙalÑ,_Üry&‘Ò¿m1 š
ó|Nôz£gÁëÅ}µç<19> 9™endstream
endobj
6 0 obj
453
endobj
4 0 obj
<</Type/Page/MediaBox [0 0 287 230]
/Parent 3 0 R
/Resources<</ProcSet[/PDF /Text]
/ExtGState 9 0 R
/Font 10 0 R
>>
/Contents 5 0 R
>>
endobj
3 0 obj
<< /Type /Pages /Kids [
4 0 R
] /Count 1
>>
endobj
1 0 obj
<</Type /Catalog /Pages 3 0 R
>>
endobj
7 0 obj
<</Type/ExtGState
/OPM 1>>endobj
9 0 obj
<</R7
7 0 R>>
endobj
10 0 obj
<</R8
8 0 R>>
endobj
8 0 obj
<</BaseFont/Times-Roman/Type/Font
/Subtype/Type1>>
endobj
2 0 obj
<</Producer(ESP Ghostscript 815.02)
/CreationDate(D:20080703182550)
/ModDate(D:20080703182550)>>endobj
xref
0 11
0000000000 65535 f
0000000766 00000 n
0000000980 00000 n
0000000707 00000 n
0000000557 00000 n
0000000015 00000 n
0000000538 00000 n
0000000814 00000 n
0000000914 00000 n
0000000855 00000 n
0000000884 00000 n
trailer
<< /Size 11 /Root 1 0 R /Info 2 0 R
/ID [(ºÚÃñ0;ÅDŒ ,5«¨)(ºÚÃñ0;ÅDŒ ,5«¨)]
>>
startxref
1091
%%EOF

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,43 @@
#FIG 3.2 Produced by xfig version 3.2.5-alpha5
Landscape
Center
Metric
A4
100.00
Single
-2
1200 2
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 1800 1800 127 127 1800 1800 1890 1710
1 3 1 1 1 1 49 -1 20 4.000 1 0.0000 5400 4500 127 127 5400 4500 5490 4410
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 2700 5850 2700
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 4500 5850 4500
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1800 4950 1800 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
3600 4950 3600 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
4500 4950 4500 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
5400 4950 5400 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 1800 5850 1800
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
2700 4950 2700 1350
2 1 1 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
1350 3600 5850 3600
4 1 1 49 -1 0 12 0.0000 4 150 390 1530 4050 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 1530 3150 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 1530 2250 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 2250 1710 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 3150 1710 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 4050 1710 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 4950 1710 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 2250 4410 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 3150 4410 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 3960 4410 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 4860 4410 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 5130 4050 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 5130 3150 +0.5\001
4 1 1 49 -1 0 12 0.0000 4 150 390 5130 2250 +0.5\001

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

278
knik/doxyfile Normal file
View File

@ -0,0 +1,278 @@
# Doxyfile 1.3.4
# --------------------------------------------------------------------
# Project related configuration options
PROJECT_NAME = "Knik - Global Router"
PROJECT_NUMBER = 1.0
OUTPUT_DIRECTORY = doc/en/knik
OUTPUT_LANGUAGE = English
USE_WINDOWS_ENCODING = NO
BRIEF_MEMBER_DESC = YES
REPEAT_BRIEF = YES
ALWAYS_DETAILED_SEC = NO
INLINE_INHERITED_MEMB = NO
FULL_PATH_NAMES = NO
STRIP_FROM_PATH =
SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = NO
MULTILINE_CPP_IS_BRIEF = NO
DETAILS_AT_TOP = NO
INHERIT_DOCS = YES
DISTRIBUTE_GROUP_DOC = NO
TAB_SIZE = 2
ALIASES = "function=\fn"\
"important=\n\par Important:\n"\
"remark=\n\par Remark:\n"\
"overview=<b>Overview:</b>"\
"Return=<b>Returns:</b>"\
"Initial=<b>Initial value:</b>"\
"True=\b True"\
"true=\b true"\
"False=\b False"\
"false=\b false"\
"VERTICAL=\b VERTICAL"\
"HORIZONTAL=\b HORIZONTAL"\
"NULL=\c NULL"\
"vector=\c vector"\
"lower_bound=\c lower_bound"\
"Collection=\c Collection"\
"Collections=\c Collections"\
"Box=\c Box"\
"box=\c box"\
"Layer=\c Layer"\
"Layers=\c Layers"\
"Net=\c Net"\
"Nets=\c Nets"\
"Pin=\c Pin"\
"Pins=\c Pins"\
"Plug=\c Plug"\
"Plugs=\c Plugs"\
"RoutingPad=\c RoutingPad"\
"RoutingPads=\c RoutingPads"\
"Cell=\c Cell"\
"Cells=\c Cells"\
"CEngine=\c CEngine"\
"CEngines=\c CEngines"\
"GCell=\c GCell"\
"GCells=\c GCells"\
"Splitter=\c Splitter"\
"Splitters=\c Splitters"\
"SplitterContact=\c SplitterContact"\
"SplitterContacts=\c SplitterContacts"\
"RoutingPlane=\c RoutingPlane"\
"RoutingPlanes=\c RoutingPlanes"\
"Hurricane=<a href='../hurricane/Index.html'>Hurricane</a>"\
"STL=<a href='http://www.sgi.com/tech/stl/'>STL</a>"
ALIASES += define="<div class='memitem'><div class='memproto'><table class='memname' border='0'><tr><td><b>\#define </b>"
ALIASES += defineD="</td></tr></table></div><div class='memdoc'>"
ALIASES += defineEND="</div></div>"
OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO
SUBGROUPING = YES
# --------------------------------------------------------------------
# Build related configuration options
EXTRACT_ALL = NO
EXTRACT_PRIVATE = YES
EXTRACT_STATIC = YES
EXTRACT_LOCAL_CLASSES = YES
HIDE_UNDOC_MEMBERS = YES
HIDE_UNDOC_CLASSES = YES
HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
CASE_SENSE_NAMES = YES
HIDE_SCOPE_NAMES = NO
SHOW_INCLUDE_FILES = YES
INLINE_INFO = NO
SORT_MEMBER_DOCS = NO
GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES
GENERATE_BUGLIST = YES
GENERATE_DEPRECATEDLIST= YES
ENABLED_SECTIONS =
MAX_INITIALIZER_LINES = 1
SHOW_USED_FILES = YES
# --------------------------------------------------------------------
# Configuration options related to warning and progress messages
QUIET = YES
WARNINGS = YES
WARN_IF_UNDOCUMENTED = NO
WARN_IF_DOC_ERROR = YES
WARN_FORMAT = "$file:$line: $text"
WARN_LOGFILE =
# --------------------------------------------------------------------
# Configuration options related to the input files
INPUT = \
src/Edge.h src/Edge.cpp doc/Edge.dox \
src/HEdge.h src/HEdge.cpp doc/HEdge.dox \
src/VEdge.h src/VEdge.cpp doc/VEdge.dox \
src/Vertex.h src/Vertex.cpp doc/Vertex.dox \
src/Graph.h src/Graph.cpp doc/Graph.dox \
src/Knik.h src/Knik.cpp doc/Knik.dox \
doc/Global.dox
FILE_PATTERNS = *.h \
*.cpp \
*.dox
RECURSIVE = YES
EXCLUDE =
EXCLUDE_SYMLINKS = NO
EXCLUDE_PATTERNS =
EXAMPLE_PATH =
EXAMPLE_PATTERNS =
EXAMPLE_RECURSIVE = NO
IMAGE_PATH = doc/images
INPUT_FILTER =
FILTER_SOURCE_FILES = YES
# --------------------------------------------------------------------
# Configuration options related to source browsing
SOURCE_BROWSER = NO
INLINE_SOURCES = NO
STRIP_CODE_COMMENTS = YES
REFERENCED_BY_RELATION = YES
REFERENCES_RELATION = YES
VERBATIM_HEADERS = YES
# --------------------------------------------------------------------
# Configuration options related to the alphabetical class index
ALPHABETICAL_INDEX = YES
COLS_IN_ALPHA_INDEX = 2
IGNORE_PREFIX =
# --------------------------------------------------------------------
# Configuration options related to the HTML output
GENERATE_HTML = YES
HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
HTML_HEADER = doc/header.html
HTML_FOOTER = doc/footer.html
HTML_STYLESHEET = doc/ASIM.css
HTML_ALIGN_MEMBERS = YES
GENERATE_HTMLHELP = NO
CHM_FILE =
HHC_LOCATION =
GENERATE_CHI = NO
BINARY_TOC = NO
TOC_EXPAND = NO
DISABLE_INDEX = YES
ENUM_VALUES_PER_LINE = 1
GENERATE_TREEVIEW = NO
TREEVIEW_WIDTH = 250
# --------------------------------------------------------------------
# Configuration options related to the LaTeX output
GENERATE_LATEX = YES
LATEX_OUTPUT = latex
LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex
COMPACT_LATEX = NO
PAPER_TYPE = a4wide
EXTRA_PACKAGES =
LATEX_HEADER = doc/header.tex
PDF_HYPERLINKS = YES
USE_PDFLATEX = YES
LATEX_BATCHMODE = NO
LATEX_HIDE_INDICES = NO
# --------------------------------------------------------------------
# Configuration options related to the RTF output
GENERATE_RTF = YES
RTF_OUTPUT = rtf
COMPACT_RTF = NO
RTF_HYPERLINKS = NO
RTF_STYLESHEET_FILE =
RTF_EXTENSIONS_FILE =
# --------------------------------------------------------------------
# Configuration options related to the man page output
GENERATE_MAN = YES
MAN_OUTPUT = man
MAN_EXTENSION = .3
MAN_LINKS = NO
# --------------------------------------------------------------------
# Configuration options related to the XML output
GENERATE_XML = NO
XML_OUTPUT = xml
XML_SCHEMA =
XML_DTD =
# --------------------------------------------------------------------
# Configuration options for the AutoGen Definitions output
GENERATE_AUTOGEN_DEF = NO
# --------------------------------------------------------------------
# Configuration options related to the Perl module output
GENERATE_PERLMOD = NO
PERLMOD_LATEX = NO
PERLMOD_PRETTY = YES
PERLMOD_MAKEVAR_PREFIX =
# --------------------------------------------------------------------
# Configuration options related to the preprocessor
ENABLE_PREPROCESSING = YES
MACRO_EXPANSION = NO
EXPAND_ONLY_PREDEF = NO
SEARCH_INCLUDES = YES
INCLUDE_PATH =
INCLUDE_FILE_PATTERNS =
PREDEFINED = __DOXYGEN_PROCESSOR__
EXPAND_AS_DEFINED =
SKIP_FUNCTION_MACROS = YES
# --------------------------------------------------------------------
# Configuration options related to external references
TAGFILES =
GENERATE_TAGFILE = doc/en/knik/html/knik.tag
ALLEXTERNALS = NO
EXTERNAL_GROUPS = YES
PERL_PATH = /usr/bin/perl
# --------------------------------------------------------------------
# Configuration options related to the dot tool
CLASS_DIAGRAMS = NO
HIDE_UNDOC_RELATIONS = YES
HAVE_DOT = YES
CLASS_GRAPH = YES
COLLABORATION_GRAPH = NO
UML_LOOK = NO
TEMPLATE_RELATIONS = NO
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALL_GRAPH = NO
GRAPHICAL_HIERARCHY = NO
DOT_IMAGE_FORMAT = png
DOT_PATH =
DOTFILE_DIRS =
MAX_DOT_GRAPH_WIDTH = 512
MAX_DOT_GRAPH_HEIGHT = 1024
MAX_DOT_GRAPH_DEPTH = 0
GENERATE_LEGEND = YES
DOT_CLEANUP = YES
# --------------------------------------------------------------------
# Configuration::addtions related to the search engine
SEARCHENGINE = NO

62
knik/src/CMakeLists.txt Normal file
View File

@ -0,0 +1,62 @@
include ( ${QT_USE_FILE} )
include_directories ( ${KNIK_SOURCE_DIR}/src
${KNIK_SOURCE_DIR}/src/flute-2.4/src
${HURRICANE_INCLUDE_DIR}
${CORIOLIS_INCLUDE_DIR}
)
set ( includes knik/Configuration.h
knik/Vertex.h knik/Vertexes.h
knik/Tuple.h
knik/STuple.h
knik/VTuple.h
knik/Edge.h knik/Edges.h
knik/HEdge.h
knik/VEdge.h
knik/MatrixVertex.h
knik/RoutingGrid.h
knik/SlicingTree.h
knik/SlicingTreeNode.h
knik/Graph.h
knik/NetExtension.h
knik/KnikEngine.h
)
set ( mocIncludes knik/GraphicKnikEngine.h )
set ( cpps Configuration.cpp
Vertex.cpp
Edge.cpp
HEdge.cpp
VEdge.cpp
MatrixVertex.cpp
Graph.cpp
SlicingTree.cpp
NetExtension.cpp
LoadSolution.cpp
KnikEngine.cpp
GraphicKnikEngine.cpp
)
set ( fluteIncludes flute-2.4/src/knik/flute.h )
set ( fluteCpps flute-2.4/src/flute.cpp )
qt4_wrap_cpp ( mocCpps ${mocIncludes} )
add_library ( knik ${cpps} ${mocCpps} )
target_link_libraries ( knik flute
${CORIOLIS_LIBRARIES}
${HURRICANE_LIBRARIES}
${HURRICANE_GRAPHICAL_LIBRARIES}
${QT_LIBRARIES}
${LEFDEF_LIBRARIES}
${OA_LIBRARIES}
)
add_library ( flute ${fluteCpps} )
target_link_libraries ( flute ${CORIOLIS_LIBRARIES}
${HURRICANE_LIBRARIES} )
install ( TARGETS knik flute DESTINATION /lib)
install ( FILES ${includes}
${mocIncludes}
${fluteIncludes} DESTINATION /include/coriolis/knik )
install ( FILES flute-2.4/etc/POST9.dat
flute-2.4/etc/POWV9.dat DESTINATION /share/etc/flute-2.4 )

121
knik/src/Configuration.cpp Normal file
View File

@ -0,0 +1,121 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
//
// ===================================================================
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S |
// | Knik - Global Router |
// | |
// | Author : Jean-Paul Chaput |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Module : "./Configuration.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <iostream>
#include "hurricane/Warning.h"
#include "hurricane/Error.h"
#include "hurricane/Technology.h"
#include "hurricane/DataBase.h"
#include "knik/Configuration.h"
namespace Knik {
using namespace std;
using Hurricane::Warning;
using Hurricane::Error;
using Hurricane::Technology;
using Hurricane::DataBase;
// -------------------------------------------------------------------
// class : "Knik::Configuration"
Configuration* Configuration::_singleton = NULL;
Configuration* Configuration::get ()
{
if ( !_singleton ) {
DataBase* db = DataBase::getDB ();
Technology* technology = db->getTechnology ();
const Layer* pinMetal = technology->getLayer("metal1");
if ( !pinMetal ) {
throw Error("Knik::Configuration() - No \"metal1\" in technology.");
}
const Layer* gMetalH = technology->getLayer("gmetalh");
if ( !gMetalH ) {
cerr << Warning("Knik::Configuration() - No \"gmetalh\" in technology, falling back to \"metal2\".") << endl;
gMetalH = technology->getLayer("metal2");
if ( !gMetalH )
throw Error("Knik::Configuration() - No \"gmetalh\" nor \"metal2\" in technology.");
}
const Layer* gMetalV = technology->getLayer("gmetalv");
if ( !gMetalV ) {
cerr << Warning("Knik::Configuration() - No \"gmetalv\" in technology, falling back to \"metal3\".") << endl;
gMetalV = technology->getLayer("metal3");
if ( !gMetalV )
throw Error("Knik::Configuration() - No \"gmetalv\" nor \"metal3\" in technology.");
}
const Layer* gContact = technology->getLayer("gcontact");
if ( !gContact ) {
cerr << Warning("Knik::Configuration() - No \"gcontact\" in technology, falling back to \"VIA23\".") << endl;
gContact = technology->getLayer("VIA23");
if ( !gContact )
throw Error("Knik::Configuration() - No \"gmetalh\" nor \"VIA23\" in technology.");
}
_singleton = new Configuration ( pinMetal, gMetalH, gMetalV, gContact );
}
return _singleton;
}
void Configuration::destroy() {
delete ( this );
}
const Layer* Configuration::getPinMetal() {
return get()->_getPinMetal();
}
const Layer* Configuration::getGMetalH() {
return get()->_getGMetalH();
}
const Layer* Configuration::getGMetalV() {
return get()->_getGMetalV();
}
const Layer* Configuration::getGContact() {
return get()->_getGContact();
}
Configuration::Configuration(const Layer* pinMetal, const Layer* gMetalH, const Layer* gMetalV, const Layer* gContact)
: _pinMetal(gMetalH)
, _gMetalH(gMetalH)
, _gMetalV(gMetalV)
, _gContact(gContact)
{ }
} // End of Knik namespace.

383
knik/src/Edge.cpp Normal file
View File

@ -0,0 +1,383 @@
#include "hurricane/Breakpoint.h"
#include "knik/Edge.h"
#include "knik/Vertex.h"
#include "knik/Graph.h"
namespace Knik {
extern unsigned __congestion__;
extern unsigned __precongestion__;
extern bool __ripupMode__;
extern float __edge_cost__;
const Name Edge::_extensionName = "Knik::Edges";
Edge::Edge ( Vertex* from, Vertex* to )
// ************************************
: Inherit (from->getCell())
, _from (from)
, _nextFrom (NULL)
, _to (to)
, _nextTo (NULL)
, _connexID (-1)
, _cost (0.0)
, _capacity (0)
, _realOccupancy (0)
, _estimateOccupancy (0.0)
, _netStamp (0)
, _segments()
{
/*_cost = v1->getGCell()->getCenter().ManhattanDistance (v2->getGCell()->getCenter());*/
}
Edge::Edge ( Vertex* from, Vertex* to, unsigned capacity )
// *******************************************************
: Inherit (from->getCell())
, _boundingBox()
, _from (from)
, _nextFrom (NULL)
, _to (to)
, _nextTo (NULL)
, _connexID (-1)
, _cost (0.0)
, _capacity (capacity)
, _realOccupancy (0)
, _estimateOccupancy (0.0)
, _netStamp (0)
, _isCongested (false)
, _segments()
{
//cerr << " Edge capacity:" << _capacity << endl;
}
void Edge::_postCreate ( bool capacity )
// *************************************
{
Inherit::_postCreate();
_segments.reserve(_capacity);
}
Edge::~Edge()
// **********
{
}
void Edge::destroy()
// ****************
{
_preDestroy();
delete this;
}
void Edge::_preDestroy()
// ********************
{
Inherit::_preDestroy();
}
void Edge::increaseCapacity ( int capacity )
// *****************************************
{
if ( (int)_capacity + capacity < 0 ) _capacity = 0;
else
_capacity += capacity;
//cerr << "Edge " << _from->getPosition()
// << " to " << _to->getPosition() << ":" << _capacity << endl;
}
void Edge::incOccupancy ()
// ***********************
{
_realOccupancy++;
if ( !_isCongested ) {
if ( _realOccupancy > _capacity ) {
_boundingBox = computeBoundingBox();
_isCongested = true;
// reste a mettre les segments traversant l'edge dans la pile ou s'ils y sont deja a les mettre a jour
}
}
}
void Edge::decOccupancy ()
// ************************
{
if ( _realOccupancy > 0 )
_realOccupancy--;
if ( _isCongested && (_realOccupancy <= _capacity) ) {
_boundingBox = computeBoundingBox();
_isCongested = false;
}
}
void Edge::removeSegment ( Segment* segment )
// ******************************************
{
assert(segment);
decOccupancy();
vector<Segment*>::iterator vsit = find(_segments.begin(),_segments.end(),segment);
if ( vsit != _segments.end() )
_segments.erase ( vsit );
else {
cerr << segment << " " << this << endl;
Breakpoint::stop(0, "Shootdown -h now");
throw Error ( "Edge::removeSegment(): I cannot believe this segment is not in _segments!" );
}
}
void Edge::addSubEstimateOccupancy ( float increment, bool add )
// *************************************************************
{
if ( add )
_estimateOccupancy += increment;
else
_estimateOccupancy -= increment;
return;
}
DbU::Unit Edge::getXTo() const
// ***************************
{
return _to->getX();
}
DbU::Unit Edge::getYTo() const
// ***************************
{
return _to->getY();
}
DbU::Unit Edge::getXFrom() const
// *****************************
{
return _from->getX();
}
DbU::Unit Edge::getYFrom() const
// *****************************
{
return _from->getY();
}
void Edge::translate ( const DbU::Unit& dx, const DbU::Unit& dy )
// **************************************************************
{
_from->translate ( dx, dy );
_to->translate ( dx, dy );
}
Cell* Edge::getCell() const
// ************************
{
return _from->getCell();
}
float Edge::getCost ( Edge* arrivalEdge )
// **************************************
{
//#ifdef __USE_CONGESTION__
if ( __congestion__ ) {
// definition de la fonction de cout :
// on ramene l'occupation de l'edge à un pourcentage de la capacité :
float edge_capacity = (float)1.0;
float edge_occupancy;
//float h = 9.0;
//float k = 30.0; // environ 3*h pour etre sur d'avoir cost(0) = 1 !!
//now defined as edge's attributes for ripup & reroute
if ( !__ripupMode__ ) {
//#if defined ( __USE_STATIC_PRECONGESTION__ ) || defined ( __USE_DYNAMIC_PRECONGESTION__ )
if ( __precongestion__ )
edge_occupancy = ((float)getRealOccupancy() + getEstimateOccupancy()) / (float)_capacity;
//#else
else
edge_occupancy = (float)getRealOccupancy() / (float)_capacity;
//#endif
_cost = 1.0 + (9.0 / (1.0 + exp(-30.0 * (edge_occupancy - edge_capacity)))); // plutot que 1.0 on devrait avoir un getLength renvoyant la longueur de l'arete en unités normalisées (pas de grille)
}
else {
// dans ce mode l'estimation de congestion est utilisé comme historique de congestion
edge_occupancy = (float)getRealOccupancy() / (float)_capacity;
float historicCost;
if ( edge_occupancy < 1 )
historicCost = getEstimateOccupancy() * edge_occupancy;
else
historicCost = getEstimateOccupancy() * exp(log(8)*(edge_occupancy - edge_capacity));
_cost = 1.0 + (19.0 / (1.0 + exp(-60.0 * (edge_occupancy - edge_capacity)))) + historicCost;
}
}
//#else
else
_cost = 1.0;
//#endif
// Prise en compte des vias !
if ( arrivalEdge ) {
if ( arrivalEdge->isVertical() && isHorizontal() )
_cost += __edge_cost__;
if ( arrivalEdge->isHorizontal() && isVertical() )
_cost += __edge_cost__;
}
//if ( _from->getRoutingGraph()->getRipupMode() )
// if ( _isCongested )
// _cost += 1000;
return _cost;
}
unsigned Edge::getRealOccupancy() const
// ************************************
{
// pour debug plus facile : // Attention ce n'est plus vrai lorsque l'edge gère elle même son occupation!
//assert ( _realOccupancy == _fence->getOccupancy() );
return _realOccupancy;
}
Segment* Edge::getSegmentFor ( Net* net )
// **************************************
{
for_each_segment ( segment, getCollection ( _segments ) ) {
if ( segment->getNet() == net )
return segment;
end_for;
}
return NULL;
}
bool Edge::hasInfo() const
// ***********************
{
return (_netStamp == _from->getRoutingGraph()->getNetStamp())&&(_connexID != -1);
}
// void Edge::_Draw ( View* view, BasicLayer* basicLayer, const Box& updateArea, const Transformation& transformation )
// //******************************************************************************************************************
// {
// Point fromPos = transformation.getPoint ( _from->getPosition() );
// Point toPos = transformation.getPoint ( _to->getPosition() );
// //view->DrawLine ( fromPos, toPos );
// // new version to represent occupation
// DbU::Unit halfWidth = _from->getHalfWidth() < _to->getHalfWidth() ? _from->getHalfWidth() : _to->getHalfWidth();
// DbU::Unit halfHeight = _from->getHalfHeight() < _to->getHalfHeight() ? _from->getHalfHeight() : _to->getHalfHeight();
// bool overCap = false;
// float relOccupancy = 0.0;
// if ( _realOccupancy > _capacity ) {
// overCap = true;
// relOccupancy = 1.0;
// }
// else
// relOccupancy = (float)_realOccupancy / (float)_capacity;
// if ( fromPos.getY() == toPos.getY() ) {
// DbU::Unit medFromX = fromPos.getX() + halfWidth;
// DbU::Unit medFromY = fromPos.getY() - halfHeight;
// DbU::Unit medToX = fromPos.getX() + halfWidth;
// DbU::Unit medToY = fromPos.getY() + halfHeight;
// view->DrawLine ( medFromX, medFromY, medToX, medToY );
// DbU::Unit cover = DbU::lambda ( getValue(medToY - medFromY) * relOccupancy );
// view->FillRectangle ( medFromX - 100, medFromY , medFromX + 100, medFromY + (cover/2) );
// view->FillRectangle ( medToX - 100 , medToY - (cover/2), medToX + 100 , medToY );
// if (overCap)
// view->FillRectangle ( medFromX-150, medFromY+halfHeight-150, medFromX+150, medFromY+halfHeight+150 );
// }
// else {
// DbU::Unit medFromX = fromPos.getX() - halfWidth;
// DbU::Unit medFromY = fromPos.getY() + halfHeight;
// DbU::Unit medToX = fromPos.getX() + halfWidth;
// DbU::Unit medToY = fromPos.getY() + halfHeight;
// view->DrawLine ( medFromX, medFromY, medToX, medToY );
// DbU::Unit cover = DbU::lambda ( getValue(medToX - medFromX) * relOccupancy );
// view->FillRectangle ( medFromX , medFromY - 100, medFromX + (cover/2), medFromY + 100 );
// view->FillRectangle ( medToX - (cover/2), medToY - 100 , medToX , medToY + 100 );
// if (overCap)
// view->FillRectangle ( medFromX+halfWidth-150, medFromY-150, medFromX+halfWidth+150, medFromY+150 );
// }
// // old version
// //if ( _estimateOccupancy > 0 )
// // view->DrawString ( getString(_estimateOccupancy), (fromPos.getX()+toPos.getX())/2 , (fromPos.getY()+toPos.getY())/2 );
// if ( (_netStamp == _from->getRoutingGraph()->getNetStamp()) && (_connexID != -1) ) {
// view->DrawString ( getString(_connexID), (fromPos.getX()+toPos.getX())/2 , (fromPos.getY()+toPos.getY())/2+10 );
// }
// //if ( _nextTo ) {
// // Point nextToFromPos = transformation.getPoint ( _nextTo->getFrom()->getPosition() );
// // Point nextToToPos = transformation.getPoint ( _nextTo->getTo()->getPosition() );
// // DbU::Unit origX = fromPos.getX() + (toPos.getX() - fromPos.getX())/3;
// // DbU::Unit origY = fromPos.getY() + (toPos.getY() - fromPos.getY())/3;
// // DbU::Unit destX = nextToFromPos.getX() + (nextToToPos.getX() - nextToFromPos.getX())/3;
// // DbU::Unit destY = nextToFromPos.getY() + (nextToToPos.getY() - nextToFromPos.getY())/3;
// // view->DrawLine ( origX, origY, destX, destY );
// // view->DrawCircle ( destX, destY, DbU::lambda ( 3 ) );
// //}
// //if ( _nextFrom ) {
// // Point nextFromFromPos = transformation.getPoint ( _nextFrom->getFrom()->getPosition() );
// // Point nextFromToPos = transformation.getPoint ( _nextFrom->getTo()->getPosition() );
// // DbU::Unit origX = fromPos.getX() + (toPos.getX() - fromPos.getX())*2/3;
// // DbU::Unit origY = fromPos.getY() + (toPos.getY() - fromPos.getY())*2/3;
// // DbU::Unit destX = nextFromFromPos.getX() + (nextFromToPos.getX() - nextFromFromPos.getX())*2/3;
// // DbU::Unit destY = nextFromFromPos.getY() + (nextFromToPos.getY() - nextFromFromPos.getY())*2/3;
// // view->DrawLine ( origX, origY, destX, destY );
// // view->FillCircle ( destX, destY, DbU::lambda ( 3 ) );
// //}
// }
// void Edge::_Highlight ( View* view, const Box& updateArea, const Transformation& transformation )
// // **********************************************************************************************
// {
// view->DrawLine ( transformation.getPoint ( _from->getPosition() )
// , transformation.getPoint ( _to->getPosition() ) );
// }
// bool Edge::_IsInterceptedBy ( View* view, const Point& point, const DbU::Unit& aperture ) const
// // ***************************************************************************************
// {
// Box area ( point );
// area.inflate(aperture);
// return getBoundingBox().intersect ( area );
// }
void Edge::invalidate ( bool propagateFlag )
// *****************************************
{
Inherit::invalidate ( false );
}
string Edge::_getString() const
// ****************************
{
return "<" + _TName ( "Edge" )
+ ":" + getString ( _connexID )
+ " " + getString ( _netStamp )
+ " " + getString ( _from )
+ " " + getString ( _to ) + ">";
}
Record* Edge::_getRecord() const
// ***********************
{
Record* record = Inherit::_getRecord();
if ( !record )
record = new Record ( getString ( this ) );
record->add ( getSlot ( "from" , _from ) );
record->add ( getSlot ( "to" , _to ) );
record->add ( getSlot ( "nextFrom" , _nextFrom ) );
record->add ( getSlot ( "nextTo" , _nextTo ) );
record->add ( getSlot ( "connexID" , _connexID ) );
record->add ( getSlot ( "cost" , _cost ) );
record->add ( getSlot ( "netStamp" , _netStamp ) );
record->add ( getSlot ( "capacity" , _capacity ) );
record->add ( getSlot ( "occupancy", _realOccupancy ) );
record->add ( getSlot ( "estimate occupancy", _estimateOccupancy ) );
record->add ( getSlot ( "segments" , &_segments ) );
return record;
}
} // end namespace

2679
knik/src/Graph.cpp Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,481 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S |
// | K n i k - Global Router |
// | |
// | Author : Jean-Paul Chaput |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Header : "./GraphicKnikEngine.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <QAction>
#include <QMenu>
#include <QMenuBar>
#include <hurricane/Warning.h>
#include <hurricane/Go.h>
#include <hurricane/Cell.h>
#include <hurricane/viewer/Graphics.h>
#include <hurricane/viewer/CellWidget.h>
#include <hurricane/viewer/CellViewer.h>
#include <crlcore/AllianceFramework.h>
#include <knik/Vertex.h>
#include <knik/Edge.h>
#include <knik/GraphicKnikEngine.h>
namespace Knik {
using namespace std;
using Hurricane::Warning;
using Hurricane::Graphics;
using CRL::AllianceFramework;
// -------------------------------------------------------------------
// Class : "CRL::GraphicKnikEngine".
size_t GraphicKnikEngine::_references = 0;
GraphicKnikEngine* GraphicKnikEngine::_singleton = NULL;
void GraphicKnikEngine::initKnikEdges ( CellWidget* widget )
{
widget->getDrawingPlanes().setPen ( Qt::NoPen );
}
void GraphicKnikEngine::drawKnikEdges ( CellWidget* widget
, const Go* go
, const BasicLayer* basicLayer
, const Box& box
, const Transformation& transformation
)
{
const Edge* edge = dynamic_cast<const Edge*>(go);
if ( edge ) {
unsigned int occupancy = 255;
if ( edge->getRealOccupancy() < edge->getCapacity() )
occupancy = (unsigned int)( 255.0 * ( (float)edge->getRealOccupancy() / (float)edge->getCapacity() ) );
QPainter& painter = widget->getPainter();
if ( edge->getRealOccupancy() > edge->getCapacity() ) {
QColor color (Qt::cyan);
painter.setPen (color.darker(widget->getDarkening()));
}
painter.setBrush ( Graphics::getColorScale(ColorScale::Fire).getBrush(occupancy,widget->getDarkening()) );
painter.drawRect ( widget->dbuToDisplayRect(edge->getBoundingBox(), false) );
painter.setPen(Qt::NoPen);
// affichage des infos de l'arete
if ( edge->hasInfo() ) {
QColor color (Qt::blue);
painter.setPen (color.darker(widget->getDarkening()));
QFont font;
font.setBold(true);
font.setPointSize(10);
painter.setFont(font);
//QString text = QString("%1%2%3").arg(edge->getConnexID()).arg(",").arg(edge->getConstCost());
QString text = QString("%1").arg(edge->getConnexID());
Point fromPos = edge->getFrom()->getPosition();
Point toPos = edge->getTo()->getPosition();
//painter.drawText ( widget->dbuToDisplayPoint ( (fromPos.getX()+toPos.getX())/2+DbU::lambda(0.5), (fromPos.getY()+toPos.getY())/2+DbU::lambda(0.5) ), text );
if ( edge->isVertical() ) {
painter.save();
Box bbox = edge->getBoundingBox();
painter.translate (widget->dbuToDisplayPoint(bbox.getXMin(), bbox.getYMin()));
painter.rotate(-90);
painter.drawText (QRect(0,0,widget->dbuToDisplayLength(bbox.getHeight()),widget->dbuToDisplayLength(bbox.getWidth())), text, QTextOption(Qt::AlignCenter));
//painter.drawText (0, 0, text);
painter.restore();
} else
painter.drawText ( widget->dbuToDisplayRect ( edge->getBoundingBox(),false ), text, QTextOption (Qt::AlignCenter) );
painter.setPen(Qt::NoPen);
}
}
}
void GraphicKnikEngine::initKnikVertex ( CellWidget* widget )
{
//widget->getDrawingPlanes().setPen ( Qt::NoPen );
//widget->getDrawingPlanes().setBrush ( color.darker(widget->getDarkening()) );
}
void GraphicKnikEngine::drawKnikVertex ( CellWidget* widget
, const Go* go
, const BasicLayer* basicLayer
, const Box& box
, const Transformation& transformation
)
{
const Vertex* vertex = dynamic_cast<const Vertex*>(go);
if ( vertex ) {
QPainter& painter = widget->getPainter();
QColor color = Qt::darkRed;
QPen pen (color.darker(widget->getDarkening()));
pen.setWidth(2);
widget->setPen(pen);
painter.drawEllipse ( widget->dbuToDisplayRect ( vertex->getBoundingBox(), false ) );
if ( vertex->hasInfo() ) {
QColor color (Qt::blue);
painter.setPen (color.darker(widget->getDarkening()));
QFont font;
font.setBold(true);
font.setPointSize(10);
painter.setFont(font);
//QString text = QString("%1%2%3").arg(edge->getConnexID()).arg(",").arg(edge->getConstCost());
QString text = QString("%1 / %2").arg(vertex->getConnexID()).arg(vertex->getDistance());
Point center = vertex->getPosition();
Box textBox = Box(vertex->getXMin(), vertex->getYMin(), vertex->getXMax(), vertex->getYMax());
painter.drawText ( widget->dbuToDisplayRect ( textBox,false ), text, QTextOption (Qt::AlignCenter) );
painter.setPen(Qt::NoPen);
}
}
}
KnikEngine* GraphicKnikEngine::createEngine ( unsigned int mode )
{
Cell* cell = getCell ();
KnikEngine* knik = KnikEngine::get ( cell );
if ( !knik ) {
if ( cell->getRubbers().getFirst() == NULL )
cell->flattenNets ( (mode==BuildSolution) );
knik = KnikEngine::create ( cell
, _congestion
, _preCongestion
, _benchMode
, _useSegments
, _edgeCost
);
if ( mode == LoadSolution )
knik->createRoutingGraph ();
}
//else
// cerr << Warning("%s already has a Knik engine.",getString(cell).c_str()) << endl;
return knik;
}
void GraphicKnikEngine::flattenNets ()
{
Cell* cell = getCell ();
emit cellPreModificated();
cell->flattenNets ( (true) );
emit cellPostModificated();
}
void GraphicKnikEngine::run ()
{
KnikEngine* knik = createEngine ( BuildSolution );
if ( !knik ) return;
emit cellPreModificated ();
knik->run ();
emit cellPostModificated ();
}
void GraphicKnikEngine::route ()
{
KnikEngine* knik = createEngine ( BuildSolution );
if ( !knik ) return;
emit cellPreModificated ();
knik->Route ();
emit cellPostModificated ();
}
bool GraphicKnikEngine::analyse ()
{
Cell* cell = getCell ();
emit cellPreModificated();
bool done = false;
KnikEngine* knik = KnikEngine::get ( cell );
if ( knik ) {
done = knik->analyseRouting();
}
emit cellPostModificated();
return done;
}
void GraphicKnikEngine::unroute ()
{
Cell* cell = getCell ();
emit cellPreModificated();
KnikEngine* knik = KnikEngine::get ( cell );
if ( knik ) knik->unrouteOvSegments();
emit cellPostModificated();
}
void GraphicKnikEngine::reroute ()
{
Cell* cell = getCell ();
emit cellPreModificated();
KnikEngine* knik = KnikEngine::get ( cell );
if ( knik ) knik->reroute();
emit cellPostModificated();
}
void GraphicKnikEngine::saveSolution ()
{
Cell* cell = getCell ();
emit cellPreModificated();
KnikEngine* knik = KnikEngine::get ( cell );
if ( knik ) knik->saveSolution();
emit cellPostModificated();
}
void GraphicKnikEngine::loadSolution ()
{
KnikEngine* knik = createEngine ( LoadSolution );
if ( !knik ) return;
emit cellPreModificated();
knik->loadSolution();
emit cellPostModificated();
}
void GraphicKnikEngine::addToMenu ( CellViewer* viewer )
{
assert ( _viewer == NULL );
_viewer = viewer;
QMenu* prMenu = _viewer->findChild<QMenu*>("viewer.menuBar.placeAndRoute");
QMenu* stepMenu = _viewer->findChild<QMenu*>("viewer.menuBar.placeAndRoute.stepByStep");
if ( !prMenu ) {
QMenuBar* menuBar = _viewer->findChild<QMenuBar*>("viewer.menuBar");
if ( !menuBar ) {
cerr << Warning("GraphicKnikEngine::addToMenu() - No MenuBar in parent widget.") << endl;
return;
}
prMenu = menuBar->addMenu ( tr("P&&R") );
prMenu->setObjectName ( "viewer.menuBar.placeAndRoute" );
stepMenu = prMenu->addMenu ( tr("&Step by Step") );
stepMenu->setObjectName ( "viewer.menuBar.placeAndRoute.stepByStep" );
prMenu->addSeparator ();
}
QAction* gRunAction = _viewer->findChild<QAction*>("viewer.menuBar.placeAndRoute.globalRoute");
if ( gRunAction )
cerr << Warning("GraphicKnikEngine::addToMenu() - Knik global router already hooked in.") << endl;
else {
gRunAction = new QAction ( tr("Knik - &Global Route"), _viewer );
gRunAction->setObjectName ( "viewer.menuBar.placeAndRoute.globalRoute" );
gRunAction->setStatusTip ( tr("Run the <b>Knik</b> global router") );
gRunAction->setVisible ( true );
prMenu->addAction ( gRunAction );
connect ( gRunAction, SIGNAL(triggered()), this, SLOT(run()) );
}
QAction* gFlattenAction = _viewer->findChild<QAction*>("viewer.menuBar.placeAndRoute.flattenNets");
if ( gFlattenAction )
cerr << Warning("GraphicKnikEngine::addToMenu() - Knik global router already hooked in.") << endl;
else {
gFlattenAction = new QAction ( tr("Knik - &Prepare nets"), _viewer );
gFlattenAction->setObjectName ( "viewer.menuBar.placeAndRoute.flattenNets" );
gFlattenAction->setStatusTip ( tr("Prepare nets for routing") );
gFlattenAction->setVisible ( true );
stepMenu->addAction ( gFlattenAction );
connect ( gFlattenAction, SIGNAL(triggered()), this, SLOT(flattenNets()) );
}
QAction* gRouteAction = _viewer->findChild<QAction*>("viewer.menuBar.placeAndRoute.simpleGlobalRoute");
if ( gRouteAction )
cerr << Warning("GraphicKnikEngine::addToMenu() - Knik global router already hooked in.") << endl;
else {
gRouteAction = new QAction ( tr("Knik - &Simple Global Route (no ripup)"), _viewer );
gRouteAction->setObjectName ( "viewer.menuBar.placeAndRoute.simpleGlobalRoute" );
gRouteAction->setStatusTip ( tr("Run the <b>Knik</b> global router") );
gRouteAction->setVisible ( true );
stepMenu->addAction ( gRouteAction );
connect ( gRouteAction, SIGNAL(triggered()), this, SLOT(route()) );
}
QAction* gAnalyseAction = _viewer->findChild<QAction*>("viewer.menuBar.placeAndRoute.analyse");
if ( gAnalyseAction )
cerr << Warning("GraphicKnikEngine::addToMenu() - Knik global router already hooked in (analyse function).") << endl;
else {
gAnalyseAction = new QAction ( tr("Knik - &Analyse routing"), _viewer );
gAnalyseAction->setObjectName ( "viewer.menuBar.placeAndRoute.analyse" );
gAnalyseAction->setStatusTip ( tr("Analyse routing done by <b>Knik</b>") );
gAnalyseAction->setVisible ( true );
stepMenu->addAction ( gAnalyseAction );
connect ( gAnalyseAction, SIGNAL(triggered()), this, SLOT(analyse()) );
}
QAction* gUnrouteAction = _viewer->findChild<QAction*>("viewer.menuBar.placeAndRoute.unroute");
if ( gUnrouteAction )
cerr << Warning("GraphicKnikEngine::addToMenu() - Knik global router already hooked in (unroute function).") << endl;
else {
gUnrouteAction = new QAction ( tr("Knik - &Unroute overflowed segments"), _viewer );
gUnrouteAction->setObjectName ( "viewer.menuBar.placeAndRoute.unroute" );
gUnrouteAction->setStatusTip ( tr("Unroute overflowed segments") );
gUnrouteAction->setVisible ( true );
stepMenu->addAction ( gUnrouteAction );
connect ( gUnrouteAction, SIGNAL(triggered()), this, SLOT(unroute()) );
}
QAction* gRerouteAction = _viewer->findChild<QAction*>("viewer.menuBar.placeAndRoute.reroute");
if ( gRerouteAction )
cerr << Warning("GraphicKnikEngine::addToMenu() - Knik global router already hooked in (reroute function).") << endl;
else {
gRerouteAction = new QAction ( tr("Knik - &Reroute"), _viewer );
gRerouteAction->setObjectName ( "viewer.menuBar.placeAndRoute.reroute" );
gRerouteAction->setStatusTip ( tr("Reroute") );
gRerouteAction->setVisible ( true );
stepMenu->addAction ( gRerouteAction );
connect ( gRerouteAction, SIGNAL(triggered()), this, SLOT(reroute()) );
}
QAction* gSaveAction = _viewer->findChild<QAction*>("viewer.menuBar.placeAndRoute.saveSolution");
if ( gSaveAction )
cerr << Warning("GraphicKnikEngine::addToMenu() - Knik global router already hooked in (save function).") << endl;
else {
gSaveAction = new QAction ( tr("Knik - &Save global routing"), _viewer );
gSaveAction->setObjectName ( "viewer.menuBar.placeAndRoute.saveSolution" );
gSaveAction->setStatusTip ( tr("Save global routing (.kgr file)") );
gSaveAction->setVisible ( true );
stepMenu->addAction ( gSaveAction );
connect ( gSaveAction, SIGNAL(triggered()), this, SLOT(saveSolution()) );
}
QAction* gLoadAction = _viewer->findChild<QAction*>("viewer.menuBar.placeAndRoute.loadSolution");
if ( gLoadAction )
cerr << Warning("GraphicKnikEngine::addToMenu() - Knik global router already hooked in (load function).") << endl;
else {
gLoadAction = new QAction ( tr("Knik - &Load global routing"), _viewer );
gLoadAction->setObjectName ( "viewer.menuBar.placeAndRoute.loadSolution" );
gLoadAction->setStatusTip ( tr("Load global routing (.kgr file)") );
gLoadAction->setVisible ( true );
stepMenu->addAction ( gLoadAction );
connect ( gLoadAction, SIGNAL(triggered()), this, SLOT(loadSolution()) );
}
// fin du sous menu
connect ( this, SIGNAL(cellPreModificated ()), _viewer->getCellWidget(), SLOT(cellPreModificate ()) );
connect ( this, SIGNAL(cellPostModificated()), _viewer->getCellWidget(), SLOT(cellPostModificate()) );
}
const Name& GraphicKnikEngine::getName () const
{ return KnikEngine::staticGetName (); }
Cell* GraphicKnikEngine::getCell ()
{
if ( !_viewer ) {
throw Error ( "<b>Knik:</b> GraphicKnikEngine not bound to any Viewer." );
return NULL;
}
if ( !_viewer->getCell() ) {
throw Error ( "<b>Knik:</b> No Cell is loaded into the Viewer." );
return NULL;
}
return _viewer->getCell();
}
GraphicKnikEngine* GraphicKnikEngine::grab ()
{
if ( !_references )
_singleton = new GraphicKnikEngine ();
_references++;
return _singleton;
}
size_t GraphicKnikEngine::release ()
{
_references--;
if ( !_references ) {
delete _singleton;
_singleton = NULL;
}
return _references;
}
GraphicKnikEngine::GraphicKnikEngine ()
: GraphicTool ()
, _viewer (NULL)
, _congestion (1)
, _preCongestion(2)
, _benchMode (false)
, _useSegments (true)
, _edgeCost (2.5)
{
addDrawGo ( "Knik::Edges", initKnikEdges, drawKnikEdges );
addDrawGo ( "Knik::Vertex", initKnikVertex, drawKnikVertex );
}
GraphicKnikEngine::~GraphicKnikEngine()
{ }
} // End of Knik namespace.

121
knik/src/HEdge.cpp Normal file
View File

@ -0,0 +1,121 @@
#include "knik/HEdge.h"
#include "knik/Vertex.h"
#include "knik/Graph.h"
namespace Knik {
HEdge::HEdge ( Vertex* from, Vertex* to )
// **************************************
: Inherit (from, to)
{
DbU::Unit thickness = DbU::lambda( (_realOccupancy>_capacity)?5.0:2.5 );
Point fromPoint = getFrom()->getPosition();
Point toPoint = getTo()->getPosition();
_boundingBox = Box ( fromPoint.getX(), fromPoint.getY() - thickness, toPoint.getX(), toPoint.getY() + thickness );
}
HEdge::HEdge ( Vertex* from, Vertex* to, unsigned capacity )
// *********************************************************
: Inherit (from, to, capacity)
{
DbU::Unit thickness = DbU::lambda( (_realOccupancy>_capacity)?5.0:2.5 );
Point fromPoint = getFrom()->getPosition();
Point toPoint = getTo()->getPosition();
_boundingBox = Box ( fromPoint.getX(), fromPoint.getY() - thickness, toPoint.getX(), toPoint.getY() + thickness );
}
HEdge* HEdge::create ( Vertex* from, Vertex* to )
// **********************************************
{
if ( !from || !to )
throw Error ("HEdge::create(): cannot create HEdge with NULL vertex.");
HEdge* hEdge = new HEdge ( from, to );
hEdge->_postCreate(true);
return hEdge;
}
HEdge* HEdge::create ( Vertex* from, Vertex* to, unsigned capacity )
// *****************************************************************
{
if ( !from || !to )
throw Error ("HEdge::create(): cannot create HEdge with NULL vertex.");
HEdge* hEdge = new HEdge ( from, to, capacity );
hEdge->_postCreate(false);
return hEdge;
}
void HEdge::_postCreate ( bool fenceCapacity )
// *******************************************
{
Inherit::_postCreate ( fenceCapacity );
}
HEdge::~HEdge()
// **********
{
}
Box HEdge::computeBoundingBox() const
// ***********************************
{
DbU::Unit thickness = DbU::lambda( (_realOccupancy>_capacity)?2.5:2.5 );
Point fromPoint = getFrom()->getPosition();
Point toPoint = getTo()->getPosition();
return Box ( fromPoint.getX(), fromPoint.getY() - thickness, toPoint.getX(), toPoint.getY() + thickness );
}
Point HEdge::getReferencePoint() const
// ************************************
{
return Point ( getBoundingBox().getXMax(), getBoundingBox().getYMin() );
}
DbU::Unit HEdge::getWidth() const
// *******************************
{
return getBoundingBox().getHeight();
}
float HEdge::getNormalisedLength() const
// *************************************
{
return _from->getRoutingGraph()->getHEdgeNormalisedLength();
}
//void HEdge::createSplitter ( Net* net )
//// ************************************
//{
// if ( !_splitter )
// {
// DbU::Unit _size = DbU::lambda(3);
// _splitter = Splitter::createHorizontal ( net, _fence->getGrid()->getLayer(), _fence, DbU::lambda(2), _size, _size );
// _fence->attachSplitter ( _splitter );
// // when attaching a splitter : fence's occupancity is incremented. do the same for the edge
// _realOccupancy++;
// }
//}
//Hook* HEdge::getSplitterHook ( Vertex* vertex )
//// ********************************************
//{
// assert ( _splitter );
// assert ( (vertex == _from) || (vertex == _to) );
// if ( vertex == _from )
// return _splitter->getLeftHook();
// else
// return _splitter->getRightHook();
//}
} // end namespace

1226
knik/src/KnikEngine.cpp Normal file

File diff suppressed because it is too large Load Diff

427
knik/src/LoadSolution.cpp Normal file
View File

@ -0,0 +1,427 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved
//
// ===================================================================
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S |
// | K n i k - Global Router |
// | |
// | Author : Damien Dupuis |
// | E-mail : Damien.Dupuis@lip6.fr |
// | =============================================================== |
// | C++ Module : "./LoadSolution.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <iostream>
#include "hurricane/Error.h"
#include "hurricane/DataBase.h"
#include "hurricane/Technology.h"
#include "hurricane/Layer.h"
#include "hurricane/Contact.h"
#include "hurricane/Vertical.h"
#include "hurricane/Horizontal.h"
#include "hurricane/RoutingPad.h"
#include "hurricane/Cell.h"
#include "hurricane/UpdateSession.h"
#include "crlcore/Utilities.h"
#include "knik/Configuration.h"
#include "knik/Graph.h"
#include "knik/KnikEngine.h"
namespace {
using std::string;
using std::cerr;
using std::endl;
using std::vector;
using std::map;
using std::make_pair;
using CRL::IoFile;
using Hurricane::ForEachIterator;
using Hurricane::Error;
using Hurricane::DbU;
using Hurricane::Point;
using Hurricane::Box;
using Hurricane::Name;
using Hurricane::DataBase;
using Hurricane::Technology;
using Hurricane::Layer;
using Hurricane::Net;
using Hurricane::Contact;
using Hurricane::Segment;
using Hurricane::Vertical;
using Hurricane::Horizontal;
using Hurricane::RoutingPad;
using Hurricane::Cell;
using Hurricane::UpdateSession;
using Knik::Configuration;
using Knik::KnikEngine;
using Knik::Vertex;
const char* LoadError = "KnikEngine::LoadSolution(): %s.\n (file: %s, at line: %d)";
const char* NotManhattan =
"KnikEngine::LoadSolution(): Encountered a Segment neither Horizontal nor Vertical.\n"
" ([%s %s] [%s %s], file: %s, at line: %d)";
const char* BadLong =
"KnikEngine::LoadSolution(): Incomplete string to integer conversion for \"%s\" (%ld).\n"
" (file: %s, at line: %d)";
struct PointCompare {
bool operator() ( const Point& lhs, const Point& rhs ) const;
};
bool PointCompare::operator() ( const Point& lhs, const Point& rhs ) const
{
if ( lhs.getX() < rhs.getX() ) return true;
if ( lhs.getX() > rhs.getX() ) return false;
if ( lhs.getY() < rhs.getY() ) return true;
return false;
}
class GContactMap {
public:
GContactMap ( KnikEngine* knik
, const Layer* gmetalh
, const Layer* gmetalv
);
void setNet ( Net* );
const Layer* getLayer ( unsigned int z );
Contact* find ( DbU::Unit x, DbU::Unit y, unsigned int z );
Contact* findVertexContact ( const Box& );
size_t size () const;
void clear ();
private:
void _mergeLayer ( Contact*, unsigned int );
private:
KnikEngine* _knik;
Technology* _technology;
Net* _net;
map<Point,Contact*,PointCompare> _contactMap;
map<Vertex*,Contact*> _vertexMap;
const Layer* _gmetalh;
const Layer* _gmetalv;
};
GContactMap::GContactMap ( KnikEngine* knik
, const Layer* gmetalh
, const Layer* gmetalv
)
: _knik (knik)
, _technology(DataBase::getDB()->getTechnology())
, _net (NULL)
, _contactMap()
, _vertexMap ()
, _gmetalh (gmetalh)
, _gmetalv (gmetalv)
{ }
void GContactMap::setNet ( Net* net )
{ _net = net; }
const Layer* GContactMap::getLayer ( unsigned int z )
{ return (z%2) ? _gmetalh : _gmetalv; }
Contact* GContactMap::find ( DbU::Unit x, DbU::Unit y, unsigned int z )
{
map<Point,Contact*,PointCompare>::iterator icontact = _contactMap.find ( Point(x,y) );
Contact* contact;
if ( icontact == _contactMap.end() ) {
contact = Contact::create ( _net, getLayer(z), x, y, DbU::lambda(3.0), DbU::lambda(3.0) );
Vertex* vertex = _knik->getVertex ( x, y );
_contactMap.insert ( make_pair(Point(x,y),contact) );
_vertexMap .insert ( make_pair(vertex ,contact) );
} else {
contact = icontact->second;
}
_mergeLayer ( contact, z );
return contact;
}
Contact* GContactMap::findVertexContact ( const Box& boundingBox )
{
Point reference = boundingBox.getCenter();
Vertex* vertex = _knik->getVertex ( reference );
if ( !vertex ) return NULL;
map<Vertex*,Contact*>::iterator icontact = _vertexMap.find ( vertex );
if ( icontact == _vertexMap.end() ) return NULL;
return icontact->second;
}
size_t GContactMap::size () const
{ return _contactMap.size(); }
void GContactMap::clear ()
{
_contactMap.clear();
_vertexMap.clear();
}
void GContactMap::_mergeLayer ( Contact* contact, unsigned int z )
{
const Layer* mergeLayer = getLayer ( z );
const Layer* contactLayer = contact->getLayer();
if ( contactLayer->contains(mergeLayer) ) return;
contactLayer = _technology->getViaBetween ( contactLayer, mergeLayer );
if ( contactLayer )
contact->setLayer ( contactLayer );
}
class SolutionParser {
public:
SolutionParser ( KnikEngine*, const string& loadFileName );
void load ();
private:
long _getLong ( const char* );
vector<char*> _splitSegmentString ( char* );
vector<char*> _splitString ( char* );
private:
enum Constants { RawLineSize = 4096 };
private:
char _rawLine [ RawLineSize ];
size_t _lineNumber;
string _fileName;
KnikEngine* _knik;
const Layer* _gmetalh;
const Layer* _gmetalv;
const Layer* _gcontact;
};
SolutionParser::SolutionParser ( KnikEngine* knik, const string& fileName )
: _lineNumber(0)
, _fileName (fileName)
, _knik (knik)
, _gmetalh (Configuration::getGMetalH())
, _gmetalv (Configuration::getGMetalV())
, _gcontact (Configuration::getGContact())
{ }
long SolutionParser::_getLong ( const char* s )
{
char* end;
long value = strtol ( s, &end, 10 );
if ( *end != '\0' )
cerr << Error(BadLong,s,value,_fileName.c_str(),_lineNumber) << endl;
return value;
}
vector<char*> SolutionParser::_splitString ( char* s )
{
vector<char*> fields;
fields.push_back ( s );
while ( *s != '\0' ) {
unsigned i = 0;
if ( (*s == ' ') || (*s == '\t') ) {
i++;
*s = '\0';
while ( (*(s+i) == ' ') || (*(s+i) == '\t') ) i++;
fields.push_back ( s+i );
s += i;
} else
s++;
}
return fields;
}
vector<char*> SolutionParser::_splitSegmentString ( char* s )
{
vector<char*> fields;
while ( *s != '\0' ) {
switch ( *s ) {
case '(':
case ',': *s = '\0'; ++s; break;
case ')':
*s = '\0'; ++s;
if ( *s == '-' ) { *s = '\0'; ++s; }
break;
default:
fields.push_back ( s );
while ( *s && ( (*s != ')') && (*s != ',') ) ) ++s;
}
}
return fields;
}
void SolutionParser::load ()
{
UpdateSession::open ();
try {
cmess1 << " o Loading solution: \"" << _fileName << "\"." << endl;
CRL::IoFile fileStream ( _fileName );
fileStream.open ( "r" );
if ( !fileStream.isOpen() )
throw Error ("Can't open/read file: %s.",_fileName.c_str());
unsigned int contactCount = 0;
unsigned int segmentCount = 0;
GContactMap contactMap ( _knik, _gmetalh, _gmetalv );
while ( !fileStream.eof() ) {
fileStream.readLine ( _rawLine, RawLineSize );
_lineNumber++;
if ( _rawLine[0] == '\0' ) break;
if ( _rawLine[0] == '\n' ) continue;
vector<char*> fields = _splitString ( _rawLine );
if ( fields.size() != 3 )
throw Error ( LoadError, "Malformed Net Line", _fileName.c_str(), _lineNumber );
else {
Name netName = Name ( fields[0] );
unsigned nbPins = _getLong ( fields[2] );
Net* net = _knik->getCell()->getNet ( netName );
if ( !net ) {
string message = "Cell has no Net: ";
message += getString(netName);
throw Error ( LoadError, message.c_str(), _fileName.c_str(), _lineNumber );
}
contactMap.setNet ( net );
for ( unsigned i = 0 ; i < nbPins ; i++ ) {
fileStream.readLine ( _rawLine, RawLineSize );
_lineNumber++;
fields = _splitSegmentString ( _rawLine );
if ( fields.size() != 6 )
throw Error ( LoadError, "Malformed Net Line", _fileName.c_str(), _lineNumber );
else {
DbU::Unit xSource = DbU::lambda(_getLong(fields[0]));
DbU::Unit ySource = DbU::lambda(_getLong(fields[1]));
unsigned zSource = (unsigned) (_getLong(fields[2]));
DbU::Unit xTarget = DbU::lambda(_getLong(fields[3]));
DbU::Unit yTarget = DbU::lambda(_getLong(fields[4]));
unsigned zTarget = (unsigned) (_getLong(fields[5]));
Contact* source = contactMap.find ( xSource, ySource, zSource );
Contact* target = contactMap.find ( xTarget, yTarget, zTarget );
Segment* segment = NULL;
unsigned int type = ((ySource == yTarget)?1:0) + ((xSource == xTarget)?2:0);
switch ( type ) {
case 0:
throw Error(NotManhattan
,DbU::getValueString(xSource).c_str()
,DbU::getValueString(ySource).c_str()
,DbU::getValueString(xTarget).c_str()
,DbU::getValueString(yTarget).c_str()
,_fileName.c_str()
,_lineNumber
);
case 1:
segment = Horizontal::create ( source, target, _gmetalh, ySource, DbU::lambda(2.0) );
segmentCount++;
break;
case 2:
segment = Vertical::create ( source, target, _gmetalv, xSource, DbU::lambda(2.0) );
segmentCount++;
break;
case 3:
break;
}
if ( segment ) _knik->insertSegment ( segment );
}
}
fileStream.readLine ( _rawLine, RawLineSize );
_lineNumber++;
if ( _rawLine[0] != '!' )
throw Error("KnikEngine::loadSolution(): Tu t'es vu quand t'as bu! (%ld)."
,getString(_lineNumber).c_str());
RoutingPad* previousRp = NULL;
forEach ( RoutingPad*, rp, net->getComponents().getSubSet<RoutingPad*>() ) {
Contact* gcontact = contactMap.findVertexContact ( rp->getBoundingBox() );
if ( gcontact ) {
rp->getBodyHook()->attach ( gcontact->getBodyHook() );
} else {
if ( previousRp )
rp->getBodyHook()->attach ( previousRp->getBodyHook() );
}
previousRp = *rp;
//cerr << rp->_getString() << " should be attached to " << gcontact << endl;
}
contactCount += contactMap.size ();
contactMap.clear ();
}
}
fileStream.close ();
}
catch ( Error& e ) {
cerr << e << endl;
}
UpdateSession::close ();
}
} // End of anonymous namespace.
namespace Knik {
void KnikEngine::loadSolution ( const string& fileName )
{
string loadFileName = fileName;
if ( loadFileName.empty() )
loadFileName = _getSolutionName();
SolutionParser parser ( this, loadFileName );
parser.load ();
}
} // End of Knik namespace.

404
knik/src/MatrixVertex.cpp Normal file
View File

@ -0,0 +1,404 @@
#include <ext/algorithm>
#include "hurricane/Cell.h"
#include "hurricane/Box.h"
#include "crlcore/AllianceFramework.h"
#include "crlcore/CellGauge.h"
#include "knik/Graph.h"
#include "knik/MatrixVertex.h"
#include "knik/KnikEngine.h"
namespace Knik {
using namespace std;
using namespace CRL;
MatrixVertex::MatrixVertex ( Graph* routingGraph )
// ***********************************************
: _xInit(false)
, _yInit(false)
, _xRegular(false)
, _yRegular(false)
, _nbXTiles(0)
, _nbYTiles(0)
, _tileWidth(0)
, _tileHeight(0)
, _lowerLeftX(0)
, _lowerLeftY(0)
, _routingGraph(routingGraph)
{
}
MatrixVertex* MatrixVertex::create ( Graph* routingGraph )
// *******************************************************
{
MatrixVertex* matrixVertex = new MatrixVertex(routingGraph);
return matrixVertex;
}
MatrixVertex::~MatrixVertex()
// **************************
{
}
void MatrixVertex::destroy()
// ************************
{
_preDestroy();
delete ( this );
}
void MatrixVertex::_preDestroy()
// ****************************
{
}
//void MatrixVertex::createXRegular ( RoutingGrid* routingGrid )
//// ***********************************************************
//{
//
// if ( _xInit )
// throw Error ("MatrixVertex::createXRegular(): cannot initialize X vector twice.");
// _lowerLeftX = routingGrid->getLowerLeftX();
// _nbXTiles = routingGrid->getNbXTiles();
// _tileWidth = routingGrid->getTileWidth();
// _xRegular = true;
// _xInit = true;
//
// if ( _xInit && _yInit )
// createMatrix();
//}
//void MatrixVertex::createYRegular ( RoutingGrid* routingGrid )
//// ***********************************************************
//{
// if ( _yInit )
// throw Error ("MatrixVertex::createYRegular(): cannot initialize Y vector twice.");
// _lowerLeftY = routingGrid->getLowerLeftY();
// _nbYTiles = routingGrid->getNbYTiles();
// _tileHeight = routingGrid->getTileHeight();
// _yRegular = true;
// _yInit = true;
//
// if ( _xInit && _yInit )
// createMatrix();
//}
Vertex* MatrixVertex::createRegularMatrix ( RoutingGrid* routingGrid )
// *******************************************************************
{
if ( _xInit || _yInit )
throw Error ("MatrixVertex::createRegularMatrix(): cannot initialize matrix twice.");
_lowerLeftX = routingGrid->getLowerLeftX();
_lowerLeftY = routingGrid->getLowerLeftY();
_nbXTiles = routingGrid->getNbXTiles();
_nbYTiles = routingGrid->getNbYTiles();
_tileWidth = routingGrid->getTileWidth();
_tileHeight = routingGrid->getTileHeight();
_xInit = true; // XXX Nécessaire pour les fonctions comme getLineIndex
_yInit = true;
_xRegular = true; // XXX Nécessaire pour les fonctions comme getLineIndex
_yRegular = true;
DbU::Unit halfWidth = _tileWidth / 2;
DbU::Unit halfHeight = _tileHeight / 2;
// On cree les vecteurs de vertex en meme temps que les vertex et aussi les edges !
for ( unsigned j = 0 ; j < _nbYTiles ; j++ ) {
vector<Vertex*> vect;
for ( unsigned i = 0 ; i < _nbXTiles ; i++ ) {
Point position ( _lowerLeftX+(i*_tileWidth)+halfWidth, _lowerLeftY+(j*_tileHeight)+halfHeight );
// on cree le vertex
Vertex* vertex = _routingGraph->createVertex ( position, halfWidth, halfHeight );
assert ( vertex );
// on l'ajoute dans la matrice
vect.push_back ( vertex );
// si i > 0 alors on peut creer une edge horizontale entre matrix[i-1][j] et matrix[i][j] c'est a dire vect[i-1] et vect[i]
if ( i > 0 ) {
Vertex* from = vect[i-1];
assert(from);
Vertex* to = vect[i];
assert(to);
_routingGraph->createHEdge ( from, to );
}
// si j > 0 alors on peut creer une edge verticale entre matrix[i][j-1] et matrix[i][j] c'est a dire _matrix[j-1][i] et vect[i]
if ( j > 0 ) { // _matrix est un vecteur de vecteur represantant les lignes -> _matrix[ligne][colonne]
Vertex* from = _matrix[j-1][i];
assert(from);
Vertex* to = vect[i];
assert(to);
_routingGraph->createVEdge ( from, to );
}
}
_matrix.push_back ( vect );
}
return _matrix[0][0];
}
Vertex* MatrixVertex::createRegularMatrix ()
// *****************************************
{
if ( _xInit || _yInit )
throw Error ("MatrixVertex::createRegularMatrix(): cannot initialize matrix twice.");
Cell* cell = _routingGraph->getCell();
DbU::Unit sliceHeight = AllianceFramework::get()->getCellGauge()->getSliceHeight();
DbU::Unit cellWidth = cell->getAbutmentBox().getWidth();
DbU::Unit cellHeight = cell->getAbutmentBox().getHeight();
_lowerLeftX = cell->getAbutmentBox().getXMin();
_lowerLeftY = cell->getAbutmentBox().getYMin();
_nbXTiles = (unsigned int)ceil(float(cellWidth) / float(sliceHeight));
_nbYTiles = (unsigned int)ceil(float(cellHeight) / float(sliceHeight));
_tileWidth = sliceHeight;
_tileHeight = sliceHeight;
DbU::Unit _latestTileWidth = cellWidth - ((_nbXTiles - 1) * _tileWidth);
DbU::Unit _latestTileHeight = cellHeight - ((_nbYTiles - 1) * _tileHeight);
_xInit = true; // XXX Nécessaire pour les fonctions comme getLineIndex
_yInit = true;
_xRegular = true; // XXX Nécessaire pour les fonctions comme getLineIndex
_yRegular = true;
// cerr << "Resume :" << endl
// << " - this : " << (void*)this << endl
// << " - cellWidth : " << cellWidth << endl
// << " - cellHeight : " << cellHeight << endl
// << " - lowerLeftX : " << _lowerLeftX << endl
// << " - lowerLeftY : " << _lowerLeftY << endl
// << " - nbXTiles : " << _nbXTiles << endl
// << " - nbYTiles : " << _nbYTiles << endl
// << " - tileWidth : " << _tileWidth << endl
// << " - tileHieght : " << _tileHeight << endl
// << " - latestTileWidth : " << _latestTileWidth << endl
// << " - latestTileHeight : " << _latestTileHeight << endl;
// On cree les vecteurs de vertex en meme temps que les vertex et aussi les edges !
float ecp = KnikEngine::get ( cell )->getEdgeCapacityPercent();
for ( unsigned j = 0 ; j < _nbYTiles ; j++ ) {
vector<Vertex*> vect;
for ( unsigned i = 0 ; i < _nbXTiles ; i++ ) {
DbU::Unit halfWidth = (i == _nbXTiles - 1)?_latestTileWidth/2:_tileWidth/2;
DbU::Unit halfHeight = (j == _nbYTiles - 1)?_latestTileHeight/2:_tileHeight/2;
Point position ( _lowerLeftX+(i*_tileWidth)+halfWidth, _lowerLeftY+(j*_tileHeight)+halfHeight );
// on cree le vertex
Vertex* vertex = _routingGraph->createVertex ( position, halfWidth, halfHeight );
assert ( vertex );
//cerr << ". .. " << vertex << endl;
// on l'ajoute dans la matrice
vect.push_back ( vertex );
// si i > 0 alors on peut creer une edge horizontale entre matrix[i-1][j] et matrix[i][j] c'est a dire vect[i-1] et vect[i]
if ( i > 0 ) {
Vertex* from = vect[i-1];
assert(from);
Vertex* to = vect[i];
assert(to);
_routingGraph->createHEdge ( from, to, ecp );
}
// si j > 0 alors on peut creer une edge verticale entre matrix[i][j-1] et matrix[i][j] c'est a dire _matrix[j-1][i] et vect[i]
if ( j > 0 ) { // _matrix est un vecteur de vecteur represantant les lignes -> _matrix[ligne][colonne]
Vertex* from = _matrix[j-1][i];
assert(from);
Vertex* to = vect[i];
assert(to);
_routingGraph->createVEdge ( from, to, ecp );
}
}
_matrix.push_back ( vect );
}
//cerr << "---------------------------" << endl;
//print();
return _matrix[0][0];
}
//void MatrixVertex::createXIrregular ( NimbusEngine* nimbus )
//// *********************************************************
//{
// if ( _xInit )
// throw Error ("MatrixVertex::createXIrregular(): cannot initialize X vector twice.");
// GCell* gcell = nimbus->getGrid()->getLowerLeftCorner ( nimbus->getDepth() );
// assert(gcell);
// unsigned index = 0;
// _columnsIndexes.push_back ( pair<DbU::Unit,unsigned>(gcell->getXMin(),index++) );
// while ( gcell ) {
// //if ( gcell->getRightFence() ) pour la dernière gcell, on veut récupérer la fence virtuelle de droite
// _columnsIndexes.push_back ( pair<DbU::Unit,unsigned>(gcell->getXMax(),index++) );
// gcell = gcell->getRightOfMe();
// }
// _nbXTiles = index-1;
// //assert ( is_sorted(vertiCutLines.begin(), vertiCutLines.end()) );
// //for ( unsigned i = 0 ; i < vertiCutLines.size() ; i++ )
// // _columnsIndexes.push_back ( pair<DbU::Unit,unsigned> (vertiCutLines[i], i) );
// assert ( is_sorted(_columnsIndexes.begin(), _columnsIndexes.end(), IndexComp()) );
// //_nbXTiles = _columnsIndexes.size()-1;
// _xRegular = false;
// _xInit = true;
//
// if ( _xInit && _yInit )
// createMatrix();
//}
//void MatrixVertex::createYIrregular ( NimbusEngine* nimbus )
//// *********************************************************
//{
// if ( _yInit )
// throw Error ("MatrixVertex::createYIrregular(): cannot initialize Y vector twice.");
//
// GCell* gcell = nimbus->getGrid()->getLowerLeftCorner ( nimbus->getDepth() );
// assert(gcell);
// unsigned index = 0;
// _linesIndexes.push_back ( pair<DbU::Unit,unsigned>(gcell->getYMin(),index++) );
// while ( gcell ) {
// _linesIndexes.push_back ( pair<DbU::Unit,unsigned>(gcell->getYMax(),index++) );
// gcell = gcell->getUpOfMe();
// }
// assert ( is_sorted(_linesIndexes.begin(), _linesIndexes.end(), IndexComp()) );
// _nbYTiles = index-1;
// _yRegular = false;
// _yInit = true;
//
// if ( _xInit && _yInit )
// createMatrix();
//}
//void MatrixVertex::createMatrix()
//// ******************************
//{
// assert ( _xInit && _yInit );
// for ( unsigned j = 0 ; j < _nbYTiles ; j++ ) {
// vector<Vertex*> vect;
// for ( unsigned i = 0 ; i < _nbXTiles ; i++ ) {
// Vertex* vertex (NULL);
// vect.push_back ( vertex );
// }
// _matrix.push_back ( vect );
// }
//}
void MatrixVertex::setVertex ( pair<unsigned int,unsigned int> indexes, Vertex* vertex )
// *************************************************************************************
{
_matrix[indexes.second][indexes.first] = vertex;
}
void MatrixVertex::setVertex ( Point point, Vertex* vertex )
// *********************************************************
{
pair<unsigned int,unsigned int> indexes = getIJ ( point );
setVertex ( indexes, vertex );
}
unsigned int MatrixVertex::getLineIndex ( DbU::Unit y )
// ***********************************************
{
assert(_yInit );
if ( _yRegular ) {
// cerr << "y:" << DbU::getValueString(y-_lowerLeftY) << "/" << DbU::getValueString(_tileHeight)
// << "=" << (DbU::getLambda(y-_lowerLeftY)/_tileHeight)
// << "<=>" << (unsigned int)floor((y-_lowerLeftY)/_tileHeight) << endl;
return (unsigned int)floor((y-_lowerLeftY)/_tileHeight);
}
assert(is_sorted(_linesIndexes.begin(), _linesIndexes.end()));
if ( y == (*_linesIndexes.rbegin()).first )
return (*_linesIndexes.rbegin()).second-1;
pair<pairIterator,pairIterator> result = equal_range (_linesIndexes.begin(), _linesIndexes.end()
, pair<DbU::Unit,unsigned>(y,0), MatrixVertex::IndexComp());
if ( result.second == _linesIndexes.begin() )
throw Error ("MatrixVertex::getLineIndex(): search value (%s) is lower than lowest bound (%s)."
,getString(y).c_str(),getString((*_linesIndexes.begin()).first).c_str());
if ( result.second == _linesIndexes.end() )
throw Error ("MatrixVertex::getLineIndex(): search value (%s) is upper than uppest bound (%s)."
,getString(y).c_str(),getString((*_linesIndexes.rbegin()).first).c_str());
return ((*result.second).second-1);
}
unsigned int MatrixVertex::getColumnIndex ( DbU::Unit x )
// *************************************************
{
assert(_xInit );
if ( _xRegular ) {
// cerr << "x:" << DbU::getValueString(x-DbU::lambda(_lowerLeftX)) << "/" << _tileWidth << "=" << (DbU::getLambda(x-DbU::lambda(_lowerLeftX))/_tileWidth)
// << "<=>" << (unsigned int)floor(DbU::getLambda(x-DbU::lambda(_lowerLeftX))/_tileWidth) << endl;
return (unsigned int)floor((x-_lowerLeftX)/_tileWidth);
}
assert(is_sorted(_columnsIndexes.begin(),_columnsIndexes.end()));
if ( x == (*_columnsIndexes.rbegin()).first )
return (*_columnsIndexes.rbegin()).second-1;
pair<pairIterator,pairIterator> result = equal_range (_columnsIndexes.begin(), _columnsIndexes.end()
, pair<DbU::Unit,unsigned>(x,0), MatrixVertex::IndexComp());
if ( result.second == _columnsIndexes.begin() )
throw Error ("MatrixVertex::getColumnIndex(): search value is lower than lowest bound.");
if ( result.second == _columnsIndexes.end() )
throw Error ("MatrixVertex::getColumnIndex(): search value is upper than uppest bound.");
return ((*result.second).second-1);
}
pair<unsigned int,unsigned int> MatrixVertex::getIJ ( DbU::Unit x, DbU::Unit y )
// *******************************************************************
{
return pair<unsigned int,unsigned int> (getColumnIndex(x),getLineIndex(y));
}
pair<unsigned int,unsigned int> MatrixVertex::getIJ ( const Point& point )
// ***********************************************************************
{
return pair<unsigned int,unsigned int> (getColumnIndex(point.getX()),getLineIndex(point.getY()));
}
Vertex* MatrixVertex::getVertex ( pair<unsigned int,unsigned int> indexes )
// ************************************************************************
{
return _matrix[indexes.second][indexes.first];
}
Vertex* MatrixVertex::getVertex ( Point point )
// ********************************************
{
pair<unsigned int,unsigned int> indexes = getIJ ( point );
return getVertex ( indexes );
}
Vertex* MatrixVertex::getVertex ( DbU::Unit x, DbU::Unit y )
// *********************************************************
{
pair<unsigned int,unsigned int> indexes = getIJ ( x, y );
return getVertex ( indexes );
}
Vertex* MatrixVertex::getVertexFromIndexes ( unsigned lineIdx, unsigned columnIdx )
// ********************************************************************************
{
return _matrix[lineIdx][columnIdx];
}
void MatrixVertex::print()
// ***********************
{
//cerr << "\'_linesIndexes\';" << endl;
//for ( unsigned i = 0 ; i < _linesIndexes.size() ; ) {
// cerr << "\'<" << _linesIndexes[i].first << "," << _linesIndexes[i].second << ">\'";
// if ( ++i %10 )
// cerr << ",";
// else
// cerr << ";" << endl;
//}
//cerr << ";" << endl;
//cerr << "\'_columnsIndexes\';" << endl;
//for ( unsigned i = 0 ; i < _columnsIndexes.size() ; ) {
// cerr << "\'<" << _columnsIndexes[i].first << "," << _columnsIndexes[i].second << ">\'";
// if ( ++i %10 )
// cerr << ",";
// else
// cerr << ";" << endl;
//}
//cerr << ";" << endl;
for ( unsigned j = 0 ; j < _nbYTiles ; j++ )
for ( unsigned i = 0 ; i < _nbXTiles ; i++ )
cerr << i << "," << j << " " << _matrix[j][i] << endl;
}
} // end namespace

106
knik/src/NetExtension.cpp Normal file
View File

@ -0,0 +1,106 @@
// -*- C++ -*-
//
// This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved
//
// ===================================================================
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S |
// | K n i k - Global Router |
// | |
// | Author : Jean-Paul Chaput |
// | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== |
// | C++ Module : "./NetExtension.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include "hurricane/Error.h"
#include "hurricane/Net.h"
#include "hurricane/Cell.h"
#include "knik/NetExtension.h"
namespace Knik {
using Hurricane::Error;
using Hurricane::ForEachIterator;
const char* MissingNetExtension = "NetExtension::%s(): %s missing the Knik::Net extension.";
template<>
Name StandardPrivateProperty<NetExtensionDatas>::_name = "Knik::NetExtension";
// -------------------------------------------------------------------
// Class : "Knik::NetExtensionDatas".
NetExtensionDatas::NetExtensionDatas ()
: _wireLength()
{ }
// -------------------------------------------------------------------
// Class : "Knik::NetExtension".
unsigned long NetExtension::getWireLength ( const Net* net )
{
Extension* extension = Extension::get ( net );
if ( !extension )
return 0;
return extension->getValue()._wireLength;
}
void NetExtension::setWireLength ( Net* net, unsigned long wireLength )
{
Extension* extension = Extension::get ( net, true );
extension->getValue()._wireLength = wireLength;
}
int NetExtension::compare ( const Net* net1, const Net* net2 )
{
Extension* extension1 = Extension::get ( net1 );
Extension* extension2 = Extension::get ( net2 );
return ( (extension1) ? extension1->getValue()._wireLength : 0 )
- ( (extension2) ? extension2->getValue()._wireLength : 0 );
}
long NetExtension::getId ( const Net* net )
{
Extension* extension = Extension::get ( net );
if ( !extension )
return -1;
return extension->getValue()._id;
}
void NetExtension::setId ( Net* net, long id )
{
Extension* extension = Extension::get ( net, true );
extension->getValue()._id = id;
}
} // End of Knik namespace.

284
knik/src/SlicingTree.cpp Normal file
View File

@ -0,0 +1,284 @@
#include "knik/SlicingTree.h"
namespace Knik {
SlicingTree::SlicingTree()
// ***********************
: _root ( NULL )
, _xSize ( 0 )
, _ySize ( 0 )
{
}
//SlicingTree* SlicingTree::create ( NimbusEngine* nimbus )
SlicingTree* SlicingTree::create ()
// ******************************************************
{
SlicingTree* slicingTree = new SlicingTree();
// slicingTree->_postCreate ( nimbus );
slicingTree->_postCreate ();
return slicingTree;
}
//void SlicingTree::_postCreate ( NimbusEngine* nimbus )
void SlicingTree::_postCreate ()
// ***************************************************
{
// GCell* lowerLeftGC = nimbus->getGrid()->getLowerLeftCorner( nimbus->getDepth() );
// GCell* gcell = lowerLeftGC;
// while ( gcell ) {
// if ( gcell->getRightFence() )
// _xCutCoordinates.push_back ( gcell->getXMax() );
// _xSize++;
// gcell = gcell->getRightOfMe();
// }
// gcell = lowerLeftGC;
// while ( gcell ) {
// if ( gcell->getUpFence() )
// _yCutCoordinates.push_back ( gcell->getYMax() );
// _ySize++;
// gcell = gcell->getUpOfMe();
// }
// GCell* rootGCell = nimbus->getGrid()->getRoot();
//
// if ( nimbus->getDepth() == 1 ) {
// // We've got a regular flat grid
// if ( _xSize != 0 ) {
// if ( _ySize != 0 )
// _root = createNodesFromVertiCuts ( 0, _xCutCoordinates.size()-1, 0, _yCutCoordinates.size()-1 );
// else
// _root = createNodesFromVertiCuts ( 0, _xCutCoordinates.size()-1, 0, 0 );
// }
// else {
// if ( _ySize != 0 )
// _root = createNodesFromHorizCuts ( 0, _yCutCoordinates.size()-1 );
// else
// _root = new SlicingTreeTerminalNode();
// }
// _root->setPrevious ( NULL );
// }
// else {
// // We've got a (maybe unregular) hierarcic grid
// _root = createNodeFromGCell ( rootGCell );
// _root->setPrevious ( NULL );
//
// //cerr << _root << endl;
// }
}
SlicingTree::~SlicingTree()
// ************************
{
}
void SlicingTree::destroy()
// ***********************
{
_preDestroy();
delete ( this );
}
void SlicingTree::_preDestroy()
// ***************************
{
// on doit "deleter" le _root (SlicingTreeNode) qui lui même doit "deleter" tous ses fils et recursivement jusqu'aux feuilles (SlicingTreeTerminal)
if ( _root )
_root->destroy();
}
//SlicingTreeNode* SlicingTree::createNodeFromGCell ( GCell* gcell )
SlicingTreeNode* SlicingTree::createNodeFromGCell ( )
// ***************************************************************
{
// if ( !gcell->isARoutingLeaf() ) {
// DbU::Unit xCut = gcell->getSubUpperRight()->getXMin();
// DbU::Unit yCut = gcell->getSubUpperRight()->getYMin();
// SlicingTreeVertiCutNode* vertiCutNode = new SlicingTreeVertiCutNode ( xCut );
// SlicingTreeHorizCutNode* leftHorizCutNode = new SlicingTreeHorizCutNode ( yCut );
// SlicingTreeHorizCutNode* rightHorizCutNode = new SlicingTreeHorizCutNode ( yCut );
// vertiCutNode->setLeft ( leftHorizCutNode );
// vertiCutNode->setRight ( rightHorizCutNode );
// leftHorizCutNode->setPrevious ( vertiCutNode );
// rightHorizCutNode->setPrevious ( vertiCutNode );
//
// SlicingTreeNode* subNode = createNodeFromGCell ( gcell->getSubBottomLeft() );
// leftHorizCutNode->setBottom ( subNode );
// subNode->setPrevious ( leftHorizCutNode );
//
// subNode = createNodeFromGCell ( gcell->getSubUpperLeft() );
// leftHorizCutNode->setTop ( subNode );
// subNode->setPrevious( leftHorizCutNode );
//
// subNode = createNodeFromGCell ( gcell->getSubBottomRight() );
// rightHorizCutNode->setBottom ( subNode );
// subNode->setPrevious ( rightHorizCutNode );
//
// subNode = createNodeFromGCell ( gcell->getSubUpperRight() );
// rightHorizCutNode->setTop ( subNode );
// subNode->setPrevious ( rightHorizCutNode );
//
// return vertiCutNode;
// }
// else {
// SlicingTreeTerminalNode* terminalNode = new SlicingTreeTerminalNode();
// return terminalNode;
// }
return NULL;
}
SlicingTreeNode* SlicingTree::createNodesFromVertiCuts ( unsigned int xLower, unsigned int xUpper, unsigned int yLower, unsigned int yUpper )
// ******************************************************************************************************************************************
{
SlicingTreeNode* node;
unsigned int xCutIndex = getCentralIndex ( xLower, xUpper );
node = new SlicingTreeVertiCutNode ( _xCutCoordinates[xCutIndex] );
SlicingTreeNode* leftNode;
if ( xLower < xCutIndex )
leftNode = createNodesFromVertiCuts ( xLower, xCutIndex, yLower, yUpper );
else {
if ( yLower != yUpper )
leftNode = createNodesFromHorizCuts ( yLower, yUpper );
else
leftNode = new SlicingTreeTerminalNode();
}
SlicingTreeNode* rightNode;
if ( (xUpper > (xCutIndex + 1)) || ((xCutIndex + 1) == (_xCutCoordinates.size() - 1)) )
rightNode = createNodesFromVertiCuts ( xCutIndex+1, xUpper, yLower, yUpper );
else {
if ( yLower != yUpper )
rightNode = createNodesFromHorizCuts ( yLower, yUpper );
else
rightNode = new SlicingTreeTerminalNode();
}
leftNode->setPrevious ( node );
rightNode->setPrevious ( node );
node->setLeft ( leftNode );
node->setRight ( rightNode );
return node;
}
SlicingTreeNode* SlicingTree::createNodesFromHorizCuts ( unsigned int yLower, unsigned int yUpper )
// ************************************************************************************************
{
SlicingTreeNode* node;
unsigned int yCutIndex = getCentralIndex ( yLower, yUpper );
node = new SlicingTreeHorizCutNode ( _yCutCoordinates[yCutIndex] );
SlicingTreeNode* bottomNode;
if ( yLower < yCutIndex )
bottomNode = createNodesFromHorizCuts ( yLower, yCutIndex );
else
bottomNode = new SlicingTreeTerminalNode();
SlicingTreeNode* topNode;
if ( (yUpper > (yCutIndex + 1)) || ((yCutIndex + 1) == (_yCutCoordinates.size() - 1)) )
topNode = createNodesFromHorizCuts ( yCutIndex+1, yUpper );
else
topNode = new SlicingTreeTerminalNode();
bottomNode->setPrevious ( node );
topNode->setPrevious ( node );
node->setBottom ( bottomNode );
node->setTop ( topNode );
return node;
}
unsigned int SlicingTree::getCentralIndex ( unsigned int lower, unsigned int upper )
// *********************************************************************************
{
return (lower + upper) / 2;
}
Vertex* SlicingTree::getVertex ( Point position )
// **********************************************
{
assert ( _root );
if ( _root->isTerminal() )
return _root->getVertex();
SlicingTreeCutNode* slicingTreeCutNode = dynamic_cast<SlicingTreeCutNode*>(_root);
SlicingTreeNode* slicingTreeNode = NULL;
while ( slicingTreeCutNode ) {
if ( slicingTreeCutNode->isVertical() ) {
if ( position.getX() < slicingTreeCutNode->getCutCoordinate() )
slicingTreeNode = slicingTreeCutNode->getLeft();
else
slicingTreeNode = slicingTreeCutNode->getRight();
}
else {
if ( position.getY() < slicingTreeCutNode->getCutCoordinate() )
slicingTreeNode = slicingTreeCutNode->getBottom();
else
slicingTreeNode = slicingTreeCutNode->getTop();
}
if ( slicingTreeNode->isTerminal() )
break;
slicingTreeCutNode = dynamic_cast<SlicingTreeCutNode*>(slicingTreeNode);
}
/// verif
assert ( slicingTreeNode );
return slicingTreeNode->getVertex();
}
SlicingTreeNode* SlicingTree::getTerminalNode ( Point position )
// *************************************************************
{
assert ( _root );
if ( _root->isTerminal() )
return _root;
SlicingTreeCutNode* slicingTreeCutNode = dynamic_cast<SlicingTreeCutNode*>(_root);
SlicingTreeNode* slicingTreeNode = NULL;
while ( slicingTreeCutNode ) {
if ( slicingTreeCutNode->isVertical() ) {
if ( position.getX() < slicingTreeCutNode->getCutCoordinate() )
slicingTreeNode = slicingTreeCutNode->getLeft();
else
slicingTreeNode = slicingTreeCutNode->getRight();
}
else {
if ( position.getY() < slicingTreeCutNode->getCutCoordinate() )
slicingTreeNode = slicingTreeCutNode->getBottom();
else
slicingTreeNode = slicingTreeCutNode->getTop();
}
if ( slicingTreeNode->isTerminal() )
break;
slicingTreeCutNode = dynamic_cast<SlicingTreeCutNode*>(slicingTreeNode);
}
/// verif
assert ( slicingTreeNode );
return slicingTreeNode;
}
Record* SlicingTree::_getRecord() const
// ******************************
{
Record* record = new Record ( getString ( this ) );
record->add ( getSlot ( "Root", _root ) );
return record;
}
string SlicingTree::_getString() const
// ***********************************
{
return "<" + _TName ( "SlicingTree" )
+ ":" + getString ( _root )
+ ">";
}
} // end namespace

121
knik/src/VEdge.cpp Normal file
View File

@ -0,0 +1,121 @@
#include "knik/VEdge.h"
#include "knik/Vertex.h"
#include "knik/Graph.h"
namespace Knik {
VEdge::VEdge ( Vertex* from, Vertex* to )
// **************************************
: Inherit (from, to)
{
DbU::Unit thickness = DbU::lambda( (_realOccupancy>_capacity)?5.0:2.5 );
Point fromPoint = getFrom()->getPosition();
Point toPoint = getTo()->getPosition();
_boundingBox = Box ( fromPoint.getX() - thickness, fromPoint.getY(), toPoint.getX() + thickness, toPoint.getY() );
}
VEdge::VEdge ( Vertex* from, Vertex* to, unsigned capacity )
// *********************************************************
: Inherit (from, to, capacity)
{
DbU::Unit thickness = DbU::lambda( (_realOccupancy>_capacity)?5.0:2.5 );
Point fromPoint = getFrom()->getPosition();
Point toPoint = getTo()->getPosition();
_boundingBox = Box ( fromPoint.getX() - thickness, fromPoint.getY(), toPoint.getX() + thickness, toPoint.getY() );
}
VEdge* VEdge::create ( Vertex* from, Vertex* to )
// **********************************************
{
if ( !from || !to )
throw Error ("VEdge::create(): cannot create VEdge with NULL vertex.");
VEdge* vEdge = new VEdge ( from, to );
vEdge->_postCreate(true);
return vEdge;
}
VEdge* VEdge::create ( Vertex* from, Vertex* to, unsigned capacity )
// *****************************************************************
{
if ( !from || !to )
throw Error ("VEdge::create(): cannot create VEdge with NULL vertex.");
VEdge* vEdge = new VEdge ( from, to, capacity );
vEdge->_postCreate(false);
return vEdge;
}
void VEdge::_postCreate( bool fenceCapacity )
// ******************************************
{
Inherit::_postCreate ( fenceCapacity );
}
VEdge::~VEdge()
// **********
{
}
Box VEdge::computeBoundingBox() const
// **********************************
{
DbU::Unit thickness = DbU::lambda( (_realOccupancy>_capacity)?2.5:2.5 );
Point fromPoint = getFrom()->getPosition();
Point toPoint = getTo()->getPosition();
return Box ( fromPoint.getX() - thickness, fromPoint.getY(), toPoint.getX() + thickness, toPoint.getY() );
}
Point VEdge::getReferencePoint() const
// ************************************
{
return Point ( getBoundingBox().getXMin(), getBoundingBox().getYMin() );
}
DbU::Unit VEdge::getWidth() const
// *******************************
{
return getBoundingBox().getWidth();
}
float VEdge::getNormalisedLength() const
// *************************************
{
return _from->getRoutingGraph()->getVEdgeNormalisedLength();
}
//void VEdge::createSplitter ( Net* net )
//// ************************************
//{
// if ( !_splitter )
// {
// DbU::Unit _size = DbU::lambda(3);
// _splitter = Splitter::createVertical ( net, _fence->getGrid()->getLayer(), _fence, DbU::lambda(2), _size, _size );
// _fence->attachSplitter ( _splitter );
// // when attaching a splitter : fence's occupancity is incremented. do the same for the edge
// _realOccupancy++;
// }
//}
//Hook* VEdge::getSplitterHook ( Vertex* vertex )
//// ********************************************
//{
// assert ( _splitter );
// assert ( (vertex == _from) || (vertex == _to) );
// if ( vertex == _from )
// return _splitter->getBottomHook();
// else
// return _splitter->getTopHook();
//}
} // end namespace

676
knik/src/Vertex.cpp Normal file
View File

@ -0,0 +1,676 @@
#include <algorithm>
//#include "crlcore/CEditor.h"
#include "hurricane/Technology.h"
#include "hurricane/DataBase.h"
#include "knik/Vertex.h"
#include "knik/Edge.h"
#include "knik/Graph.h"
namespace {
using namespace Knik;
struct EdgeToYComp : public binary_function<const Edge*, const Edge*, bool> {
public:
bool operator() ( Edge* edge1, Edge* edge2 ) const
{
return ( edge1->getTo()->getY() < edge2->getTo()->getY() );
}
};
struct EdgeToXComp : public binary_function<const Edge*, const Edge*, bool> {
public:
bool operator() ( Edge* edge1, Edge* edge2 ) const
{
return ( edge1->getTo()->getX() > edge2->getTo()->getX() );
}
};
struct EdgeFromYComp : public binary_function<const Edge*, const Edge*, bool> {
public:
bool operator() ( Edge* edge1, Edge* edge2 ) const
{
return ( edge1->getFrom()->getY() > edge2->getFrom()->getY() );
}
};
struct EdgeFromXComp : public binary_function<const Edge*, const Edge*, bool> {
public:
bool operator() ( Edge* edge1, Edge* edge2 ) const
{
return ( edge1->getFrom()->getX() < edge2->getFrom()->getX() );
}
};
}
namespace Knik {
extern unsigned __congestion__;
extern unsigned __precongestion__;
const Name Vertex::_extensionName = "Knik::Vertex";
// ********************************************************************
// VERTEX_Edges declaration
// ********************************************************************
class VERTEX_Edges : public Collection<Edge*> {
public:
typedef Collection<Edge*> Inherit;
public:
class Locator : public Hurricane::Locator<Edge*> {
public:
typedef Hurricane::Locator<Edge*> Inherit;
private:
const Vertex* _vertex;
Edge* _edge;
int _direction;
public:
Locator(const Vertex* vertex = NULL, Edge* edge = NULL, int direction = 0);
Locator(const Locator& locator);
Locator& operator=(const Locator& locator);
virtual Edge* getElement() const;
virtual Hurricane::Locator<Edge*>* getClone() const;
virtual bool isValid() const;
virtual void progress();
virtual string _getString() const;
};
private:
const Vertex* _vertex;
Edge* _edge;
int _direction;
public:
VERTEX_Edges(const Vertex* vertex);
VERTEX_Edges(const VERTEX_Edges& edges);
VERTEX_Edges& operator=(const VERTEX_Edges& edges);
virtual Collection<Edge*>* getClone() const;
virtual Hurricane::Locator<Edge*>* getLocator() const;
virtual string _getString() const;
};
Vertex::Vertex ( Graph* routingGraph, Point position, DbU::Unit halfWidth, DbU::Unit halfHeight )
// **********************************************************************************************
: Inherit (routingGraph->getCell())
, _routingGraph (routingGraph)
, _predecessor (NULL)
, _contact (NULL)
, _position (position)
, _vtuple (NULL)
, _distance ((float)(HUGE))
, _connexID (-1)
, _netStamp (0)
, _halfWidth (halfWidth)
, _halfHeight (halfHeight)
{
_firstEdges[0] = NULL;
_firstEdges[1] = NULL;
_firstEdges[2] = NULL;
_firstEdges[3] = NULL;
}
Vertex* Vertex::create ( Graph* routingGraph, Point position, DbU::Unit halfWidth, DbU::Unit halfHeight )
// *******************************************************************************************************
{
Vertex* vertex = new Vertex ( routingGraph, position, halfWidth, halfHeight );
vertex->_postCreate();
return vertex;
}
void Vertex::_postCreate()
// ***********************
{
Inherit::_postCreate();
}
Vertex::~Vertex()
// **************
{
}
void Vertex::destroy()
// ******************
{
_preDestroy();
delete this;
}
void Vertex::_preDestroy()
// **********************
{
Inherit::_preDestroy();
}
void Vertex::attachToLocalRing ( Component* component )
// ****************************************************
{
// XXX plus utilisée ? XXX
//assert ( component );
//Hook* hook = component->getBodyHook();
//hook->detach();
//if ( Hook* previousHook = getLocalRingHook() ) {
// //cerr << "Vertex::attachToLocalRingHook : going to attach " << previousHook << " to " << hook << endl;
// hook->attach ( previousHook );
//}
//setLocalRingHook ( hook );
}
void Vertex::sortEdges()
// *********************
{
vector<Edge*> hEdgesOut;
vector<Edge*> vEdgesOut;
vector<Edge*> hEdgesIn;
vector<Edge*> vEdgesIn;
Edge* currentEdge;
//ltracein(425);
if ( (currentEdge = getHEdgeOut()) ) { // si pas de HEdgeOut : rien a faire ^^
while ( currentEdge ) {
//ltrace(425) << "Pushing_back edge " << getString(currentEdge) << endl;
hEdgesOut.push_back ( currentEdge );
currentEdge = currentEdge->getNextFrom();
}
//ltrace(425) << "sorting vector..." << endl;
sort ( hEdgesOut.begin(), hEdgesOut.end(), EdgeToYComp() );
//ltrace(425) << "setting " << getString(hEdgesOut[0]) << " as hEdgeOut for vertex " << getString(this) << endl;
setHEdgeOut ( hEdgesOut[0] );
for ( unsigned i = 1 ; i < hEdgesOut.size() ; i++ ) {
//ltrace(425) << "next : " << getString(hEdgesOut[i]) << endl;
hEdgesOut[i-1]->setNextFrom ( hEdgesOut[i] );
}
hEdgesOut[hEdgesOut.size()-1]->setNextFrom ( NULL ); // si jamais avant en milieu de chaine ...
}
//ltraceout(425);
if ( (currentEdge = getVEdgeOut()) ) {
while ( currentEdge ) {
vEdgesOut.push_back ( currentEdge );
currentEdge = currentEdge->getNextFrom();
}
sort ( vEdgesOut.begin(), vEdgesOut.end(), EdgeToXComp() );
setVEdgeOut ( vEdgesOut[0]);
for ( unsigned i = 1 ; i < vEdgesOut.size() ; i++ ) {
vEdgesOut[i-1]->setNextFrom ( vEdgesOut[i] );
}
vEdgesOut[vEdgesOut.size()-1]->setNextFrom ( NULL );
}
if ( (currentEdge = getHEdgeIn()) ) {
while ( currentEdge ) {
hEdgesIn.push_back ( currentEdge );
currentEdge = currentEdge->getNextTo();
}
sort ( hEdgesIn.begin(), hEdgesIn.end(), EdgeFromYComp() );
setHEdgeIn ( hEdgesIn[0] );
for ( unsigned i = 1 ; i < hEdgesIn.size() ; i++ ) {
hEdgesIn[i-1]->setNextTo ( hEdgesIn[i] );
}
hEdgesIn[hEdgesIn.size()-1]->setNextTo ( NULL );
}
if ( (currentEdge = getVEdgeIn()) ) {
while ( currentEdge ) {
vEdgesIn.push_back ( currentEdge );
currentEdge = currentEdge->getNextTo();
}
sort ( vEdgesIn.begin(), vEdgesIn.end(), EdgeFromXComp() );
setVEdgeIn ( vEdgesIn[0] );
for ( unsigned i = 1 ; i < vEdgesIn.size() ; i++ ) {
vEdgesIn[i-1]->setNextTo ( vEdgesIn[i] );
}
vEdgesIn[vEdgesIn.size()-1]->setNextTo ( NULL );
}
}
Edges Vertex::getAdjacentEdges() const
// ***********************************
{
return VERTEX_Edges ( this );
}
Contact* Vertex::getContact ( Edge* arrivalEdge )
// **********************************************
{
if ( _contact ) {
// il y deja un contact associe au vertex XXX on verifie que le contact appartient bien au workingNet du routingGraph XXX
if ( _routingGraph->getWorkingNet() == _contact->getNet() )
return _contact;
_contact = NULL;
}
//assert ( arrivalEdge ); // ca change si on se decide quele vertex pointe sur le contact et pas le hook d'un routingPad ou autre
if ( arrivalEdge ) {
int arrivalConnexID = arrivalEdge->getConnexID();
bool createContact = false;
bool straightOn = false;
if ( arrivalEdge->isVertical() ) {
if ( _firstEdges[0] && ( _firstEdges[0]->getConnexID() == arrivalConnexID ) && ( _firstEdges[0]->getNetStamp() == _netStamp ) )
createContact = true;
else if ( _firstEdges[2] && ( _firstEdges[2]->getConnexID() == arrivalConnexID ) && ( _firstEdges[2]->getNetStamp() == _netStamp ) )
createContact = true;
else if ( ( _firstEdges[1] == arrivalEdge )
&& ( _firstEdges[3] && ( _firstEdges[3]->getConnexID() == arrivalConnexID ) && ( _firstEdges[3]->getNetStamp() == _netStamp ) ) )
straightOn = true;
else if ( ( _firstEdges[3] == arrivalEdge )
&& ( _firstEdges[1] && ( _firstEdges[1]->getConnexID() == arrivalConnexID ) && ( _firstEdges[1]->getNetStamp() == _netStamp ) ) )
straightOn = true;
else
throw Error ( "Vertex::getContact(): problem with edges configuration *1." );
}
else {
if ( _firstEdges[1] && ( _firstEdges[1]->getConnexID() == arrivalConnexID ) && ( _firstEdges[1]->getNetStamp() == _netStamp ) )
createContact = true;
else if ( _firstEdges[3] && ( _firstEdges[3]->getConnexID() == arrivalConnexID ) && ( _firstEdges[3]->getNetStamp() == _netStamp ) )
createContact = true;
else if ( ( _firstEdges[0] == arrivalEdge )
&& ( _firstEdges[2] && ( _firstEdges[2]->getConnexID() == arrivalConnexID ) && ( _firstEdges[2]->getNetStamp() == _netStamp ) ) )
straightOn = true;
else if ( ( _firstEdges[2] == arrivalEdge )
&& ( _firstEdges[0] && ( _firstEdges[0]->getConnexID() == arrivalConnexID ) && ( _firstEdges[0]->getNetStamp() == _netStamp ) ) )
straightOn = true;
else
throw Error ( "Vertex::getContact(): problem with Edges configuration *2." );
}
if ( createContact ) {
Contact* contact = Contact::create ( _routingGraph->getWorkingNet()
//, getLayer(1)
, DataBase::getDB()->getTechnology()->getLayer("metal2")
, _position.getX()
, _position.getY()
, _halfWidth/5
, _halfHeight/5
);
// on a besoin de tester si par routage précédent il n'y a pas un segment du net qui traverse le vertex ....
Segment* segment0 = NULL;
Segment* segment1 = NULL;
Segment* segment2 = NULL;
Segment* segment3 = NULL;
if ( _firstEdges[0] )
segment0 = _firstEdges[0]->getSegmentFor ( _routingGraph->getWorkingNet() );
if ( _firstEdges[1] )
segment1 = _firstEdges[1]->getSegmentFor ( _routingGraph->getWorkingNet() );
if ( _firstEdges[2] )
segment2 = _firstEdges[2]->getSegmentFor ( _routingGraph->getWorkingNet() );
if ( _firstEdges[3] )
segment3 = _firstEdges[3]->getSegmentFor ( _routingGraph->getWorkingNet() );
if ( (segment0 != NULL) && (segment0 == segment2) ) {
if ( !dynamic_cast<Contact*>(segment0->getSource()) ) throw Error ("Vertex::getContact(): does not consider Segment not based on Contact (source).");
if ( !dynamic_cast<Contact*>(segment0->getTarget()) ) throw Error ("Vertex::getContact(): does not consider Segment not based on Contact (target).");
Contact* targetContact = static_cast<Contact*>(segment0->getTarget());
_routingGraph->removeSegment(segment0);
segment0->getTargetHook()->detach();
segment0->getTargetHook()->attach(contact->getBodyHook());
_routingGraph->insertSegment(segment0);
Segment* newSeg = _routingGraph->createSegment(contact, targetContact);
_routingGraph->insertSegment(newSeg);
}
if ( (segment1 != NULL) && (segment1 == segment3) ) {
if ( !dynamic_cast<Contact*>(segment1->getSource()) ) throw Error ("Vertex::getContact(): does not consider Segment not based on Contact (Source).");
if ( !dynamic_cast<Contact*>(segment1->getTarget()) ) throw Error ("Vertex::getContact(): does not consider Segment not based on Contact (Target).");
Contact* targetContact = static_cast<Contact*>(segment1->getTarget());
_routingGraph->removeSegment(segment1);
segment1->getTargetHook()->detach();
segment1->getTargetHook()->attach(contact->getBodyHook());
_routingGraph->insertSegment(segment1);
Segment* newSeg = _routingGraph->createSegment(contact, targetContact);
_routingGraph->insertSegment(newSeg);
}
return contact;
}
if ( straightOn )
return NULL;
}
throw Error ( "Vertex::getContact(): what are you doing here O_o?" );
}
Edge* Vertex::getHEdgeLeadingTo ( Vertex* to )
// *******************************************
{
Edge* edge = getHEdgeOut();
while ( edge ) {
if ( edge->getTo() == to )
break;
edge = edge->getNextFrom();
}
return edge;
}
Edge* Vertex::getVEdgeLeadingTo ( Vertex* to )
// *******************************************
{
Edge* edge = getVEdgeOut();
while ( edge ) {
if ( edge->getTo() == to )
break;
edge = edge->getNextFrom();
}
return edge;
}
Edge* Vertex::getHEdgeComingFrom ( Vertex* from )
// **********************************************
{
Edge* edge = getHEdgeIn();
while ( edge ) {
if ( edge->getFrom() == from )
break;
edge = edge->getNextTo();
}
return edge;
}
Edge* Vertex::getVEdgeComingFrom ( Vertex* from )
// **********************************************
{
Edge* edge = getVEdgeIn();
while ( edge ) {
if ( edge->getFrom() == from )
break;
edge = edge->getNextTo();
}
return edge;
}
Edge* Vertex::getBestHEdgeOut ( DbU::Unit yDest )
// *****************************************
{
Edge* bestEdge = getHEdgeOut();
Edge* currentEdge = bestEdge;
while ( (currentEdge = currentEdge->getNextFrom()) ) {
if ( abs(currentEdge->getTo()->getY() - yDest) < abs(bestEdge->getTo()->getY() - yDest) )
bestEdge = currentEdge;
}
return bestEdge;
}
Edge* Vertex::getBestVEdgeOut ( DbU::Unit xDest )
// *****************************************
{
Edge* bestEdge = getVEdgeOut();
Edge* currentEdge = bestEdge;
while ( (currentEdge = currentEdge->getNextFrom()) ) {
if ( abs(currentEdge->getTo()->getX() - xDest) < abs(bestEdge->getTo()->getX() - xDest) )
bestEdge = currentEdge;
}
return bestEdge;
}
Edge* Vertex::getBestHEdgeIn ( DbU::Unit yDest )
// ****************************************
{
Edge* bestEdge = getHEdgeIn();
Edge* currentEdge = bestEdge;
while ( (currentEdge = currentEdge->getNextTo()) ) {
if ( abs(currentEdge->getFrom()->getY() - yDest) < abs(bestEdge->getFrom()->getY() - yDest) )
bestEdge = currentEdge;
}
return bestEdge;
}
Edge* Vertex::getBestVEdgeIn ( DbU::Unit xDest )
// ****************************************
{
Edge* bestEdge = getVEdgeIn();
Edge* currentEdge = bestEdge;
while ( (currentEdge = currentEdge->getNextTo()) ) {
if ( abs(currentEdge->getFrom()->getX() - xDest) < abs(bestEdge->getFrom()->getX() - xDest) )
bestEdge = currentEdge;
}
return bestEdge;
}
bool Vertex::hasInfo() const
// *************************
{
return (_netStamp == _routingGraph->getNetStamp());
}
void Vertex::translate ( const DbU::Unit& dx, const DbU::Unit& dy )
// ****************************************************************
{
_position.translate ( dx, dy );
}
Cell* Vertex::getCell() const
// **************************
{
return _routingGraph->getCell();
}
// void Vertex::_Draw ( View* view, BasicLayer* basicLayer, const Box& updateArea, const Transformation& transformation )
// // *******************************************************************************************************************
// {
// DbU::Unit size = DbU::lambda(5);
// view->FillCircle ( transformation.getPoint ( getPosition() ), size );
// //if ( _distance < (float)(HUGE) )
// if ( _netStamp == _routingGraph->getNetStamp() && _distance < (float)(HUGE) )
// view->DrawString ( getString(_distance), getXMax() - (_halfWidth), getYMax() - (_halfHeight/2) );
// if ( _connexID != -1 )
// view->DrawString ( getString(_connexID)+","+getString(_netStamp), getXMax() - (_halfWidth), getYMin() + (_halfHeight/2) );
// //if ( _predecessor ) {
// // Vertex* oppositeVertex = _predecessor->getOpposite ( this );
// // Point position = transformation.getPoint ( _position );
// // Point oppPos = transformation.getPoint ( oppositeVertex->getPosition() );
// // DbU::Unit origX = position.getX();
// // DbU::Unit origY = position.getY();
// // DbU::Unit destX = position.getX() + (4*(oppPos.getX() - position.getX()))/5;
// // DbU::Unit destY = position.getY() + (4*(oppPos.getY() - position.getY()))/5;
// // view->DrawLine ( origX, origY, destX, destY );
// //}
// }
// void Vertex::_Highlight ( View* view, const Box& updateArea, const Transformation& transformation )
// // ************************************************************************************************
// {
// DbU::Unit size = DbU::lambda(5);
// view->FillCircle ( transformation.getPoint ( getPosition() ), size );
// }
// bool Vertex::_IsInterceptedBy ( View* view, const Point& point, const DbU::Unit& aperture ) const
// // *****************************************************************************************
// {
// Box area ( point );
// area.inflate(aperture);
// return getBoundingBox().intersect ( area );
// // return false;
// }
void Vertex::invalidate ( bool propagateFlag )
// *******************************************
{
Inherit::invalidate ( false );
// Invalider toutes les Edges associées ?
}
string Vertex::_getString() const
// ******************************
{
return "<" + _TName ( "Vertex" )
+ ":" + getString ( _connexID )
+ " " + getString ( _netStamp )
+ " " + getString ( DbU::getValueString(_position.getX()) )
+ " " + getString ( DbU::getValueString(_position.getY()) ) + ">";
}
Record* Vertex::_getRecord() const
// *************************
{
Record* record = Inherit::_getRecord();
if ( !record )
record = new Record ( getString ( this ) );
record->add ( getSlot ( "hEdgeOut", getHEdgeOut() ) );
record->add ( getSlot ( "vEdgeOut", getVEdgeOut() ) );
record->add ( getSlot ( "hEdgeIn", getHEdgeIn() ) );
record->add ( getSlot ( "vEdgeIn", getVEdgeIn() ) );
record->add ( getSlot ( "predecessor", _predecessor ) );
//if ( _localRingHook) record->add ( getSlot ( "localRingHook", _localRingHook ) );
record->add ( getSlot ( "contact", _contact ) );
record->add ( getSlot ( "connexID", _connexID ) );
record->add ( getSlot ( "position", _position ) );
record->add ( getSlot ( "distance", _distance ) );
record->add ( getSlot ( "netStamp", _netStamp ) );
record->add ( getSlot ( "halfWidth", _halfWidth ) );
record->add ( getSlot ( "halfHeight", _halfHeight ) );
return record;
}
// ************************************************************************************************
// VERTEX_Edges implementation
// ************************************************************************************************
VERTEX_Edges::VERTEX_Edges ( const Vertex* vertex )
// ************************************************
: Inherit()
, _vertex(vertex)
, _edge(NULL)
, _direction(0)
{
// _direction represents one of the four direction in the routing graph. these ditections are set as follow :
// 0 = East
// 1 = North
// 2 = West
// 3 = South
for ( _direction = 0 ; _direction < 4 ; _direction++ ) {
if ( (_edge = _vertex->getFirstEdges(_direction)) )
return;
}
}
VERTEX_Edges::VERTEX_Edges ( const VERTEX_Edges& edges )
// *****************************************************
: Inherit()
, _vertex(edges._vertex)
, _edge(edges._edge)
, _direction(edges._direction)
{
}
VERTEX_Edges& VERTEX_Edges::operator=(const VERTEX_Edges& edges)
// *************************************************************
{
_vertex = edges._vertex;
_edge = edges._edge;
_direction = edges._direction;
return *this;
}
Collection<Edge*>* VERTEX_Edges::getClone() const
// **********************************************
{
return new VERTEX_Edges(*this);
}
Locator<Edge*>* VERTEX_Edges::getLocator() const
// *********************************************
{
return new Locator(_vertex, _edge, _direction);
}
string VERTEX_Edges::_getString() const
// ************************************
{
string s = "<" + _TName("Vertex::Edges");
if (_vertex) s += " " + getString(_vertex);
s += ">";
return s;
}
// ************************************************************************************************
// VERTEX_Edges::Locator implementation
// ************************************************************************************************
VERTEX_Edges::Locator::Locator(const Vertex* vertex, Edge* edge, int direction)
// ****************************************************************************
: Inherit()
, _vertex(vertex)
, _edge(edge)
, _direction(direction)
{
}
VERTEX_Edges::Locator::Locator(const Locator& locator)
// ***************************************************
: Inherit()
, _vertex(locator._vertex)
, _edge(locator._edge)
, _direction(locator._direction)
{
}
VERTEX_Edges::Locator& VERTEX_Edges::Locator::operator=(const Locator& locator)
// ****************************************************************************
{
_vertex = locator._vertex;
_edge = locator._edge;
_direction = locator._direction;
return *this;
}
Edge* VERTEX_Edges::Locator::getElement() const
// ********************************************
{
return _edge;
}
Locator<Edge*>* VERTEX_Edges::Locator::getClone() const
// ****************************************************
{
return new Locator(*this);
}
bool VERTEX_Edges::Locator::isValid() const
// ****************************************
{
return (_edge != NULL );
}
void VERTEX_Edges::Locator::progress()
// ***********************************
{
if ( !_edge )
return;
if ( _direction == 0 || _direction == 1 )
_edge = _edge->getNextFrom();
else
_edge = _edge->getNextTo();
while ( !_edge ) {
if ( _direction == 3 )
return;
_direction++;
_edge = _vertex->getFirstEdges(_direction);
}
}
string VERTEX_Edges::Locator::_getString() const
// *********************************************
{
string s = "<" + _TName("Vertex::Edges::Locator");
if (_vertex) s += " " + getString(_vertex);
s += ">";
return s;
}
} // namespace Knik

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,71 @@
#ifndef _KNIK_FLUTE_H
#define _KNIK_FLUTE_H
#define POWVFILE "POWV9.dat" // LUT for POWV (Wirelength Vector)
#define POSTFILE "POST9.dat" // LUT for POST (Steiner FTree)
#define MAXD 150 // max. degree of a net that can be handled
// setting MAXD to more than 150 is not recommended
#define D 9 // LUT is used for d <= D, D <= 9
#define ROUTING 1 // 1 to construct routing, 0 to estimate WL only
#define REMOVE_DUPLICATE_PIN 0 // remove dup. pin for flute_wl() & flute()
#define ACCURACY 3 // Default accuracy
#ifndef DTYPE // Data type for distance
#define DTYPE int
#endif
typedef struct
{
DTYPE x, y; // starting point of the branch
int n; // index of neighbor
} Branch;
typedef struct
{
int deg; // degree
DTYPE length; // total wirelength
Branch *branch; // array of tree branches
} FTree;
// Major functions
extern void readLUT();
extern DTYPE flute_wl(int d, DTYPE x[], DTYPE y[], int acc);
//Macro: DTYPE flutes_wl(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
extern FTree flute(int d, DTYPE x[], DTYPE y[], int acc);
//Macro: FTree flutes(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
extern DTYPE wirelength(FTree t);
extern void printtree(FTree t);
extern void plottree(FTree t);
// Other useful functions
extern DTYPE flutes_wl_LD(int d, DTYPE xs[], DTYPE ys[], int s[]);
extern DTYPE flutes_wl_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
extern DTYPE flutes_wl_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
extern FTree flutes_LD(int d, DTYPE xs[], DTYPE ys[], int s[]);
extern FTree flutes_MD(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
extern FTree flutes_RDP(int d, DTYPE xs[], DTYPE ys[], int s[], int acc);
#if REMOVE_DUPLICATE_PIN==1
#define flutes_wl(d, xs, ys, s, acc) flutes_wl_RDP(d, xs, ys, s, acc)
#define flutes(d, xs, ys, s, acc) flutes_RDP(d, xs, ys, s, acc)
#else
#define flutes_wl(d, xs, ys, s, acc) flutes_wl_ALLD(d, xs, ys, s, acc)
#define flutes(d, xs, ys, s, acc) flutes_ALLD(d, xs, ys, s, acc)
#endif
#define flutes_wl_ALLD(d, xs, ys, s, acc) flutes_wl_LMD(d, xs, ys, s, acc)
#define flutes_ALLD(d, xs, ys, s, acc) flutes_LMD(d, xs, ys, s, acc)
//#define flutes_ALLD(d, xs, ys, s, acc) (d<=D ? flutes_LD(d, xs, ys, s) : (d<=D2 ? flutes_MD(d, xs, ys, s, acc) : flutes_HD(d, xs, ys, s, acc)))
#define flutes_wl_LMD(d, xs, ys, s, acc) \
(d<=D ? flutes_wl_LD(d, xs, ys, s) : flutes_wl_MD(d, xs, ys, s, acc))
#define flutes_LMD(d, xs, ys, s, acc) \
(d<=D ? flutes_LD(d, xs, ys, s) : flutes_MD(d, xs, ys, s, acc))
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define abs(x) ((x)<0?(-x):(x))
#define ADIFF(x,y) ((x)>(y)?(x-y):(y-x)) // Absolute difference
#endif

Some files were not shown because too many files have changed in this diff Show More