* ./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".
|
@ -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)
|
|
@ -0,0 +1 @@
|
|||
install ( FILES FindKNIK.cmake DESTINATION /share/cmake_modules )
|
|
@ -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)
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
}
|
||||
|
|
@ -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
|
||||
*
|
||||
*/
|
||||
|
||||
}
|
||||
|
|
@ -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
|
||||
*/
|
||||
|
||||
// \}
|
||||
|
||||
}
|
|
@ -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
|
||||
*/
|
||||
|
||||
// \}
|
||||
|
||||
}
|
|
@ -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;
|
||||
*/
|
||||
// \}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -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
|
||||
*/
|
||||
|
||||
// \}
|
||||
|
||||
}
|
|
@ -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
|
||||
*/
|
||||
|
||||
// \}
|
||||
|
||||
}
|
|
@ -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'.
|
|
@ -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 © 2006 LIP6. All rights reserved</small></td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
|
@ -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>
|
|
@ -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}
|
|
@ -0,0 +1 @@
|
|||
<LI><A CLASS="entry" HREF="knik/index.html">Knik</A><BR>Global Router<BR><BR>
|
|
@ -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
|
After Width: | Height: | Size: 6.8 KiB |
|
@ -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
|
|
@ -0,0 +1,72 @@
|
|||
%PDF-1.3
|
||||
%Çì<C387>¢
|
||||
5 0 obj
|
||||
<</Length 6 0 R/Filter /FlateDecode>>
|
||||
stream
|
||||
xœSMkÜ0½Ï¯˜ãn`U<>4’¬k¡zKbÈ!„°8ìnŠ<6E><C5A0>&¥äßg4²ãÝ
”¤4ŸïÍ<Y<>h
¡-ßxv|9K¸}‚G°,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Œá°¹(w0ü…äýh3¨ø¿ ŠŽÓød}ÑÒëìêöà<C3B6>S—]*.{»ïžÃ¥àã•È~£·@åV]¨E¡™™"ÜÐÔ6÷èŸàå+N”«=<3D>(ìGJ[-ÿµ•Ë§j<C2A7>G7à×VÞRƒŽLÄvõ<>2‘a‡>˜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
|
After Width: | Height: | Size: 6.4 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.5 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.6 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.4 KiB |
|
@ -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
|
After Width: | Height: | Size: 3.4 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.1 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.5 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.5 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.4 KiB |
|
@ -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
|
After Width: | Height: | Size: 3.3 KiB |
|
@ -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
|
After Width: | Height: | Size: 4.3 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.6 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.7 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.9 KiB |
|
@ -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
|
After Width: | Height: | Size: 3.3 KiB |
|
@ -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
|
After Width: | Height: | Size: 3.4 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.4 KiB |
|
@ -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
|
|
@ -0,0 +1,72 @@
|
|||
%PDF-1.3
|
||||
%Çì<C387>¢
|
||||
5 0 obj
|
||||
<</Length 6 0 R/Filter /FlateDecode>>
|
||||
stream
|
||||
xœÝT»n1ìõ*c¡Å‡l‚4q¶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Éo¢P92¤Lé{ ƒÞ
|
||||
Bf)?Ò)ä“Fl½…<C2BD>ÑûÛ+¼P°ýÊ·(«þ®'‡mµõ×zð[ˆÖ(³™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
|
After Width: | Height: | Size: 2.9 KiB |
|
@ -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
|
After Width: | Height: | Size: 2.9 KiB |
|
@ -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
|
|
@ -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 )
|
|
@ -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.
|
|
@ -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
|
|
@ -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.
|
|
@ -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
|
|
@ -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.
|
|
@ -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
|
|
@ -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.
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|