* ./kite:

- New: Whole replacement by Kite3.
This commit is contained in:
Jean-Paul Chaput 2013-12-04 00:59:29 +00:00
parent 00975e1ad1
commit ac85c0cca4
126 changed files with 11012 additions and 12052 deletions

View File

@ -1,3 +1,4 @@
# -*- explicit-buffer-name: "CMakeLists.txt<kite>" -*-
project(KITE) project(KITE)
@ -40,6 +41,6 @@
add_subdirectory(src) add_subdirectory(src)
add_subdirectory(cmake_modules) add_subdirectory(cmake_modules)
if(BUILD_DOC AND DOXYGEN_FOUND AND IS_DIRECTORY doc) if(BUILD_DOC AND DOXYGEN_FOUND)
add_subdirectory(doc) add_subdirectory(doc)
endif(BUILD_DOC AND DOXYGEN_FOUND AND IS_DIRECTORY doc) endif(BUILD_DOC AND DOXYGEN_FOUND)

View File

@ -1,353 +0,0 @@
/*
* x-----------------------------------------------------------------x
* | HTML Standart Tags |
* x-----------------------------------------------------------------x
*/
html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 {
font-size: 100%;
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: 10%;
margin-left: 10%;
}
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).
*/
table.header {
width: 100%;
/*background-color: #EEEEEE;*/
background-color: #CCE6CA;
}
h1.header {
font-family: times, verdana, sans-serif;
}
td.header {
/*width: 14%;*/
text-align: center;
font-weight: bold;
font-family: verdana, sans-serif;
}
table.footer {
width: 100%;
}
td.leftFoot1, td.leftFoot2 {
text-align: left;
}
td.rightFoot1, td.rightFoot2 {
text-align: right;
}
td.leftFoot2 {
font-family: time;
font-weight: bold;
}
td.rightFoot2 {
font-weight: bold;
}
div.ah {
font-family: time;
font-size: 250%;
}
/* -------------------------------------------------------------------
* Quick Index Class (top page navigation bar).
*/
div.qindex, div.nav {
width: 100%;
/*background-color: #DADAEF;*/
/*background-color: #eeeeff;*/
/*background-color: #EEEEEE;*/
background-color: #CCE6CA;
border: 1px solid #003300;
text-align: center;
margin: 2px;
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%;
}
/* -------------------------------------------------------------------
* 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 #868686;
/*background-color: #B8E6B8;*/
background-color: #CCE6CA;
margin-top: 25px;
}
.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: 12px;
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;
}
.memItemLeft, .memItemRight, .memTemplItemLeft {
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;
}
.memItemLeft { font-size: 12px; }
.memItemRight { font-size: 13px; }
.memTemplItemLeft { font-size: 12px; }
.memTemplItemRight { font-size: 13px; }
.memTemplParams {
color: #606060;
background-color: #DADAEF;
font-size: 12px;
}

View File

@ -1,485 +0,0 @@
/*
* 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%; }
h2.classHierarchy {
/*border: 1px none #008500;*/
border: 1px none #000000;
border-top-width: 2px;
border-top-style: solid;
padding-top: 1em;
}
.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: dashed;
border-width: thin;
border-color: #003300;
/*
background-color: #EEEEEE;
*/
background-color: #FCFCE1;
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; }
table.classHierarchy {
border-collapse: separate;
border-spacing: 5px;
font-size: 110%;
}
table.classHierarchy tr {
border: 1px solid blue;
}
table.classHierarchy td.normal {
border: 1px solid #CCE6CA;
width: 140pt;
text-align: center;
font-weight: bold;
background-color: #CCE6CA;
}
table.classHierarchy td.virtual {
border: 1px solid black;
width: 140pt;
text-align: center;
font-weight: bold;
}
table.classHierarchy td.wnormal {
border: 1px solid #CCE6CA;
width: 240pt;
text-align: center;
font-weight: bold;
background-color: #CCE6CA;
}
table.classHierarchy td.wvirtual {
border: 1px solid black;
width: 240pt;
text-align: center;
font-weight: bold;
}
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: 1px;
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;
}
.memproto {
background-color: #CCE6CA;
border-left-width: 4px;
border-left-style: solid;
border-color: #008500;
}
.memname {
white-space: nowrap;
padding-left: 5px;
font-size: 105%;
}
.memdoc{
padding-left: 5px;
/*margin-top: -8px;*/
border-left-width: 1px;
border-left-style: solid;
border-color: #008500;
}
.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;
}

View File

@ -1,3 +1,4 @@
# -*- explicit-buffer-name: "CMakeLists.txt<kite/doc>" -*-
set ( htmlInstallDir share/doc/coriolis2/en/html/kite ) set ( htmlInstallDir share/doc/coriolis2/en/html/kite )
set ( latexInstallDir share/doc/coriolis2/en/latex/kite ) set ( latexInstallDir share/doc/coriolis2/en/latex/kite )
@ -5,8 +6,8 @@
add_custom_target ( doc ALL cd ${KITE_SOURCE_DIR}/doc && ${DOXYGEN_EXECUTABLE} doxyfile ) add_custom_target ( doc ALL cd ${KITE_SOURCE_DIR}/doc && ${DOXYGEN_EXECUTABLE} doxyfile )
install ( DIRECTORY html/ DESTINATION ${htmlInstallDir} ) install ( DIRECTORY html/ DESTINATION ${htmlInstallDir} )
# install ( FILES customHierarchy.html DESTINATION ${htmlInstallDir} ) install ( FILES customHierarchy.html DESTINATION ${htmlInstallDir} )
# install ( FILES customSummary.html DESTINATION ${htmlInstallDir} ) install ( FILES customSummary.html DESTINATION ${htmlInstallDir} )
install ( DIRECTORY latex/ DESTINATION ${latexInstallDir} ) install ( DIRECTORY latex/ DESTINATION ${latexInstallDir} )
install ( FILES asimbook.cls DESTINATION ${latexInstallDir} ) install ( FILES asimbook.cls DESTINATION ${latexInstallDir} )

View File

@ -1,597 +1,246 @@
// -*- C++ -*- // -*- C++ -*-
namespace Kite { namespace Kite {
/*! \class RoutingEvent::Key
* \brief RoutingEvent cached key for maps
*
* The key is used as a cache in RoutingEvent, that is, the RoutingEvent
* attributes could be modificated without the key changing. It is
* important for the key to remain stable as it used in the various
* event queue as the sorting attribute. The key should be updated
* only when the RoutingEvent is temporarily whidrawn from the queue.
*
* Cached attributes: (used in that lexicographical order for sorting)
* - \b 1 -- \c eventLevel.
* - \b 2 -- \c canRipple.
* - \b 3 -- \c priority.
* - \b 4 -- \c length.
* - \b 5 -- \c isHorizontal.
* - \b 6 -- \c axis.
* - \b 7 -- \c sourceU.
* - \b 8 -- \c net (name).
* - \b 9 -- \c id.
* - \b X -- \c slackenStrap \b unused.
* - \b X -- \c tracksNb \b unused.
*
* It is internally managed by RoutingEvent and the queue.
*/
//! \function RoutingEvent::Key::update ( const RoutingEvent* event );
//! Cache the value of the key from \c event.
/*! \class RoutingEvent /*! \class RoutingEvent
* \brief Manage TrackSegment routing requests. * \brief Atomic Placement Request for a TrackSegment
* *
* The \RoutingEvent is the workhorse of Kite. A \RoutingEvent is * \red{The trackFrees attribute has to be reviewed not sure it's still useful.}
* associated to one \TrackSegment. One \TrackSegment could be
* associated to many \RoutingEvent in the queue, but only one
* of those is active (marked as unprocessed).
* *
* \see ClassManipulator. * Cached key for stable sorting, see RoutingEvent::Key.
*
* \section secProcessAlgorithm Description of the process() method
*
\code
void RoutingEvent::process ()
{
if ( isProcessed() ) return;
setProcessed ();
incRipupCount ();
if ( getRipupCount() > MAX_RIPUP_COUNT ) {
// We are *not* in ripup mode.
// The event's segment has to be topologically modified.
modifyTopology ( _segment );
} else {
// We are in ripup mode.
// Other overlaping segments are to be removeds/pusheds. It can result in
// segment breaking *if* other segment came from an already routed GCell.
// optimal, constraint, perpandicular.
computeAllIntervals ();
// Find & order all candidates Tracks.
candidates = computeCostOnCandidateTracks ();
sort ( candidates );
if ( candidates[0].isFree() ) {
// Case -A.1- "Free Track".
candidate[0].insert ( _segment );
} else if ( candidates[0].isSoftOverlap()
|| candidates[0].isHardOverlap() ) {
// Case -A.2- "Soft Overlap".
// Case -A.3- "Hard Overlap".
for ( size_t i=0 ; i<candidates.size() ; i++ ) {
if ( candidates[0].insertInTrack ( _segment ) ) {
break;
}
}
} else {
// Case -B- "Infinite Cost".
// Attention: meaning's changed, *infinite* only in case of
// conflict with a *fixed* other segment.
modifyTopology ( _segment );
}
}
// Restore Track coherency before processing any other event.
Session::revalidate ();
}
\endcode
* \section secRoutingIntervalToDo ToDo
*
* <ul>
* <li>New \c isLocal() method on \TrackSegment. Tells if the \TrackSegment
* is associated only to local AutoSegment.
* <li>Increase the overlap cost of a \TrackSegment from an already routed
* GCell routing set.
* </ul>
*
*
* \section secRoutingEventInterval The various intervals of a RoutingEvent
*
* The three Intervals controlling a RoutingEvent : all those intervals
* defines the track range in which the \TrackSegment could be inserted.
* <ul>
* <li>The <i>optimal</i> interval : where the \Net wirelength will be
* minimal (comes from \c Katabatic::AutoSegment).
* <li>The <i>constraint</i> interval : the interval outside of which
* the \Net connexity would be broken. This is the bigger interval
* but it must be strictly respected (also comes from
* \c Katabatic::AutoSegment).
* <li>The <i>perpandicular</i> interval : for each perpandicular
* \TrackSegment connected, the intersection of the free interval
* around them in their track.
*
* It is important to note that the \TrackSegment overlaping in the
* target track is not removed from the track. It is it's perpandiculars
* which are, along with a modification of theirs left axis weight and/or
* right axis weight.
*
* Second remark: no overlap will be created (due to the non-removal of
* overlaping \TrackSegments) because the insertion is delayed in case
* of overlap.
* </ul>
* The perpandicular interval comes from perpandicular constraints on \TrackSegment
* of the <i>same</i> \c Net. The left/right axis weights comes from requests of
* <i>other</i> \c Nets.
*
* \image html RoutingEvent-1.png "RoutingEvent Intervals"
* \image latex RoutingEvent-1.pdf "RoutingEvent Intervals" width=0.6\textwidth
*
* Example of perpandicular interval computation :
*
* \image html RoutingEvent-2.png "Perpandicular Interval"
* \image latex RoutingEvent-2.pdf "Perpandicular Interval"
*
*
* \section secRoutingEventRules Rules governing RoutingEvents
*
* \RoutingEvent respect the following rules:
* <ul>
* <li>A \TrackSegment can only be displaced by it's associated \RoutingEvent.
* <li>Corollary: the only \TrackSegment displaced while processing a
* \RoutingEvent is the one associated to the event.
* <li>Conflicts occurs between the \RoutingEvent \TrackSegment and already
* placed others \TrackSegment.
*
* The conflict can be solved by displacing/modifying <i>others</i>
* \TrackSegment or by modifying the to be inserted one. In the later
* case, the newly created or modified \TrackSegment are (re)scheduleds
* <i>before</i> the would be inserted.
* <li>Conflicting \TrackSegments are only removed from their \Track
* but their axis remains unchanged. Movement requests are passed
* through increase of the left/right axis weights, if needed.
* <li>\TrackSegment are inserted only, and only if there is enough free space.
* That is, if any kind of overlap occurs, it is <i>not</i> inserted
* but <i>rescheduled</i>. The blocking \TrackSegments are then
* rescheduled <i>after</i> the current one.
* <li>Each \RoutingEvent processing takes place inside a one atomic
* Session. That is, the coherency of the data-base is restored
* immediatly afterward (both Kite &amp; Katabatic).
* </ul>
*
* \remark Be very careful to distinguish between Session commands, which affects
* \Track and \TrackSegment insertion/update/removal and schedule/re-schedule
* events, which relates to the negociation algorithm.
*
* Re-ordering rules:
* <ol>
* <li>In normal mode, that is, no maximum ripup has been reached, the
* blocking <i>other</i> \TrackSegment are removed and the current
* is rescheduled <i>before</i> them.
* <li>In maximum ripup mode, some \TrackSegment has to give way.
* <ul>
* <li>If the current one is modified, it must be rescheduled <i>after</i>
* it's modified bits are rescheduleds.
* <li>If <i>others</i> are modifieds they must be rescheduled <i>after</i>
* the current one (so it will grabs the place).
* </ul>
* </ol>
*
*
* \section secRoutingEventCycle RoutingEvent life cycle
*
* As an active \RoutingEvent is associated with one and only one \TrackSegment
* we can talk indeferently of \RoutingEvent lifecycle or \TrackSegment
* lifecycle.
*
* Below is the ordered list of states that a \RoutingEvent could be in.
* The order correspond to increasing level of slackening/freedom.
* Transition between states occurs each time a maximum ripup is reached.
*
* <table>
* <tr>
* <td align="center">&nbsp;\b Id&nbsp;</td>
* <td align="center">\b Type</td>
* <td align="center">&nbsp;\b Local&nbsp;</td>
* <td align="center">&nbsp;\b Global&nbsp;</td>
* <td align="center">\b Action</td>
* </tr>
* <tr>
* <td align="center">\e 1</td>
* <td align="center">\c Minimize</td>
* <td align="center">\e yes</td>
* <td align="center">\e no</td>
* <td>try to fit into a hole</td>
* </tr>
* <tr>
* <td align="center">\e 2</td>
* <td align="center">\c DogLeg</td>
* <td align="center">\e yes</td>
* <td align="center">\e no</td>
* <td>Dogleg : analyse overlap and try to solve it by breaking (self)</td>
* </tr>
* <tr>
* <td align="center">\e 3</td>
* <td align="center">\c Desalignate</td>
* <td align="center">\e yes</td>
* <td align="center">\e yes</td>
* <td>on a set of alignated \TrackSegment, suppress the
* alignment constraints, thus making then independants
* </td>
* </tr>
* <tr>
* <td align="center">\e 4</td>
* <td align="center">\c Slacken</td>
* <td align="center">\e yes</td>
* <td align="center">\e yes</td>
* <td>if the target/source constraint is less than the
* GCell, adds perpandicular straps to free the \TrackSegment.
* This occurs to free from terminal constraints
* </td>
* </tr>
* <tr>
* <td align="center">\e 5</td>
* <td align="center">\c ConflictSolve1</td>
* <td align="center">\e yes</td>
* <td align="center">\e yes</td>
* <td>try to find in the history a reccurent dislodger,
* and break (self) to accomodate it
* </td>
* </tr>
* <tr>
* <td align="center">\e 6</td>
* <td align="center">\c ConflictSolve2</td>
* <td align="center">\e no</td>
* <td align="center">\e yes</td>
* <td>try to find a Track on which we can dislodge
* an other \TrackSegment
* </td>
* </tr>
* <tr>
* <td align="center">\e 7</td>
* <td align="center">\c MoveUp</td>
* <td align="center">\e no</td>
* <td align="center">\e yes</td>
* <td>try to go on upper layer.
* </td>
* </tr>
* <tr>
* <td align="center">\e 8</td>
* <td align="center">\c Unimplemented</td>
* <td align="center">\e no</td>
* <td align="center">\e yes</td>
* <td>we failed to place this \TrackSegment
* </td>
* </tr>
* </table>
*
*
* \section secManageMaximumRipup Managing the maximum ripup case
*
\code
bool State::manageMaximumRipup ()
{
bool success = false;
if ( !_segment->isGlobal() ) {
// Candidates Tracks (ignore optimal & perpandiculars).
candidates = computeAllIntervals ();
overlap = _segment->getInterval();
for ( size_t i=0 ; i<candidates.size() ; i++ ) {
others = otherSegmentsConflicts(candidates[i]);
// Select Track with only one conflicting other.
if ( others.size() == 1 ) {
// Local vs. Local => reject.
// Local vs. Terminal => reject.
if ( others[0]->isLocal() || others[0]->isTerminal() ) continue;
// Local vs. Global (not routed yet).
if ( others[i]->getOrder() >= _segment->getOrder() ) {
success = modifyTopology(others[0]);
break;
}
// Local vs. Global (already routed).
success = relax(_others[0],overlap);
if ( success ) break;
}
}
}
if ( !success ) {
// Global vs. Local.
// Failed Local vs. Any.
success = modifyTopology(_segment);
}
return success;
}
\endcode
*
*
* \section secModifyTopology Description of the modifyTopology() method
*
\code
bool Manipulator::modifyTopology ( TrackSegment* segment )
{
bool success = false;
if ( segment->isLocal() ) {
if ( segment->canMinimize() {
segment->minimize();
success = true;
}
if ( segment->canDogLeg() ) {
// Case -C.4- "Self Relax".
segment->makeDogLeg();
success = true;
}
} else if ( segment->canDesalignate() ) {
// Case -C.5- "Desalignate".
segment->desalignate();
success = true;
} else if ( segment->canSlacken() ) {
// Case -C.6- "Slacken".
segment->slacken();
success = true;
} else {
RipupHistory* history = RipupHistory(segment);
GCell* dogLegGCell = history.getDogLegGCell();
if ( dogLegGCell ) {
if ( segment->canDogLegAt(dogLegGCell) ) {
segment->makeDogLeg(dogLegGCell)
success = true;
}
} else {
// Dislodgers seems to far in ripup history.
// Recheck the Track, maybe they have vanish.
Track* track = getTrack(segment);
if ( track->getFreeInterval(segment) ) {
track.insert ( segment );
success = true;
}
}
}
if ( segment->canMoveUp() ) {
segment->moveUp ();
success = true;
}
if ( success ) {
resetRipupCount(segment);
} else {
cerr << "[UNIMPLEMENTED] " << segment << endl;
}
return success;
}
\endcode
*
*
* \section secHardSoftOverlap Hard and soft overlap
*
* Schematic execution of a \RoutingEvent leading to a set aside.
* <ol>
* <li>The scheduler try to place the \TrackSegment on top of the
* event queue, calling process().
* <li>There is a soft overlap on the best candidate track, a set
* aside is issued.
* <li>Each \TrackSegment in conflict in the candidate track has the
* \RoutingEvent bounds of it's perpandicular \TrackSegment modificated
* according to the free space requested through setLeftBound() or setRightBound().
* <li>If a perpandicular is already in a \Track is removed from it and scheduled for
* immediate re-routing (it's event level is increased so it pops
* out immediately from the queue).
* <li>If the perpandicular is not routed yet, we are done.
*
* Note that this technique of modificating a \RoutingEvent yet to come is
* kind a like seeing the future...
* </ol>
*
* \image html RoutingEvent-3.png "Set aside schematic"
* \image latex RoutingEvent-3.pdf "Set aside schematic"
*
*
* \section setDetructionStrategy Destruction Strategy
*
* \RoutingEvent are not destroyed as soon as they have been processed by
* the scheduler. Instead, they are stored in the historical queue.
* They are two reasons for that behavior :
* <ul>
* <li>\RoutingEvent are used to store algorithmic informations that
* must persist until the negociation algorithm have fully
* completed (<i>bound</i> interval in particular).
* <li>When ripup phases takes place and maximum ripup count is
* reached, the history can be used to find the whole set of
* \TrackSegment in conflict an made an educated guess about
* which one must be relaxed.
* </ul>
*
* \important This is the history queue which is responsible for freeing all the
* \RoutingEvent in his destructor.
*
*
* \section secRoutingEventCase Routing Event actions
*
* <ul>
* <li><b>Free Track Case</b>
*
* There is a sufficent free space in the candidate \Track to insert the
* \TrackSegment. The \TrackSegment is inserted.
*
* \important This is the only way for a \TrackSegment to be inserted into a \Track.
*
* \image html RoutingEvent-10.png
* \image latex RoutingEvent-10.pdf
*
*
* <li><b>Soft Overlap Case</b>
*
* Already inserted \TrackSegment <b>a</b> &amp; <b>b</b> could be shrunk
* to make place for \TrackSegment <b>c</b>. Parallel overlaping \TrackSegment
* are not removed, their perpandiculars are with updated left/right axis weight.
*
* The <b>a</b> perpandicular belongs the same GCell routing set so it
* is removed from is \Track to be displaced.
*
* The <b>b</b> perdandicular belongs to a more prioritary GCell routing
* set, which has therefore be placed earlier so it can't be removed.
* Instead it is broken.
*
* \image html RoutingEvent-11.png
* \image latex RoutingEvent-11.pdf
*
*
* <li><b>Hard Overlap Case</b>
*
* No way to shrunk overlaping \TrackSegment to make place for <b>c</b>.
* All parallel overlaping \TrackSegments must be removeds to be displaced
* on other \Tracks.
*
* The <b>a</b> parallel belongs to a more prioritary GCell routing set
* so it can be removed, it is therefore broken.
*
* The <b>b</b> parallel belongs the same GCell routing set so it can be
* removed to be displaced.
*
* \image html RoutingEvent-12.png
* \image latex RoutingEvent-12.pdf
*
*
* <li><b>Self Relax</b>
*
* Instead of trying to displace overlaping \TrackSegments we break the
* current one.
*
* \image html RoutingEvent-13.png
* \image latex RoutingEvent-13.pdf
*
*
* <li><b>Self Desalignate</b>
*
* Instead of trying to displace overlaping \TrackSegments we desalignate
* it's components (by supressing alignement constraints on it's
* AutoContacts). We do not create new Katabatic components but new
* \TrackSegments will appears.
*
* \image html RoutingEvent-14.png
* \image latex RoutingEvent-14.pdf
*
*
* <li><b>Self Slacken</b>
*
* Instead of trying to displace overlaping \TrackSegments we slacken
* the current one. This is different than desalignate because we create
* new Katabatic component to relax any AutoContact transmitted constraints.
* This operation is most likely to be applied on \TrackSegments that are
* directly connecteds to terminals.
*
* \image html RoutingEvent-15.png
* \image latex RoutingEvent-15.pdf
*
* </ul>
*/ */
/*! \function bool RoutingEvent::isProcessed () const; //! \enum RoutingEvent::Mode
* \return \true if this event has already been processed. //! The working mode of the router, affect how events are to
* //! be handled.
* \remark Note that inside a _setAside() a \RoutingEvent can be re-posted for
* a given \TrackSegment which has been processed yet. This can lead //! \var RoutingEvent::Negociate
* to two or more \RoutingEvent in the queue (as we cannot easily remove //! This is the normal mode of operation, topological modifications
* a \RoutingEvent already in the queue). We need this new \RoutingEvent //! and ripup are enableds.
* because we want to reschedule with a new priority/slack.
* As we cannot remove the previous \RoutingEvent, we mark it as //! \var RoutingEvent::Pack
* processed for it to be ignored by the scheduler. //! First post-processing step. For each segment, tries to find a
//! more compact position for a segment, but without riping any others.
//! \var RoutingEvent::Repair
//! Second post-processing step, try to find a suitable location for
//! a segment more aggressively.
//! \function unsigned int RoutingEvent::getStage ();
//! \sreturn The stage the router is in (see RoutingEvent::Mode).
//! \function size_t RoutingEvent::getAllocateds ();
//! \sreturn The number of RoutingEvent currently allocateds.
//! \function size_t RoutingEvent::getProcesseds ();
//! \sreturn The number of RoutingEvent that have been processeds since
//! the last call to RoutingEvent::resetProcesseds().
//! \function void RoutingEvent::resetProcesseds ();
//! \sreturn Reset the number of processeds events.
//! \function unsigned int RoutingEvent::setStage ( unsigned int mode );
//! Sets the router's stage (see RoutingEvent::Mode).
//! \function RoutingEvent* RoutingEvent::create ( TrackElement* element, unsigned int mode );
//! \param element The element for which to create the event.
//! \param mode The mode into which this event will be valid.
//!
//! RoutingEvent constructor.
//! \function RoutingEvent* RoutingEvent::clone () const;
//! \return A clone of the event.
//!
//! Cloning an event is slightly different from copying it (which is forbidden).
//! There can be multiple events for one \c element but only one must be
//! active at a time. This is a cheap way of implementing the rescheduling
//! mechanism. The original event remains the active one, but it's cloned
//! flag is raised. The cloned event is created inactive and with a null
//! \e eventLevel.
//! \function void RoutingEvent::destroy ();
//! The destructor.
//! \function bool RoutingEvent::isCloned () const;
//! \sreturn \true if this event has been cloned at least once.
//! \function bool RoutingEvent::isValid () const;
//! \sreturn \true if the cached informations from the \e element are valid
//! (i.e. the element has not been changed).
//! \function bool RoutingEvent::isUnimplemented () const;
//! \sreturn \true if the event has tried to use an unimplemented feature.
//! \function bool RoutingEvent::isProcessed () const;
//! \sreturn \true if the event has been processed.
//! \function bool RoutingEvent::isDisabled () const;
//! \sreturn \true if the event is \b not the active one. It should be discarted
//! by the algorithm.
//! \function bool RoutingEvent::isForcedToHint () const;
//! \sreturn \true the \e element must be placed exacltly on the given axis hint.
//! \function bool RoutingEvent::isRipedByLocal () const;
//! \sreturn \true the \e element (global) has been riped up to place a local one.
//! \function bool RoutingEvent::canMinimize () const;
//! \sreturn \true the \e element could still be minimized.
//! \function unsigned int RoutingEvent::getMode () const;
//! \sreturn the mode the event must be taken into account to.
//! \function unsigned int RoutingEvent::getState () const;
//! \sreturn the mode the router is currently in.
//! \function const Key& RoutingEvent::getKey () const;
//! \sreturn The \e key to use in map & queue for this event.
//! \function TrackElement* RoutingEvent::getSegment () const;
//! \sreturn The associated segment.
//! \function const vector<TrackElement*>& RoutingEvent::getPerpandiculars () const;
//! \sreturn A vector of cached perpandiculars to the associated segment.
//! \function DbU::Unit RoutingEvent::getAxisHint () const;
//! \sreturn The preferred position for the segment axis.
//! \function DbU::Unit RoutingEvent::getAxisHistory () const;
//! \sreturn The previous position of the segment axis (before it's current position).
//! \function DbU::Unit RoutingEvent::getAxisWeight ( DbU::Unit axis ) const;
//! \sreturn The distance between \c axis and the preferred position.
//! \function const Interval& RoutingEvent::getOptimal () const;
//! \sreturn The range of positions for the optimal axis (cached).
//! \function const Interval& RoutingEvent::getConstraints () const;
//! \sreturn The range of legal positions for the axis.
/*! \function unsigned int RoutingEvent::getPriority () const;
* \sreturn The priority of the event, it quantify the degree of freedom of the
* segment. Currently it's computed from the length of the segment
* and it's slack:
\f[
priority = (slack(segment)+1.0) \times (length(segment)+1.0)
\f]
* A high priority means that the segment will be harder to place
* thus it will be scheduled first. With this function, longer
* segments will be placed first.
*/ */
/*! \function TrackSegment* RoutingEvent::getSegment () const; //! \function unsigned int RoutingEvent::getEventLevel () const;
* \Return The associated and unique \TrackSegment. //! \sreturn The event level of the event, used to tweak the order inside the event
*/ //! queue. It differs from the priority in the sense that it isn't a
//! topologicaly based value, but manipulated by the algorithm.
/*! \function unsigned long RoutingEvent::getPriority () const; //! \function unsigned int RoutingEvent::getTracksNb () const;
* \Return The second criterion used to sort \RoutingEvents in the negociation queue. //! \sreturn The number of tracks avalaibles for the segment to be placed.
* Currently, it is the <i>area</i> of the associated \TrackSegment, which in
* turn return the <i>slack</i> (not a very fortunate choice of name...).
*/
/*! \function unsigned int RoutingEvent::getEventLevel () const; //! \function unsigned int RoutingEvent::getInsertState () const;
* \Return The first criterion used to sort \RoutingEvents in the negociation queue. //! \return The kind of track insertion that will be intended. It's a counter
* It is used to re-schedule a \RoutingEvent and make the new event be //! whose values have the following meaning:
* processed <i>before</i> the original one, which is marked as //! - \b 1 : normal insert.
* <i>processed</i> to be ignored. //! - \b 2 : shrink the segment to it's minimum before inserting.
* //! - \b 3 : attempt to ripup conflicting others before inserting.
* \see setEventLevel().
*/
/*! \function RoutingEvent* RoutingEvent::getClone () const; //! \function void RoutingEvent::revalidate ();
* \Return An exact copy of the current \RoutingEvent. //! Perform an event revalidation.
*/
/*! \function RoutingEvent* RoutingEvent::reschedule ( RoutingEventQueue& queue ); //! \function void RoutingEvent::updateKey ();
* \param queue The \RoutingEvent queue. //! Update the key with the new values from the event, the key \e must
* \return The rescheduled \RoutingEvent. May be \NULL if it cannot be rescheduled. //! not be inserted in the queue when this method is called.
*/
/*! \function void RoutingEvent::setProcessed ( bool state=true ); //! \function void RoutingEvent::process ( RoutingEventQueue& queue, RoutingEventHistory& history, RoutingEventLoop& loop );
* \param state The state into which the event is to be put. //! \param queue The main event queue.
* //! \param history The event's history list.
* Mark the event as processed. This arises in two cases : //! \param loop The loop detector.
* <ul> //!
* <li>The event has really been processed by the process() member //! Process the event, that is:
* function. //! - First, check if there is no looping, if any, do not process the
* <li>There has been a fork from this event and it has been //! event but dicard it (marked as unimplemented).
* superseded by a newly rescheduled one, so we have to //! - Second, attempt to place the associated segment. Pass it to the relevant
* invalidate this one. //! function, according to the router's mode (\c _processNegociate(),
* </ul> //! \c processPack() or \c _processRepair() ).
*/ //! Once processed, the event is added to both \c history (for the record)
//! and \c loop to check if we are not looping.
/*! \function void RoutingEvent::setEventLevel ( unsigned int level ); //! \function void RoutingEvent::setSegment ( TrackElement* element );
* \param level The new event level. //! Change the associated \c segment. \red{Used only by TrackSegment::swapTrack().}
*
* \see getEventLevel().
*/
/*! \function void RoutingEvent::process ( RoutingEventQueue& queue, RoutingEventHistory& history ); //! \function RoutingEvent* RoutingEvent::reschedule ( RoutingEventQueue& queue, unsigned int eventLevel);
* \param queue The event queue from the negociate algorithm. //! \return The newly reinserted event. Depending on the cases it could be itself.
* \param history The event history. //!
* //! Insert or reinsert an event in the scheduler. The \c eventLevel parameter only
* Perform all the operations shared by all \RoutingEvent classes then //! allows to increase the level (if it is less than the current level of the
* calls the virtual _subProcess() functions. //! event, it will be ignored).
* //!
* Shared operations are : //! <b>Cloning Management.</b> As an event could be cloned, if we try to re-insert
* <ol> //! a disabled original, we must first lookup the currently cloned active event.
* <li>Invalidating all perpandicular \TrackSegments. //! This is done through the associated \c segment which must always be associated
* <li>Computing the free interval allowed by the free intervals //! with the active event (if any).
* in perpandicular \Tracks holding the perpandicular \TrackSegments. //!
* <li>Merging in the various constraints intervals : from the //! <b>Unimplemented Protection.</b> If the unimplemented flag is set the reschedule
* \TrackSegment itself, from the free intervals in the //! is cancelled (\c NULL is returned).
* perpandicular \Tracks and from the \RoutingEvent bound //!
* constraints. //! <b>Unprocessed Event.</b> The event is still in queue, waiting to be
* <li>Finding the candidate \Tracks for the \RoutingEvent, //! processed, then just repush it in the queue with it's new level.
* using \c Track_Spiral \Collection. //!
* </ol> //! <b>Processed Event.</b> Clone the already processed one, activate it
* The results of the shared operation are passed to derived classes //! and push it on the queue.
* trough the \c State internal structure. //!
*/ //! <b>Router's Mode.</b> The mode is also updated.
/* \function bool RoutingEvent::_setAside ( Track* track, size_t begin, size_t end, Net* net, Interval interval, RoutingEventQueue& queue ); //! \function void RoutingEvent::setMode ( unsigned int mode );
* \param track The track in wich to make free space. //! Set the mode in which the event must be processed (see RoutingEvent::Mode).
* \param begin The index of the first overlaping TrackSegment.
* \param end The index of the last overlaping TrackSegment.
* \param net The net for which we want to insert a TrackSegment.
* \param interval The interval which must be made empty.
* \param queue The queue of RoutingEvent.
*
* Manage the case of <i>soft overlap</i>. Create or enlarge a free space
* in \c track so it can contain the requested \interval. <code>[begin:end]</code> defines
* the range of indexes of overlaping \TrackSegment in \c track.
* Displace TrackSegment that are <b>perpandicular</b> to those overlaping,
* remove them from their \c Track if needed and issue an associated \RoutingEvent
* with an updated bound constraint. Note that the overlaping \TrackSegment
* themselves are <em>not</em> removed from the \c track.
*
* A note on implementation :
* <ul>
* <li>\c data1 : the DataNegociate of the to be inserted \TrackSegment.
* <li>\c segment2 : the current overlaping \TrackSegment (from \c begin
* to \c end).
* <li>\c data2 : the DataNegociate of the overlaping \TrackSegment.
* <li>\c segment3 : a \TrackSegment perpandicular to \c segment2.
* </ul>
*/
/* \function void RoutingEvent::_ripup ( Track* track, Net* net, Interval interval, size_t begin, size_t end, RoutingEventQueue& queue ); //! \function void RoutingEvent::setState ( unsigned int state );
* \param track The track in wich to make free space. //! Proxy mutator for DataNegociate::setState().
* \param net The net for which we want to insert a TrackSegment.
* \param interval The interval which must be made empty.
* \param begin The index of the first overlaping TrackSegment.
* \param end The index of the last overlaping TrackSegment.
* \param queue The queue of RoutingEvent.
*
* Manage the case of <i>hard overlap</i>, that is bluntly remove
* any \TrackSegment overlaping \interval. Issue both a remove event
* (to \c Session) and a \RoutingEvent to re-process the dislodged
* \TrackSegment.
*/
} // End of Kite namespace. //! \function void RoutingEvent::setAxisHintFromParent ();
//! Sets the axis hint from it's parent segment. The parentage is found
//! through the TrackSegment parentage.
//! \function void RoutingEvent::incInsertState ();
//! Increment the insertion state.
//!
//! \sa RoutingEvent::getInsertState().
//! \function void RoutingEvent::resetInsertState ();
//! Reset the insertion state.
//!
//! \sa RoutingEvent::getInsertState().
//! \function void RoutingEvent::setEventLevel ( unsigned int level );
//! Set the event level (user-controlled re-ordering).
}

View File

@ -1,133 +1,163 @@
// -*- mode: C++; explicit-buffer-name: "Session.dox<kite>" -*-
// -*- C++ -*-
namespace Kite { namespace Kite {
/*! \class Session /*! \class Session
* \brief Kite update Session (\b API). * \brief Kite update Session
* *
* Session extend the Katabatic update session to the Kite * Session extend the Katabatic update session to the Kite
* router level. Mainly by managing Track update. * router level. Mainly by managing Track update.
* *
* <b>Difference between Kite & Katabatic sessions:</b>
* - In Katabatic, segments are actually moved \e before the
* revalidation, then \e during the revalidation, contacts
* and topologies are adjusteds
* - In Kite, nothing is moved until the revalidation.
* Requests for segment displacement are queued for the session.
*
* <b>Asymmetry between invalidation & revalidation:</b>
* - When a TrackSegment (or directly an AutoSegment) is invalidated
* both associated AutoSegment and TrackSegment are invalidated
* (through the Observer mechanism).
* - When an AutoSegment is revalidated, the TrackSegment is \b not
* immediatly revalidated. See the revalidate algorithm for more
* details.
*
* <b>Indirect TrackSegment invalidation:</b>
* - TrackSegment invalidation do not result only from direct insertion
* in Track. For example, any or all of it's perpandicular can be
* invalidated trough the Katabatic::Session update (the perpandicular
* Katabatic::AutoSegment is revalidated, generating invalidation on their
* associated TrackSegment).
*
* For details on how Katabatic Sessions works, have a look to * For details on how Katabatic Sessions works, have a look to
* \ref katabaticSession. * Katabatic::Session.
* *
* *
* \section secSessionMechanism The Session Mechanism. * \section secSessionMechanism The Session Mechanism.
* *
* Delayed modification procedure : * Delayed modification procedure :
* <ol> * - Modifications events are recorded (queued) into the Session.
* <li>Modifications events are recorded into the Session. * At this step, no modification are actually done, the
* At this step, no modification are actually done, the * data-base retains it's previous state and coherency.
* data-base retains it's previous state and coherency. * - The \c revalidate() procedure is called (or the Session
* <li>The Revalidate() procedure is called (or the Session * is closed), then all the modification events are applied.
* is closed), then all the modification events are applied. * The data-base is in now in it's new state.
* the data-base is in it's new state.
* </ol>
* *
* *
* \section secKiteSessionRevalidate The Revalidate Algorithm. * \section secKiteSessionRevalidate The Revalidate Algorithm.
* *
* Revalidation steps : * Revalidation steps :
* <ol> * - Process all remove events. detach TrackSegment from
* <li>process all remove events. detach TrackSegment from * their Track, but do not remove the pointer from the
* their Track, but do not remove the pointer from the * internal \vector.
* internal \vector. * - Pack all Track in which removal have took place.
* <li>Pack all Track in which removal have took place. * - Process all insert events. <b>This is the time TrackSegment
* <li>process all insert events. This is the time TrackSegment * are moved into their new Track (physical displacement)</b>.
* are moved into their new Track (physical displacement). * It is at this point that the invalidation of both AutoSegment
* <li>Call the Katabatic::Session::revalidate() method. * and TrackSEgment is done.
* <li>Recompute the canonical position of source and target * - Call the Katabatic::Session::revalidate() method which
* of all invalidateds TrackSegment (take account of * will recompute the correct contact extensions and topologies.
* extention modifications). * \e After this step the Katabatic data-base is up to date,
* <li>Perform a sort() on all Track that have been modifieds. * but \e not the Kite one. AutoSEgment are revalidated.
* </ol> * - Recompute the canonical position of source and target
*/ * of all invalidateds TrackSegment (take account of
* extention modifications). The set of invalidated TrackSegment
* is computed from the revalidated AutoSegment, that is
/*! \name Accessors * AutoSegment that are canonical.
*/ * - Perform a sort() on all Track that have been modifieds.
// \{
/*! \function static Session* Session::get ();
* \Return The currently opened session, \c NULL if no session has
* been opened.
*/
/*! \function static KiteEngine* Session::getKiteEngine ();
* \Return The Kite ToolEngine associated to the current update
* session.
*/
// \}
/*! \name Miscellaneous
*/
// \{
/*! \function bool Session::isEmpty ();
* Ensure that the Session is empty and can be closed (deleted)
* safely.
*/
/*! \function static Session* Session::open ( KiteEngine* kite );
* \param kite A Kite ToolEngine on which to work.
* \return A new Kite update Session.
* *
* Open a new Kite update Session on the \c kite \c ToolEngine. * <b>Note:</b> We cannot use the Observer mechanism to automatically
* At this point only one session can be opened at a time. Attempt * update TrackSegment from an AutoSegment, because we must wait for all
* to open a second one will result in an exception. * AutoSegments (canonical or not) involved into the TrackSegment to be
*/ * up to date before we can update it.
// \}
/*! \name Event Scheduling
*/
// \{
/* \function void Session::addInvalidated ( TrackSegment* segment );
* \param segment An AutoSegment that has been moved.
* *
* add \e segment to the \vector of TrackSegment for which we * <b>Note:</b> Have to talk about the special case when new canonical
* have to recompute the canonical size (i.e. extentions may * AutoSegment appears after dogleg creation.
* have moved). *
*
* \section secKiteSessionLookup The Lookup Mechanism
*
* There are two lookup mechanisms:
* - From a Hurricane::Segment, we uses the Katabatic segment lookup
* table (slow, stored in a \c map<>).
* - From a Katabatic::AutoSegment, we uses the Observer, it's owner
* is the TrackSegment (fast).
*/ */
/*! \function void Session::addInsertEvent ( TrackSegment* segment, Track* track ); //! \function Session* Session::open ( KiteEngine* kite );
* \param segment An AutoSegment to insert in a Track. //! \param kite A Kite ToolEngine on which to work.
* \param track The Track into which the \e segment will be inserted. //! \return A new Kite update Session.
* //!
* Schedule the insertion of \e segment into Track \e track. //! Open a new Kite update Session on the \c kite \c ToolEngine.
* The \e segment must not already be part of a Track. //! At this point only one session can be opened at a time. Attempt
*/ //! to open a second one will result in an exception.
/*! \function void Session::addRemoveEvent ( TrackSegment* segment ); //! \function Session* Session::get ( const char* message=NULL );
* \param segment An AutoSegment to remove from a Track. //! \sreturn The currently opened session, \c NULL if no session has
* //! been opened.
* Schedule the removal of \e segment from Track \e track.
*/
/*! \function void Session::addMoveEvent ( TrackSegment* segment, Track* track ); //! \function Katabatic::Session* Session::base ();
* \param segment An AutoSegment to move into a new Track. //! \sreturn The Session, casted as it's base object.
* \param track The Track into which the \e segment will be moved.
*
* Schedule the displacement of \e segment into Track \e track.
*/
/*! \function void Session::addSortEvent ( Track* track, bool forced=false ); //! \function bool Session::isEmpty ();
* \param track The Track to update. //! Ensure that the Session is empty and can be closed (deleted)
* \param forced Force the invalidation of the \Track. //! safely.
*
* Schedule the update of Track \e track. If the \Track has not been //! \function Configuration* Session::getConfiguration ();
* invalidated, no actual sort will takes place. To force a sort //! \sreturn The Kite Configuration of the Router (proxy helper).
* (manually invalidating the \Track), sets \b forced to \true.
* //! \function Net* Session::getBlockageNet ();
* \see Track::pack() & Track::sort(). //! \sreturn The net used to create blockage components (proxy helper).
*/
//! \function KiteEngine* Session::getKiteEngine ();
//! \sreturn The Kite ToolEngine associated to the current update
//! session (proxy helper).
//! \function NegociateWindow* Session::getNegociateWindow ();
//! \sreturn The current NegociateWindow (proxy helper).
//! \function Katabatic::GCell* Session::getGCellUnder ( DbU::Unit x, DbU::Unit y );
//! \sreturn The GCell under \c (x,y) (proxy helper, see Katabatic::GCellGrid::getGCell()).
//! \function void Session::addInsertEvent ( TrackElement* segment, Track* track );
//! \param segment An AutoSegment to insert in a Track.
//! \param track The Track into which the \e segment will be inserted.
//!
//! Schedule the insertion of \e segment into Track \e track.
//! The \e segment must not already be part of a Track.
//! \function void Session::addRemoveEvent ( TrackElement* segment );
//! \param segment A TrackSegment to remove from a Track.
//!
//! Schedule the removal of \e segment from Track \e track.
//! \function void Session::addMoveEvent ( TrackElement* segment, Track* track );
//! \param segment An AutoSegment to move into a new Track.
//! \param track The Track into which the \e segment will be moved.
//!
//! Schedule the displacement of \e segment into Track \e track.
//! \function void Session::addSortEvent ( Track* track, bool forced=false );
//! \param track The Track to update.
//! \param forced Force the invalidation of the \Track.
//!
//! Schedule the update of Track \e track. If the \Track has not been
//! invalidated, no actual sort will takes place. To force a sort
//! (manually invalidating the \Track), sets \b forced to \true.
//!
//! \sa Track::pack() & Track::sort().
//! \function void Session::revalidate ();
//! Applies all the requested modifications, but keeping the session
//! opened.
//! \function TrackElement* Session::lookup ( Segment* segment );
//! \sreturn the TrackElement associated to \c segment.
//! \function TrackElement* Session::lookup ( AutoSegment* segment );
//! \sreturn the TrackElement associated to \c segment.
// \}
} }

View File

@ -7,391 +7,481 @@
/*! \class Track /*! \class Track
* \brief Structure managing one routing track. * \brief Structure managing one routing track.
* *
* \section secTrackPurpose Track Purpose
*
* We use an array of <em>regularly spaced</em> Track as a geometrical
* fast access structure. It allows to know whether an area is used or
* not. The whole area may be seen as a set of adjoining tiles of fixed
* \e width but variable \e length.
*
* The figure <b>(1.b)</b> show, for an horizontal, track the relation
* between <code>y,min,max</code> and the occupied area of the plane.
* \c min and \c max must take into account segment extensions (\c e) and
* the minimal distance between two rectangles (\c MD) of the same layer.
* We assume that the width of the segment, augmented of all it's
* contraints is no greater than \c TS (in fact it's how \c TS must be
* calculated).
*
* For the whole track array, see RoutingPlane.
*
* \image html Track-0.png "Fig 1: Track Area"
*
*
* \section secTrackImplementation Track Implementation * \section secTrackImplementation Track Implementation
* *
* Basically a Track is a sorted vector of TrackSegment, TrackSegment * A Track is implemented with a sorted vector of TrackElement.
* beeing a decoration of the Katabatic::AutoSegment. Managment rules : * TrackElements from differents nets must not overlap.
* <ul> * The sorting order is defined as follow:
* <li><b>Rule 1 :</b> the vector of TrackSegment is sorted by * - TrackElements are sorted by increasing source (\e min)
* increasing source positions. * positions.
* <li><b>Rule 2 :</b> two consecutives segments TrackSegment do * - In case of overlap (i.e. belongs to the same net), if
* not overlap, except in case of <b>rule 3</b>. * they share the same source position, then they are sorted
* <li><b>Rule 3 :</b> if they belongs to the same \Net, two * by \e decreasing length. This way, the longest one will be
* consecutive segments can overlap, see Track::getNetUsedInterval(). * the first encountered when walking through the Track in
* </ul> * increasing index order.
* *
* \image html Track-1.png "Track Structure" * Figure <b>2.b</b> shows the details of the Track <b>[1]</b> of
* figure <b>1.a</b>. Net \b \<d\> show an exemple of overlapping.
*
* \image html Track-1.png "Fig 2: Track Structure"
* \image latex Track-1.pdf "Track Structure" width=0.7\textwidth * \image latex Track-1.pdf "Track Structure" width=0.7\textwidth
* *
* In addition to the TrackSegments, the Track also manage additionnal
* informations through a second vector of TrackMarkers. TrackMarker
* are currently used only to hints at how strongly a terminal is
* dependant on that portion of Track to be accessed.
* *
* <b>updates procedures</b>
* *
* Kite extend the Katabatic::Session mechanism to manage Track * \subsection ssecTrackIndexes Indexes vs. Iterators
* modifications.
*
* <b>Indexes vs. Iterators</b>
* *
* Numerical indexes have been prefered over iterators because they can * Numerical indexes have been prefered over iterators because they can
* be used more easily by objects other the Track itself for referencing. * be used more easily by objects other the Track itself for referencing.
* So internal managment follow the same rule, handling indexes or * So internal managment follow the same rule, handling indexes or
* reference to indexes. * reference to indexes.
* *
* <b>Looking up free/used zones</b>
* *
* The most important operation performed on a Track is to locate * \subsection ssecTrackUpdate Update Mechanism
* free or used zones at a given point. We uses the \STL \lower_bound
* function to find the index in the vector from a position.
* It relies heavily on the hypothesis that consecutives TrackSegment
* do not overlap, however, as segments from a same net can overlap
* the \c max() function is more complex than the \c min(). In fact
* it has to aggregate all the overlaping TrackSegment from the
* same \Net (getUsedNetInterval()).
* *
* \image html Track-2.png "Track Zones - First Approach" * When a TrackElement is normaly inserted in a Track, a two way link
* \image latex Track-2.pdf "Track Zones - First Approach" width=0.7\textwidth * is established. The Track has an entry in it's vector refering to
* TrackElement, and conversely, the TrackElement has it's \c track
* field pointing to it's owning Track.
* *
* As can be seen on the previous figure it is slightly more * <b>TrackElement Removal</b>
* efficient to work on \c lower_bound-1 instead of \c lower_bound.
* *
* \image html Track-3.png "Track Zones - Optimized" * To remove a TrackElement from a Track, we break one of those two links:
* \image latex Track-3.pdf "Track Zones - Optimized" width=0.7\textwidth * the TrackElement cease to refer to the owning Track, marking him for
*/ * removal which will occurs at the next track revalidation (Track::doRemoval()).
* In figure <b>3</b>, the TrackElement belonging to net \b \<b\> is
/*! \enum Track::IndexState * marked for removal.
* Indicates how to compute the bounds of the interval enclosing
* a given position.
* *
* \note According to \e position, the interval can be a free interval * \image html Track-2.png "Fig 3: TrackElement Removal"
* or a used interval.
*/
/*! \var Track::MinTrackMin
* Minimum/Source : uses the Track minimum.
*/
/*! \var Track::MinSegmentMin
* Minimum/Source : uses the begin segment minimum (source).
*/
/*! \var Track::MinSegmentMax
* Minimum/Source : uses the begin segment maximum (target).
*/
/*! \var Track::MaxTrackMax
* Maximum/Target : uses the Track maximum.
*/
/*! \var Track::MaxSegmentMin
* Maximum/Target : uses the end segment minimum (source).
*/
/*! \var Track::MaxNextSegmentMin
* Maximum/Target : uses the next to end segment minimum (source).
*/
/*! \var Track::MaxSegmentMax
* Maximum/Target : uses the end segment maximum (target).
*/
/*! \var Track::BeforeFirst
* Interval type : free, before the first interval [case (1)].
*/
/*! \var Track::Inside
* Interval type : used, in the Track [case (2)].
*/
/*! \var Track::Outside
* Interval type : free, between two used TrackSegment [case (3)].
*/
/*! \var Track::AfterLast
* Interval type : free, after the last used TrackSegment [case (4)].
*/
/*! \var Track::EmptyTrack
* Interval type : free, and the Track is empty [case (5)].
*/
/*! \var Track::MinMask
* Mask value : used to reset all the minimal values.
*/
/*! \var Track::MaxMask
* Mask value : used to reset all the maximal values.
*/
/*! \var Track::NPOS;
* A special index value (greatest integer) meaning that
* an index is invalid.
*/
/*! \name Accessors
*/
// \{
/*! \function RoutingPlane* Track::getRoutingPlane () const;
* \Return The RoutingPlane owning this Track.
*/
/*! \function KiteEngine* Track::getKiteEngine () const;
* \Return The KiteEngine owning this Track.
*/
/*! \function RoutingPlane* Track::getIndex () const;
* \Return The index of this Track in the RoutingPlane Track vector.
*/
/*! \function Layer* Track::getLayer () const;
* \Return The \Layer of the Track.
*/
/*! \function DbU::Unit Track::getAxis () const;
* \Return The Axis of the Track.
*/
/*! \function DbU::Unit Track::getMin () const;
* \Return The minimal allowed coordinate of the Track.
*/
/*! \function DbU::Unit Track::getMax () const;
* \Return The maximal allowed coordinate of the Track.
*/
/*! \function Track* Track::getNext () const;
* \Return The next Ttrack in the \RoutingPlane vector. That is the
* one with the axis immediatly superior.
*/
/*! \function Track* Track::getPrevious () const;
* \Return The previous Track in the \RoutingPlane vector. That is the
* one with the axis immediatly inferior.
*/
/*! \function size_t Track::getSize () const;
* \Return The total number of TrackSegment in the Track.
*/
/*! \function Point Track::getPosition ( DbU::Unit position ) const;
* \Return the point at \c (position,getAxis()) for horizontal Track
* at or \c (getAxis(),position) for vertical Track.
*/
// \}
/*! \name TrackSegment Accessors
*/
// \{
/*! \function TrackSegment* Track::getNext ( size_t& index, Net* net ) const;
* \param index Index of the starting TrackSegment.
* \param net A \Net to ignore.
* \return The next TrackSegment (\NULL if not found).
* *
* find, starting from TrackSegment at \e index the next TrackSegment * <b>TrackElement Insertion</b>
* ignoring TrackSegment from \e net. \e index is modified to point
* on the returned TrackSegment. If there's no next TrackSegment (\NULL)
* then index is set to Track::NPOS.
*/
/*! \function TrackSegment* Track::getPrevious ( size_t& index, Net* net ) const;
* \param index Index of the starting TrackSegment.
* \param net A \Net to ignore.
* \return The previous TrackSegment (\NULL if not found).
* *
* find, starting from TrackSegment at \e index the previous TrackSegment * When a TrackElement is inserted into a Track, the two way link is
* ignoring TrackSegment from \e net. \e index is modified to point * immediatly created (but the TrackElement is not yet at it's final
* on the returned TrackSegment. If there's no previous TrackSegment (\NULL) * place in the Track's vector). Before inserting a TrackElement we
* then index is set to Track::NPOS. * check that it's been already detached (\c track field to \c NULL).
*/
/*! \function TrackSegment* Track::getNextFixed ( size_t& index ) const;
* \param index Index of the starting TrackSegment.
* \return The first previous \e Fixed TrackSegment.
* *
* find, starting from TrackSegment at \e index the first previous * It is at that step that the TrackElement axis is actually updated
* with a \e Fixed attribute set. \e index is modified to point on the * through a call to TrackElement::setAxis().
* returned TrackSegment. If there's no previous TrackSegment (\NULL) *
* then index is set to Track::NPOS. * <b>Revalidation Sequence</b>
*/
/*! \function TrackSegment* Track::getSegment ( size_t index ) const;
* \param index The index of the TrackSegment.
* \return The TrackSegment at \e index. The result will be \NULL in the
* follwing cases :
* <ul>
* <li>\e index is outside the sorted zone.
* <li>\e index points to a hole in the Track.
* <li>\e index is equal to Track::NPOS.
* </ul>
*/
/*! \function TrackSegment* Track::getSegment ( DbU::Unit position ) const;
* \param position The position where to search.
* \return The TrackSegment whose starting point is immediatly inferior to \e position.
*/
/*! \function size_t Track::find ( const TrackSegment* segment ) const;
* \Return the \e index of \e segment inside the Track. If the \e segment do
* not belongs to the Track, return Track::NPOS.
*/
/*! \function void Track::getIBounds ( DbU::Unit position, size_t& begin, size_t& end, unsigned int& state ) const;
* \param position The position where to search.
* \param begin Index of the starting bound.
* \param end Index of the ending bound.
* \param state how to use the returned \e indexes.
* \return The TrackSegment index around \e position.
* *
* The relation between the returned \e index and the position is * After a Track has been modificated either the Track element vector or
* given through the \e state parameter. * the MarkerElement vector (or both) has been invalidateds. Revalidation
* take place in three steps:
* - Track::doRemoval(), remove all TrackElement marked for removal.
* - Track::insert(), insert the TrackElement into their new Track.
* - Track::doReorder(), sort the TrackElement of the vector, that is, put the
* newly inserted elements at their right place.
* *
* \note It uses the \lower_bound \STL function. * Each step must be done <em>for all Tracks</em> before proceeding to the
*/ * next. This way a TrackElement \c track field doesn't get set \e before
* it has been actually removed from it's previous Track.
/*! \function DbU::Unit Track::getSourcePosition ( size_t index ) const; *
* \Return The canonical source position of TrackSegment at index \e index. *
* If \e index is equal to Track::NPOS, returns zero.
*/
/*! \function DbU::Unit Track::getSourcePosition ( vector<TrackSegment*>::iterator it ) const;
* \Return The canonical source position of TrackSegment pointed by iterator \e it.
* If \e it is equal to \c end() , returns zero.
*/
/*! \function DbU::Unit Track::getMinimalPosition ( size_t index, unsigned int state ) const;
* \Return The minmal position (lower bound) of an interval, starting near index \e index
* with state \e state.
* *
* \see Track::IndexState. * \subsection ssecTrackOperations Main Operations on Tracks
*/
/*! \function DbU::Unit Track::getMaximalPosition ( size_t index, unsigned int state ) const;
* \Return The maximal position (upper bound) of an interval, ending near index \e index
* with state \e state.
* *
* \see Track::IndexState. * <b>Helper Function:</b> Track::getBeginIndex()
*/
/*! \function Interval Track::getFreeInterval ( DbU::Unit position, Net* net ) const;
* \param position where fo find a free interval.
* \param net for which net to find the free interval.
* \return The longuest free interval enclosing \e position (may be empty).
*/
/*! \function Interval Track::expandUsedInterval ( size_t& begin, size_t& end ) const;
* \param begin index on any of the overlaping TrackSegment. This value
* is then modified to point on the lower TrackSegment of the set.
* \param end initial value is ignored. sets to the index of the rightmost
* extended TrackSegment of the set (i.e. the one setting the
* upper bound).
* \return the whole interval used by a set of overlaping TrackSegment.
* *
* \image html Track-4.png "Overlap - Example 1" * Return in \c begin the index of the TrackElement whose minimum is immediately
* \image html Track-5.png "Overlap - Example 2" * below the requested \c position on the Track axis. The second returned
* \image latex Track-4.pdf "Overlap - Example 1" width=0.7\textwidth * parameter \c state is a set of flags to tell how the \c begin index
* \image latex Track-5.pdf "Overlap - Example 2" width=0.7\textwidth * has to be interpreted.
*/
/*! \function Interval Track::expandFreeInterval ( size_t& begin, size_t& end, unsigned int state, Net* net ) const;
* \param begin the lowest used TrackSegment.
* \param end the highest used TrackSegment.
* \param state the enclosing characterics.
* \param net the for wich we seek place.
* \Return The longuest free interval between \c ]begin,end[ .
* *
* \note \c ]begin,end[ must define a free interval between two TrackSegment. * <b>Helper Function:</b> Track::getOccupiedInterval()
*/
/*! \function void Track::_check ( const char* message=NULL ) const;
* \param message An iformative message, only printed if an error occurs.
* \return \true if the Track contains no incoherencies.
* *
* Perform a complete Track check. Looks for the following incoherencies : * Returns the complete interval of a set of overlapping TrackElement from
* <ul> * the same net.
* <li>TrackSegment do not refers this Track.
* <li>TrackSegment is detached (TrackSegment::getTrack() is \NULL).
* <li>TrackSegment is hollow, this one is very unlikely as hollow
* TrackSegment are only created for the \lower_bound.
* <li>\NULL pointers (should never occurs, nevertheless...)
* <li>And finally, call checkOverlap().
* </ul>
*/ */
/*! \function void Track::checkOverlap () const; //! \enum Track::IndexState
* \return the number of overlaping TrackSegment. //! Indicates how to compute the bounds of the interval enclosing
* //! a given \c position on track axis.
* Perform the following checks : //!
* <ul> //! \note According to \e position, the interval can be a free interval
* <li>Two consecutive TrackSegment from different \Net must not //! or a used interval.
* overlap.
* <li>For TrackSegment starting from the same position, the
* longuest must be first.
* </ul>
*/
/*! \function void Track::getOverlapBounds ( Interval interval, size_t& begin, size_t& end ) const; //! \var Track::BeginIsTrackMin
* \param interval the overlaping interval. //! (implies \c begin=0) there is no TrackElement \e before \c position
* \param begin where to store the starting bound.
* \param end where to store the ending bound.
*
* find the range of TrackSegment intersecting \e interval.
* Note that when the \e interval lower bound crosses a set of
* overlaping intervals from the same \Net, the interval at
* \e begin will crosses the lower bound but some following
* of the same \Net may not.
*/
/*! \function DbU::Unit Track::getOverlapCost ( Interval interval, Net* net, size_t begin, size_t end ) const; //! \var Track::BeginIsSegmentMin
* \param interval the overlaping interval. //! The \c begin segment starts \e before \c position and ends \e after.
* \param net a Net to ignore (null cost).
* \param begin the starting bound.
* \param end the ending bound.
* \return The cost of the overlap.
*
* compute the cost of the overlap of \e interval with the range
* \c [begin,end] of TrackSegment. Any TrackSegment belonging to
* \e net will be ignored.
*/
/*! \function DbU::Unit Track::getOverlapCost ( Interval interval, Net* net ) const; //! \var Track::BeginIsSegmentMax
* \param interval the overlaping interval. //! The \c begin segment starts and ends \e before \c position.
* \param net a Net to ignore (null cost).
*
* compute the overlap of \e interval with TrackSegment from
* the current Track, ignoring thoses belonging to \e net.
*/
// \} //! \var Track::EndIsTrackMax
//! There is no TrackElement \e after \c position.
//! \var Track::EndIsSegmentMin
//! The \c begin segment starts \e before \c position.
/*! \name Updators //! \var Track::EndIsNextSegmentMin
*/ //! The \c begin segment starts and ends \e before \c position. So the maximum
// \{ //! is given by the \c minimum of the \e next TrackElement.
/*! \function void Track::insert ( TrackSegment* segment ); //! \var Track::EndIsSegmentMax
* adds \e segment to the Track. Must only be used inside a //! The \c begin segment starts \e before \c position and ends \e after.
* TrackSession.
*
* \see TrackSession.
*/
/*! \function size_t Track::pack (); //! \var Track::BeforeFirstElement
* \Return The number of removeds TrackSegment. //! the \c position is before the first TrackElement.
*
* Suppress all the TrackSegment that have been withdraw from the
* Track. TrackSegment must be withdraw trough the TrackSegment::detach()
* method which sets their owning Track to \NULL (the removal criterion).
*/
/*! \function void Track::sort (); //! \var Track::InsideElement
* //! the \c position is inside a TrackElement.
* sort the the vector. Must be called \e after the Pack() method,
* so no detached TrackSegment are presents.
*/
// \} //! \var Track::OutsideElement
//! the \c position is in free zone between two TrackElements.
//! \var Track::AfterLastElement
//! the position is after the end of the last element.
//! \var Track::EmptyTrack
//! the track is still empty.
//! \var Track::BeginMask
//! To extract the \e begin part from a combination of flags.
//! \var Track::EndMask
//! To extract the \e end part from a combination of flags.
//! \var Track::npos;
//! A special index value (greatest integer) meaning that
//! an index is invalid.
//! \function bool Track::isHorizontal () const;
//! \sreturn \true if the Track in horizontal direction.
//! \function bool Track::isVertical () const;
//! \sreturn \true if the Track in vertical direction.
//! \function bool Track::isLocalAssigned () const;
//! \sreturn \true is the Track should be preferentially used for local routing.
//! \function RoutingPlane* Track::getRoutingPlane () const;
//! \sreturn The RoutingPlane owning this Track.
//! \function KiteEngine* Track::getKiteEngine () const;
//! \sreturn The KiteEngine owning this Track.
//! \function unsigned int Track::getDirection () const;
//! \sreturn The direction of the Track, either Katabatic::KbHorizontal or
//! Katabatic::KbVertical.
//! \function RoutingPlane* Track::getIndex () const;
//! \sreturn The index of this Track in the RoutingPlane Track vector.
//! \function unsigned int Track::getDepth () const;
//! \sreturn The depth (as given by the RoutingGauge) of the Track's layer.
//! \function Layer* Track::getLayer () const;
//! \sreturn The \Layer of the Track.
//! \function Layer* Track::getBlockageLayer () const;
//! \sreturn The associated blockage \Layer to the Track's layer.
//! \function DbU::Unit Track::getAxis () const;
//! \sreturn The Axis of the Track.
//! \function DbU::Unit Track::getMin () const;
//! \sreturn The minimal allowed coordinate of the Track.
//! \function DbU::Unit Track::getMax () const;
//! \sreturn The maximal allowed coordinate of the Track.
//! \function Track* Track::getNextTrack () const;
//! \sreturn The next Track in the \RoutingPlane vector. That is the
//! one with the axis immediatly superior.
//! \function Track* Track::getPreviousTrack () const;
//! \sreturn The previous Track in the \RoutingPlane vector. That is the
//! one with the axis immediatly inferior.
//! \function size_t Track::getSize () const;
//! \sreturn The total number of TrackSegment in the Track.
//! \function Point Track::getPosition ( DbU::Unit position ) const;
//! \sreturn the point at \c (position,getAxis()) for horizontal Track
//! at or \c (getAxis(),position) for vertical Track.
//! \function TrackSegment* Track::getSegment ( size_t index ) const;
//! \param index The index of the TrackSegment.
//! \return The TrackSegment at \e index. The result will be \NULL in the
//! follwing cases :
//! - \e index is outside the sorted zone.
//! - \e index points to a hole in the Track.
//! - \e index is equal to Track::npos.
//! \function TrackSegment* Track::getSegment ( DbU::Unit position ) const;
//! \param position The position where to search.
//! \return The TrackSegment whose starting point is immediatly inferior to \e position.
//! \function TrackSegment* Track::getNext ( size_t& index, Net* net ) const;
//! \param index Index of the starting TrackSegment.
//! \param net A \Net to ignore.
//! \return The next TrackSegment (\NULL if not found).
//!
//! Find, starting from TrackSegment at \e index the next TrackSegment
//! ignoring TrackSegment from \e net. \e index is modified to point
//! on the returned TrackSegment. If there's no next TrackSegment (\NULL)
//! then index is set to Track::npos.
//! \function TrackSegment* Track::getPrevious ( size_t& index, Net* net ) const;
//! \param index Index of the starting TrackSegment.
//! \param net A \Net to ignore.
//! \return The previous TrackSegment (\NULL if not found).
//!
//! find, starting from TrackSegment at \e index the previous TrackSegment
//! ignoring TrackSegment from \e net. \e index is modified to point
//! on the returned TrackSegment. If there's no previous TrackSegment (\NULL)
//! then index is set to Track::npos.
//! \function TrackSegment* Track::getNextFixed ( size_t& index ) const;
//! \param index Index of the starting TrackSegment.
//! \return The first previous \e Fixed TrackSegment.
//!
//! find, starting from TrackSegment at \e index the first previous
//! with a \e Fixed attribute set. \e index is modified to point on the
//! returned TrackSegment. If there's no previous TrackSegment (\NULL)
//! then index is set to Track::npos.
//! \function size_t Track::find ( const TrackElement* element ) const;
//! \sreturn the \e index of \e element inside the Track. If the \e element do
//! not belongs to the Track, return Track::npos.
//! \function DbU::Unit Track::getSourcePosition ( size_t index ) const;
//! \sreturn The source position of TrackSegment at index \e index.
//! If \e index is equal to Track::npos, returns zero.
//! \function DbU::Unit Track::getSourcePosition ( vector<TrackElement*>::iterator it ) const;
//! \sreturn The source position of TrackSegment pointed by iterator \e it.
//! If \e it is equal to \c end() , returns zero.
//! \function DbU::Unit Track::getMinimalPosition ( size_t index, unsigned int state ) const;
//! \sreturn Extract the minimal position from the interval at \c index in accordance
//! to \c state hinting.
//!
//! \sa Track::IndexState.
//! \function DbU::Unit Track::getMaximalPosition ( size_t index, unsigned int state ) const;
//! \sreturn Extract the maximal position from the interval at \c index in accordance
//! to \c state hinting.
//!
//! \sa Track::IndexState.
//! \function Interval Track::getFreeInterval ( DbU::Unit position, Net* net=NULL ) const;
//! \param position where fo find a free interval.
//! \param net for which net to find the free interval.
//! \sreturn The longuest free interval enclosing \e position (may be empty).
//! \function Interval Track::getOccupiedInterval ( size_t& begin ) const;
//! \param begin index of one of the TrackElement set. May be modificated.
//! \sreturn the whole interval used by a set of overlaping TrackSegment.
//!
//! As TrackElement from a same net can overlap, the interval of one of
//! them do not give the full extend of the Track occupation at this point.
//! This function looks for all overlaping segments and returns the
//! merged interval. Additionnaly it sets \c begin to the index of the
//! lowest TrackElement of the set.
//!
//! \image html TrackOccupiedInterval-1.png "Fig 4: Track::getOccuppiedInterval()"
//! \function Interval Track::expandFreeInterval ( size_t& begin, size_t& end, unsigned int state, Net* net ) const;
//! \param begin the lowest used TrackSegment.
//! \param end the highest used TrackSegment.
//! \param state tells how to interpret the \c begin & \c end indexes.
//! \param net the for wich we seek place.
//! \sreturn The longuest free interval between \c ]begin,end[ .
//!
//! Starting from the initial <code>[begin,end]</code> interval, expand the
//! interval to encompass all free space or segments belonging to \c net.
//! \c state may be used to compute the interval bounds from \c begin
//! and \c end instead of directly using the returned \c interval.
//!
//! \note \c ]begin,end[ must define a free interval between two TrackSegment.
//! \function void Track::getBeginIndex ( DbU::Unit position, size_t& begin, unsigned int& state ) const;
//! \param position The position where to search.
//! \param begin Index of the immediatly inferior TrackElement.
//! \param state how to interpret the returned \c begin.
//!
//! Return in \c begin the index of the TrackElement whose minimum is immediately
//! below the requested \c position on the Track axis. The second returned
//! parameter \c state is a set of flags to tell how the \c begin index
//! has to be interpreted.
//!
//! Flags for the \c state are:
//! - Track::BeginIsTrackMin : (implies \c begin=0) there is no TrackElement
//! \e before \c position.
//! - Track::EndIsSegmentMin : The \c begin segment starts \e before \c position.
//! - Track::BeginIsSegmentMin : The \c begin segment starts \e before \c position
//! and ends \e after.
//! - Track::EndIsSegmentMax : The \c begin segment starts \e before \c position
//! and ends \e after.
//! - Track::BeginIsSegmentMax : The \c begin segment starts and ends \e before
//! \c position.
//! - Track::EndIsNextSegmentMin : The \c begin segment starts and ends \e before
//! \c position. So the maximum is given by the \c minimum of the \e next
//! TrackElement.
//! - Track::EndIsTrackMax : There is no TrackElement \e after \c position.
//!
//! Based on the previous flags, we build the \c state parameter:
//! - Track::BeforeFirstElement : the \c position is before the first TrackElement.
//! - Track::InsideElement : the \c position is inside a TrackElement.
//! - Track::OutsideElement : the \c position is in free zone between two
//! TrackElements.
//! - Track::AfterLastElement : the position is after the end of the last
//! element.
//! - Track::EmptyTrack : the track is still empty.
//!
//! To separate flags relevant to \e begin and \e end informations, two masks
//! are provideds:
//! - Track::BeginMask
//! - Track::EndMask
//!
//! \image html TrackBeginIndex-1.png "Fig 3: Track::getBeginIndex()"
//!
//! <b>Reminder for myself:</b>
//! The Track::getBeginIndex() function relies on the \STL \lower_bound
//! function. \c lower_bound() finds the TrackElement immediately \e superior
//! to \c position (shown on Figure <b>3</b> by the \c LB label in white on black).
//!
//! The relation between the returned \c begin index and the position is
//! given through the \c state parameter.
//! \function void Track::getOverlapBounds ( Interval interval, size_t& begin, size_t& end ) const;
//! \param interval the overlaping interval.
//! \param begin where to store the starting bound.
//! \param end where to store the ending bound.
//!
//! find the range of TrackSegment intersecting \e interval.
//! Note that when the \e interval lower bound crosses a set of
//! overlaping intervals from the same \Net, the interval at
//! \e begin will crosses the lower bound but some following
//! of the same \Net may not.
//! \function TrackCost Track::getOverlapCost ( Interval interval, Net* net, size_t begin, size_t end, unsigned int flags ) const;
//! \param interval the overlaping interval.
//! \param net a Net to ignore (null cost).
//! \param begin the starting bound.
//! \param end the ending bound.
//! \param flags passed to the overlap cost function.
//! \return The cost of the overlap.
//!
//! Compute the cost of the overlap of \e interval with the range
//! \c [begin,end] of TrackSegment. Any TrackSegment belonging to
//! \e net will be ignored.
//! \function TrackCost Track::getOverlapCost ( Interval interval, Net* net, unsigned int flags ) const;
//! \param interval the overlaping interval.
//! \param net a Net to ignore (null cost).
//! \param flags passed to the overlap cost function.
//!
//! Compute the overlap cost of \e interval with TrackSegment from
//! the current Track, ignoring thoses belonging to \e net.
//! \function TrackCost Track::getOverlapCost ( TrackElement* segment, unsigned int flags ) const;
//! \param segment under which to compute overlap cost.
//! \param flags passed to the overlap cost function.
//!
//! Compute the overlap cost of \c segment with TrackSegment from
//! the current Track (interval and net are deduced from \c segment).
//! \function void Track::getTerminalWeight ( Interval interval, Net* net, size_t& count, unsigned int& weight ) const;
//! \param interval under which to compute terminal weight.
//! \param net a net to be ignored.
//! \param count incremented of the number of track markers under the
//! \c interval.
//! \param weight incremented of the sum of the weight of the track markers
//! under the \c interval.
//!
//! Compute and return the sum of the weight of the track markers (see TrackMarker)
//! under \c interval ignoring \c net (that is, \e for \c net).
//!
//! \remark The referenced variables \c count and \c weight are <b>not</b> reset to
//! zero by this function. It is of the caller's responsability.
//! \function bool Track::check ( unsigned int& overlaps, const char* message=NULL ) const;
//! \param overlaps The number of overlaping segments.
//! \param message An iformative message, only printed if an error occurs.
//! \return \true if the Track contains no incoherencies.
//!
//! Perform a complete Track check. Looks for the following incoherencies :
//! - TrackSegment do not refers this Track.
//! - TrackSegment is detached (TrackSegment::getTrack() is \NULL).
//! - TrackSegment is hollow, this one is very unlikely as hollow
//! TrackSegment are only created for the \lower_bound.
//! - \NULL pointers (should never occurs, nevertheless...)
//! - Two consecutive TrackSegment from different \Net must not
//! overlap.
//! - For TrackSegment starting from the same position, the
//! longuest must be first.
//! \function void Track::invalidate ();
//! Inconditionnaly invalidate the Track, regardless if it has been
//! modificated. The Track will be forced to be revalidated on closure
//! of the current session.
//! \function void Track::insert ( TrackElement* segment );
//! Adds \e segment to the Track. Must only be used inside a
//! Session. They must appears \e after Track::doRemoval()
//! and \e before Track::doReorder().
//!
//! \sa Kite::Session.
//! \function void Track::insert ( TrackMarker* marker );
//! Adds \e marker to the Track. Must only be used inside a
//! Session.
//!
//! \sa Kite::Session.
//! \function void Track::setSegment ( TrackElement* element, size_t index );
//! Directly affect the Track entry at position \c index to
//! \c element (use with great care).
//!
//! \sa Kite::Session.
//! \function size_t Track::doRemoval ();
//! \sreturn The number of removeds TrackSegment.
//!
//! Suppress all the TrackSegment that have been withdraw from the
//! Track. TrackSegment must be withdraw trough the TrackSegment::detach()
//! method which sets their owning Track to \NULL (the removal criterion).
//! It uses the \STL \e remove_if algorithm that put all the to be removed
//! elements at the end of the vector.
//!
//! \sa Kite::Session.
//! \function void Track::doReorder ();
//!
//! (Re)sort the TrackElement of the vector. Must be called \e after:
//! - Track::doRemoval() so no detached TrackSegment are presents.
//! - All calls to Track::insert(), as the newly inserted elements
//! are put at the back of the vector.
//!
//! \sa Kite::Session.
} }

View File

@ -1,18 +1,13 @@
// -*- C++ -*- // -*- C++ -*-
namespace Kite { namespace Kite {
/*! \typedef SegmentOverlapCostCB
* Prototype of overlap cost callback functions.
*
* \see TrackSegment::setOverlapCostCB(), TrackSegment::getOverlapCost().
*/
/*! \class TrackSegment /*! \class TrackSegment
* \brief Derived Katabatic::AutoSegment for the router. * \brief Derived Katabatic::AutoSegment for the router.
* *
* \image html TrackSegment-10.png "Fig 1: TrackSegment Context"
*
* We create one TrackSegment per aligned Katabatic::AutoSegment set, * We create one TrackSegment per aligned Katabatic::AutoSegment set,
* the TrackSegment is associated to the canonical one of the set. * the TrackSegment is associated to the canonical one of the set.
* *
@ -21,150 +16,114 @@
* The drawback beeing that whenever one segment from the aligned * The drawback beeing that whenever one segment from the aligned
* set has it's extention modified, the full extention must be * set has it's extention modified, the full extention must be
* recomputed. * recomputed.
*/
/*! \name Constructors & Destructors
*/
// \{
/*! \function static TrackSegment* TrackSegment::create ( AutoSegment* segment, Track* track, bool& created );
* \param segment The Katabatic AutoSegment to decorate.
* \param track A Track into which insert the TrackSegment (may be \NULL).
* \param created This flag is sets is a new TrackSegment has be created.
* \return A TrackSegment wrapped around an AutoSegment.
* *
* Constructor mainly used at loading time to decorate the Katabatic
* data-base with the router attributes.
*/
// \}
/*! \name Predicates
*/
// \{
/*! \function bool TrackSegment::isLocked () const;
* \Return \True if the TrackSegment is locked (cannot be deleted from the
* Track).
*/
// \}
/*! \name Callback modifier
*/
// \{
/*! \function SegmentOverlapCostCB* TrackSegment::setOverlapCostCB ( SegmentOverlapCostCB* cb );
* \param cb the new overlap cost callback.
* \return the previous overlap cost callback.
* *
* sets the overlap callback. * \section secTSLazyRevalidate Lazy Revalidate
*/
// \}
/*! \name Accessors
*/
// \{
/*! \function Track* TrackSegment::getTrack () const;
* \Return The Track in which this TrackSegment is inserted (can be \NULL).
*/
/*! \function size_t TrackSegment::getIndex () const;
* \Return Index of the TrackSegment inside the Track's vector. set to
* Track::NPOS if not inserted in any Track.
*/
/*! \function unsigned long TrackSegment::getArea () const;
* \Return The priority value used for TrackSegment sorting. Currently,
* the slack of the AutoSegment.
*/
/*! \function TrackSegment* TrackSegment::getNext () const;
* \Return The next TrackSegment in the Track (can be \NULL).
* *
* \see Track::getNext(). * When the TrackSegment::revalidate() method is called, it only update
*/ * the cached size of the segment (from the AutoSegment set of aligneds)
* and the track into which it may be inserted.
/*! \function TrackSegment* TrackSegment::getPrevious () const;
* \Return The previous TrackSegment in the Track (can be \NULL).
* *
* \see Track::getPrevious(). * The associated DataNegociate and RoutingEvent are \b not updated.
*/ * - The RoutingEvent will be updated when it's key is updated,
* typically during a requeueing operation \b and in the
/*! \function Interval TrackSegment::getFreeInterval () const; * SegmentFsm constructor. This should be optimzed in the future.
* \Return The free interval around this TrackSegment in the Track. * - The DataNegociate is updated \e only in the SegmentFsm
*/ * constructor. This is the most costly of the two updates as
* it perform a perpandicular & parallel connexity exploration.
/*! \function DbU::Unit TrackSegment::getSourceCanonical () const;
* \Return The leftmost position of the associated aligned segment set.
*/
/*! \function DbU::Unit TrackSegment::getTargetCanonical () const;
* \Return The rightmost position of the associated aligned segment set.
*/
/*! \function DbU::Unit TrackSegment::getCanonicalInterval () const;
* \Return The canonical interval of the associated aligned segment set.
*/
/* \function DbU::Unit TrackSegment::getOverlapCost ( Interval interval, Net* net ) const;
* \param interval the overlaping interval.
* \param net the \Net owning the overlaping interval.
* \return The cost of overlaping the TrackSegment with \e interval from \Net \e net.
*/
// \}
/*! \name Modifiers
*/
// \{
/*! \function void TrackSegment::setLock ( bool state );
* \param state set the Track locking state.
*/
/*! \function void TrackSegment::setTrack ( Track* track );
* \param track The Track the TrackSegment is assigned to.
*/
/*! \function void TrackSegment::setIndex ( size_t index );
* \param index The index of TrackSegment in the Track's vector.
*/
/*! \function void TrackSegment::setArea ();
* compute the the sorting criterion used as priority, for
* now it's simply the AutoSegment's slack.
*/
/*! \function void TrackSegment::detach ();
* remove the TrackSegment from the Track.
* *
* \important This function <em>do not</em> update the Track itself. The
* program must take care of it under penalty of introducing
* incoherencies.
* *
* \see Track::detach(). * \section secDogleg Dogleg Management
*
* The basic AutoSegment::canDogleg() method is declined in three more
* dedicated methods in this class:
* - TrackSegment::canDogleg(), for locals only, check if a break
* is possible, never break a segment more than once (to avoid
* fragmentation).
* - TrackSegment::canDogleg(Katabatic::GCell*,unsigned int flags)
* for globals, check that the segment is breakable in the desired
* GCell. Never break twice in the first/last GCell (fragmentation
* limitation), but may \e reuse an already existing dogleg.
* - TrackSegment::canDogleg(Interval), for locals only, direct proxy
* for the AutoSegment method. Never allow more than one break.
*
* <b>Relationship between AutoSegment and TrackSegment</b>
*
* Figure 2 below, shows an example of dogleg creation:
* - At the Katabatic level, AutoSegment \c id:12 is broken. Thus
* the creation of AutoSegments \c id:20 and \c id:21. As per
* specification, the orignal segment \c id:10 remains on the
* left side (source) of the break.
* - But, because the canonical of the former aligned AutoSegment
* set \c (10,11,12,13,14) was on the \e right side of the break,
* the new parallel TrackSegment will be created on the \c left
* side, associated to the newly promoted canonical AutoSegment
* \c id:12.
*
* \image html _makeDogleg-10.png "Fig 2: Dogleg Management"
*
* The TrackSegment::_postDoglegs() method called by all flavors of
* TrackSegment::makeDogleg() methods is responsible for creating new
* TrackSegments for the new doglegs (there may be more than one), it
* also update the dogleg level and source/target dogleg flags.
*
* \redB{This section is not finished.} I need to review the parent and
* doglevel numbering management. There seems to be a risk of infinite
* fragmentation as the numbering of the original segment is not
* increased, we should create a \e break counter separate from
* deepness.
*
*
* \section secWeakGlobal Global, Weak Global and Local Segments
*
* There's a slight semantic change between Katabatic and Kite about
* what is local and what is local. This is due to how we consider the
* intermediate status of \e WeakGlobal.
*
* A \c WeakGlobal segment is a local segment which is aligned with a
* global (though a VTee or an HTee contact).
*
* In Katabatic a local segment is one that is not \c Global, a local segment
* can be both \c Local and \c WeakGlobal.
*
* In Kite a local segment is one that is neither \c Global or \c WeakGlobal.
* The \c WeakGlobal sides with \c Global unlike in Katabatic.
*
*/ */
/* \function void TrackSegment::autoInvalidate (); //! \function static TrackSegment* TrackSegment::create ( AutoSegment* segment, Track* track, bool& created );
* add \e this TrackSegment to the Kite level update Session. //! \param segment The Katabatic AutoSegment to decorate.
* Something maybe buggy here, or at least not very clean. //! \param track A Track into which insert the TrackSegment (may be \NULL).
*/ //! \param created This flag is sets is a new TrackSegment has be created.
//! \return A TrackSegment wrapped around an AutoSegment.
//!
//! Constructor mainly used at loading time to decorate the Katabatic
//! data-base with the router attributes.
/* \function void TrackSegment::refreshCanonical (); //! \function unsigned long TrackElement::getFreedomDegree() const;
* Recompute the letfmost & rightmost position of the collapsed set. //! \sreturn The degree of freedom of the element. It is used as a priority value
* Must be done after each modification of the TrackSegment. //! when sorting TrackElement (in RoutingEvent).
* Dealt by the TrackSession mechanism. //!
* //! Currently, it is the \e slack of the Katabatic::AutoSegment.
*/
// \} //! \function void TrackSegment::revalidate ();
//! Actualize the TrackSegment characteristics from the supporting
//! elements (set of AutoSegment).
//!
//! This method do not update the DataNegociate or the RoutingEvent.
//! This is a lazy update delayed until the constructor of SegmentFsm is called.
//! (see \ref secTSLazyRevalidate "Lazy Revalidate").
//! \function TrackSegment* TrackSegment::_postDoglegs ( TrackElement*& perpandicular, TrackElement*& parallel );
//! Post-process to be called inside the various dogleg creation or slacken
//! methods. Iterate through the newly created AutoSegments to create, for
//! the <em>perpandicular</em> and the <em>new parallel</em> associateds
//! TrackSegments. Also sets the dogleg levels and flags of the newly
//! created elements.
//!
//! The session dogleg reset is called at the end of this method. The \c perpandicular
//! and \c parallel references to pointers contains the newly created segments
//! for the \b last dogleg. If more than one was created, you cannot access them
//! (the need has not arised yet).
} }

View File

@ -1,798 +0,0 @@
%%
%% 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'.

View File

@ -1,3 +1,5 @@
# -*- explicit-buffer-name: "doxyfile<kite/doc>" -*-
# Doxyfile 1.3.4 # Doxyfile 1.3.4
# -------------------------------------------------------------------- # --------------------------------------------------------------------
@ -24,7 +26,8 @@ TAB_SIZE = 2
ALIASES = "function=\fn"\ ALIASES = "function=\fn"\
"important=\par Important:\n"\ "important=\par Important:\n"\
"remark=\par Remark:\n"\ "remark=\par Remark:\n"\
"Return=<b>Returns:</b>"\ "sreturn=\b Returns:"\
"sa=<b>See also:</b>&nbsp;"\
"True=\b True"\ "True=\b True"\
"true=\b true"\ "true=\b true"\
"False=\b False"\ "False=\b False"\
@ -33,7 +36,7 @@ ALIASES = "function=\fn"\
"HORIZONTAL=\b HORIZONTAL"\ "HORIZONTAL=\b HORIZONTAL"\
"NULL=\c NULL"\ "NULL=\c NULL"\
"vector=\c vector"\ "vector=\c vector"\
"lower_bound=\c lower_bound"\ "lower_bound=\c lower_bound()"\
"Collection=\c Collection"\ "Collection=\c Collection"\
"Collections=\c Collections"\ "Collections=\c Collections"\
"Interval=\c Interval"\ "Interval=\c Interval"\
@ -72,7 +75,9 @@ ALIASES = "function=\fn"\
"Session=\c Session"\ "Session=\c Session"\
"Sessions=\c Sessions"\ "Sessions=\c Sessions"\
"Hurricane=<a href='../hurricane/Index.html'>Hurricane</a>"\ "Hurricane=<a href='../hurricane/Index.html'>Hurricane</a>"\
"STL=<a href='http://www.sgi.com/tech/stl/'>STL</a>" "STL=<a href='http://www.sgi.com/tech/stl/'>STL</a>"\
"red{1}=<span class=\"red\">\1</span>" \
"redB{1}=<b><span class=\"red\">\1</span></b>"
OPTIMIZE_OUTPUT_FOR_C = NO OPTIMIZE_OUTPUT_FOR_C = NO
OPTIMIZE_OUTPUT_JAVA = NO OPTIMIZE_OUTPUT_JAVA = NO
SUBGROUPING = YES SUBGROUPING = YES
@ -91,7 +96,7 @@ HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO INTERNAL_DOCS = NO
CASE_SENSE_NAMES = YES CASE_SENSE_NAMES = YES
HIDE_SCOPE_NAMES = NO HIDE_SCOPE_NAMES = YES
SHOW_INCLUDE_FILES = YES SHOW_INCLUDE_FILES = YES
INLINE_INFO = YES INLINE_INFO = YES
SORT_MEMBER_DOCS = NO SORT_MEMBER_DOCS = NO
@ -117,13 +122,30 @@ WARN_LOGFILE =
# Configuration options related to the input files # Configuration options related to the input files
INPUT = \ INPUT = \
../src/kite/TrackSegment.h ../src/TrackSegment.cpp TrackSegment.dox \ ../src/kite/Constants.h Constants.dox \
../src/kite/TrackSegmentCost.h ../src/TrackSegmentCost.cpp TrackSegmentCost.dox \ ../src/kite/KiteEngine.h KiteEngine.dox \
../src/kite/Track.h ../src/Track.cpp Track.dox \ ../src/kite/DataNegociate.h ../src/DataNegociate.cpp DataNegociate.dox \
../src/kite/TrackCost.h ../src/TrackCost.cpp TrackCost.dox \ ../src/kite/TrackMarker.h ../src/TrackMarker.cpp TrackMarker.dox \
../src/kite/RoutingEvent.h ../src/RoutingEvent.cpp RoutingEvent.dox \ ../src/kite/TrackElement.h ../src/TrackElement.cpp TrackElement.dox \
../src/kite/Session.h Session.dox \ ../src/kite/TrackSegment.h ../src/TrackSegment.cpp TrackSegment.dox \
Kite.dox ../src/kite/TrackFixedSegment.h ../src/TrackFixedSegment.cpp TrackFixedSegment.dox \
../src/kite/Track.h ../src/Track.cpp Track.dox \
../src/kite/HorizontalTrack.h ../src/HorizontalTrack.cpp HorizontalTrack.dox \
../src/kite/VerticalTrack.h ../src/VerticalTrack.cpp VerticalTrack.dox \
../src/kite/RoutingPlane.h ../src/RoutingPlane.cpp RoutingPlane.dox \
../src/kite/Manipulator.h ../src/Manipulator.cpp Manipulator.dox \
../src/kite/SegmentFsm.h ../src/SegmentFsm.cpp SegmentFsm.dox \
../src/kite/RoutingEvent.h ../src/RoutingEvent.cpp RoutingEvent.dox \
../src/kite/RoutingEventQueue.h ../src/RoutingEventQueue.cpp RoutingEventQueue.dox \
../src/kite/RoutingEventLoop.h ../src/RoutingEventLoop.cpp RoutingEventLoop.dox \
../src/kite/RoutingEventHistory.h ../src/RoutingEventHistory.cpp RoutingEventHistory.dox \
../src/kite/NegociateWindow.h ../src/NegociateWindow.cpp NegociateWindow.dox \
../src/kite/Session.h Session.dox \
Kite.dox \
notes.dox
# ../src/kite/TrackSegmentCost.h ../src/TrackSegmentCost.cpp TrackSegmentCost.dox \
# ../src/kite/TrackCost.h ../src/TrackCost.cpp TrackCost.dox \
FILE_PATTERNS = *.h \ FILE_PATTERNS = *.h \
*.cpp \ *.cpp \
@ -166,7 +188,7 @@ HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html HTML_FILE_EXTENSION = .html
HTML_HEADER = header.html HTML_HEADER = header.html
HTML_FOOTER = footer.html HTML_FOOTER = footer.html
HTML_STYLESHEET = ASIM.css HTML_STYLESHEET = SoC.css
HTML_ALIGN_MEMBERS = YES HTML_ALIGN_MEMBERS = YES
GENERATE_HTMLHELP = NO GENERATE_HTMLHELP = NO
CHM_FILE = CHM_FILE =
@ -250,7 +272,7 @@ SKIP_FUNCTION_MACROS = YES
# -------------------------------------------------------------------- # --------------------------------------------------------------------
# Configuration options related to external references # Configuration options related to external references
TAGFILES = ../../../../hurricane/doc/hurricane/html/hurricane.tag=../hurricane \ TAGFILES = ../../hurricane/doc/hurricane/html/hurricane.tag=../hurricane \
../../katabatic/doc/html/katabatic.tag=../katabatic ../../katabatic/doc/html/katabatic.tag=../katabatic
GENERATE_TAGFILE = html/kite.tag GENERATE_TAGFILE = html/kite.tag
ALLEXTERNALS = NO ALLEXTERNALS = NO

View File

@ -9,7 +9,7 @@
<table class="footer2"> <table class="footer2">
<tr> <tr>
<td class="LFooter">Kite - Detailed Router</td> <td class="LFooter">Kite - Detailed Router</td>
<td class="RFooter"><small>Copyright &#169; 2008-2009 LIP6. All rights reserved</small></td> <td class="RFooter"><small>Copyright &#169; 2008-2013 UPMC. All rights reserved</small></td>
</tr> </tr>
</table> </table>
</body> </body>

View File

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

View File

@ -0,0 +1,96 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
80.00
Single
-2
1200 2
0 32 #ffffdd
6 750 525 11400 1050
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
2400 600 9900 600
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 900 11400 900
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1500 900 4500 900
4 0 0 50 -1 12 14 0.0000 4 105 150 1500 825 a\001
4 2 0 50 -1 14 14 0.0000 4 180 450 1200 975 [3]\001
-6
6 750 975 11400 1350
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 1200 11400 1200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2100 1200 5100 1200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
8100 1200 11100 1200
4 0 0 50 -1 12 14 0.0000 4 150 150 2100 1125 b\001
4 0 0 50 -1 12 14 0.0000 4 150 150 8100 1125 f\001
4 2 0 50 -1 14 14 0.0000 4 180 450 1200 1275 [2]\001
-6
6 750 1275 11400 1650
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 1500 11400 1500
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2700 1500 5700 1500
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7500 1500 10500 1500
4 0 0 50 -1 12 14 0.0000 4 105 150 2700 1425 c\001
4 0 0 50 -1 12 14 0.0000 4 105 150 7500 1425 e\001
4 2 0 50 -1 14 14 0.0000 4 180 450 1200 1575 [1]\001
-6
6 750 1575 11400 1950
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 1800 11400 1800
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
6900 1800 9900 1800
4 0 0 50 -1 12 14 0.0000 4 150 150 6900 1725 d\001
4 2 0 50 -1 14 14 0.0000 4 180 450 1200 1875 [0]\001
-6
6 750 2775 11400 4050
6 750 2775 11400 3150
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 3000 11400 3000
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1500 3000 4500 3000
4 0 0 50 -1 12 14 0.0000 4 105 150 1500 2925 a\001
4 2 0 50 -1 14 14 0.0000 4 180 450 1200 3075 [3]\001
-6
6 750 3075 11400 3450
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 3300 11400 3300
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2100 3300 5100 3300
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
8100 3300 11100 3300
4 0 0 50 -1 12 14 0.0000 4 150 150 2100 3225 b\001
4 0 0 50 -1 12 14 0.0000 4 150 150 8100 3225 f\001
4 2 0 50 -1 14 14 0.0000 4 180 450 1200 3375 [2]\001
-6
6 750 3375 11400 3750
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 3600 11400 3600
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2700 3600 5700 3600
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7575 3600 10575 3600
4 0 0 50 -1 12 14 0.0000 4 105 150 2700 3525 c\001
4 0 0 50 -1 12 14 0.0000 4 105 150 7575 3525 e\001
4 2 0 50 -1 14 14 0.0000 4 180 450 1200 3675 [1]\001
-6
6 750 3675 11400 4050
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 3900 11400 3900
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
6900 3900 9900 3900
4 0 0 50 -1 12 14 0.0000 4 150 150 6900 3825 d\001
4 0 4 50 -1 14 14 0.0000 4 150 150 2400 3825 g\001
4 2 0 50 -1 14 14 0.0000 4 180 450 1200 3975 [0]\001
-6
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
2400 3900 6300 3900 6300 3000 9900 3000
-6
2 2 0 0 0 32 200 -1 20 0.000 0 0 -1 0 0 5
675 0 11700 0 11700 4500 675 4500 675 0
4 0 4 50 -1 14 14 0.0000 4 150 150 2400 525 g\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -0,0 +1,89 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
0 32 #ffffdd
6 5025 1425 7350 2175
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5175 1500 5100 1500 5100 2100 5175 2100
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7275 1500 7200 1500 7200 2100 7275 2100
2 2 0 0 0 0 60 -1 10 0.000 0 0 -1 0 0 5
5100 1650 7200 1650 7200 1950 5100 1950 5100 1650
4 1 0 40 -1 14 14 0.0000 4 180 600 5475 1575 [-4]\001
-6
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 1800 9300 1800
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 1 2
0 0 2.00 120.00 240.00
0 0 2.00 120.00 240.00
2400 600 2400 4200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3675 600 3600 600 3600 1200 3675 1200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5475 600 5400 600 5400 1200 5475 1200
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
3600 750 5400 750 5400 1050 3600 1050 3600 750
2 1 0 4 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3600 900 5400 900
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3375 2700 3300 2700 3300 3300 3375 3300
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5175 2700 5100 2700 5100 3300 5175 3300
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4575 3225 4500 3225 4500 2775 4575 2775
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7575 3225 7500 3225 7500 2775 7575 2775
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
3300 2850 5100 2850 5100 3150 3300 3150 3300 2850
2 1 0 4 1 7 60 -1 -1 0.000 0 0 -1 0 0 2
3300 3000 7500 3000
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 900 9300 900
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
4500 2925 7500 2925 7500 3075 4500 3075 4500 2925
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 3000 9300 3000
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
1575 3600 1500 3600 1500 4200 1575 4200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
8775 3600 8700 3600 8700 4200 8775 4200
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 3900 9300 3900
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3975 3600 3900 3600 3900 4200 3975 4200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6075 3600 6000 3600 6000 4200 6075 4200
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
1500 3750 3900 3750 3900 4050 1500 4050 1500 3750
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
6000 3750 8700 3750 8700 4050 6000 4050 6000 3750
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
6375 2250 6300 2250 6300 2550 6375 2550
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
1875 2250 1800 2250 1800 2550 1875 2550
2 2 0 0 0 4 60 -1 10 0.000 0 0 -1 0 0 5
1800 2325 6300 2325 6300 2475 1800 2475 1800 2325
2 2 0 0 0 32 200 -1 20 0.000 0 0 -1 0 0 5
900 300 9600 300 9600 5700 900 5700 900 300
3 0 0 1 4 7 50 -1 -1 0.000 0 1 0 3
0 0 1.00 60.00 120.00
1800 2400 1500 2550 1500 3000
0.000 1.000 0.000
3 0 0 4 1 7 50 -1 -1 0.000 0 0 0 2
1200 5100 2700 5100
0.000 0.000
4 1 4 50 -1 14 12 1.5708 4 165 2160 2325 2250 perpandicular span\001
4 1 0 40 -1 14 14 0.0000 4 180 600 3975 675 [-3]\001
4 1 0 40 -1 14 14 0.0000 4 180 600 3675 2775 [-1]\001
4 1 0 40 -1 14 14 0.0000 4 180 600 4800 2775 [-2]\001
4 1 0 40 -1 14 14 0.0000 4 180 600 1875 3675 [-5]\001
4 1 0 40 -1 14 14 0.0000 4 180 600 6975 3675 [-6]\001
4 1 4 40 -1 14 14 0.0000 4 150 1500 4050 2250 conflicted\001
4 0 1 50 -1 14 14 0.0000 4 150 2100 3000 5100 UnionIntervals\001
4 0 0 50 -1 14 14 0.0000 4 195 6900 1200 5400 [-INDEX] index of the segment in event history\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@ -0,0 +1,116 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
0 32 #ffffdd
6 1425 6825 5850 7575
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
1575 6900 1500 6900 1500 7500 1575 7500
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3375 6900 3300 6900 3300 7500 3375 7500
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
2775 7425 2700 7425 2700 6975 2775 6975
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5775 7425 5700 7425 5700 6975 5775 6975
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
1500 7050 3300 7050 3300 7350 1500 7350 1500 7050
2 1 0 4 1 7 60 -1 -1 0.000 0 0 -1 0 0 2
1500 7200 5700 7200
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
2700 7125 5700 7125 5700 7275 2700 7275 2700 7125
-6
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3375 2700 3300 2700 3300 3300 3375 3300
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5175 2700 5100 2700 5100 3300 5175 3300
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4575 3225 4500 3225 4500 2775 4575 2775
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7575 3225 7500 3225 7500 2775 7575 2775
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
3300 2850 5100 2850 5100 3150 3300 3150 3300 2850
2 1 0 4 1 7 60 -1 -1 0.000 0 0 -1 0 0 2
3300 3000 7500 3000
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
4500 2925 7500 2925 7500 3075 4500 3075 4500 2925
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 3000 9600 3000
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
6375 2250 6300 2250 6300 2550 6375 2550
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
1875 2250 1800 2250 1800 2550 1875 2550
2 2 0 0 0 4 60 -1 10 0.000 0 0 -1 0 0 5
1800 2325 6300 2325 6300 2475 1800 2475 1800 2325
2 1 0 1 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
3300 1800 3300 3900
2 1 0 1 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
7500 1800 7500 3900
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
1875 4050 1800 4050 1800 4350 1875 4350
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
6375 4950 6300 4950 6300 5250 6375 5250
2 1 0 4 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
3000 4200 3000 5100
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
3225 4050 3150 4050 3150 4350 3225 4350
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
2925 4950 2850 4950 2850 5250 2925 5250
2 2 0 0 0 4 60 -1 10 0.000 0 0 -1 0 0 5
1800 4125 3150 4125 3150 4275 1800 4275 1800 4125
2 2 0 0 0 4 60 -1 10 0.000 0 0 -1 0 0 5
2850 5025 6300 5025 6300 5175 2850 5175 2850 5025
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 7200 9600 7200
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
6375 6450 6300 6450 6300 6750 6375 6750
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
1875 6450 1800 6450 1800 6750 1875 6750
2 2 0 0 0 4 60 -1 10 0.000 0 0 -1 0 0 5
1800 6525 6300 6525 6300 6675 1800 6675 1800 6525
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
1875 8250 1800 8250 1800 8550 1875 8550
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
6375 9150 6300 9150 6300 9450 6375 9450
2 1 0 1 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
1500 6000 1500 8100
2 1 0 1 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
5700 6000 5700 8100
2 1 0 4 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
6000 8400 6000 9300
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
6225 8250 6150 8250 6150 8550 6225 8550
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
5925 9150 5850 9150 5850 9450 5925 9450
2 2 0 0 0 4 60 -1 10 0.000 0 0 -1 0 0 5
1800 8325 6150 8325 6150 8475 1800 8475 1800 8325
2 2 0 0 0 4 60 -1 10 0.000 0 0 -1 0 0 5
5850 9225 6300 9225 6300 9375 5850 9375 5850 9225
2 2 0 0 0 32 200 -1 20 0.000 0 0 -1 0 0 5
900 1500 9900 1500 9900 10200 900 10200 900 1500
3 0 0 1 4 7 50 -1 -1 0.000 0 1 0 3
0 0 1.00 60.00 120.00
1800 2400 1500 2550 1500 3000
0.000 1.000 0.000
3 0 0 1 4 7 60 -1 -1 0.000 0 1 0 4
0 0 1.00 60.00 120.00
3300 2325 2700 3000 2700 3900 3000 4500
0.000 1.000 1.000 0.000
3 0 0 1 4 7 60 -1 -1 0.000 0 1 0 4
0 0 1.00 60.00 120.00
5700 6525 5100 7200 5100 8100 6000 8850
0.000 1.000 1.000 0.000
4 1 4 40 -1 14 14 0.0000 4 150 1500 4050 2250 conflicted\001
4 0 4 60 -1 12 14 0.0000 4 195 1800 3375 3900 sourceDogleg\001
4 0 4 60 -1 12 14 0.0000 4 195 1800 7575 3900 targetDogleg\001
4 0 0 50 -1 12 14 0.0000 4 150 1650 3375 1950 minConflict\001
4 0 0 50 -1 12 14 0.0000 4 150 1650 7575 1950 maxConflict\001
4 1 0 50 -1 14 16 0.0000 4 210 3960 4500 5700 (a) - Break under Source\001
4 1 4 40 -1 14 14 0.0000 4 150 1500 4050 6450 conflicted\001
4 0 4 60 -1 12 14 0.0000 4 195 1800 1575 8100 sourceDogleg\001
4 0 4 60 -1 12 14 0.0000 4 195 1800 5775 8100 targetDogleg\001
4 1 0 50 -1 14 16 0.0000 4 225 3960 4425 9900 (b) - Break under Target\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

View File

@ -0,0 +1,93 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
0 32 #ffffdd
6 1725 2100 6450 2625
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
6375 2250 6300 2250 6300 2550 6375 2550
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
1875 2250 1800 2250 1800 2550 1875 2550
2 2 0 0 0 4 60 -1 10 0.000 0 0 -1 0 0 5
1800 2325 6300 2325 6300 2475 1800 2475 1800 2325
4 1 4 40 -1 14 14 0.0000 4 150 1500 4050 2250 conflicted\001
-6
6 5025 1425 7350 2175
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5175 1500 5100 1500 5100 2100 5175 2100
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7275 1500 7200 1500 7200 2100 7275 2100
2 2 0 0 0 0 60 -1 10 0.000 0 0 -1 0 0 5
5100 1650 7200 1650 7200 1950 5100 1950 5100 1650
4 1 0 40 -1 14 14 0.0000 4 180 600 5475 1575 [-4]\001
-6
2 2 0 0 0 32 100 -1 20 0.000 0 0 -1 0 0 5
15000 -300 24900 -300 24900 12300 15000 12300 15000 -300
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
0 0 1.00 60.00 120.00
13800 1800 13800 300
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 1800 9300 1800
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 1 2
0 0 2.00 120.00 240.00
0 0 2.00 120.00 240.00
2400 600 2400 4200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3675 600 3600 600 3600 1200 3675 1200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5475 600 5400 600 5400 1200 5475 1200
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
3600 750 5400 750 5400 1050 3600 1050 3600 750
2 1 0 4 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3600 900 5400 900
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3375 2700 3300 2700 3300 3300 3375 3300
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5175 2700 5100 2700 5100 3300 5175 3300
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4575 3225 4500 3225 4500 2775 4575 2775
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7575 3225 7500 3225 7500 2775 7575 2775
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
3300 2850 5100 2850 5100 3150 3300 3150 3300 2850
2 1 0 4 1 7 60 -1 -1 0.000 0 0 -1 0 0 2
3300 3000 7500 3000
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 900 9300 900
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
4500 2925 7500 2925 7500 3075 4500 3075 4500 2925
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 3000 9300 3000
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
1575 3600 1500 3600 1500 4200 1575 4200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
8775 3600 8700 3600 8700 4200 8775 4200
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 3900 9300 3900
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3975 3600 3900 3600 3900 4200 3975 4200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6075 3600 6000 3600 6000 4200 6075 4200
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
1500 3750 3900 3750 3900 4050 1500 4050 1500 3750
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
6000 3750 8700 3750 8700 4050 6000 4050 6000 3750
3 0 0 1 4 7 50 -1 -1 0.000 0 1 0 3
0 0 1.00 60.00 120.00
1800 2400 1500 2550 1500 3000
0.000 1.000 0.000
4 0 0 50 -1 14 12 0.0000 4 120 2160 12750 -675 BeforeFirstElement\001
4 0 0 50 -1 12 14 0.0000 4 135 450 13200 -1200 Pos\001
4 0 1 50 -1 14 12 0.0000 4 165 1800 4800 -750 EndIsSegmentMin\001
4 0 4 50 -1 12 14 0.0000 4 195 1050 2100 -1200 begin:0\001
4 1 4 50 -1 14 12 1.5708 4 165 2160 2325 2250 perpandicular span\001
4 1 0 40 -1 14 14 0.0000 4 180 600 3975 675 [-3]\001
4 1 0 40 -1 14 14 0.0000 4 180 600 3675 2775 [-1]\001
4 1 0 40 -1 14 14 0.0000 4 180 600 4800 2775 [-2]\001
4 1 0 40 -1 14 14 0.0000 4 180 600 1875 3675 [-5]\001
4 1 0 40 -1 14 14 0.0000 4 180 600 6975 3675 [-6]\001

View File

@ -0,0 +1,145 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
80.00
Single
-2
1200 2
0 32 #ffffdd
6 5625 1575 7050 2025
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5775 1650 5700 1650 5700 1950 5775 1950
2 2 0 0 0 0 60 -1 10 0.000 0 0 -1 0 0 5
5700 1725 6900 1725 6900 1875 5700 1875 5700 1725
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6975 1650 6900 1650 6900 1950 6975 1950
-6
6 3225 1575 4650 2025
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3375 1650 3300 1650 3300 1950 3375 1950
2 2 0 0 0 0 60 -1 10 0.000 0 0 -1 0 0 5
3300 1725 4500 1725 4500 1875 3300 1875 3300 1725
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4575 1650 4500 1650 4500 1950 4575 1950
-6
6 3225 675 5850 1125
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3375 750 3300 750 3300 1050 3375 1050
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5775 750 5700 750 5700 1050 5775 1050
2 2 0 0 0 0 60 -1 10 0.000 0 0 -1 0 0 5
3300 825 5700 825 5700 975 3300 975 3300 825
-6
6 3225 2775 4650 3225
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3375 2850 3300 2850 3300 3150 3375 3150
2 2 0 0 0 0 60 -1 10 0.000 0 0 -1 0 0 5
3300 2925 4500 2925 4500 3075 3300 3075 3300 2925
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4575 2850 4500 2850 4500 3150 4575 3150
-6
6 2625 3675 4050 4125
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
2775 3750 2700 3750 2700 4050 2775 4050
2 2 0 0 0 0 60 -1 10 0.000 0 0 -1 0 0 5
2700 3825 3900 3825 3900 3975 2700 3975 2700 3825
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3975 3750 3900 3750 3900 4050 3975 4050
-6
6 4425 3675 4950 4125
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4575 3750 4500 3750 4500 4050 4575 4050
2 2 0 0 0 0 60 -1 10 0.000 0 0 -1 0 0 5
4500 3825 4800 3825 4800 3975 4500 3975 4500 3825
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4875 3750 4800 3750 4800 4050 4875 4050
-6
6 5625 3675 7050 4125
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5775 3750 5700 3750 5700 4050 5775 4050
2 2 0 0 0 0 60 -1 10 0.000 0 0 -1 0 0 5
5700 3825 6900 3825 6900 3975 5700 3975 5700 3825
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6975 3750 6900 3750 6900 4050 6975 4050
-6
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 1800 7800 1800
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 1 2
0 0 2.00 120.00 240.00
0 0 2.00 120.00 240.00
2400 600 2400 4200
2 1 0 4 1 7 60 -1 -1 0.000 0 0 -1 0 0 2
3300 3000 7500 3000
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 900 7800 900
2 2 0 0 0 0 70 -1 10 0.000 0 0 -1 0 0 5
4500 2925 7500 2925 7500 3075 4500 3075 4500 2925
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 3000 7800 3000
2 1 0 1 0 7 100 -1 -1 0.000 0 0 -1 0 0 2
1200 3900 7800 3900
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
6375 2250 6300 2250 6300 2550 6375 2550
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
1875 2250 1800 2250 1800 2550 1875 2550
2 2 0 0 0 4 60 -1 10 0.000 0 0 -1 0 0 5
1800 2325 6300 2325 6300 2475 1800 2475 1800 2325
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5175 2850 5100 2850 5100 3150 5175 3150
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7575 2850 7500 2850 7500 3150 7575 3150
2 1 0 4 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3300 900 5700 900
2 1 0 4 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3300 1800 4500 1800
2 1 0 4 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5700 1800 6900 1800
2 1 0 4 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2700 3900 3900 3900
2 1 0 4 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5700 3900 6900 3900
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
1800 600 1800 4800
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
6300 600 6300 4800
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 1 2
0 0 1.00 60.00 120.00
0 0 1.00 60.00 120.00
1800 4725 6300 4725
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
8100 -1500 8100 4200
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
8700 -1500 8700 4200
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9300 -1500 9300 4200
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
8100 600 9300 600
2 2 0 0 0 32 200 -1 20 0.000 0 0 -1 0 0 5
900 -1800 9600 -1800 9600 6000 900 6000 900 -1800
3 0 0 4 1 7 50 -1 -1 0.000 0 0 0 2
1200 5700 2700 5700
0.000 0.000
4 1 4 50 -1 14 12 1.5708 4 165 2160 2325 2250 perpandicular span\001
4 1 4 40 -1 14 14 0.0000 4 150 1500 4050 2250 conflicted\001
4 1 0 50 -1 12 14 0.0000 4 135 150 4650 4200 L\001
4 1 0 50 -1 12 14 0.0000 4 135 150 3300 4200 G\001
4 1 0 50 -1 12 14 0.0000 4 135 150 6300 4200 G\001
4 1 0 50 -1 12 14 0.0000 4 135 150 3900 3300 G\001
4 1 0 50 -1 12 14 0.0000 4 135 150 6000 3300 G\001
4 1 0 50 -1 12 14 0.0000 4 135 150 4500 750 G\001
4 1 0 50 -1 12 14 0.0000 4 135 150 6300 1650 G\001
4 1 0 50 -1 12 14 0.0000 4 135 150 3900 1650 G\001
4 0 1 50 -1 14 14 0.0000 4 150 4200 2775 5700 accounted conflict intervals\001
4 1 4 50 -1 12 12 0.0000 4 165 3000 3900 4650 conflict span (begin,end)\001
4 0 0 50 -1 14 12 1.5708 4 120 1800 9075 450 Candidate Order\001
4 0 0 50 -1 14 12 1.5708 4 150 1680 8475 375 Track Id/Index\001
4 1 0 50 -1 14 12 0.0000 4 150 360 8400 3975 [0]\001
4 1 0 50 -1 14 12 0.0000 4 150 360 8400 975 [3]\001
4 1 0 50 -1 14 12 0.0000 4 150 360 8400 1875 [2]\001
4 1 0 50 -1 14 12 0.0000 4 150 360 8400 3075 [1]\001
4 1 0 50 -1 14 12 0.0000 4 120 120 9000 3075 0\001
4 1 0 50 -1 14 12 0.0000 4 120 120 9000 975 1\001
4 1 0 50 -1 14 12 0.0000 4 120 120 9000 1875 2\001
4 1 0 50 -1 14 12 0.0000 4 120 120 9000 3975 3\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

View File

@ -0,0 +1,145 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
0 32 #ffffdd
6 2475 975 2925 1275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2
2550 1200 2850 1200
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
2700 1050 2700 1200
-6
6 3225 1125 3675 1425
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
3300 1200 3600 1200
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
3450 1350 3450 1200
-6
6 4125 975 4575 1275
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
4200 1200 4500 1200
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
4350 1050 4350 1200
-6
6 5175 975 5475 1425
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
5400 1350 5400 1050
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2
5250 1200 5400 1200
-6
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 3
1800 1200 1650 1200 1650 1350
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
2700 1200 2700 300
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
3450 1200 3450 1800
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
4350 1200 4350 600
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
5400 1200 5400 1800
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
5400 1200 5400 0
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
1650 1950 1650 2250
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
1500 2100 1650 2100
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
1650 2100 1650 2850
2 1 3 1 0 7 70 -1 -1 4.000 0 0 7 0 0 2
1725 2850 6300 2850
2 1 3 1 0 7 70 -1 -1 4.000 0 0 7 0 0 2
4425 600 6300 600
2 1 3 1 0 7 70 -1 -1 4.000 0 0 7 0 0 2
2775 300 6300 300
2 1 3 1 0 7 70 -1 -1 4.000 0 0 7 0 0 2
5475 0 6300 0
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
1650 1200 1650 2100
2 1 3 1 4 7 70 -1 -1 4.000 0 0 -1 0 0 2
1725 2100 6300 2100
2 1 0 2 0 7 70 -1 -1 6.000 0 0 -1 0 0 2
1650 1200 2700 1200
2 1 0 2 0 7 70 -1 -1 6.000 0 0 -1 0 0 2
3450 1200 5400 1200
2 1 0 2 0 7 69 -1 -1 6.000 0 0 -1 0 0 2
6000 0 6300 0
2 1 0 2 0 7 69 -1 -1 6.000 0 0 -1 0 0 2
6000 300 6300 300
2 1 0 2 0 7 69 -1 -1 6.000 0 0 -1 0 0 2
6000 600 6300 600
2 1 0 2 0 7 69 -1 -1 6.000 0 0 -1 0 0 2
6000 1800 6300 1800
2 1 0 2 0 7 69 -1 -1 6.000 0 0 -1 0 0 2
6000 2850 6300 2850
2 1 0 2 4 7 69 -1 -1 6.000 0 0 -1 0 0 2
6000 2100 6300 2100
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 3
1650 2700 1650 2850 1500 2850
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 3
2550 300 2700 300 2700 450
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 3
4200 600 4350 600 4350 750
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 3
5250 0 5400 0 5400 150
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 3
3450 1650 3450 1800 3300 1800
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 3
5400 1650 5400 1800 5550 1800
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 1 0 2
0 0 2.00 120.00 240.00
1200 3150 1200 -600
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 2850 1275 2850
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 2100 1275 2100
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 1200 1275 1200
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 300 1275 300
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 0 1275 0
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 600 1275 600
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 1800 1275 1800
2 1 3 1 0 7 70 -1 -1 4.000 0 0 7 0 0 2
5475 1200 6300 1200
2 1 0 2 0 7 69 -1 -1 6.000 0 0 -1 0 0 2
6000 1200 6300 1200
2 1 3 1 0 7 70 -1 -1 4.000 0 0 7 0 0 2
3525 1800 6300 1800
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
6900 -450 7200 -450
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
6900 150 7200 150
2 2 1 0 32 32 100 -1 20 2.000 0 0 -1 0 0 5
600 -900 8850 -900 8850 3750 600 3750 600 -900
2 2 0 2 0 0 50 -1 10 0.000 0 0 -1 0 0 5
6900 -225 7200 -225 7200 -150 6900 -150 6900 -225
2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5
2700 1200 3450 1200 3450 1275 2700 1275 2700 1200
4 1 0 60 -1 14 10 0.0000 4 105 210 6150 2775 -1\001
4 1 0 60 -1 14 10 0.0000 4 105 210 6150 1725 -2\001
4 1 0 60 -1 14 10 0.0000 4 105 210 6150 525 +1\001
4 1 0 60 -1 14 10 0.0000 4 105 210 6150 -75 +1\001
4 1 0 60 -1 14 10 0.0000 4 105 210 6150 225 +1\001
4 1 4 60 -1 14 10 0.0000 4 105 105 6150 2025 0\001
4 2 0 60 -1 14 12 0.0000 4 135 120 1050 -450 y\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 0 29\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 300 27\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 600 25\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 1200 21\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 2100 15\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 2850 10\001
4 1 0 60 -1 14 12 0.0000 4 150 3360 3750 3450 _attractors=[10,17,25,27,29]\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 1800 17\001
4 1 0 60 -1 14 10 0.0000 4 135 315 6150 1125 N/A\001
4 1 0 60 -1 14 12 0.0000 4 165 480 6150 -450 spin\001
4 0 0 60 -1 14 10 0.0000 4 135 840 7275 -450 aligneds\001
4 0 0 60 -1 14 10 0.0000 4 105 945 7275 -150 canonical\001
4 0 0 60 -1 14 10 0.0000 4 135 1470 7275 150 perpandiculars\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

View File

@ -0,0 +1,164 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
0 32 #ffffdd
6 2475 975 2925 1275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2
2550 1200 2850 1200
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
2700 1050 2700 1200
-6
6 3225 1125 3675 1425
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
3300 1200 3600 1200
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
3450 1350 3450 1200
-6
6 4125 975 4575 1275
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
4200 1200 4500 1200
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
4350 1050 4350 1200
-6
6 5175 975 5475 1425
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
5400 1350 5400 1050
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2
5250 1200 5400 1200
-6
6 6150 3000 7650 3300
3 0 0 1 0 7 50 -1 -1 4.000 0 0 0 4
6150 3000 6150 3150 6900 3150 6900 3300
0.000 1.000 1.000 0.000
3 0 0 1 0 7 50 -1 -1 4.000 0 0 0 4
7650 3000 7650 3150 6900 3150 6900 3300
0.000 1.000 1.000 0.000
-6
6 4725 3375 8700 3675
6 6000 3375 8700 3675
4 0 0 50 -1 32 14 0.0000 4 195 225 6225 3600 S(\001
4 0 0 50 -1 12 14 0.0000 4 45 150 6000 3600 =\001
4 0 0 50 -1 12 12 0.0000 4 150 2160 6450 3600 |axis - attractor|\001
4 0 0 50 -1 32 14 0.0000 4 195 75 8625 3600 )\001
-6
4 1 0 50 -1 14 10 0.0000 4 135 1155 5325 3600 wiringDelta\001
-6
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 3
1800 1200 1650 1200 1650 1350
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
2700 1200 2700 300
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
3450 1200 3450 1800
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
4350 1200 4350 600
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
5400 1200 5400 1800
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
5400 1200 5400 0
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
1650 1950 1650 2250
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
1500 2100 1650 2100
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
1650 2100 1650 2850
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
1650 1200 1650 2100
2 1 0 2 0 7 70 -1 -1 6.000 0 0 -1 0 0 2
1650 1200 2700 1200
2 1 0 2 0 7 70 -1 -1 6.000 0 0 -1 0 0 2
3450 1200 5400 1200
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 3
1650 2700 1650 2850 1500 2850
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 3
2550 300 2700 300 2700 450
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 3
4200 600 4350 600 4350 750
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 3
5250 0 5400 0 5400 150
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 3
3450 1650 3450 1800 3300 1800
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 3
5400 1650 5400 1800 5550 1800
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 1 0 2
0 0 2.00 120.00 240.00
1200 3150 1200 -600
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 2850 1275 2850
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 2100 1275 2100
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 1200 1275 1200
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 300 1275 300
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 0 1275 0
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 600 1275 600
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
1125 1800 1275 1800
2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5
2700 1200 3450 1200 3450 1275 2700 1275 2700 1200
2 1 3 1 0 7 70 -1 -1 4.000 0 0 7 0 0 2
1725 2850 6525 2850
2 1 3 1 0 7 70 -1 -1 4.000 0 0 7 0 0 2
3525 1800 6525 1800
2 1 3 1 0 7 70 -1 -1 4.000 0 0 7 0 0 2
5475 1200 6675 1200
2 1 3 1 0 7 70 -1 -1 4.000 0 0 7 0 0 2
4425 600 6825 600
2 1 3 1 0 7 70 -1 -1 4.000 0 0 7 0 0 2
2775 300 6975 300
2 1 3 1 0 7 70 -1 -1 4.000 0 0 7 0 0 2
5475 0 7125 0
2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2
6300 2250 7350 2250
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2
0 0 1.00 60.00 120.00
0 0 1.00 60.00 120.00
6450 2250 6450 1800
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2
0 0 1.00 60.00 120.00
0 0 1.00 60.00 120.00
6450 2250 6450 2850
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2
0 0 1.00 60.00 120.00
0 0 1.00 60.00 120.00
6600 2250 6600 1200
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2
0 0 1.00 60.00 120.00
0 0 1.00 60.00 120.00
6750 2250 6750 600
2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2
7950 150 8250 150
2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5
7950 -225 8250 -225 8250 -150 7950 -150 7950 -225
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
7950 -450 8250 -450
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2
0 0 1.00 60.00 120.00
0 0 1.00 60.00 120.00
6900 300 6900 2250
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2
0 0 1.00 60.00 120.00
0 0 1.00 60.00 120.00
7050 0 7050 2250
2 2 1 0 32 32 100 -1 20 2.000 0 0 -1 0 0 5
600 -900 10050 -900 10050 3900 600 3900 600 -900
4 2 0 60 -1 14 12 0.0000 4 135 120 1050 -450 y\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 0 29\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 300 27\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 600 25\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 1200 21\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 2100 15\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 2850 10\001
4 2 0 60 -1 14 10 0.0000 4 105 210 1050 1800 17\001
4 0 0 60 -1 14 10 0.0000 4 135 1470 8400 150 perpandiculars\001
4 0 0 60 -1 14 10 0.0000 4 105 945 8400 -150 canonical\001
4 0 0 60 -1 14 10 0.0000 4 135 840 8400 -450 aligneds\001
4 0 0 50 -1 14 10 0.0000 4 105 420 7500 2250 axis\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@ -0,0 +1,158 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
80.00
Single
-2
1200 2
0 32 #ffffdd
6 1200 1200 2625 1500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
1200 1200 2100 1200 2100 1500 1200 1500 1200 1200
4 0 7 50 -1 14 14 0.0000 4 150 750 1275 1425 id:10\001
4 0 0 50 -1 12 14 0.0000 4 150 450 2175 1425 d:7\001
-6
6 1200 6900 2625 7200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
1200 6900 2100 6900 2100 7200 1200 7200 1200 6900
4 0 7 50 -1 14 14 0.0000 4 150 750 1275 7125 id:10\001
4 0 0 50 -1 12 14 0.0000 4 150 450 2175 7125 d:7\001
-6
1 4 0 0 0 7 50 -1 0 2.000 1 0.0000 5100 2700 75 75 5025 2700 5175 2700
1 4 0 0 0 7 50 -1 0 2.000 1 0.0000 8100 2700 75 75 8025 2700 8175 2700
1 4 0 0 0 7 50 -1 0 2.000 1 0.0000 5100 6000 75 75 5025 6000 5175 6000
1 4 0 0 0 7 50 -1 0 2.000 1 0.0000 8100 6000 75 75 8025 6000 8175 6000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
3000 1200 3000 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
4800 1200 4800 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
6600 1200 6600 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
8400 1200 8400 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
10200 1200 10200 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
12000 1200 12000 3000
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
5400 900 7200 900
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
3000 1200 3900 1200 3900 1500 3000 1500 3000 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
4800 1200 5700 1200 5700 1500 4800 1500 4800 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
6600 1200 7500 1200 7500 1500 6600 1500 6600 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
8400 1200 9300 1200 9300 1500 8400 1500 8400 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
10200 1200 11100 1200 11100 1500 10200 1500 10200 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
12000 1200 12900 1200 12900 1500 12000 1500 12000 1200
2 1 0 4 4 7 50 -1 -1 10.000 0 0 -1 0 0 2
1800 2400 12600 2400
2 2 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 5
1200 1200 13800 1200 13800 3000 1200 3000 1200 1200
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
5400 825 5400 2700
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
7200 825 7200 2700
2 1 0 2 0 7 80 -1 0 6.000 0 0 -1 0 0 2
5100 2700 5100 3600
2 1 0 2 0 7 80 -1 0 6.000 0 0 -1 0 0 2
8100 2700 8100 3600
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 3
2400 7200 2400 7425 3000 7425
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 3
1650 7275 1650 7725 3000 7725
2 2 0 0 1 1 110 -1 30 2.000 0 0 -1 0 0 5
5100 4125 5400 4125 5400 6000 5100 6000 5100 4125
2 2 0 0 1 1 110 -1 30 2.000 0 0 -1 0 0 5
7200 4125 7500 4125 7500 6000 7200 6000 7200 4125
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
3000 4500 3000 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
4800 4500 4800 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
6600 4500 6600 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
8400 4500 8400 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
10200 4500 10200 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
12000 4500 12000 6300
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
5400 4200 7200 4200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
1200 4500 2100 4500 2100 4800 1200 4800 1200 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
3000 4500 3900 4500 3900 4800 3000 4800 3000 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
4800 4500 5700 4500 5700 4800 4800 4800 4800 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
6600 4500 7500 4500 7500 4800 6600 4800 6600 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
8400 4500 9300 4500 9300 4800 8400 4800 8400 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
10200 4500 11100 4500 11100 4800 10200 4800 10200 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
12000 4500 12900 4500 12900 4800 12000 4800 12000 4500
2 1 0 4 4 7 50 -1 -1 10.000 0 0 -1 0 0 2
1800 5700 5100 5700
2 2 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 5
1200 4500 13800 4500 13800 6300 1200 6300 1200 4500
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
5400 4125 5400 6000
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
7200 4125 7200 6000
2 1 0 4 19 7 50 -1 -1 0.000 0 0 -1 0 0 5
5100 5700 5100 5100 7500 5100 7500 5700 12600 5700
2 1 0 8 19 7 40 -1 -1 18.000 0 0 -1 0 0 3
4875 5700 5100 5700 5100 5475
2 1 0 8 19 7 40 -1 -1 18.000 0 0 -1 0 0 3
5100 5325 5100 5100 5250 5100
2 1 0 8 19 7 40 -1 -1 18.000 0 0 -1 0 0 3
7275 5100 7500 5100 7500 5250
2 1 0 8 19 7 40 -1 -1 18.000 0 0 -1 0 0 3
7500 5475 7500 5700 7725 5700
2 2 0 0 0 32 200 -1 20 0.000 0 0 -1 0 0 5
600 300 14400 300 14400 8100 600 8100 600 300
4 0 7 50 -1 14 14 0.0000 4 150 750 3075 1425 id:11\001
4 0 7 50 -1 14 14 0.0000 4 150 750 4875 1425 id:12\001
4 0 7 50 -1 14 14 0.0000 4 150 750 6675 1425 id:13\001
4 0 7 50 -1 14 14 0.0000 4 150 750 8475 1425 id:14\001
4 0 7 50 -1 14 14 0.0000 4 150 750 10275 1425 id:15\001
4 0 7 50 -1 14 14 0.0000 4 150 750 12075 1425 id:16\001
4 0 0 50 -1 12 14 0.0000 4 150 1800 8250 3600 imaxconflict\001
4 2 0 50 -1 12 14 0.0000 4 150 1800 5025 3600 iminconflict\001
4 1 1 50 -1 12 14 0.0000 4 150 1200 6300 750 interval\001
4 0 0 50 -1 12 14 0.0000 4 150 450 5775 1425 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 3975 1425 d:6\001
4 0 0 50 -1 12 14 0.0000 4 150 450 11175 1425 d:3\001
4 0 0 50 -1 12 14 0.0000 4 150 450 12975 1425 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 450 7575 1425 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 9375 1425 d:7\001
4 0 0 50 -1 14 14 0.0000 4 195 1950 3075 7500 GCell density\001
4 0 0 50 -1 14 14 0.0000 4 150 1200 3075 7800 GCell id\001
4 0 7 50 -1 14 14 0.0000 4 150 750 3075 4725 id:11\001
4 0 7 50 -1 14 14 0.0000 4 150 750 4875 4725 id:12\001
4 0 7 50 -1 14 14 0.0000 4 150 750 6675 4725 id:13\001
4 0 7 50 -1 14 14 0.0000 4 150 750 8475 4725 id:14\001
4 0 7 50 -1 14 14 0.0000 4 150 750 10275 4725 id:15\001
4 0 7 50 -1 14 14 0.0000 4 150 750 12075 4725 id:16\001
4 0 7 50 -1 14 14 0.0000 4 150 750 1275 4725 id:10\001
4 1 1 50 -1 12 14 0.0000 4 150 1200 6300 4050 interval\001
4 0 0 50 -1 12 14 0.0000 4 150 450 5775 4725 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 3975 4725 d:6\001
4 0 0 50 -1 12 14 0.0000 4 150 450 2175 4725 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 450 11175 4725 d:3\001
4 0 0 50 -1 12 14 0.0000 4 150 450 12975 4725 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 450 7575 4725 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 9375 4725 d:7\001
4 1 19 50 -1 14 14 0.0000 4 195 450 4800 5250 (b)\001
4 1 19 50 -1 14 14 0.0000 4 195 450 6300 5325 (c)\001
4 1 19 50 -1 14 14 0.0000 4 195 450 7800 5250 (d)\001
4 1 19 50 -1 14 14 0.0000 4 195 450 12375 5550 (e)\001
4 1 4 50 -1 14 14 0.0000 4 195 450 1950 5550 (a)\001
4 1 4 50 -1 14 14 0.0000 4 195 450 1950 2250 (a)\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,163 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
80.00
Single
-2
1200 2
0 32 #ffffdd
6 1200 1200 2625 1500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
1200 1200 2100 1200 2100 1500 1200 1500 1200 1200
4 0 7 50 -1 14 14 0.0000 4 150 750 1275 1425 id:10\001
4 0 0 50 -1 12 14 0.0000 4 150 450 2175 1425 d:7\001
-6
6 1200 6900 2625 7200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
1200 6900 2100 6900 2100 7200 1200 7200 1200 6900
4 0 7 50 -1 14 14 0.0000 4 150 750 1275 7125 id:10\001
4 0 0 50 -1 12 14 0.0000 4 150 450 2175 7125 d:7\001
-6
1 4 0 0 0 7 50 -1 0 2.000 1 0.0000 5100 6000 75 75 5025 6000 5175 6000
1 4 0 0 0 7 50 -1 0 2.000 1 0.0000 5100 2700 75 75 5025 2700 5175 2700
1 4 0 0 0 7 50 -1 0 2.000 1 0.0000 8100 2700 75 75 8025 2700 8175 2700
1 4 0 0 0 7 50 -1 0 2.000 1 0.0000 10500 2700 75 75 10425 2700 10575 2700
1 4 0 0 0 7 50 -1 0 2.000 1 0.0000 10500 6000 75 75 10425 6000 10575 6000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
3000 4500 3000 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
4800 4500 4800 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
6600 4500 6600 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
8400 4500 8400 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
10200 4500 10200 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
12000 4500 12000 6300
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
5400 4200 7200 4200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
1200 4500 2100 4500 2100 4800 1200 4800 1200 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
3000 4500 3900 4500 3900 4800 3000 4800 3000 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
4800 4500 5700 4500 5700 4800 4800 4800 4800 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
6600 4500 7500 4500 7500 4800 6600 4800 6600 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
8400 4500 9300 4500 9300 4800 8400 4800 8400 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
10200 4500 11100 4500 11100 4800 10200 4800 10200 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
12000 4500 12900 4500 12900 4800 12000 4800 12000 4500
2 1 0 4 4 7 50 -1 -1 10.000 0 0 -1 0 0 2
1800 5700 5100 5700
2 2 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 5
1200 4500 13800 4500 13800 6300 1200 6300 1200 4500
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
5400 4125 5400 6000
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
7200 4125 7200 6000
2 1 0 8 19 7 40 -1 -1 18.000 0 0 -1 0 0 3
4875 5700 5100 5700 5100 5475
2 1 0 8 19 7 40 -1 -1 18.000 0 0 -1 0 0 3
5100 5325 5100 5100 5250 5100
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
3000 1200 3000 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
4800 1200 4800 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
6600 1200 6600 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
8400 1200 8400 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
10200 1200 10200 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
12000 1200 12000 3000
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
5400 900 7200 900
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
3000 1200 3900 1200 3900 1500 3000 1500 3000 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
4800 1200 5700 1200 5700 1500 4800 1500 4800 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
6600 1200 7500 1200 7500 1500 6600 1500 6600 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
8400 1200 9300 1200 9300 1500 8400 1500 8400 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
10200 1200 11100 1200 11100 1500 10200 1500 10200 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
12000 1200 12900 1200 12900 1500 12000 1500 12000 1200
2 1 0 4 4 7 50 -1 -1 10.000 0 0 -1 0 0 2
1800 2400 12600 2400
2 2 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 5
1200 1200 13800 1200 13800 3000 1200 3000 1200 1200
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
5400 825 5400 2700
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
7200 825 7200 2700
2 1 0 2 0 7 80 -1 0 6.000 0 0 -1 0 0 2
5100 2700 5100 3600
2 1 0 2 0 7 80 -1 0 6.000 0 0 -1 0 0 2
10500 2700 10500 3600
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 3
2400 7200 2400 7425 2925 7425
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 3
1650 7200 1650 7725 2925 7725
2 2 0 0 1 1 110 -1 36 2.000 0 0 -1 0 0 5
5100 4125 5400 4125 5400 6000 5100 6000 5100 4125
2 2 0 0 1 1 110 -1 36 2.000 0 0 -1 0 0 5
7200 4125 7500 4125 7500 6000 7200 6000 7200 4125
2 1 0 4 19 7 50 -1 -1 10.000 0 0 -1 0 0 5
5100 5700 5100 5100 11100 5100 11100 5700 12600 5700
2 1 0 8 19 7 40 -1 -1 18.000 0 0 -1 0 0 3
10875 5100 11100 5100 11100 5250
2 1 0 8 19 7 40 -1 -1 18.000 0 0 -1 0 0 3
11100 5475 11100 5700 11325 5700
2 2 0 0 0 32 200 -1 20 0.000 0 0 -1 0 0 5
600 300 14400 300 14400 8100 600 8100 600 300
3 0 0 1 0 7 50 -1 -1 4.000 0 1 0 4
0 0 1.00 120.00 240.00
8100 2700 8700 2400 9900 3000 10500 2700
0.000 1.000 1.000 0.000
4 0 7 50 -1 14 14 0.0000 4 150 750 3075 4725 id:11\001
4 0 7 50 -1 14 14 0.0000 4 150 750 4875 4725 id:12\001
4 0 7 50 -1 14 14 0.0000 4 150 750 6675 4725 id:13\001
4 0 7 50 -1 14 14 0.0000 4 150 750 8475 4725 id:14\001
4 0 7 50 -1 14 14 0.0000 4 150 750 10275 4725 id:15\001
4 0 7 50 -1 14 14 0.0000 4 150 750 12075 4725 id:16\001
4 0 7 50 -1 14 14 0.0000 4 150 750 1275 4725 id:10\001
4 1 1 50 -1 12 14 0.0000 4 150 1200 6300 4050 interval\001
4 0 0 50 -1 12 14 0.0000 4 150 450 5775 4725 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 3975 4725 d:6\001
4 0 0 50 -1 12 14 0.0000 4 150 450 2175 4725 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 450 11175 4725 d:3\001
4 0 0 50 -1 12 14 0.0000 4 150 450 12975 4725 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 450 7575 4725 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 9375 4725 d:7\001
4 0 7 50 -1 14 14 0.0000 4 150 750 3075 1425 id:11\001
4 0 7 50 -1 14 14 0.0000 4 150 750 4875 1425 id:12\001
4 0 7 50 -1 14 14 0.0000 4 150 750 6675 1425 id:13\001
4 0 7 50 -1 14 14 0.0000 4 150 750 8475 1425 id:14\001
4 0 7 50 -1 14 14 0.0000 4 150 750 10275 1425 id:15\001
4 0 7 50 -1 14 14 0.0000 4 150 750 12075 1425 id:16\001
4 2 0 50 -1 12 14 0.0000 4 150 1800 5025 3600 iminconflict\001
4 1 1 50 -1 12 14 0.0000 4 150 1200 6300 750 interval\001
4 0 0 50 -1 12 14 0.0000 4 150 450 5775 1425 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 3975 1425 d:6\001
4 0 0 50 -1 12 14 0.0000 4 150 450 11175 1425 d:3\001
4 0 0 50 -1 12 14 0.0000 4 150 450 12975 1425 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 450 7575 1425 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 9375 1425 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 1800 10575 3600 imaxconflict\001
4 0 0 50 -1 14 14 0.0000 4 195 1950 3000 7500 GCell density\001
4 0 0 50 -1 14 14 0.0000 4 150 1200 3000 7800 GCell id\001
4 1 19 50 -1 14 14 0.0000 4 195 450 12450 5550 (e)\001
4 1 4 50 -1 14 14 0.0000 4 195 450 1950 5550 (a)\001
4 1 4 50 -1 14 14 0.0000 4 195 450 1950 2250 (a)\001
4 1 19 50 -1 14 14 0.0000 4 195 450 4800 5250 (b)\001
4 1 19 50 -1 14 14 0.0000 4 195 450 6000 5325 (c)\001
4 1 19 50 -1 14 14 0.0000 4 195 450 11400 5250 (d)\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -0,0 +1,152 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
80.00
Single
-2
1200 2
0 32 #ffffdd
6 1200 1200 2625 1500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
1200 1200 2100 1200 2100 1500 1200 1500 1200 1200
4 0 7 50 -1 14 14 0.0000 4 150 750 1275 1425 id:10\001
4 0 0 50 -1 12 14 0.0000 4 150 450 2175 1425 d:7\001
-6
6 1200 6900 2625 7200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
1200 6900 2100 6900 2100 7200 1200 7200 1200 6900
4 0 7 50 -1 14 14 0.0000 4 150 750 1275 7125 id:10\001
4 0 0 50 -1 12 14 0.0000 4 150 450 2175 7125 d:7\001
-6
1 4 0 0 0 7 50 -1 0 2.000 1 0.0000 5100 6000 75 75 5025 6000 5175 6000
1 4 0 0 0 7 50 -1 0 2.000 1 0.0000 5100 2700 75 75 5025 2700 5175 2700
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
3000 4500 3000 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
4800 4500 4800 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
6600 4500 6600 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
8400 4500 8400 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
10200 4500 10200 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
12000 4500 12000 6300
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
5400 4200 13500 4200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
1200 4500 2100 4500 2100 4800 1200 4800 1200 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
3000 4500 3900 4500 3900 4800 3000 4800 3000 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
4800 4500 5700 4500 5700 4800 4800 4800 4800 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
6600 4500 7500 4500 7500 4800 6600 4800 6600 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
8400 4500 9300 4500 9300 4800 8400 4800 8400 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
10200 4500 11100 4500 11100 4800 10200 4800 10200 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
12000 4500 12900 4500 12900 4800 12000 4800 12000 4500
2 1 0 4 4 7 50 -1 -1 10.000 0 0 -1 0 0 2
1800 5700 5100 5700
2 2 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 5
1200 4500 13800 4500 13800 6300 1200 6300 1200 4500
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
5400 4125 5400 6000
2 1 0 8 19 7 40 -1 -1 18.000 0 0 -1 0 0 3
4875 5700 5100 5700 5100 5475
2 1 0 8 19 7 40 -1 -1 18.000 0 0 -1 0 0 3
5100 5325 5100 5100 5250 5100
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
3000 1200 3000 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
4800 1200 4800 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
6600 1200 6600 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
8400 1200 8400 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
10200 1200 10200 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
12000 1200 12000 3000
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
5400 900 13500 900
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
3000 1200 3900 1200 3900 1500 3000 1500 3000 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
4800 1200 5700 1200 5700 1500 4800 1500 4800 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
6600 1200 7500 1200 7500 1500 6600 1500 6600 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
8400 1200 9300 1200 9300 1500 8400 1500 8400 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
10200 1200 11100 1200 11100 1500 10200 1500 10200 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
12000 1200 12900 1200 12900 1500 12000 1500 12000 1200
2 1 0 4 4 7 50 -1 -1 10.000 0 0 -1 0 0 2
1800 2400 11400 2400
2 2 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 5
1200 1200 13800 1200 13800 3000 1200 3000 1200 1200
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
5400 825 5400 2700
2 1 0 2 0 7 80 -1 0 6.000 0 0 -1 0 0 2
5100 2700 5100 3600
2 1 0 2 0 7 80 -1 0 6.000 0 0 -1 0 0 2
10500 3300 10500 3600
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 3
2400 7200 2400 7425 2925 7425
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 3
1650 7200 1650 7725 2925 7725
2 2 0 0 1 1 110 -1 36 2.000 0 0 -1 0 0 5
5100 4125 5400 4125 5400 6000 5100 6000 5100 4125
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
13500 825 13500 2700
2 1 0 1 0 1 50 -1 36 0.000 0 0 -1 0 0 2
10500 3525 12375 3525
2 1 0 4 19 7 50 -1 -1 10.000 0 0 -1 0 0 3
5100 5700 5100 5100 12600 5100
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
13500 4125 13500 6000
2 2 0 0 0 32 200 -1 20 0.000 0 0 -1 0 0 5
600 300 14400 300 14400 8100 600 8100 600 300
4 0 7 50 -1 14 14 0.0000 4 150 750 3075 4725 id:11\001
4 0 7 50 -1 14 14 0.0000 4 150 750 4875 4725 id:12\001
4 0 7 50 -1 14 14 0.0000 4 150 750 6675 4725 id:13\001
4 0 7 50 -1 14 14 0.0000 4 150 750 8475 4725 id:14\001
4 0 7 50 -1 14 14 0.0000 4 150 750 10275 4725 id:15\001
4 0 7 50 -1 14 14 0.0000 4 150 750 12075 4725 id:16\001
4 0 7 50 -1 14 14 0.0000 4 150 750 1275 4725 id:10\001
4 0 0 50 -1 12 14 0.0000 4 150 450 5775 4725 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 3975 4725 d:6\001
4 0 0 50 -1 12 14 0.0000 4 150 450 2175 4725 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 450 11175 4725 d:3\001
4 0 0 50 -1 12 14 0.0000 4 150 450 12975 4725 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 450 7575 4725 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 9375 4725 d:7\001
4 0 7 50 -1 14 14 0.0000 4 150 750 3075 1425 id:11\001
4 0 7 50 -1 14 14 0.0000 4 150 750 4875 1425 id:12\001
4 0 7 50 -1 14 14 0.0000 4 150 750 6675 1425 id:13\001
4 0 7 50 -1 14 14 0.0000 4 150 750 8475 1425 id:14\001
4 0 7 50 -1 14 14 0.0000 4 150 750 10275 1425 id:15\001
4 0 7 50 -1 14 14 0.0000 4 150 750 12075 1425 id:16\001
4 2 0 50 -1 12 14 0.0000 4 150 1800 5025 3600 iminconflict\001
4 0 0 50 -1 12 14 0.0000 4 150 450 5775 1425 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 3975 1425 d:6\001
4 0 0 50 -1 12 14 0.0000 4 150 450 11175 1425 d:3\001
4 0 0 50 -1 12 14 0.0000 4 150 450 12975 1425 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 450 7575 1425 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 9375 1425 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 1800 10575 3600 imaxconflict\001
4 0 0 50 -1 14 14 0.0000 4 195 1950 3000 7500 GCell density\001
4 0 0 50 -1 14 14 0.0000 4 150 1200 3000 7800 GCell id\001
4 1 4 50 -1 14 14 0.0000 4 195 450 1950 5550 (a)\001
4 1 4 50 -1 14 14 0.0000 4 195 450 1950 2250 (a)\001
4 1 19 50 -1 14 14 0.0000 4 195 450 4800 5250 (b)\001
4 1 19 50 -1 14 14 0.0000 4 195 450 6000 5325 (c)\001
4 1 1 50 -1 12 14 0.0000 4 150 1200 9600 825 interval\001
4 0 0 50 -1 14 14 0.0000 4 195 6600 5700 7200 The only dogleg is the min, the axis must be\001
4 0 0 50 -1 14 14 0.0000 4 195 7050 5700 7500 pushed to the left to stay clear of <interval>.\001
4 1 1 50 -1 12 14 0.0000 4 150 1200 9600 4125 interval\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -0,0 +1,152 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
80.00
Single
-2
1200 2
0 32 #ffffdd
6 1200 1200 2625 1500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
1200 1200 2100 1200 2100 1500 1200 1500 1200 1200
4 0 7 50 -1 14 14 0.0000 4 150 750 1275 1425 id:10\001
4 0 0 50 -1 12 14 0.0000 4 150 450 2175 1425 d:7\001
-6
6 1200 6900 2625 7200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
1200 6900 2100 6900 2100 7200 1200 7200 1200 6900
4 0 7 50 -1 14 14 0.0000 4 150 750 1275 7125 id:10\001
4 0 0 50 -1 12 14 0.0000 4 150 450 2175 7125 d:7\001
-6
1 4 0 0 0 7 50 -1 0 2.000 1 0.0000 8700 2700 75 75 8625 2700 8775 2700
1 4 0 0 0 7 50 -1 0 2.000 1 0.0000 8700 6000 75 75 8625 6000 8775 6000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
3000 4500 3000 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
4800 4500 4800 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
6600 4500 6600 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
8400 4500 8400 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
10200 4500 10200 6300
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
12000 4500 12000 6300
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
1200 4500 2100 4500 2100 4800 1200 4800 1200 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
3000 4500 3900 4500 3900 4800 3000 4800 3000 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
4800 4500 5700 4500 5700 4800 4800 4800 4800 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
6600 4500 7500 4500 7500 4800 6600 4800 6600 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
8400 4500 9300 4500 9300 4800 8400 4800 8400 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
10200 4500 11100 4500 11100 4800 10200 4800 10200 4500
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
12000 4500 12900 4500 12900 4800 12000 4800 12000 4500
2 2 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 5
1200 4500 13800 4500 13800 6300 1200 6300 1200 4500
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
3000 1200 3000 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
4800 1200 4800 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
6600 1200 6600 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
8400 1200 8400 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
10200 1200 10200 3000
2 1 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 2
12000 1200 12000 3000
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
3000 1200 3900 1200 3900 1500 3000 1500 3000 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
4800 1200 5700 1200 5700 1500 4800 1500 4800 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
6600 1200 7500 1200 7500 1500 6600 1500 6600 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
8400 1200 9300 1200 9300 1500 8400 1500 8400 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
10200 1200 11100 1200 11100 1500 10200 1500 10200 1200
2 2 0 1 0 7 100 -1 0 4.000 0 0 -1 0 0 5
12000 1200 12900 1200 12900 1500 12000 1500 12000 1200
2 2 1 1 0 7 70 -1 -1 4.000 0 0 -1 0 0 5
1200 1200 13800 1200 13800 3000 1200 3000 1200 1200
2 1 0 2 0 7 80 -1 0 6.000 0 0 -1 0 0 2
5100 2700 5100 3600
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 3
2400 7200 2400 7425 2925 7425
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 3
1650 7200 1650 7725 2925 7725
2 1 0 4 19 7 50 -1 -1 10.000 0 0 -1 0 0 3
9900 5700 9900 5100 12600 5100
2 1 0 4 4 7 50 -1 -1 10.000 0 0 -1 0 0 2
3300 2400 12900 2400
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
1500 825 1500 2700
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
1500 900 9600 900
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
9600 825 9600 2700
2 1 0 2 0 7 80 -1 0 6.000 0 0 -1 0 0 2
8700 2700 8700 3600
2 1 0 1 0 1 50 -1 36 0.000 0 0 -1 0 0 2
3300 3525 5175 3525
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
1500 4125 1500 6000
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
1500 4200 9600 4200
2 1 0 1 1 7 80 -1 0 4.000 0 0 -1 0 0 2
9600 4125 9600 6000
2 2 0 0 1 1 110 -1 36 2.000 0 0 -1 0 0 5
9600 4125 9900 4125 9900 6000 9600 6000 9600 4125
2 1 0 8 19 7 40 -1 -1 18.000 0 0 -1 0 0 3
9900 5325 9900 5100 10050 5100
2 1 0 4 4 7 50 -1 -1 10.000 0 0 -1 0 0 2
1800 5700 9900 5700
2 1 0 8 19 7 40 -1 -1 18.000 0 0 -1 0 0 3
9675 5700 9900 5700 9900 5475
2 2 0 0 0 32 200 -1 20 0.000 0 0 -1 0 0 5
600 300 14400 300 14400 8100 600 8100 600 300
4 0 7 50 -1 14 14 0.0000 4 150 750 3075 4725 id:11\001
4 0 7 50 -1 14 14 0.0000 4 150 750 4875 4725 id:12\001
4 0 7 50 -1 14 14 0.0000 4 150 750 6675 4725 id:13\001
4 0 7 50 -1 14 14 0.0000 4 150 750 8475 4725 id:14\001
4 0 7 50 -1 14 14 0.0000 4 150 750 10275 4725 id:15\001
4 0 7 50 -1 14 14 0.0000 4 150 750 12075 4725 id:16\001
4 0 7 50 -1 14 14 0.0000 4 150 750 1275 4725 id:10\001
4 0 0 50 -1 12 14 0.0000 4 150 450 5775 4725 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 3975 4725 d:6\001
4 0 0 50 -1 12 14 0.0000 4 150 450 2175 4725 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 450 11175 4725 d:3\001
4 0 0 50 -1 12 14 0.0000 4 150 450 12975 4725 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 450 7575 4725 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 9375 4725 d:7\001
4 0 7 50 -1 14 14 0.0000 4 150 750 3075 1425 id:11\001
4 0 7 50 -1 14 14 0.0000 4 150 750 4875 1425 id:12\001
4 0 7 50 -1 14 14 0.0000 4 150 750 6675 1425 id:13\001
4 0 7 50 -1 14 14 0.0000 4 150 750 8475 1425 id:14\001
4 0 7 50 -1 14 14 0.0000 4 150 750 10275 1425 id:15\001
4 0 7 50 -1 14 14 0.0000 4 150 750 12075 1425 id:16\001
4 2 0 50 -1 12 14 0.0000 4 150 1800 5025 3600 iminconflict\001
4 0 0 50 -1 12 14 0.0000 4 150 450 5775 1425 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 3975 1425 d:6\001
4 0 0 50 -1 12 14 0.0000 4 150 450 11175 1425 d:3\001
4 0 0 50 -1 12 14 0.0000 4 150 450 12975 1425 d:7\001
4 0 0 50 -1 12 14 0.0000 4 150 450 7575 1425 d:5\001
4 0 0 50 -1 12 14 0.0000 4 150 450 9375 1425 d:7\001
4 0 0 50 -1 14 14 0.0000 4 195 1950 3000 7500 GCell density\001
4 0 0 50 -1 14 14 0.0000 4 150 1200 3000 7800 GCell id\001
4 1 4 50 -1 14 14 0.0000 4 195 450 1950 5550 (a)\001
4 0 0 50 -1 14 14 0.0000 4 195 6600 5700 7200 The only dogleg is the max, the axis must be\001
4 0 0 50 -1 14 14 0.0000 4 195 7200 5700 7500 pushed to the right to stay clear of <interval>.\001
4 1 4 50 -1 14 14 0.0000 4 195 450 3525 2250 (a)\001
4 1 1 50 -1 12 14 0.0000 4 150 1200 5100 825 interval\001
4 0 0 50 -1 12 14 0.0000 4 150 1800 8775 3600 imaxconflict\001
4 1 1 50 -1 12 14 0.0000 4 150 1200 5100 4125 interval\001
4 1 19 50 -1 14 14 0.0000 4 195 450 12450 5325 (c)\001
4 1 19 50 -1 14 14 0.0000 4 195 450 9675 5250 (b)\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@ -1,66 +0,0 @@
#FIG 3.2
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
6 900 0 2700 4800
2 2 0 0 4 7 60 -1 45 0.000 0 0 7 0 0 5
1650 0 1950 0 1950 1800 1650 1800 1650 0
2 2 0 0 4 7 60 -1 45 0.000 0 0 7 0 0 5
1650 3000 1950 3000 1950 4800 1650 4800 1650 3000
2 2 0 0 7 4 60 -1 38 2.000 0 0 -1 0 0 5
1650 1800 1950 1800 1950 3000 1650 3000 1650 1800
4 1 4 50 -1 14 12 0.0000 4 180 1785 1800 1725 right axis weight\001
4 1 4 50 -1 14 12 0.0000 4 180 1680 1800 3225 left axis weight\001
-6
6 375 0 675 4800
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
600 4800 600 3000
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
600 0 600 1800
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
600 1800 600 3000
4 1 4 50 -1 14 12 1.5708 4 180 1470 525 4050 _perpandicular\001
-6
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 2400 6900 2400
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 900 6900 900
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 3300 6900 3300
2 2 0 0 0 7 60 -1 15 0.000 0 0 -1 0 0 5
3000 900 6900 900 6900 3300 3000 3300 3000 900
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7050 3300 8400 3300
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7050 900 8400 900
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7050 1500 7800 1500
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7125 2700 7800 2700
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 1 2
3 1 1.00 60.00 120.00
3 1 1.00 60.00 120.00
7725 1500 7725 2700
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 1 2
3 1 1.00 60.00 120.00
3 1 1.00 60.00 120.00
8325 900 8325 3300
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
6900 3000 300 3000
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
6900 1800 300 1800
2 2 0 0 0 7 55 -1 10 0.000 0 0 -1 0 0 5
3000 1500 6900 1500 6900 2700 3000 2700 3000 1500
2 2 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 5
2925 2325 3075 2325 3075 2475 2925 2475 2925 2325
2 2 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 5
6825 2325 6975 2325 6975 2475 6825 2475 6825 2325
4 1 0 50 -1 14 12 1.5708 4 180 840 7950 2100 _optimal\001
4 1 0 50 -1 14 12 1.5708 4 165 1155 8550 2100 _constraint\001

View File

@ -1,46 +0,0 @@
#FIG 3.2
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
600 3600 6600 3600
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
900 3600 2400 3600 2400 6300
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
6300 3600 4800 3600 4800 900
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 4
2700 900 2700 3600 4500 3600 4500 6300
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
900 3300 1200 3300 1200 3600 900 3600 900 3300
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
6000 3300 6300 3300 6300 3600 6000 3600 6000 3300
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
2700 900 3000 900 3000 1200 2700 1200 2700 900
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
0 0 525 0 525 525 0 525 0 0
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
525 0 3150 0 3150 525 525 525 525 0
2 1 0 1 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
2700 600 2700 6600
2 1 0 1 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
4500 600 4500 6600
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
4800 600 4800 6600
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
2400 600 2400 6600
2 2 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 5
0 0 7200 0 7200 7200 0 7200 0 0
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
1200 2400 3600 2400 3600 4800 1200 4800 1200 2400
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
3600 2400 6000 2400 6000 4800 3600 4800 3600 2400
4 1 0 50 -1 14 18 0.0000 4 135 165 1050 3525 a\001
4 1 0 50 -1 14 18 0.0000 4 180 165 6150 3525 b\001
4 1 4 50 -1 14 18 0.0000 4 135 165 2850 1125 c\001
4 1 0 50 -1 14 24 0.0000 4 240 225 300 375 1\001
4 0 0 50 -1 14 24 0.0000 4 240 2250 675 375 Free Track\001

View File

@ -1,124 +0,0 @@
#FIG 3.2
Landscape
Center
Inches
Letter
60.00
Single
-2
1200 2
6 8925 825 9375 1275
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
9000 900 9300 900 9300 1200 9000 1200 9000 900
4 1 4 50 -1 14 18 0.0000 4 135 165 9150 1125 c\001
-6
6 825 3525 1275 3975
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
900 3600 1200 3600 1200 3900 900 3900 900 3600
4 1 0 50 -1 14 18 0.0000 4 135 165 1050 3825 a\001
-6
6 5925 3525 6375 3975
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
6000 3600 6300 3600 6300 3900 6000 3900 6000 3600
4 1 0 50 -1 14 18 0.0000 4 180 165 6150 3825 b\001
-6
6 8025 3525 8475 3975
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
8100 3600 8400 3600 8400 3900 8100 3900 8100 3600
4 1 0 50 -1 14 18 0.0000 4 135 165 8250 3825 a\001
-6
6 13125 3525 13575 3975
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
13200 3600 13500 3600 13500 3900 13200 3900 13200 3600
4 1 0 50 -1 14 18 0.0000 4 180 165 13350 3825 b\001
-6
6 1725 825 2175 1275
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
1800 900 2100 900 2100 1200 1800 1200 1800 900
4 1 4 50 -1 14 18 0.0000 4 135 165 1950 1125 c\001
-6
6 4425 2475 5175 2925
1 4 0 2 0 7 45 -1 20 0.000 1 0.0000 4800 2700 75 75 4725 2700 4875 2700
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
4500 2550 5100 2850
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5100 2550 4500 2850
-6
1 4 0 2 0 7 45 -1 20 0.000 1 0.0000 2400 4800 75 75 2325 4800 2475 4800
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
7800 3600 13800 3600
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
600 3600 6600 3600
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
900 3600 2400 3600 2400 6300
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
2400 4800 1500 4800
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
12600 600 12600 6600
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
12300 600 12300 6600
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
9300 6600 9300 600
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
5100 600 5100 6600
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
2100 600 2100 6600
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
4800 600 4800 6600
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
2400 600 2400 6600
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
0 0 525 0 525 525 0 525 0 0
2 1 0 4 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
12000 2775 12000 900
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
9600 600 9600 6600
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
12000 600 12000 6600
2 2 0 2 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
0 0 14400 0 14400 7800 0 7800 0 0
2 2 0 2 0 7 45 -1 -1 0.000 0 0 -1 0 0 5
525 0 3525 0 3525 525 525 525 525 0
2 1 1 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 3
12525 3600 12525 2775 12000 2775
2 1 1 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 2
9525 3600 9525 6300
2 1 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
8100 3600 9525 3600
2 1 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
12525 3600 13500 3600
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
9300 900 9300 3675
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
5100 3675 5100 6300
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
12300 3675 12300 6300
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
2100 900 2100 3675
2 1 1 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
2100 3675 5100 3675
2 1 1 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
9300 3675 12300 3675
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
6300 3600 4800 3600
2 1 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
4800 3600 4800 900
2 1 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
4725 900 4725 3600
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
8400 2400 10800 2400 10800 4800 8400 4800 8400 2400
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
10800 2400 13200 2400 13200 4800 10800 4800 10800 2400
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
1200 2400 3600 2400 3600 4800 1200 4800 1200 2400
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
3600 2400 6000 2400 6000 4800 3600 4800 3600 2400
2 1 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
11925 900 11925 2775
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
7800 2700 13800 2700
4 1 0 50 -1 14 24 0.0000 4 240 225 300 375 2\001
4 0 0 45 -1 14 24 0.0000 4 315 2700 675 375 Soft Overlap\001
4 0 0 50 -1 14 20 0.0000 4 255 5775 8400 6900 (a/vertical) is pushed to the left.\001
4 0 0 50 -1 14 20 0.0000 4 240 3795 8400 7200 (b/vertical) is broken.\001

View File

@ -1,127 +0,0 @@
#FIG 3.2
Landscape
Center
Inches
Letter
60.00
Single
-2
1200 2
6 5925 3225 6375 3675
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
6000 3300 6300 3300 6300 3600 6000 3600 6000 3300
4 1 0 50 -1 14 18 0.0000 4 180 165 6150 3525 b\001
-6
6 13125 3600 13575 4050
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
13200 3675 13500 3675 13500 3975 13200 3975 13200 3675
4 1 0 50 -1 14 18 0.0000 4 180 165 13350 3900 b\001
-6
6 1725 825 2175 1275
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
1800 900 2100 900 2100 1200 1800 1200 1800 900
4 1 4 50 -1 14 18 0.0000 4 135 165 1950 1125 c\001
-6
6 8925 825 9375 1275
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
9000 900 9300 900 9300 1200 9000 1200 9000 900
4 1 4 50 -1 14 18 0.0000 4 135 165 9150 1125 c\001
-6
6 825 3150 1275 3600
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
900 3225 1200 3225 1200 3525 900 3525 900 3225
4 1 0 50 -1 14 18 0.0000 4 135 165 1050 3450 a\001
-6
6 1425 3225 1875 3975
1 4 0 2 0 7 45 -1 20 0.000 1 0.0000 1650 3600 75 75 1575 3600 1725 3600
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1500 3300 1800 3900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1500 3900 1800 3300
-6
6 8025 3150 8475 3600
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
8100 3225 8400 3225 8400 3525 8100 3525 8100 3225
4 1 0 50 -1 14 18 0.0000 4 135 165 8250 3450 a\001
-6
1 4 0 2 0 7 45 -1 20 0.000 1 0.0000 5400 3600 75 75 5325 3600 5475 3600
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
7800 3600 13800 3600
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
600 3600 6600 3600
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
6300 3600 4800 3600 4800 900
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
12300 600 12300 6600
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
9300 6600 9300 600
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
5100 600 5100 6600
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
2100 600 2100 6600
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
4800 600 4800 6600
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
2400 600 2400 6600
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
0 0 525 0 525 525 0 525 0 0
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
5400 3300 5400 4200
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
5400 3900 5400 3000
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
9600 600 9600 6600
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
9000 600 9000 6600
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
7800 4500 13500 4500
2 2 0 2 0 7 45 -1 -1 0.000 0 0 -1 0 0 5
525 0 3525 0 3525 525 525 525 525 0
2 2 0 2 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
0 0 14400 0 14400 7500 0 7500 0 0
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
12000 3675 12000 900
2 1 1 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
12000 3675 13500 3675
2 1 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
8925 3600 8100 3600
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
2100 900 2100 3675
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
9300 900 9300 3750
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
5100 3675 5100 6300
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
12300 3750 12300 6300
2 1 1 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
2100 3675 5100 3675
2 1 1 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
9300 3750 12300 3750
2 1 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
9600 4575 9600 6300
2 1 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
900 3525 2400 3525
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
900 3600 2400 3600
2 1 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
2400 3600 2400 6300
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
12000 600 12000 6600
2 1 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
8100 3525 8925 3525
2 1 1 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 3
8925 3600 8925 4575 9600 4575
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
1200 2100 3600 2100 3600 4800 1200 4800 1200 2100
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
3600 2100 6000 2100 6000 4800 3600 4800 3600 2100
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
8400 2100 10800 2100 10800 4800 8400 4800 8400 2100
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
10800 2100 13200 2100 13200 4800 10800 4800 10800 2100
4 1 0 50 -1 14 24 0.0000 4 240 225 300 375 3\001
4 0 0 45 -1 14 24 0.0000 4 315 2700 675 375 Hard Overlap\001
4 0 0 50 -1 14 20 0.0000 4 240 4125 8400 6900 (a/horizontal) is broken.\001
4 0 0 50 -1 14 20 0.0000 4 255 4620 8400 7200 (b/horizontal) is dislodged.\001

View File

@ -1,108 +0,0 @@
#FIG 3.2
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
6 825 3825 1275 4275
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
900 3900 1200 3900 1200 4200 900 4200 900 3900
4 1 0 50 -1 14 18 0.0000 4 135 165 1050 4125 a\001
-6
6 5925 3825 6375 4275
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
6000 3900 6300 3900 6300 4200 6000 4200 6000 3900
4 1 0 50 -1 14 18 0.0000 4 180 165 6150 4125 b\001
-6
6 13125 3825 13575 4275
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
13200 3900 13500 3900 13500 4200 13200 4200 13200 3900
4 1 0 50 -1 14 18 0.0000 4 180 165 13350 4125 b\001
-6
6 4125 1425 4575 1875
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
4200 1500 4500 1500 4500 1800 4200 1800 4200 1500
4 1 4 50 -1 14 18 0.0000 4 135 165 4350 1725 c\001
-6
6 4425 3900 4875 4650
1 4 0 2 4 7 45 -1 20 0.000 1 0.0000 4650 4275 75 75 4575 4275 4725 4275
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
4500 3975 4800 4575
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
4500 4575 4800 3975
-6
6 8025 3825 8475 4275
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
8100 3900 8400 3900 8400 4200 8100 4200 8100 3900
4 1 0 50 -1 14 18 0.0000 4 135 165 8250 4125 a\001
-6
6 11325 1425 11775 1875
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
11400 1500 11700 1500 11700 1800 11400 1800 11400 1500
4 1 4 50 -1 14 18 0.0000 4 135 165 11550 1725 c\001
-6
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
7800 4200 13800 4200
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
600 4200 6600 4200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
900 4200 3900 4200 3900 6900
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
6300 4200 5100 4200 5100 1500
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
13575 4200 12300 4200 12300 1500
2 2 0 2 0 7 45 -1 -1 0.000 0 0 -1 0 0 5
525 0 3525 0 3525 825 525 825 525 0
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
0 0 525 0 525 825 0 825 0 0
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
8100 4200 11100 4200 11100 6900
2 2 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 5
0 0 14400 0 14400 8100 0 8100 0 0
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
1200 3000 3600 3000 3600 5400 1200 5400 1200 3000
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
3600 3000 6000 3000 6000 5400 3600 5400 3600 3000
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
8400 3000 10800 3000 10800 5400 8400 5400 8400 3000
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
10800 3000 13200 3000 13200 5400 10800 5400 10800 3000
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
5400 1200 5400 7200
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
5400 4275 5400 6900
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
5100 1200 5100 7200
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
4200 1200 4200 7200
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
3900 1200 3900 7200
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
4200 1500 4200 4275
2 1 1 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
4200 4275 5400 4275
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
12600 1200 12600 7200
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
12600 5175 12600 6900
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
11400 4500 11400 1200
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
12000 1200 12000 7200
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
11100 1200 11100 7200
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
12300 1200 12300 7200
2 1 1 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 4
11400 4275 11925 4275 11925 5175 12525 5175
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
11400 1500 11400 4275
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
7800 5100 13725 5100
4 1 0 50 -1 14 24 0.0000 4 240 225 300 375 4\001
4 0 0 45 -1 14 24 0.0000 4 240 2250 675 375 Self Relax\001
4 0 0 60 -1 12 18 0.0000 4 240 1650 675 675 Local only\001
4 0 0 50 -1 14 20 0.0000 4 240 4125 8700 7800 (c/horizontal) is broken.\001

View File

@ -1,110 +0,0 @@
#FIG 3.2
Landscape
Center
Inches
Letter
60.00
Single
-2
1200 2
6 825 3825 1275 4275
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
900 3900 1200 3900 1200 4200 900 4200 900 3900
4 1 0 50 -1 14 18 0.0000 4 135 165 1050 4125 a\001
-6
6 5925 3825 6375 4275
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
6000 3900 6300 3900 6300 4200 6000 4200 6000 3900
4 1 0 50 -1 14 18 0.0000 4 180 165 6150 4125 b\001
-6
6 13125 3825 13575 4275
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
13200 3900 13500 3900 13500 4200 13200 4200 13200 3900
4 1 0 50 -1 14 18 0.0000 4 180 165 13350 4125 b\001
-6
6 8025 3825 8475 4275
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
8100 3900 8400 3900 8400 4200 8100 4200 8100 3900
4 1 0 50 -1 14 18 0.0000 4 135 165 8250 4125 a\001
-6
6 1725 1425 2175 1875
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
1800 1500 2100 1500 2100 1800 1800 1800 1800 1500
4 1 4 50 -1 14 18 0.0000 4 135 165 1950 1725 c\001
-6
6 8925 1425 9375 1875
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
9000 1500 9300 1500 9300 1800 9000 1800 9000 1500
4 1 4 50 -1 14 18 0.0000 4 135 165 9150 1725 c\001
-6
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
7800 4200 13800 4200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
900 4200 3900 4200 3900 6900
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
6300 4200 5100 4200 5100 1500
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
13575 4200 12300 4200 12300 1500
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
8100 4200 11100 4200 11100 6900
2 2 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 5
0 0 14400 0 14400 8100 0 8100 0 0
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
1200 3000 3600 3000 3600 5400 1200 5400 1200 3000
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
3600 3000 6000 3000 6000 5400 3600 5400 3600 3000
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
8400 3000 10800 3000 10800 5400 8400 5400 8400 3000
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
10800 3000 13200 3000 13200 5400 10800 5400 10800 3000
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
5100 1200 5100 7200
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
11100 1200 11100 7200
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
12300 1200 12300 7200
2 2 0 2 0 7 45 -1 -1 0.000 0 0 -1 0 0 5
525 0 4500 0 4500 600 525 600 525 0
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
0 0 525 0 525 600 0 600 0 0
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
3900 1200 3900 7200
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
1800 1200 1800 7200
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
600 4200 6600 4200
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
1800 1500 1800 4275
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
4800 1200 4800 7200
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
4200 1200 4200 7200
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
4800 4275 4800 6900
2 1 1 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
1800 4275 4800 4275
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
4200 1500 4200 4275
2 2 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 5
4125 4200 4275 4200 4275 4350 4125 4350 4125 4200
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
9000 7200 9000 1200
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
11400 1200 11400 7200
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
11400 1500 11400 4275
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
9000 1500 9000 3975
2 1 0 1 4 7 60 -1 20 0.000 0 0 -1 0 0 2
12000 1200 12000 7200
2 1 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
12000 4275 12000 6900
2 1 1 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
11400 4275 12000 4275
2 1 1 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
9000 3975 11325 3975
2 2 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 5
11325 3825 11475 3825 11475 4350 11325 4350 11325 3825
4 1 0 50 -1 14 24 0.0000 4 240 225 300 375 5\001
4 0 0 45 -1 14 24 0.0000 4 315 3600 675 375 Self Desalignate\001
4 0 0 50 -1 14 20 0.0000 4 255 4950 8400 7800 (c/horizontal) is desalignate.\001

View File

@ -1,96 +0,0 @@
#FIG 3.2
Landscape
Center
Inches
Letter
60.00
Single
-2
1200 2
6 825 3825 1275 4275
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
900 3900 1200 3900 1200 4200 900 4200 900 3900
4 1 0 50 -1 14 18 0.0000 4 135 165 1050 4125 a\001
-6
6 5925 3825 6375 4275
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
6000 3900 6300 3900 6300 4200 6000 4200 6000 3900
4 1 0 50 -1 14 18 0.0000 4 180 165 6150 4125 b\001
-6
6 13125 3825 13575 4275
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
13200 3900 13500 3900 13500 4200 13200 4200 13200 3900
4 1 0 50 -1 14 18 0.0000 4 180 165 13350 4125 b\001
-6
6 8025 3825 8475 4275
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
8100 3900 8400 3900 8400 4200 8100 4200 8100 3900
4 1 0 50 -1 14 18 0.0000 4 135 165 8250 4125 a\001
-6
6 1575 2325 2025 2775
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
1650 2400 1950 2400 1950 2700 1650 2700 1650 2400
4 1 4 50 -1 14 18 0.0000 4 135 165 1800 2625 c\001
-6
6 8925 2325 9375 2775
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
9000 2400 9300 2400 9300 2700 9000 2700 9000 2400
4 1 4 50 -1 14 18 0.0000 4 135 165 9150 2625 c\001
-6
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
7800 4200 13800 4200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
900 4200 3900 4200 3900 6900
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
6300 4200 5100 4200 5100 1500
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
13575 4200 12300 4200 12300 1500
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3
8100 4200 11100 4200 11100 6900
2 2 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 5
0 0 14400 0 14400 8100 0 8100 0 0
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
1200 3000 3600 3000 3600 5400 1200 5400 1200 3000
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
3600 3000 6000 3000 6000 5400 3600 5400 3600 3000
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
8400 3000 10800 3000 10800 5400 8400 5400 8400 3000
2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5
10800 3000 13200 3000 13200 5400 10800 5400 10800 3000
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
5100 1200 5100 7200
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
11100 1200 11100 7200
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
12300 1200 12300 7200
2 2 0 2 0 7 45 -1 -1 0.000 0 0 -1 0 0 5
525 0 4500 0 4500 600 525 600 525 0
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
0 0 525 0 525 600 0 600 0 0
2 1 0 1 0 7 60 -1 20 0.000 0 0 -1 0 0 2
3900 1200 3900 7200
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
600 4200 6600 4200
2 1 1 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
1800 4275 4800 4275
2 2 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 5
4725 4125 4875 4125 4875 4875 4725 4875 4725 4125
2 2 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 5
1725 3225 1875 3225 1875 4350 1725 4350 1725 3225
2 2 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 5
8925 3225 9075 3225 9075 4350 8925 4350 8925 3225
2 2 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 5
11925 4125 12075 4125 12075 4875 11925 4875 11925 4125
2 1 1 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 6
9000 3675 9525 3675 9525 4275 11325 4275 11325 4575 12000 4575
2 1 0 1 4 7 60 -1 -1 4.000 0 0 -1 0 0 2
9600 1200 9600 7200
2 1 0 1 4 7 60 -1 -1 4.000 0 0 -1 0 0 2
11400 1200 11400 7200
2 1 0 1 4 7 60 -1 -1 4.000 0 0 -1 0 0 2
7800 3600 13800 3600
2 1 0 1 4 7 60 -1 -1 4.000 0 0 -1 0 0 2
7800 4500 13800 4500
4 1 0 50 -1 14 24 0.0000 4 240 225 300 375 6\001
4 0 0 45 -1 14 24 0.0000 4 240 2700 675 375 Self Slacken\001
4 0 0 45 -1 14 20 0.0000 4 240 4620 9000 7800 [c/horizontal] is slackened.\001

View File

@ -1,82 +0,0 @@
#FIG 3.2
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
6 2100 7350 2325 8100
4 1 4 50 -1 15 18 1.5708 4 165 660 2325 7725 Free\001
-6
6 7500 3600 7725 4350
4 1 4 50 -1 15 18 1.5708 4 165 660 7725 3975 Free\001
-6
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
8400 6600 1125 6600
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
6900 5400 1125 5400
2 1 0 2 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
1800 1575 1800 9900
2 1 1 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
1800 1575 1800 5400
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
1200 4200 1200 5400
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
1200 5400 1200 6600
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
1200 8400 1200 6600
2 4 0 2 0 7 45 -1 -1 6.000 0 0 7 0 0 5
3150 6150 3150 5850 1650 5850 1650 6150 3150 6150
2 4 0 2 0 7 45 -1 -1 6.000 0 0 7 0 0 5
8325 6150 8325 5850 6750 5850 6750 6150 8325 6150
2 2 1 0 4 7 60 -1 45 2.000 0 0 -1 0 0 5
2100 1500 2400 1500 2400 5400 2100 5400 2100 1500
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
8100 6000 8100 2700
2 1 0 2 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
8100 1500 8100 9900
2 1 1 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
8100 6675 8100 9900
2 1 0 4 4 7 50 -1 -1 10.000 0 0 -1 0 0 4
1650 5325 1650 5400 1950 5400 1950 5325
2 1 0 4 4 7 50 -1 -1 10.000 0 0 -1 0 0 4
7950 6675 7950 6600 8250 6600 8250 6675
2 2 0 0 7 4 60 -1 38 2.000 0 0 -1 0 0 5
2100 5400 2400 5400 2400 9900 2100 9900 2100 5400
2 2 0 0 7 4 60 -1 38 2.000 0 0 -1 0 0 5
7500 1500 7800 1500 7800 6600 7500 6600 7500 1500
2 2 1 0 4 7 60 -1 45 2.000 0 0 -1 0 0 5
7500 6600 7800 6600 7800 9900 7500 9900 7500 6600
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 6000 6900 6000
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 4500 6900 4500
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 6900 6900 6900
2 2 0 0 0 7 60 -1 15 0.000 0 0 -1 0 0 5
3000 4500 6900 4500 6900 6900 3000 6900 3000 4500
2 2 0 0 0 7 55 -1 10 0.000 0 0 -1 0 0 5
3000 5100 6900 5100 6900 6300 3000 6300 3000 5100
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1800 9300 1800 6000
2 2 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 5
2925 5925 3075 5925 3075 6075 2925 6075 2925 5925
2 2 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 5
1725 5925 1875 5925 1875 6075 1725 6075 1725 5925
2 2 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 5
1725 9225 1875 9225 1875 9375 1725 9375 1725 9225
2 2 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 5
6825 5925 6975 5925 6975 6075 6825 6075 6825 5925
2 2 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 5
8025 5925 8175 5925 8175 6075 8025 6075 8025 5925
2 2 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 5
8025 2625 8175 2625 8175 2775 8025 2775 8025 2625
4 1 4 50 -1 14 12 1.5708 4 180 1470 1125 7575 _perpandicular\001
4 1 0 45 -1 14 14 0.0000 4 135 270 7500 6075 AC\001
4 1 0 45 -1 14 14 0.0000 4 135 270 2400 6075 AC\001
4 1 4 45 -1 14 18 1.5708 4 180 825 1725 1950 Track\001
4 1 4 45 -1 14 18 1.5708 4 180 825 8025 1950 Track\001

View File

@ -1,98 +0,0 @@
#FIG 3.2
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
6 1125 1425 1875 2175
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
1200 1500 1800 1500 1800 2100 1200 2100 1200 1500
4 1 0 50 -1 14 18 0.0000 4 165 330 1500 1875 RE\001
-6
6 1800 1425 2550 2175
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
1875 1500 2475 1500 2475 2100 1875 2100 1875 1500
4 1 0 50 -1 14 18 0.0000 4 165 330 2175 1875 RE\001
-6
6 2475 1425 3225 2175
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
2550 1500 3150 1500 3150 2100 2550 2100 2550 1500
4 1 0 50 -1 14 18 0.0000 4 165 330 2850 1875 RE\001
-6
6 3150 1425 3900 2175
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
3225 1500 3825 1500 3825 2100 3225 2100 3225 1500
4 1 0 50 -1 14 18 0.0000 4 165 330 3525 1875 RE\001
-6
6 5025 1425 5775 2175
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
5100 1500 5700 1500 5700 2100 5100 2100 5100 1500
4 1 0 50 -1 14 18 0.0000 4 165 330 5400 1875 RE\001
-6
6 5700 1425 6450 2175
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
5775 1500 6375 1500 6375 2100 5775 2100 5775 1500
4 1 0 50 -1 14 18 0.0000 4 165 330 6075 1875 RE\001
-6
6 6375 1425 7125 2175
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
6450 1500 7050 1500 7050 2100 6450 2100 6450 1500
4 1 0 50 -1 14 18 0.0000 4 165 330 6750 1875 RE\001
-6
6 7050 1425 7800 2175
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
7125 1500 7725 1500 7725 2100 7125 2100 7125 1500
4 1 0 50 -1 14 18 0.0000 4 165 330 7425 1875 RE\001
-6
6 7725 1425 8475 2175
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
7800 1500 8400 1500 8400 2100 7800 2100 7800 1500
4 1 0 50 -1 14 18 0.0000 4 165 330 8100 1875 RE\001
-6
6 8400 1425 9150 2175
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
8475 1500 9075 1500 9075 2100 8475 2100 8475 1500
4 1 0 50 -1 14 18 0.0000 4 165 330 8775 1875 RE\001
-6
6 9075 1425 9825 2175
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
9150 1500 9750 1500 9750 2100 9150 2100 9150 1500
4 1 0 50 -1 14 18 0.0000 4 165 330 9450 1875 RE\001
-6
2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
5400 2100 5400 3900
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
4425 3900 6375 3900 6375 4800 4425 4800 4425 3900
2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 7
975 150 1125 0 2325 0 2475 -150 2625 0 3825 0
3975 150
2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 7
4950 150 5100 0 7200 0 7350 -150 7500 0 9600 0
9750 150
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
300 -900 10500 -900 10500 5100 300 5100 300 -900
3 0 0 2 4 7 50 -1 -1 6.000 0 1 0 4
3 1 2.00 120.00 240.00
4425 4650 3300 4650 2100 3600 2100 2100
0.000 1.000 1.000 0.000
3 0 0 2 4 7 50 -1 -1 6.000 0 1 0 4
3 1 2.00 120.00 240.00
6393 4502 6618 4502 6768 3302 6768 2102
0.000 1.000 1.000 0.000
3 0 0 2 4 7 50 -1 -1 6.000 0 1 0 6
3 1 2.00 120.00 240.00
2100 1500 2100 1200 2700 600 5100 600 5700 1200 5700 1425
0.000 1.000 1.000 1.000 1.000 0.000
4 1 0 50 -1 14 18 0.0000 4 240 1485 5475 4200 process()\001
4 1 4 50 -1 14 18 0.0000 4 240 1815 5400 4650 _setAside()\001
4 1 4 50 -1 14 12 0.0000 4 165 1470 2475 3900 setLeftBound()\001
4 1 4 50 -1 14 12 0.0000 4 180 1575 6750 3450 setRightBound()\001
4 1 4 50 -1 14 12 0.0000 4 165 2625 2475 4125 Session::addRemoveEvent()\001
4 1 0 50 -1 18 18 0.0000 4 270 900 2550 -300 history\001
4 1 0 50 -1 18 18 0.0000 4 210 840 7350 -300 queue\001
4 1 4 50 -1 14 12 0.0000 4 165 1575 2175 1200 setEventLevel()\001
4 1 4 50 -1 14 12 0.0000 4 180 945 2175 975 getFork()\001

View File

@ -0,0 +1,61 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
80.00
Single
-2
1200 2
0 32 #ffffdd
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
300 4050 4650 4050
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
300 3450 4650 3450
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
300 2850 4650 2850
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
300 2250 4650 2250
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
300 1650 4650 1650
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
300 1050 4650 1050
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
300 450 4650 450
2 2 1 2 26 7 60 -1 -1 6.000 0 0 -1 0 0 5
300 150 4650 150 4650 4350 300 4350 300 150
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
4725 150 5550 150
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
4725 4350 5550 4350
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
300 4425 300 5100
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2
4650 4425 4650 5100
2 1 0 3 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
300 4800 300 5100
2 1 0 3 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
4650 4800 4650 5100
2 1 0 3 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
5250 150 5550 150
2 1 0 3 0 7 50 -1 -1 8.000 0 0 -1 0 0 2
5250 4350 5550 4350
2 1 0 4 1 7 50 -1 -1 10.000 0 0 -1 0 0 2
6450 300 7050 300
2 1 1 2 25 7 50 -1 -1 6.000 0 0 -1 0 0 2
6450 600 7050 600
2 2 1 0 32 32 100 -1 20 2.000 0 0 -1 0 0 5
0 -150 9450 -150 9450 5400 0 5400 0 -150
4 1 0 50 -1 14 12 0.0000 4 150 360 4875 4125 [0]\001
4 1 0 50 -1 14 12 0.0000 4 150 360 4875 3525 [1]\001
4 1 0 50 -1 14 12 0.0000 4 150 360 4875 2925 [2]\001
4 1 0 50 -1 14 12 0.0000 4 150 360 4875 2325 [3]\001
4 1 0 50 -1 14 12 0.0000 4 150 360 4875 1725 [4]\001
4 1 0 50 -1 14 12 0.0000 4 150 360 4875 1125 [5]\001
4 1 0 50 -1 14 12 0.0000 4 150 360 4875 525 [6]\001
4 0 0 50 -1 14 12 1.5708 4 120 840 5550 4275 axisMin\001
4 2 0 50 -1 14 12 1.5708 4 120 840 5550 225 axisMax\001
4 0 0 50 -1 14 12 0.0000 4 120 600 7200 300 Track\001
4 0 0 50 -1 14 12 0.0000 4 120 2040 7200 600 Cell abutment box\001
4 2 0 50 -1 14 12 0.0000 4 120 960 4575 5100 trackMax\001
4 0 0 50 -1 14 12 0.0000 4 120 960 375 5100 trackMin\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

212
kite/doc/images/Track-0.fig Normal file
View File

@ -0,0 +1,212 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
90.00
Single
-2
1200 2
0 32 #ffffdd
6 3225 7725 6975 8475
6 3450 7950 3750 8250
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
3525 8025 3675 8175
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
3675 8025 3525 8175
-6
6 6450 7950 6750 8250
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
6525 8025 6675 8175
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
6675 8025 6525 8175
-6
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
3450 7800 3300 7950
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
3600 7800 3300 8100
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
3750 7800 3300 8250
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
3900 7800 3300 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
4050 7800 3450 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
4200 7800 3600 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
4350 7800 3750 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
4500 7800 3900 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
4650 7800 4050 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
4800 7800 4200 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
4950 7800 4350 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
5100 7800 4500 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
5250 7800 4650 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
5400 7800 4800 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
5550 7800 4950 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
5700 7800 5100 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
5850 7800 5250 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
6000 7800 5400 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
6150 7800 5550 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
6300 7800 5700 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
6450 7800 5850 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
6600 7800 6000 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
6750 7800 6150 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
6900 7800 6300 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
6900 7950 6450 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
6900 8100 6600 8400
2 1 0 1 0 7 40 -1 -1 0.000 0 0 7 0 0 2
6900 8250 6750 8400
2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5
3300 7800 6900 7800 6900 8400 3300 8400 3300 7800
-6
6 2400 10350 7950 11175
4 0 0 50 -1 14 14 0.0000 4 135 450 2400 10500 TS:\001
4 0 0 40 -1 14 14 0.0000 4 135 450 2400 10800 MD:\001
4 0 0 40 -1 14 14 0.0000 4 105 300 2400 11100 e:\001
4 0 0 40 -1 14 14 0.0000 4 195 1950 3000 10500 Track Spacing\001
4 0 0 40 -1 14 14 0.0000 4 195 4950 3000 10800 Minimal Distance (layer to layer)\001
4 0 0 40 -1 14 14 0.0000 4 195 3000 3000 11100 Extension (of layer)\001
-6
2 1 0 2 0 32 50 -1 20 0.000 0 0 -1 0 0 2
1200 3300 8400 3300
2 1 0 2 0 32 50 -1 20 0.000 0 0 -1 0 0 2
1200 3900 8400 3900
2 1 0 2 0 32 50 -1 20 0.000 0 0 -1 0 0 2
1200 4500 8400 4500
2 1 0 2 0 32 50 -1 20 0.000 0 0 -1 0 0 2
1200 5100 8400 5100
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
1500 3600 2100 3600 2100 4200 1500 4200 1500 3600
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
3000 3600 3900 3600 3900 4200 3000 4200 3000 3600
2 2 0 1 0 7 60 -1 15 0.000 0 0 -1 0 0 5
2100 3600 2700 3600 2700 4200 2100 4200 2100 3600
2 2 0 1 4 4 60 -1 30 0.000 0 0 -1 0 0 5
4200 3600 5100 3600 5100 4200 4200 4200 4200 3600
2 2 0 1 4 4 60 -1 35 0.000 0 0 -1 0 0 5
5100 3600 5700 3600 5700 4200 5100 4200 5100 3600
2 2 0 1 4 4 60 -1 37 0.000 0 0 -1 0 0 5
5700 3600 6300 3600 6300 4200 5700 4200 5700 3600
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
6900 3600 7800 3600 7800 4200 6900 4200 6900 3600
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
1200 3000 2400 3000 2400 3600 1200 3600 1200 3000
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
2400 3000 3300 3000 3300 3600 2400 3600 2400 3000
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
4800 3000 6000 3000 6000 3600 4800 3600 4800 3000
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
1800 4200 7500 4200 7500 4800 1800 4800 1800 4200
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
1500 4800 2400 4800 2400 5400 1500 5400 1500 4800
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
3000 4800 3900 4800 3900 5400 3000 5400 3000 4800
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
3900 4800 4500 4800 4500 5400 3900 5400 3900 4800
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
5100 4800 6300 4800 6300 5400 5100 5400 5100 4800
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
6300 4800 6900 4800 6900 5400 6300 5400 6300 4800
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
7200 4800 8100 4800 8100 5400 7200 5400 7200 4800
2 1 0 4 0 32 50 -1 20 0.000 0 0 -1 0 0 2
2700 8100 7500 8100
2 1 0 4 0 32 50 -1 20 0.000 0 0 -1 0 0 2
2700 9300 7500 9300
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7275 8700 7800 8700 8100 9300 8775 9300
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7575 8100 8700 8100
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7275 7500 7800 7500 8100 6900 8700 6900
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2625 6900 1500 6900
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2625 8100 900 8100
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7200 8775 7200 9900
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 1 2
3 1 1.00 60.00 120.00
3 1 1.00 60.00 120.00
8625 6900 8625 8100
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 1 2
3 1 1.00 60.00 120.00
3 1 1.00 60.00 120.00
8625 8100 8625 9300
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 1 2
3 1 1.00 60.00 120.00
3 1 1.00 60.00 120.00
1575 6900 1575 8100
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
900 8100 1200 8100
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 9600 3000 9900
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7200 9600 7200 9900
2 1 0 4 0 32 50 -1 20 0.000 0 0 -1 0 0 2
2700 6900 7500 6900
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 8775 3000 9900
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3600 8775 3600 9900
2 1 0 3 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3600 9600 3600 9900
2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
1500 8850 3000 8850
2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
3525 8850 3300 8850
2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
3000 8850 3300 8850
2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
3225 9150 3600 9150
2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
1500 9150 3300 9150
2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
3825 9150 3600 9150
2 2 0 1 0 7 60 -1 10 0.000 0 0 -1 0 0 5
3000 7500 7200 7500 7200 8700 3000 8700 3000 7500
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3300 8475 3300 9225
2 2 0 0 0 32 100 -1 20 0.000 0 0 -1 0 0 5
300 2700 9300 2700 9300 13200 300 13200 300 2700
4 1 0 50 -1 14 14 1.5708 4 195 600 8550 7500 TS/2\001
4 1 0 50 -1 14 14 1.5708 4 195 600 8550 8700 TS/2\001
4 1 0 50 -1 14 14 1.5708 4 135 300 1500 7500 TS\001
4 1 0 50 -1 14 14 0.0000 4 105 450 7500 9900 max\001
4 1 0 50 -1 14 14 0.0000 4 150 150 675 8175 y\001
4 1 0 50 -1 18 16 0.0000 4 255 330 5100 6000 (a)\001
4 0 0 40 -1 14 14 0.0000 4 105 150 1500 9075 e\001
4 0 0 40 -1 14 14 0.0000 4 195 600 1500 8775 MD/2\001
4 1 0 50 -1 14 14 0.0000 4 150 450 2700 9900 min\001
4 0 0 40 -1 14 14 0.0000 4 150 300 3750 9900 x1\001
4 1 0 50 -1 14 16 0.0000 4 255 7095 5100 11700 area(y,min,max) = (min,y-TS/2) (max,y+TS/2)\001
4 1 0 50 -1 14 16 0.0000 4 225 3135 5100 12000 min = x1 - e - MD/2\001
4 1 0 50 -1 14 16 0.0000 4 225 3135 5100 12300 max = x2 + e + MD/2\001
4 1 0 50 -1 18 16 0.0000 4 255 345 5100 12900 (b)\001
4 0 0 40 -1 14 16 0.0000 4 210 495 600 3375 [0]\001
4 0 0 40 -1 14 16 0.0000 4 225 495 600 3975 [1]\001
4 0 0 40 -1 14 16 0.0000 4 210 495 600 4575 [2]\001
4 0 0 40 -1 14 16 0.0000 4 210 495 600 5175 [3]\001

BIN
kite/doc/images/Track-0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -1,87 +1,253 @@
#FIG 3.2 #FIG 3.2 Produced by xfig version 3.2.5a
Landscape Landscape
Center Center
Metric Inches
Letter Letter
100.00 100.00
Single Single
-2 -2
1200 2 1200 2
6 495 405 4320 6120 0 32 #ffffdd
1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 1800 585 45 45 1755 585 1845 585 6 1500 1725 2100 5325
1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 2250 585 45 45 2205 585 2295 585
1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 2700 585 45 45 2655 585 2745 585
1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 3150 585 45 45 3105 585 3195 585
1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 3600 585 45 45 3555 585 3645 585
1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 4050 585 45 45 4005 585 4095 585
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2025 450 2025 675
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2475 450 2475 675
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2925 450 2925 675
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3375 450 3375 675
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3825 450 3825 675
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
3 0 1.00 60.00 120.00
3600 630 3600 1755
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
3375 1755 3825 1755 3825 4680 3375 4680 3375 1755
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
3 0 1.00 60.00 120.00
3150 630 3150 1710
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
2925 1710 3375 1710 3375 4635 2925 4635 2925 1710
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
3 0 1.00 60.00 120.00
2700 630 2700 1665
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
2475 1665 2925 1665 2925 4590 2475 4590 2475 1665
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
3 0 1.00 60.00 120.00
2250 630 2250 1620
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
2025 1620 2475 1620 2475 4545 2025 4545 2025 1620
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
3 0 1.00 60.00 120.00
1800 630 1800 1575
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
3 0 1.00 60.00 120.00
3375 5175 3150 4680
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2
3 0 1.00 60.00 120.00
3375 5175 3600 4725
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1575 1575 2025 1575 2025 4500 1575 4500 1575 1575 1575 2250 2025 2250 2025 5250 1575 5250 1575 2250
2 1 0 3 0 7 60 -1 10 0.000 0 0 -1 1 0 2 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3 1 2.00 120.00 240.00 1575 3750 2025 3750
1575 5850 4275 5850 2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
2 1 0 3 0 7 60 -1 10 0.000 0 0 -1 0 0 2 1575 2250 1575 1800 2025 1800 2025 2250 1575 2250
1575 5805 1575 5895 4 0 0 50 -1 14 16 1.5708 4 165 990 1875 3450 net<a>\001
2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 1 0 2 4 0 0 50 -1 14 16 1.5708 4 210 825 1875 4950 [5,8[\001
3 0 1.00 60.00 120.00 4 1 7 40 -1 14 16 1.5708 4 165 330 1875 2025 TS\001
4050 630 4050 1800
2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5
3825 1800 4275 1800 4275 4725 3825 4725 3825 1800
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1575 450 4275 450 4275 675 1575 675 1575 450
4 2 0 50 -1 14 12 0.0000 4 165 945 1440 630 _segments\001
4 0 0 50 -1 14 12 1.5708 4 180 1260 3555 4590 TrackSegment\001
4 0 0 50 -1 14 14 1.5708 4 180 945 3645 3105 [32,35[\001
4 0 0 50 -1 14 12 1.5708 4 180 1260 3105 4545 TrackSegment\001
4 0 0 50 -1 14 14 1.5708 4 180 945 3195 3060 [31,38[\001
4 0 0 50 -1 14 12 1.5708 4 180 1260 2655 4500 TrackSegment\001
4 0 0 50 -1 14 14 1.5708 4 180 945 2745 3015 [12,30[\001
4 0 0 50 -1 14 12 1.5708 4 180 1260 2205 4455 TrackSegment\001
4 0 0 50 -1 14 14 1.5708 4 180 810 2295 2970 [8,10[\001
4 0 0 50 -1 14 12 1.5708 4 180 1260 1755 4410 TrackSegment\001
4 0 0 50 -1 14 14 1.5708 4 180 675 1845 2925 [5,8[\001
4 1 0 50 -1 18 12 0.0000 4 135 825 3375 5400 same net\001
4 0 0 50 -1 14 12 1.5708 4 180 1260 4005 4635 TrackSegment\001
4 0 0 50 -1 14 14 1.5708 4 180 945 4095 3150 [40,45[\001
4 1 0 50 -1 19 12 0.0000 4 180 1140 2925 6075 sorting order\001
-6 -6
2 2 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 5 6 2100 1725 2700 5325
0 0 4725 0 4725 6525 0 6525 0 0 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
2175 2250 2625 2250 2625 5250 2175 5250 2175 2250
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2175 3750 2625 3750
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
2175 2250 2175 1800 2625 1800 2625 2250 2175 2250
4 0 0 50 -1 14 16 1.5708 4 165 990 2475 3450 net<b>\001
4 1 7 40 -1 14 16 1.5708 4 165 330 2475 2025 TS\001
4 0 0 50 -1 14 16 1.5708 4 225 990 2475 4950 [8,10[\001
-6
6 2700 1725 3300 5325
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
2775 2250 3225 2250 3225 5250 2775 5250 2775 2250
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2775 3750 3225 3750
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
2775 2250 2775 1800 3225 1800 3225 2250 2775 2250
4 0 0 50 -1 14 16 1.5708 4 165 990 3075 3450 net<c>\001
4 0 0 50 -1 14 16 1.5708 4 225 1155 3075 4950 [12,30[\001
4 1 7 40 -1 14 16 1.5708 4 165 330 3075 2025 TS\001
-6
6 3300 1725 3900 5325
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
3375 2250 3375 5250 3825 5250 3825 2250 3375 2250
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
3375 3750 3825 3750
2 2 0 2 4 4 50 -1 20 0.000 0 0 -1 0 0 5
3375 2250 3375 1800 3825 1800 3825 2250 3375 2250
4 0 4 50 -1 14 16 1.5708 4 165 990 3675 3450 net<d>\001
4 0 4 50 -1 14 16 1.5708 4 225 1155 3675 4950 [31,38[\001
4 1 7 40 -1 14 16 1.5708 4 165 330 3675 2025 TS\001
-6
6 3900 1725 4500 5325
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
3975 2250 3975 5250 4425 5250 4425 2250 3975 2250
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
3975 3750 4425 3750
2 2 0 2 4 4 50 -1 20 0.000 0 0 -1 0 0 5
3975 2250 3975 1800 4425 1800 4425 2250 3975 2250
4 0 4 50 -1 14 16 1.5708 4 165 990 4275 3450 net<d>\001
4 0 4 50 -1 14 16 1.5708 4 225 1155 4275 4950 [31,35[\001
4 1 7 40 -1 14 16 1.5708 4 165 330 4275 2025 TS\001
-6
6 4500 1725 5100 5325
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
4575 2250 4575 5250 5025 5250 5025 2250 4575 2250
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
4575 3750 5025 3750
2 2 0 2 4 4 50 -1 20 0.000 0 0 -1 0 0 5
4575 2250 4575 1800 5025 1800 5025 2250 4575 2250
4 0 4 50 -1 14 16 1.5708 4 165 990 4875 3450 net<d>\001
4 0 4 50 -1 14 16 1.5708 4 210 1155 4875 4950 [34,40[\001
4 1 7 40 -1 14 16 1.5708 4 165 330 4875 2025 TS\001
-6
6 5100 1725 5700 5325
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
5175 2250 5625 2250 5625 5250 5175 5250 5175 2250
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5175 3750 5625 3750
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
5175 2250 5175 1800 5625 1800 5625 2250 5175 2250
4 0 0 50 -1 14 16 1.5708 4 165 990 5475 3450 net<e>\001
4 0 0 50 -1 14 16 1.5708 4 210 1155 5475 4950 [45,50[\001
4 1 7 40 -1 14 16 1.5708 4 165 330 5475 2025 TS\001
-6
6 1350 6525 1575 7275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1425 6600 1425 7200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1500 6600 1500 7200
-6
6 8925 6525 9150 7275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 6600 9000 7200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9075 6600 9075 7200
-6
1 4 0 2 4 7 50 -1 -1 0.000 1 0.0000 3600 750 75 75 3525 750 3675 750
1 4 0 2 4 7 50 -1 -1 0.000 1 0.0000 4200 750 75 75 4125 750 4275 750
1 4 0 2 4 7 50 -1 -1 0.000 1 0.0000 4800 750 75 75 4725 750 4875 750
1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 5400 750 75 75 5325 750 5475 750
1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 3000 750 75 75 2925 750 3075 750
1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 2400 750 75 75 2325 750 2475 750
1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 1800 750 75 75 1725 750 1875 750
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2100 600 2100 900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2700 600 2700 900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3300 600 3300 900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3900 600 3900 900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
4500 600 4500 900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5100 600 5100 900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5700 600 5700 900
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1500 600 6300 600 6300 900 1500 900 1500 600
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
1800 825 1800 1800
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
2400 825 2400 1800
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
3000 825 3000 1800
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
5400 825 5400 1800
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
4800 825 4800 1800
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
4200 825 4200 1800
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
3600 825 3600 1800
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
1500 300 2700 300 2700 600 1500 600 1500 300
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
1875 6600 1800 6600 1800 7200 1875 7200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
2475 6600 2400 6600 2400 7200 2475 7200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3075 6600 3000 6600 3000 7200 3075 7200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3375 6600 3300 6600 3300 7200 3375 7200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4275 6600 4200 6600 4200 7200 4275 7200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
1800 6750 2400 6750 2400 7050 1800 7050 1800 6750
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
3300 6750 4200 6750 4200 7050 3300 7050 3300 6750
2 2 0 0 0 7 60 -1 15 0.000 0 0 -1 0 0 5
2400 6750 3000 6750 3000 7050 2400 7050 2400 6750
2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 4
4575 6600 4500 6600 4500 7200 4575 7200
2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 4
4875 6600 4800 6600 4800 7200 4875 7200
2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 4
5475 6600 5400 6600 5400 7200 5475 7200
2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 4
6075 6600 6000 6600 6000 7200 6075 7200
2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 4
6675 6600 6600 6600 6600 7200 6675 7200
2 2 0 0 4 4 61 -1 35 0.000 0 0 -1 0 0 5
4500 6750 6000 6750 6000 7050 4500 7050 4500 6750
2 2 0 0 4 4 62 -1 30 0.000 0 0 -1 0 0 5
4500 6675 5400 6675 5400 7125 4500 7125 4500 6675
2 2 0 0 4 4 60 -1 38 0.000 0 0 -1 0 0 5
4800 6825 6600 6825 6600 6975 4800 6975 4800 6825
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7575 6600 7500 6600 7500 7200 7575 7200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
8475 6600 8400 6600 8400 7200 8475 7200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
7500 6750 8400 6750 8400 7050 7500 7050 7500 6750
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1200 6900 9300 6900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
1800 5250 1800 6600
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
2400 5250 2400 6600
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
3000 5250 3300 6600
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
5400 5250 7500 6600
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
3600 5250 4500 6600
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
4200 5250 4500 6600
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
4800 5250 4800 6600
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
4500 7275 4500 8100
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
4800 7275 4800 8100
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
5400 7275 5400 8100
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
6000 7275 6000 8100
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
6600 7275 6600 8100
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
4200 7275 4200 8100
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3300 7275 3300 8100
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 7275 3000 8100
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2400 7275 2400 8100
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1800 7275 1800 8100
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7500 7275 7500 8100
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
8400 7275 8400 8100
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 7275 9000 8100
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1500 7275 1500 8100
2 2 0 0 0 32 100 -1 20 0.000 0 0 -1 0 0 5
300 0 9600 0 9600 8700 300 8700 300 0
4 1 7 40 -1 14 16 0.0000 4 165 825 2100 525 Track\001
4 0 0 50 -1 16 12 0.0000 4 135 105 1800 8250 5\001
4 0 0 50 -1 16 12 0.0000 4 135 105 2400 8250 8\001
4 0 0 50 -1 16 12 0.0000 4 135 210 3000 8250 10\001
4 0 0 50 -1 16 12 0.0000 4 135 210 3300 8250 12\001
4 0 0 50 -1 16 12 0.0000 4 135 210 4200 8250 30\001
4 0 4 50 -1 16 12 0.0000 4 135 210 4500 8250 31\001
4 0 4 50 -1 16 12 0.0000 4 135 210 4800 8250 34\001
4 0 4 50 -1 16 12 0.0000 4 135 210 5400 8250 35\001
4 0 4 50 -1 16 12 0.0000 4 135 210 6000 8250 38\001
4 0 4 50 -1 16 12 0.0000 4 135 210 6600 8250 40\001
4 0 0 50 -1 16 12 0.0000 4 135 210 7500 8250 45\001
4 0 0 50 -1 16 12 0.0000 4 135 210 8400 8250 50\001
4 0 0 50 -1 16 12 0.0000 4 135 210 9000 8250 60\001
4 0 0 50 -1 16 12 0.0000 4 135 105 1500 8250 0\001
4 0 0 50 -1 18 16 0.0000 4 255 330 600 675 (a)\001
4 0 0 50 -1 18 16 0.0000 4 255 345 600 6975 (b)\001

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,150 +1,198 @@
#FIG 3.2 #FIG 3.2 Produced by xfig version 3.2.5a
Landscape Landscape
Center Center
Metric Inches
Letter Letter
100.00 100.00
Single Single
-2 -2
1200 2 1200 2
6 360 855 540 1395 0 32 #ffffdd
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6 600 -525 8175 3075
405 900 405 1350 6 3525 1275 7575 1875
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 6 3525 1275 4125 1875
495 900 495 1350 2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
3600 1350 4050 1350 4050 1800 3600 1800 3600 1350
4 1 7 40 -1 14 16 0.0000 4 165 330 3825 1650 TS\001
-6 -6
6 7785 855 7965 1395 1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 7275 1575 75 75 7200 1575 7350 1575
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7830 900 7830 1350 5550 1350 5550 1800
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
7920 900 7920 1350 7500 1350 4050 1350 4050 1800 7500 1800 7500 1350
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7050 1350 7050 1800
4 0 0 50 -1 14 16 0.0000 4 165 990 5850 1650 net<a>\001
4 0 0 50 -1 14 16 0.0000 4 210 825 4350 1650 [5,8[\001
-6 -6
6 0 0 135 720 6 3525 1875 7575 2475
3 0 0 2 0 7 50 -1 -1 0.000 0 0 0 6 6 3525 1875 4125 2475
113 22 68 68 68 135 68 248 68 315 23 360 2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
0.000 1.000 1.000 1.000 1.000 0.000 3600 1950 4050 1950 4050 2400 3600 2400 3600 1950
3 0 0 2 0 7 50 -1 -1 0.000 0 0 0 6 4 1 7 40 -1 14 16 0.0000 4 165 330 3825 2250 TS\001
113 698 68 653 68 585 68 473 68 405 23 360
0.000 1.000 1.000 1.000 1.000 0.000
-6 -6
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 1485 1935 135 135 1350 1935 1620 1935 1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 7275 2175 75 75 7200 2175 7350 2175
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 2160 1935 135 135 2025 1935 2295 1935 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 3510 1935 135 135 3375 1935 3645 1935 5550 1950 5550 2400
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 5310 1935 135 135 5175 1935 5445 1935 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 6300 1935 135 135 6165 1935 6435 1935 7500 1950 7500 2400 4050 2400 4050 1950 7500 1950
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 7335 1935 135 135 7200 1935 7470 1935 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 2610 135 135 765 2610 1035 2610 7050 1950 7050 2400
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 3060 135 135 765 3060 1035 3060 4 0 0 50 -1 14 16 0.0000 4 165 990 5850 2250 net<b>\001
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 3510 135 135 765 3510 1035 3510 4 0 0 50 -1 14 16 0.0000 4 225 990 4350 2250 [8,10[\001
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 3960 135 135 765 3960 1035 3960 -6
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 4410 135 135 765 4410 1035 4410 6 3525 2475 7575 3075
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 4860 135 135 765 4860 1035 4860 6 3525 2475 4125 3075
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 810 1935 135 135 675 1935 945 1935 2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 3600 2550 4050 2550 4050 3000 3600 3000 3600 2550
315 1125 8010 1125 4 1 7 40 -1 14 16 0.0000 4 165 330 3825 2850 TS\001
2 2 0 0 0 7 60 -1 16 0.000 0 0 -1 0 0 5 -6
1125 1035 1800 1035 1800 1215 1125 1215 1125 1035 1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 7275 2775 75 75 7200 2775 7350 2775
2 2 0 0 0 7 60 -1 16 0.000 0 0 -1 0 0 5 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2475 1035 3600 1035 3600 1215 2475 1215 2475 1035 5550 2550 5550 3000
2 2 0 0 0 7 60 -1 16 0.000 0 0 -1 0 0 5 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
5850 1035 6750 1035 6750 1215 5850 1215 5850 1035 7500 2550 7500 3000 4050 3000 4050 2550 7500 2550
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1125 0 1125 900 7050 2550 7050 3000
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2 4 0 0 50 -1 14 16 0.0000 4 165 990 5850 2850 net<c>\001
2475 0 2475 900 4 0 0 50 -1 14 16 0.0000 4 225 1155 4350 2850 [12,30[\001
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2 -6
5850 0 5850 900 6 1425 225 6375 975
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2 1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 3000 750 75 75 2925 750 3075 750
3375 0 3375 810 1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 2400 750 75 75 2325 750 2475 750
2 1 0 0 0 7 60 -1 15 0.000 0 0 -1 0 0 7 1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 1800 750 75 75 1725 750 1875 750
1125 540 1125 450 2250 450 2475 540 2250 630 1125 630 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1125 540 2100 600 2100 900
2 1 0 0 0 7 60 -1 15 0.000 0 0 -1 0 0 7 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2475 540 2475 450 3150 450 3375 540 3150 630 2475 630 2700 600 2700 900
2475 540 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2 1 0 0 0 7 60 -1 15 0.000 0 0 -1 0 0 7 3300 600 3300 900
3375 540 3375 450 5625 450 5850 540 5625 630 3375 630 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3375 540 3900 600 3900 900
2 1 0 0 0 7 60 -1 15 0.000 0 0 -1 0 0 7 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5850 540 5850 450 7650 450 7875 540 7650 630 5850 630 4500 600 4500 900
5850 540 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2 1 0 0 0 7 60 -1 15 0.000 0 0 -1 0 0 7 5100 600 5100 900
450 540 450 450 900 450 1125 540 900 630 450 630 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
450 540 5700 600 5700 900
2 2 0 0 0 7 70 -1 19 0.000 0 0 -1 0 0 5 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
3375 990 4500 990 4500 1260 3375 1260 3375 990 1500 600 6300 600 6300 900 1500 900 1500 600
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
-1575 -675 8325 -675 8325 5400 -1575 5400 -1575 -675 1500 300 2700 300 2700 600 1500 600 1500 300
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4 4 1 7 40 -1 14 16 0.0000 4 165 825 2100 525 Track\001
6795 945 6750 945 6750 1305 6795 1305 -6
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
5895 945 5850 945 5850 1305 5895 1305 3 1 2.00 120.00 240.00
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4 3000 825 3000 1425 3150 1575 3600 1575
4545 855 4500 855 4500 1395 4545 1395 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4 3 1 2.00 120.00 240.00
3645 945 3600 945 3600 1305 3645 1305 2400 825 2400 2025 2550 2175 3600 2175
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
3420 855 3375 855 3375 1395 3420 1395 3 1 2.00 120.00 240.00
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4 1800 825 1800 2625 1950 2775 3600 2775
2520 945 2475 945 2475 1305 2520 1305 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 8
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4 3 1 2.00 120.00 240.00
1845 945 1800 945 1800 1305 1845 1305 2550 300 2550 0 2700 -150 7650 -150 7800 0 7800 1425
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4 7650 1575 7350 1575
1170 945 1125 945 1125 1305 1170 1305 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 8
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 3 1 2.00 120.00 240.00
675 2385 4410 2385 4410 5085 675 5085 675 2385 2400 300 2400 -150 2550 -300 7800 -300 7950 -150 7950 2025
4 1 0 50 -1 14 12 0.0000 4 135 105 1125 -45 3\001 7800 2175 7500 2175
4 1 0 50 -1 14 12 0.0000 4 135 105 2475 -45 9\001 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 8
4 1 0 50 -1 14 12 0.0000 4 135 210 3375 -45 13\001 3 1 2.00 120.00 240.00
4 1 0 50 -1 14 12 0.0000 4 135 210 5850 -45 24\001 2250 300 2250 -300 2400 -450 7950 -450 8100 -300 8100 2625
4 1 0 50 -1 14 12 0.0000 4 165 315 810 225 [0]\001 7950 2775 7500 2775
4 1 0 50 -1 14 12 0.0000 4 165 315 1800 225 [1]\001 2 1 0 4 4 7 40 -1 -1 0.000 0 0 -1 0 0 2
4 1 0 50 -1 14 12 0.0000 4 165 315 2925 225 [2]\001 7650 1950 7800 2400
4 1 0 50 -1 14 12 0.0000 4 165 315 4635 225 [3]\001 2 1 0 4 4 7 40 -1 -1 0.000 0 0 -1 0 0 2
4 1 0 50 -1 14 12 0.0000 4 165 315 6975 225 [4]\001 7800 1950 7650 2400
4 0 0 50 -1 14 12 1.5708 4 120 420 7920 0 _max\001 4 0 0 50 -1 18 16 0.0000 4 255 330 600 675 (a)\001
4 0 0 50 -1 14 12 1.5708 4 165 420 450 0 _min\001 -6
4 2 0 50 -1 18 12 0.0000 4 180 1125 -90 405 lower_bound\001 6 3525 6525 7575 7125
4 1 7 40 -1 18 14 0.0000 4 150 120 810 2025 1\001 6 3525 6525 4125 7125
4 1 7 40 -1 18 14 0.0000 4 150 120 1485 2025 2\001 2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
4 1 7 40 -1 18 14 0.0000 4 150 120 2160 2025 3\001 3600 6600 4050 6600 4050 7050 3600 7050 3600 6600
4 1 7 40 -1 18 14 0.0000 4 150 120 3510 2025 2\001 4 1 7 40 -1 14 16 0.0000 4 165 330 3825 6900 TS\001
4 1 7 40 -1 18 14 0.0000 4 150 120 5310 2025 3\001 -6
4 1 7 40 -1 18 14 0.0000 4 150 120 6300 2025 4\001 1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 7275 6825 75 75 7200 6825 7350 6825
4 1 7 40 -1 18 14 0.0000 4 150 120 7335 2025 5\001 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 4905 [\001 5550 6600 5550 7050
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 4455 [\001 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 4005 [\001 7500 6600 7500 7050 4050 7050 4050 6600 7500 6600
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 3555 [\001 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 3105 [\001 7050 6600 7050 7050
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 2655 [\001 4 0 0 50 -1 14 16 0.0000 4 165 990 5850 6900 net<c>\001
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 3105 ]\001 4 0 0 50 -1 14 16 0.0000 4 225 1155 4350 6900 [12,30[\001
4 0 0 50 -1 14 14 0.0000 4 180 540 1395 2655 _min\001 -6
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 3150 ,\001 6 3525 5325 7575 5925
4 0 0 50 -1 14 14 0.0000 4 180 1080 2925 3105 max(i-1)\001 6 3525 5325 4125 5925
4 0 0 50 -1 14 14 0.0000 4 180 1080 1440 3105 min(i-1)\001 2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 2655 ]\001 3600 5400 4050 5400 4050 5850 3600 5850 3600 5400
4 0 0 50 -1 14 14 0.0000 4 180 810 2925 2655 min(i)\001 4 1 7 40 -1 14 16 0.0000 4 165 330 3825 5700 TS\001
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 2700 ,\001 -6
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 3555 ]\001 1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 7275 5625 75 75 7200 5625 7350 5625
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 4005 ]\001 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 4455 ]\001 5550 5400 5550 5850
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 4905 ]\001 2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
4 0 0 50 -1 14 14 0.0000 4 180 810 2925 3555 min(i)\001 7500 5400 4050 5400 4050 5850 7500 5850 7500 5400
4 0 0 50 -1 14 14 0.0000 4 180 1080 2925 4005 max(i-1)\001 2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
4 0 0 50 -1 14 14 0.0000 4 135 540 2925 4455 _max\001 7050 5400 7050 5850
4 0 0 50 -1 14 14 0.0000 4 135 540 2925 4905 _max\001 4 0 0 50 -1 14 16 0.0000 4 165 990 5850 5700 net<a>\001
4 0 0 50 -1 14 14 0.0000 4 180 1215 1440 3555 _max(i-1)\001 4 0 0 50 -1 14 16 0.0000 4 210 825 4350 5700 [5,8[\001
4 0 0 50 -1 14 14 0.0000 4 180 1080 1440 4005 min(i-1)\001 -6
4 0 0 50 -1 14 14 0.0000 4 180 1080 1440 4455 max(i-1)\001 6 3525 5925 7575 6525
4 0 0 50 -1 14 14 0.0000 4 180 540 1440 4905 _min\001 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 3600 ,\001 5550 6000 5550 6450
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 4050 ,\001 2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 4500 ,\001 7500 6000 4050 6000 4050 6450 7500 6450 7500 6000
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 4950 ,\001 2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
4 1 7 40 -1 10 14 0.0000 4 135 90 900 2700 1\001 7050 6000 7050 6450
4 1 7 40 -1 18 14 0.0000 4 150 120 900 3150 2\001 2 2 0 2 4 4 50 -1 20 0.000 0 0 -1 0 0 5
4 1 7 40 -1 18 14 0.0000 4 150 120 900 3600 3\001 3600 6000 4050 6000 4050 6450 3600 6450 3600 6000
4 1 7 40 -1 18 14 0.0000 4 150 120 900 4050 4\001 4 0 4 50 -1 14 16 0.0000 4 165 990 5850 6300 net<b>\001
4 1 7 40 -1 18 14 0.0000 4 150 120 900 4500 5\001 4 0 4 50 -1 14 16 0.0000 4 225 990 4350 6300 [8,10[\001
4 1 7 40 -1 18 14 0.0000 4 150 120 900 4950 6\001 4 1 7 40 -1 14 16 0.0000 4 165 330 3825 6300 TS\001
4 1 4 50 -1 14 10 0.0000 4 90 420 7275 6300 NULL\001
-6
1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 3000 4800 75 75 2925 4800 3075 4800
1 4 0 2 4 7 50 -1 -1 0.000 1 0.0000 2400 4800 75 75 2325 4800 2475 4800
1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 1800 4800 75 75 1725 4800 1875 4800
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
3 1 2.00 120.00 240.00
3000 4875 3000 5475 3150 5625 3600 5625
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 4
3 1 2.00 120.00 240.00
2400 4875 2400 6075 2550 6225 3600 6225
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 1 0 4
3 1 2.00 120.00 240.00
1800 4875 1800 6675 1950 6825 3600 6825
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 8
3 1 2.00 120.00 240.00
2550 4350 2550 4050 2700 3900 7650 3900 7800 4050 7800 5475
7650 5625 7350 5625
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 1 8
3 1 2.00 120.00 240.00
2250 4350 2250 3750 2400 3600 7950 3600 8100 3750 8100 6675
7950 6825 7500 6825
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2100 4650 2100 4950
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2700 4650 2700 4950
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3300 4650 3300 4950
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3900 4650 3900 4950
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
4500 4650 4500 4950
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5100 4650 5100 4950
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5700 4650 5700 4950
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1500 4650 6300 4650 6300 4950 1500 4950 1500 4650
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
1500 4350 2700 4350 2700 4650 1500 4650 1500 4350
2 2 0 0 0 32 100 -1 20 0.000 0 0 -1 0 0 5
450 -750 8400 -750 8400 7350 450 7350 450 -750
4 0 0 50 -1 18 16 0.0000 4 255 345 600 4725 (b)\001
4 1 7 40 -1 14 16 0.0000 4 165 825 2100 4575 Track\001

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

After

Width:  |  Height:  |  Size: 11 KiB

View File

@ -1,165 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
Letter
100.00
Single
-2
1200 2
6 360 855 540 1395
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
405 900 405 1350
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
495 900 495 1350
-6
6 7785 855 7965 1395
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7830 900 7830 1350
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7920 900 7920 1350
-6
6 0 0 135 720
3 0 0 2 0 7 50 -1 -1 0.000 0 0 0 6
113 22 68 68 68 135 68 248 68 315 23 360
0.000 1.000 1.000 1.000 1.000 0.000
3 0 0 2 0 7 50 -1 -1 0.000 0 0 0 6
113 698 68 653 68 585 68 473 68 405 23 360
0.000 1.000 1.000 1.000 1.000 0.000
-6
6 630 1755 990 2115
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 810 1935 135 135 675 1935 945 1935
4 1 7 40 -1 18 14 0.0000 4 150 120 810 2025 1\001
-6
6 1305 1755 1665 2115
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 1485 1935 135 135 1350 1935 1620 1935
4 1 7 40 -1 18 14 0.0000 4 150 120 1485 2025 2\001
-6
6 1980 1755 2340 2115
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 2160 1935 135 135 2025 1935 2295 1935
4 1 7 40 -1 18 14 0.0000 4 150 120 2160 2025 3\001
-6
6 3330 1755 3690 2115
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 3510 1935 135 135 3375 1935 3645 1935
4 1 7 40 -1 18 14 0.0000 4 150 120 3510 2025 2\001
-6
6 5130 1755 5490 2115
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 5310 1935 135 135 5175 1935 5445 1935
4 1 7 40 -1 18 14 0.0000 4 150 120 5310 2025 3\001
-6
6 675 2340 4410 4635
6 720 2385 1080 2745
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 2565 135 135 765 2565 1035 2565
4 1 7 40 -1 18 14 0.0000 4 150 120 900 2655 1\001
-6
6 720 2835 1080 3195
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 3015 135 135 765 3015 1035 3015
4 1 7 40 -1 18 14 0.0000 4 150 120 900 3105 2\001
-6
6 720 3285 1080 3645
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 3465 135 135 765 3465 1035 3465
4 1 7 40 -1 18 14 0.0000 4 150 120 900 3555 3\001
-6
6 720 3735 1080 4095
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 3915 135 135 765 3915 1035 3915
4 1 7 40 -1 18 14 0.0000 4 150 120 900 4005 4\001
-6
6 720 4185 1080 4545
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 4365 135 135 765 4365 1035 4365
4 1 7 40 -1 18 14 0.0000 4 150 120 900 4455 5\001
-6
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
675 2340 4410 2340 4410 4635 675 4635 675 2340
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 3960 [\001
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 3510 [\001
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 3060 [\001
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 2610 [\001
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 3060 ]\001
4 0 0 50 -1 14 14 0.0000 4 180 540 1395 2610 _min\001
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 3105 ,\001
4 0 0 50 -1 14 14 0.0000 4 180 810 2925 3060 max(i)\001
4 0 0 50 -1 14 14 0.0000 4 180 810 1440 3060 min(i)\001
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 2610 ]\001
4 0 0 50 -1 14 14 0.0000 4 180 810 2925 2610 min(i)\001
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 2655 ,\001
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 3510 ]\001
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 3960 ]\001
4 0 0 50 -1 14 14 0.0000 4 180 1080 2925 3510 min(i+1)\001
4 0 0 50 -1 14 14 0.0000 4 135 540 2925 3960 _max\001
4 0 0 50 -1 14 14 0.0000 4 180 810 1440 3510 max(i)\001
4 0 0 50 -1 14 14 0.0000 4 180 810 1440 3960 max(i)\001
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 3555 ,\001
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 4005 ,\001
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 4410 [\001
4 0 0 50 -1 14 14 0.0000 4 180 540 1440 4410 _min\001
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 4455 ,\001
4 0 0 50 -1 14 14 0.0000 4 135 540 2925 4410 _max\001
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 4410 ]\001
-6
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 7335 1935 135 135 7200 1935 7470 1935
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 6300 1935 135 135 6165 1935 6435 1935
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
315 1125 8010 1125
2 2 0 0 0 7 60 -1 16 0.000 0 0 -1 0 0 5
1125 1035 1800 1035 1800 1215 1125 1215 1125 1035
2 2 0 0 0 7 60 -1 16 0.000 0 0 -1 0 0 5
2475 1035 3600 1035 3600 1215 2475 1215 2475 1035
2 2 0 0 0 7 60 -1 16 0.000 0 0 -1 0 0 5
5850 1035 6750 1035 6750 1215 5850 1215 5850 1035
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2
1125 0 1125 900
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2
2475 0 2475 900
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2
5850 0 5850 900
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2
3375 0 3375 810
2 1 0 0 0 7 60 -1 15 0.000 0 0 -1 0 0 7
1125 540 1125 450 2250 450 2475 540 2250 630 1125 630
1125 540
2 1 0 0 0 7 60 -1 15 0.000 0 0 -1 0 0 7
2475 540 2475 450 3150 450 3375 540 3150 630 2475 630
2475 540
2 1 0 0 0 7 60 -1 15 0.000 0 0 -1 0 0 7
3375 540 3375 450 5625 450 5850 540 5625 630 3375 630
3375 540
2 1 0 0 0 7 60 -1 15 0.000 0 0 -1 0 0 7
5850 540 5850 450 7650 450 7875 540 7650 630 5850 630
5850 540
2 1 0 0 0 7 60 -1 15 0.000 0 0 -1 0 0 7
450 540 450 450 900 450 1125 540 900 630 450 630
450 540
2 2 0 0 0 7 70 -1 19 0.000 0 0 -1 0 0 5
3375 990 4500 990 4500 1260 3375 1260 3375 990
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
-1800 -675 8325 -675 8325 4950 -1800 4950 -1800 -675
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
1170 945 1125 945 1125 1305 1170 1305
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
1845 945 1800 945 1800 1305 1845 1305
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
2520 945 2475 945 2475 1305 2520 1305
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
3420 855 3375 855 3375 1395 3420 1395
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
3645 945 3600 945 3600 1305 3645 1305
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
4545 855 4500 855 4500 1395 4545 1395
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
5895 945 5850 945 5850 1305 5895 1305
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
6795 945 6750 945 6750 1305 6795 1305
4 1 0 50 -1 14 12 0.0000 4 135 105 1125 -45 3\001
4 1 0 50 -1 14 12 0.0000 4 135 105 2475 -45 9\001
4 1 0 50 -1 14 12 0.0000 4 135 210 3375 -45 13\001
4 1 0 50 -1 14 12 0.0000 4 135 210 5850 -45 24\001
4 1 0 50 -1 14 12 0.0000 4 165 315 810 225 [0]\001
4 1 0 50 -1 14 12 0.0000 4 165 315 1800 225 [0]\001
4 1 0 50 -1 14 12 0.0000 4 165 315 2925 225 [1]\001
4 1 0 50 -1 14 12 0.0000 4 165 315 4635 225 [2]\001
4 1 0 50 -1 14 12 0.0000 4 165 315 6975 225 [3]\001
4 0 0 50 -1 14 12 1.5708 4 120 420 7920 0 _max\001
4 0 0 50 -1 14 12 1.5708 4 165 420 450 0 _min\001
4 2 0 50 -1 18 12 0.0000 4 180 1425 -90 405 lower_bound - 1\001
4 1 7 40 -1 18 14 0.0000 4 150 120 6300 2025 2\001
4 1 7 40 -1 18 14 0.0000 4 150 120 7335 2025 4\001

View File

@ -1,83 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
Letter
100.00
Single
-2
1200 2
6 360 855 540 1395
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
405 900 405 1350
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
495 900 495 1350
-6
6 7785 855 7965 1395
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7830 900 7830 1350
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7920 900 7920 1350
-6
1 4 0 1 0 7 50 -1 -1 0.000 1 0.0000 3600 1800 90 90 3510 1800 3690 1800
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
315 1125 8010 1125
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
1395 855 1350 855 1350 1395 1395 1395
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
2295 945 2250 945 2250 1305 2295 1305
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
3195 945 3150 945 3150 1305 3195 1305
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
4095 945 4050 945 4050 1305 4095 1305
2 2 0 0 0 7 60 -1 16 0.000 0 0 -1 0 0 5
4050 1035 4950 1035 4950 1215 4050 1215 4050 1035
2 2 0 0 0 7 60 -1 16 0.000 0 0 -1 0 0 5
2250 1035 3150 1035 3150 1215 2250 1215 2250 1035
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
7470 945 7425 945 7425 1305 7470 1305
2 2 0 0 0 7 60 -1 16 0.000 0 0 -1 0 0 5
6525 1035 7425 1035 7425 1215 6525 1215 6525 1035
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
6570 945 6525 945 6525 1305 6570 1305
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
5895 855 5850 855 5850 1395 5895 1395
2 2 0 0 0 7 70 -1 19 0.000 0 0 -1 0 0 5
1350 990 5850 990 5850 1260 1350 1260 1350 990
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2
2250 0 2250 855
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2
1350 0 1350 765
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2
4050 0 4050 855
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2
6525 0 6525 855
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
3600 2250 3600 1215
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
3510 1800 2295 1800
2 1 3 2 0 7 50 -1 -1 4.500 0 0 -1 0 0 2
2250 1395 2250 2250
2 1 3 2 0 7 50 -1 -1 4.500 0 0 -1 0 0 2
1350 1485 1350 2250
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
2250 2025 1350 2025
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
4995 945 4950 945 4950 1305 4995 1305
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
0 -675 8325 -675 8325 3375 0 3375 0 -675
3 0 0 2 0 7 50 -1 -1 0.000 0 0 0 6
1350 2475 1575 2700 1800 2700 3150 2700 3375 2700 3600 2925
0.000 1.000 1.000 1.000 1.000 0.000
3 0 0 2 0 7 50 -1 -1 0.000 0 0 0 6
5850 2475 5625 2700 5400 2700 4050 2700 3825 2700 3600 2925
0.000 1.000 1.000 1.000 1.000 0.000
4 1 0 50 -1 14 12 0.0000 4 135 105 1350 -45 4\001
4 1 0 50 -1 14 12 0.0000 4 135 105 2250 -45 8\001
4 1 0 50 -1 14 12 0.0000 4 135 210 4050 -45 16\001
4 1 0 50 -1 14 12 0.0000 4 135 210 6525 -45 27\001
4 1 0 50 -1 14 12 0.0000 4 180 840 3600 2475 position\001
4 1 0 50 -1 18 14 0.0000 4 210 2820 3600 3150 Overlaping TrackSegments\001

View File

@ -1,74 +0,0 @@
#FIG 3.2
Landscape
Center
Metric
Letter
100.00
Single
-2
1200 2
6 360 855 540 1395
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
405 900 405 1350
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
495 900 495 1350
-6
6 7785 855 7965 1395
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7830 900 7830 1350
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7920 900 7920 1350
-6
1 4 0 1 0 7 50 -1 -1 0.000 1 0.0000 3600 1800 90 90 3510 1800 3690 1800
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
315 1125 8010 1125
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
1395 855 1350 855 1350 1395 1395 1395
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
2295 945 2250 945 2250 1305 2295 1305
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
7470 945 7425 945 7425 1305 7470 1305
2 2 0 0 0 7 60 -1 16 0.000 0 0 -1 0 0 5
6525 1035 7425 1035 7425 1215 6525 1215 6525 1035
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
6570 945 6525 945 6525 1305 6570 1305
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2
2250 0 2250 855
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2
1350 0 1350 765
2 1 0 2 0 7 50 -1 19 0.000 0 0 -1 0 0 2
6525 0 6525 855
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
3600 2250 3600 1215
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
3510 1800 2295 1800
2 1 3 2 0 7 50 -1 -1 4.500 0 0 -1 0 0 2
2250 1395 2250 2250
2 1 3 2 0 7 50 -1 -1 4.500 0 0 -1 0 0 2
1350 1485 1350 2250
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
3 1 1.00 60.00 120.00
2250 2025 1350 2025
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
0 -675 8325 -675 8325 3375 0 3375 0 -675
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
4095 945 4050 945 4050 1305 4095 1305
2 2 0 0 0 7 60 -1 16 0.000 0 0 -1 0 0 5
2250 1035 4050 1035 4050 1215 2250 1215 2250 1035
2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 4
2970 855 2925 855 2925 1395 2970 1395
2 2 0 0 0 7 70 -1 19 0.000 0 0 -1 0 0 5
1350 990 2925 990 2925 1260 1350 1260 1350 990
3 0 0 2 0 7 50 -1 -1 0.000 0 0 0 6
4095 2475 3825 2700 3600 2700 3150 2700 2925 2700 2700 2925
0.000 1.000 1.000 1.000 1.000 0.000
3 0 0 2 0 7 50 -1 -1 0.000 0 0 0 6
1350 2475 1575 2700 1800 2700 2250 2700 2475 2700 2700 2925
0.000 1.000 1.000 1.000 1.000 0.000
4 1 0 50 -1 14 12 0.0000 4 135 105 1350 -45 4\001
4 1 0 50 -1 14 12 0.0000 4 135 105 2250 -45 8\001
4 1 0 50 -1 14 12 0.0000 4 135 210 6525 -45 27\001
4 1 0 50 -1 14 12 0.0000 4 180 840 3600 2475 position\001
4 1 0 50 -1 18 14 0.0000 4 210 2820 3600 3150 Overlaping TrackSegments\001

View File

@ -0,0 +1,269 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
0 32 #ffffdd
6 1725 8325 2850 9075
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
1800 8550 2700 8550 2700 8850 1800 8850 1800 8550
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
1875 8400 1800 8400 1800 9000 1875 9000
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
2775 8400 2700 8400 2700 9000 2775 9000
-6
6 3225 8325 4050 9075
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3975 8400 3900 8400 3900 9000 3975 9000
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
3300 8550 3900 8550 3900 8850 3300 8850 3300 8550
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3375 8400 3300 8400 3300 9000 3375 9000
-6
6 6000 4200 6450 4800
6 6000 4500 6450 4800
2 2 0 1 0 7 50 -1 0 0.000 0 0 -1 0 0 5
6000 4500 6450 4500 6450 4800 6000 4800 6000 4500
4 0 7 40 -1 14 14 0.0000 4 135 300 6075 4725 LB\001
-6
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
6000 4200 6000 4800
-6
6 6000 6600 6450 7200
6 6000 6900 6450 7200
2 2 0 1 0 7 50 -1 0 0.000 0 0 -1 0 0 5
6000 6900 6450 6900 6450 7200 6000 7200 6000 6900
4 0 7 40 -1 14 14 0.0000 4 135 300 6075 7125 LB\001
-6
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
6000 6600 6000 7200
-6
6 9000 9000 9450 9600
6 9000 9300 9450 9600
2 2 0 1 0 7 50 -1 0 0.000 0 0 -1 0 0 5
9000 9300 9450 9300 9450 9600 9000 9600 9000 9300
4 0 7 40 -1 14 14 0.0000 4 135 300 9075 9525 LB\001
-6
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 9000 9000 9600
-6
6 9000 11400 9450 12000
6 9000 11700 9450 12000
2 2 0 1 0 7 50 -1 0 0.000 0 0 -1 0 0 5
9000 11700 9450 11700 9450 12000 9000 12000 9000 11700
4 0 7 40 -1 14 14 0.0000 4 135 300 9075 11925 LB\001
-6
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 11400 9000 12000
-6
6 3600 1200 4050 1800
6 3600 1500 4050 1800
2 2 0 1 0 7 50 -1 0 0.000 0 0 -1 0 0 5
3600 1500 4050 1500 4050 1800 3600 1800 3600 1500
4 0 7 40 -1 14 14 0.0000 4 135 300 3675 1725 LB\001
-6
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3600 1200 3600 1800
-6
6 8925 525 9150 1275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 600 9000 1200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9075 600 9075 1200
-6
6 5925 525 6750 1275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6675 600 6600 600 6600 1200 6675 1200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
6000 750 6600 750 6600 1050 6000 1050 6000 750
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6075 600 6000 600 6000 1200 6075 1200
-6
6 8925 3525 9150 4275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 3600 9000 4200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9075 3600 9075 4200
-6
6 5925 3525 6750 4275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6675 3600 6600 3600 6600 4200 6675 4200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
6000 3750 6600 3750 6600 4050 6000 4050 6000 3750
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6075 3600 6000 3600 6000 4200 6075 4200
-6
6 8925 5925 9150 6675
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 6000 9000 6600
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9075 6000 9075 6600
-6
6 4125 6300 6000 7200
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
0 0 1.00 60.00 120.00
4200 7200 4200 6300
4 0 0 50 -1 14 12 0.0000 4 120 1680 4275 7200 OutsideElement\001
4 0 0 50 -1 12 14 0.0000 4 135 450 4275 6975 Pos\001
-6
6 3300 5400 5475 6000
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
3300 5400 3300 6000
4 0 4 50 -1 12 14 0.0000 4 195 1050 3375 5550 begin:0\001
4 0 4 50 -1 14 12 0.0000 4 165 2040 3375 5775 BeginIsSegmentMax\001
-6
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
0 0 1.00 60.00 120.00
2400 2400 2400 900
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 2
1500 10800 1500 11400
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1200 11100 9300 11100
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 2
1425 10800 1425 11400
2 1 0 4 1 7 51 -1 -1 0.000 0 0 -1 0 0 2
9000 10800 9000 11400
2 1 0 4 1 7 51 -1 -1 0.000 0 0 -1 0 0 2
9075 10800 9075 11400
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
0 0 1.00 60.00 120.00
6900 12000 6900 11100
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 10200 9000 10800
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
1500 10200 1500 10800
2 1 0 4 0 7 51 -1 -1 0.000 0 0 -1 0 0 2
1500 8400 1500 9000
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1200 8700 9300 8700
2 1 0 4 0 7 51 -1 -1 0.000 0 0 -1 0 0 2
1425 8400 1425 9000
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 4
5775 8400 5700 8400 5700 9000 5775 9000
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
4800 8550 5700 8550 5700 8850 4800 8850 4800 8550
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4875 8400 4800 8400 4800 9000 4875 9000
2 1 0 4 1 7 51 -1 -1 0.000 0 0 -1 0 0 2
9000 8400 9000 9000
2 1 0 4 1 7 51 -1 -1 0.000 0 0 -1 0 0 2
9075 8400 9075 9000
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
0 0 1.00 60.00 120.00
6900 9600 6900 8700
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
5700 7800 5700 8400
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 7800 9000 8400
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 2
1425 600 1425 1200
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 2
1500 600 1500 1200
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
1500 0 1500 600
2 1 0 4 1 7 50 -1 -1 0.000 0 0 -1 0 0 4
3675 600 3600 600 3600 1200 3675 1200
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3600 0 3600 600
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1200 900 9300 900
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
8475 600 8400 600 8400 1200 8475 1200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
7500 750 8400 750 8400 1050 7500 1050 7500 750
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7575 600 7500 600 7500 1200 7575 1200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
3600 750 4500 750 4500 1050 3600 1050 3600 750
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4575 600 4500 600 4500 1200 4575 1200
2 1 0 4 0 7 51 -1 -1 0.000 0 0 -1 0 0 2
1500 3600 1500 4200
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1200 3900 9300 3900
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
8475 3600 8400 3600 8400 4200 8475 4200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
7500 3750 8400 3750 8400 4050 7500 4050 7500 3750
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7575 3600 7500 3600 7500 4200 7575 4200
2 1 0 4 0 7 51 -1 -1 0.000 0 0 -1 0 0 2
1425 3600 1425 4200
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 4
2475 3600 2400 3600 2400 4200 2475 4200
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
0 0 1.00 60.00 120.00
3000 4800 3000 3900
2 1 0 4 1 7 50 -1 -1 0.000 0 0 -1 0 0 4
5175 3600 5100 3600 5100 4200 5175 4200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
2400 3750 5100 3750 5100 4050 2400 4050 2400 3750
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
2400 3000 2400 3600
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5100 3000 5100 3600
2 1 0 4 0 7 51 -1 -1 0.000 0 0 -1 0 0 2
1500 6000 1500 6600
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1200 6300 9300 6300
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
8475 6000 8400 6000 8400 6600 8475 6600
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
7500 6150 8400 6150 8400 6450 7500 6450 7500 6150
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7575 6000 7500 6000 7500 6600 7575 6600
2 1 0 4 0 7 51 -1 -1 0.000 0 0 -1 0 0 2
1425 6000 1425 6600
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6675 6000 6600 6000 6600 6600 6675 6600
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
6000 6150 6600 6150 6600 6450 6000 6450 6000 6150
2 1 0 4 1 7 50 -1 -1 0.000 0 0 -1 0 0 4
6075 6000 6000 6000 6000 6600 6075 6600
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
2400 6150 3300 6150 3300 6450 2400 6450 2400 6150
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 4
3375 6000 3300 6000 3300 6600 3375 6600
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
2475 6000 2400 6000 2400 6600 2475 6600
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6000 5400 6000 6000
2 2 0 0 0 32 100 -1 20 0.000 0 0 -1 0 0 5
900 -300 10800 -300 10800 12300 900 12300 900 -300
4 0 0 50 -1 14 12 0.0000 4 120 2160 2475 2400 BeforeFirstElement\001
4 0 0 50 -1 12 14 0.0000 4 135 450 2475 2175 Pos\001
4 0 0 50 -1 14 12 0.0000 4 165 1200 6975 12000 EmptyTrack\001
4 0 0 50 -1 12 14 0.0000 4 135 450 6975 11775 Pos\001
4 0 1 50 -1 14 12 0.0000 4 120 1560 9075 10575 EndIsTrackMax\001
4 0 4 50 -1 12 14 0.0000 4 195 1050 1575 10350 begin:0\001
4 0 4 50 -1 14 12 0.0000 4 165 1800 1575 10575 BeginIsTrackMin\001
4 0 0 50 -1 14 12 0.0000 4 120 1920 6975 9600 AfterLastElement\001
4 0 0 50 -1 12 14 0.0000 4 135 450 6975 9375 Pos\001
4 0 4 50 -1 12 14 0.0000 4 195 1050 5775 7950 begin:2\001
4 0 4 50 -1 14 12 0.0000 4 165 2040 5775 8175 BeginIsSegmentMax\001
4 0 1 50 -1 14 12 0.0000 4 120 1560 9075 8175 EndIsTrackMax\001
4 1 0 40 -1 14 14 0.0000 4 180 450 4050 825 [0]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 6300 825 [1]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 7950 825 [2]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 3750 3825 [0]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 2850 6225 [0]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 6300 3825 [1]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 6300 6225 [1]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 7950 3825 [2]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 7950 6225 [2]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 2250 8625 [0]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 5250 8625 [2]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 3600 8625 [1]\001
4 0 4 50 -1 12 14 0.0000 4 195 1050 1575 150 begin:0\001
4 0 4 50 -1 14 12 0.0000 4 165 1800 1575 375 BeginIsTrackMin\001
4 0 1 50 -1 14 12 0.0000 4 165 1800 3675 375 EndIsSegmentMin\001
4 0 0 50 -1 14 12 0.0000 4 120 1560 3075 4800 InsideElement\001
4 0 0 50 -1 12 14 0.0000 4 135 450 3075 4575 Pos\001
4 0 4 50 -1 12 14 0.0000 4 195 1050 2475 3150 begin:0\001
4 0 4 50 -1 14 12 0.0000 4 165 2040 2475 3375 BeginIsSegmentMin\001
4 0 1 50 -1 14 12 0.0000 4 165 1800 5175 3375 EndIsSegmentMax\001
4 0 1 50 -1 14 12 0.0000 4 165 2280 6075 5775 EndIsNextSegmentMin\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -0,0 +1,269 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
0 32 #ffffdd
6 1725 8325 2850 9075
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
1800 8550 2700 8550 2700 8850 1800 8850 1800 8550
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
1875 8400 1800 8400 1800 9000 1875 9000
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
2775 8400 2700 8400 2700 9000 2775 9000
-6
6 3225 8325 4050 9075
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3975 8400 3900 8400 3900 9000 3975 9000
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
3300 8550 3900 8550 3900 8850 3300 8850 3300 8550
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3375 8400 3300 8400 3300 9000 3375 9000
-6
6 6000 4200 6450 4800
6 6000 4500 6450 4800
2 2 0 1 0 7 50 -1 0 0.000 0 0 -1 0 0 5
6000 4500 6450 4500 6450 4800 6000 4800 6000 4500
4 0 7 40 -1 14 14 0.0000 4 135 300 6075 4725 LB\001
-6
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
6000 4200 6000 4800
-6
6 6000 6600 6450 7200
6 6000 6900 6450 7200
2 2 0 1 0 7 50 -1 0 0.000 0 0 -1 0 0 5
6000 6900 6450 6900 6450 7200 6000 7200 6000 6900
4 0 7 40 -1 14 14 0.0000 4 135 300 6075 7125 LB\001
-6
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
6000 6600 6000 7200
-6
6 9000 9000 9450 9600
6 9000 9300 9450 9600
2 2 0 1 0 7 50 -1 0 0.000 0 0 -1 0 0 5
9000 9300 9450 9300 9450 9600 9000 9600 9000 9300
4 0 7 40 -1 14 14 0.0000 4 135 300 9075 9525 LB\001
-6
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 9000 9000 9600
-6
6 9000 11400 9450 12000
6 9000 11700 9450 12000
2 2 0 1 0 7 50 -1 0 0.000 0 0 -1 0 0 5
9000 11700 9450 11700 9450 12000 9000 12000 9000 11700
4 0 7 40 -1 14 14 0.0000 4 135 300 9075 11925 LB\001
-6
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 11400 9000 12000
-6
6 3600 1200 4050 1800
6 3600 1500 4050 1800
2 2 0 1 0 7 50 -1 0 0.000 0 0 -1 0 0 5
3600 1500 4050 1500 4050 1800 3600 1800 3600 1500
4 0 7 40 -1 14 14 0.0000 4 135 300 3675 1725 LB\001
-6
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3600 1200 3600 1800
-6
6 8925 525 9150 1275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 600 9000 1200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9075 600 9075 1200
-6
6 5925 525 6750 1275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6675 600 6600 600 6600 1200 6675 1200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
6000 750 6600 750 6600 1050 6000 1050 6000 750
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6075 600 6000 600 6000 1200 6075 1200
-6
6 8925 3525 9150 4275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 3600 9000 4200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9075 3600 9075 4200
-6
6 5925 3525 6750 4275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6675 3600 6600 3600 6600 4200 6675 4200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
6000 3750 6600 3750 6600 4050 6000 4050 6000 3750
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6075 3600 6000 3600 6000 4200 6075 4200
-6
6 8925 5925 9150 6675
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 6000 9000 6600
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9075 6000 9075 6600
-6
6 4125 6300 6000 7200
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
0 0 1.00 60.00 120.00
4200 7200 4200 6300
4 0 0 50 -1 14 12 0.0000 4 120 1680 4275 7200 OutsideElement\001
4 0 0 50 -1 12 14 0.0000 4 135 450 4275 6975 Pos\001
-6
6 3300 5400 5475 6000
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
3300 5400 3300 6000
4 0 4 50 -1 12 14 0.0000 4 195 1050 3375 5550 begin:0\001
4 0 4 50 -1 14 12 0.0000 4 165 2040 3375 5775 BeginIsSegmentMax\001
-6
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
0 0 1.00 60.00 120.00
2400 2400 2400 900
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 2
1500 10800 1500 11400
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1200 11100 9300 11100
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 2
1425 10800 1425 11400
2 1 0 4 1 7 51 -1 -1 0.000 0 0 -1 0 0 2
9000 10800 9000 11400
2 1 0 4 1 7 51 -1 -1 0.000 0 0 -1 0 0 2
9075 10800 9075 11400
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
0 0 1.00 60.00 120.00
6900 12000 6900 11100
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 10200 9000 10800
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
1500 10200 1500 10800
2 1 0 4 0 7 51 -1 -1 0.000 0 0 -1 0 0 2
1500 8400 1500 9000
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1200 8700 9300 8700
2 1 0 4 0 7 51 -1 -1 0.000 0 0 -1 0 0 2
1425 8400 1425 9000
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 4
5775 8400 5700 8400 5700 9000 5775 9000
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
4800 8550 5700 8550 5700 8850 4800 8850 4800 8550
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4875 8400 4800 8400 4800 9000 4875 9000
2 1 0 4 1 7 51 -1 -1 0.000 0 0 -1 0 0 2
9000 8400 9000 9000
2 1 0 4 1 7 51 -1 -1 0.000 0 0 -1 0 0 2
9075 8400 9075 9000
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
0 0 1.00 60.00 120.00
6900 9600 6900 8700
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
5700 7800 5700 8400
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 7800 9000 8400
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 2
1425 600 1425 1200
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 2
1500 600 1500 1200
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
1500 0 1500 600
2 1 0 4 1 7 50 -1 -1 0.000 0 0 -1 0 0 4
3675 600 3600 600 3600 1200 3675 1200
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3600 0 3600 600
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1200 900 9300 900
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
8475 600 8400 600 8400 1200 8475 1200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
7500 750 8400 750 8400 1050 7500 1050 7500 750
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7575 600 7500 600 7500 1200 7575 1200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
3600 750 4500 750 4500 1050 3600 1050 3600 750
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4575 600 4500 600 4500 1200 4575 1200
2 1 0 4 0 7 51 -1 -1 0.000 0 0 -1 0 0 2
1500 3600 1500 4200
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1200 3900 9300 3900
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
8475 3600 8400 3600 8400 4200 8475 4200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
7500 3750 8400 3750 8400 4050 7500 4050 7500 3750
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7575 3600 7500 3600 7500 4200 7575 4200
2 1 0 4 0 7 51 -1 -1 0.000 0 0 -1 0 0 2
1425 3600 1425 4200
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 4
2475 3600 2400 3600 2400 4200 2475 4200
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2
0 0 1.00 60.00 120.00
3000 4800 3000 3900
2 1 0 4 1 7 50 -1 -1 0.000 0 0 -1 0 0 4
5175 3600 5100 3600 5100 4200 5175 4200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
2400 3750 5100 3750 5100 4050 2400 4050 2400 3750
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
2400 3000 2400 3600
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5100 3000 5100 3600
2 1 0 4 0 7 51 -1 -1 0.000 0 0 -1 0 0 2
1500 6000 1500 6600
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1200 6300 9300 6300
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
8475 6000 8400 6000 8400 6600 8475 6600
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
7500 6150 8400 6150 8400 6450 7500 6450 7500 6150
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
7575 6000 7500 6000 7500 6600 7575 6600
2 1 0 4 0 7 51 -1 -1 0.000 0 0 -1 0 0 2
1425 6000 1425 6600
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
6675 6000 6600 6000 6600 6600 6675 6600
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
6000 6150 6600 6150 6600 6450 6000 6450 6000 6150
2 1 0 4 1 7 50 -1 -1 0.000 0 0 -1 0 0 4
6075 6000 6000 6000 6000 6600 6075 6600
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
2400 6150 3300 6150 3300 6450 2400 6450 2400 6150
2 1 0 4 4 7 51 -1 -1 0.000 0 0 -1 0 0 4
3375 6000 3300 6000 3300 6600 3375 6600
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
2475 6000 2400 6000 2400 6600 2475 6600
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6000 5400 6000 6000
2 2 0 0 0 32 100 -1 20 0.000 0 0 -1 0 0 5
900 -300 10800 -300 10800 12300 900 12300 900 -300
4 0 0 50 -1 14 12 0.0000 4 120 2160 2475 2400 BeforeFirstElement\001
4 0 0 50 -1 12 14 0.0000 4 135 450 2475 2175 Pos\001
4 0 0 50 -1 14 12 0.0000 4 165 1200 6975 12000 EmptyTrack\001
4 0 0 50 -1 12 14 0.0000 4 135 450 6975 11775 Pos\001
4 0 1 50 -1 14 12 0.0000 4 120 1560 9075 10575 EndIsTrackMax\001
4 0 4 50 -1 12 14 0.0000 4 195 1050 1575 10350 begin:0\001
4 0 4 50 -1 14 12 0.0000 4 165 1800 1575 10575 BeginIsTrackMin\001
4 0 0 50 -1 14 12 0.0000 4 120 1920 6975 9600 AfterLastElement\001
4 0 0 50 -1 12 14 0.0000 4 135 450 6975 9375 Pos\001
4 0 4 50 -1 12 14 0.0000 4 195 1050 5775 7950 begin:2\001
4 0 4 50 -1 14 12 0.0000 4 165 2040 5775 8175 BeginIsSegmentMax\001
4 0 1 50 -1 14 12 0.0000 4 120 1560 9075 8175 EndIsTrackMax\001
4 1 0 40 -1 14 14 0.0000 4 180 450 4050 825 [0]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 6300 825 [1]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 7950 825 [2]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 3750 3825 [0]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 2850 6225 [0]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 6300 3825 [1]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 6300 6225 [1]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 7950 3825 [2]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 7950 6225 [2]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 2250 8625 [0]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 5250 8625 [2]\001
4 1 0 40 -1 14 14 0.0000 4 180 450 3600 8625 [1]\001
4 0 4 50 -1 12 14 0.0000 4 195 1050 1575 150 begin:0\001
4 0 4 50 -1 14 12 0.0000 4 165 1800 1575 375 BeginIsTrackMin\001
4 0 1 50 -1 14 12 0.0000 4 165 1800 3675 375 EndIsSegmentMin\001
4 0 0 50 -1 14 12 0.0000 4 120 1560 3075 4800 InsideElement\001
4 0 0 50 -1 12 14 0.0000 4 135 450 3075 4575 Pos\001
4 0 4 50 -1 12 14 0.0000 4 195 1050 2475 3150 begin:0\001
4 0 4 50 -1 14 12 0.0000 4 165 2040 2475 3375 BeginIsSegmentMin\001
4 0 1 50 -1 14 12 0.0000 4 165 1800 5175 3375 EndIsSegmentMax\001
4 0 1 50 -1 14 12 0.0000 4 165 2280 6075 5775 EndIsNextSegmentMin\001

View File

@ -0,0 +1,69 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
90.00
Single
-2
1200 2
0 32 #ffffdd
6 1350 6525 1575 7275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1425 6600 1425 7200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1500 6600 1500 7200
-6
6 8925 6525 9150 7275
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9000 6600 9000 7200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
9075 6600 9075 7200
-6
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
1875 6600 1800 6600 1800 7200 1875 7200
2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
2475 6600 2400 6600 2400 7200 2475 7200
2 2 0 0 0 7 60 -1 10 0.000 0 0 -1 0 0 5
1800 6750 2400 6750 2400 7050 1800 7050 1800 6750
2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 4
3375 6600 3300 6600 3300 7200 3375 7200
2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 4
4575 6600 4500 6600 4500 7200 4575 7200
2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 4
7875 6600 7800 6600 7800 7200 7875 7200
2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 4
6675 6600 6600 6600 6600 7200 6675 7200
2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 4
5775 6600 5700 6600 5700 7200 5775 7200
2 2 0 0 4 4 62 -1 30 0.000 0 0 -1 0 0 5
5700 6975 7800 6975 7800 7050 5700 7050 5700 6975
2 2 0 0 4 4 62 -1 30 0.000 0 0 -1 0 0 5
3300 6750 6600 6750 6600 6825 3300 6825 3300 6750
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1200 6900 9300 6900
2 2 0 0 4 4 62 -1 30 0.000 0 0 -1 0 0 5
3300 6975 4500 6975 4500 7050 3300 7050 3300 6975
2 1 0 1 4 7 40 -1 -1 0.000 0 0 -1 0 0 2
5700 6000 5700 6600
2 1 0 1 4 7 40 -1 -1 0.000 0 0 -1 0 0 2
3300 6000 3300 6600
2 1 0 1 4 7 40 -1 -1 0.000 0 0 -1 0 0 2
3300 7275 3300 7800
2 1 0 1 4 7 40 -1 -1 0.000 0 0 -1 0 0 2
7800 7275 7800 7800
2 1 0 1 4 7 40 -1 -1 0.000 0 0 -1 1 1 2
0 0 1.00 60.00 120.00
0 0 1.00 60.00 120.00
3300 7725 7800 7725
2 2 0 0 0 32 100 -1 20 0.000 0 0 -1 0 0 5
900 5700 9600 5700 9600 8400 900 8400 900 5700
4 1 0 40 -1 14 14 0.0000 4 180 450 2100 6825 [0]\001
4 1 4 40 -1 14 14 0.0000 4 180 450 3900 6750 [1]\001
4 1 4 40 -1 14 14 0.0000 4 180 450 3900 7125 [2]\001
4 1 4 40 -1 14 14 0.0000 4 180 450 6150 7125 [3]\001
4 0 4 40 -1 14 14 0.0000 4 195 1050 3375 6150 begin:1\001
4 0 4 40 -1 14 14 0.0000 4 195 1050 5775 6150 begin:3\001
4 1 4 40 -1 14 14 0.0000 4 150 2550 5550 7950 returned interval\001
4 0 4 40 -1 12 14 0.0000 4 180 1200 3300 6375 (return)\001
4 0 4 40 -1 12 14 0.0000 4 180 900 5700 6375 (call)\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@ -0,0 +1,93 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
90.00
Single
-2
1200 2
0 32 #ffffdd
1 4 0 2 4 7 50 -1 -1 0.000 1 0.0000 3975 2400 75 75 3900 2400 4050 2400
1 4 0 2 4 7 50 -1 -1 0.000 1 0.0000 3975 3300 75 75 3900 3300 4050 3300
1 4 0 2 4 7 50 -1 -1 0.000 1 0.0000 3975 3600 75 75 3900 3600 4050 3600
1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 3000 750 75 75 2925 750 3075 750
1 4 0 2 4 7 50 -1 -1 0.000 1 0.0000 2400 750 75 75 2325 750 2475 750
1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 1800 750 75 75 1725 750 1875 750
1 4 0 2 4 7 50 -1 -1 0.000 1 0.0000 7125 5550 75 75 7050 5550 7200 5550
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 2550 5100 2550
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 2850 5100 2850
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 3150 5100 3150
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 3450 5100 3450
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
5100 1950 5100 3750 3000 3750 3000 1950 5100 1950
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
3000 1950 5100 1950 5100 2250 3000 2250 3000 1950
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
6150 3750 8250 3750
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
8250 3150 8250 4350 6150 4350 6150 3150 8250 3150
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
6150 3150 8250 3150 8250 3450 6150 3450 6150 3150
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
9000 5400 11100 5400 11100 5700 9000 5700 9000 5400
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
11100 5400 11100 6000 9000 6000 9000 5400 11100 5400
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 4
1 1 1.00 60.00 120.00
2400 825 2400 1950 2550 2100 3000 2100
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2100 600 2100 900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
2700 600 2700 900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3300 600 3300 900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
3900 600 3900 900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
4500 600 4500 900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5100 600 5100 900
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5700 600 5700 900
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
1500 600 6300 600 6300 900 1500 900 1500 600
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
1500 300 2700 300 2700 600 1500 600 1500 300
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
6150 4800 8250 4800 8250 5100 6150 5100 6150 4800
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
6150 5400 8250 5400
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
8250 4800 8250 5700 6150 5700 6150 4800 8250 4800
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 8
1 1 1.00 60.00 120.00
4050 2400 6750 2400 6900 2250 6900 -150 6750 -300 2250 -300
2100 -150 2100 300
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
4050 3300 6150 3300
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 6
1 1 1.00 60.00 120.00
4050 3600 5250 3600 5400 3750 5400 4800 5550 4950 6150 4950
2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 1 0 2
1 1 1.00 60.00 120.00
7200 5550 9000 5550
2 2 0 0 0 32 100 -1 20 0.000 0 0 -1 0 0 5
1200 -450 11400 -450 11400 6150 1200 6150 1200 -450
4 0 0 50 -1 14 14 0.0000 4 150 900 3075 2775 net<b>\001
4 0 0 50 -1 14 14 0.0000 4 195 900 3075 3075 [8,10[\001
4 0 7 40 -1 14 14 0.0000 4 195 1800 3075 2175 TrackSegment\001
4 0 7 40 -1 14 14 0.0000 4 180 1650 6225 3375 AutoSegment\001
4 0 0 50 -1 14 14 0.0000 4 150 900 6225 3675 net<b>\001
4 0 0 50 -1 14 16 0.0000 4 225 990 6225 3975 _flags\001
4 0 0 50 -1 14 12 0.0000 4 165 1440 6450 4200 SegCanonical\001
4 0 7 40 -1 14 14 0.0000 4 195 1800 9075 5625 RoutingEvent\001
4 0 0 50 -1 14 14 0.0000 4 150 900 9075 5925 net<b>\001
4 1 7 40 -1 14 16 0.0000 4 165 825 2100 525 Track\001
4 0 7 40 -1 14 14 0.0000 4 195 1950 6225 5025 DataNegociate\001
4 0 0 50 -1 14 14 0.0000 4 150 900 6225 5325 net<b>\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

View File

@ -0,0 +1,432 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
90.00
Single
-2
1200 2
0 32 #ffffdd
6 1350 300 8700 600
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1425 450 1500 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1425 525 1575 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
7500 525 7650 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
8025 525 8175 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
8100 525 8250 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
8175 525 8325 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
7800 525 7950 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
7875 525 8025 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
7950 525 8100 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
7575 525 7725 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
7650 525 7800 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
7725 525 7875 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6750 525 6900 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
7275 525 7425 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
7350 525 7500 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
7425 525 7575 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
7050 525 7200 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
7125 525 7275 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
7200 525 7350 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6825 525 6975 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6900 525 7050 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6975 525 7125 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6000 525 6150 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6525 525 6675 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6600 525 6750 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6675 525 6825 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6300 525 6450 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6375 525 6525 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6450 525 6600 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6075 525 6225 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6150 525 6300 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6225 525 6375 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5250 525 5400 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5775 525 5925 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5850 525 6000 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5925 525 6075 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5550 525 5700 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5625 525 5775 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5700 525 5850 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5325 525 5475 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5400 525 5550 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5475 525 5625 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4500 525 4650 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5025 525 5175 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5100 525 5250 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5175 525 5325 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4800 525 4950 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4875 525 5025 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4950 525 5100 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4575 525 4725 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4650 525 4800 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4725 525 4875 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3750 525 3900 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4275 525 4425 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4350 525 4500 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4425 525 4575 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4050 525 4200 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4125 525 4275 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4200 525 4350 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3825 525 3975 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3900 525 4050 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3975 525 4125 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 525 3150 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3525 525 3675 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3600 525 3750 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3675 525 3825 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3300 525 3450 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3375 525 3525 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3450 525 3600 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3075 525 3225 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3150 525 3300 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3225 525 3375 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2250 525 2400 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2775 525 2925 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2850 525 3000 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2925 525 3075 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2550 525 2700 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2625 525 2775 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2700 525 2850 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2325 525 2475 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2400 525 2550 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2475 525 2625 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1500 525 1650 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2025 525 2175 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2100 525 2250 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2175 525 2325 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1800 525 1950 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1875 525 2025 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1950 525 2100 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1575 525 1725 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1650 525 1800 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1725 525 1875 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
8250 525 8400 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
8325 525 8475 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
8400 525 8550 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
8475 525 8625 375
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
8550 525 8625 450
2 2 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 5
1425 375 8625 375 8625 525 1425 525 1425 375
-6
6 1350 1350 3300 1650
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2925 1575 3075 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3000 1575 3150 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3075 1575 3225 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2175 1575 2325 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2700 1575 2850 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2775 1575 2925 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2850 1575 3000 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2475 1575 2625 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2550 1575 2700 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2625 1575 2775 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2250 1575 2400 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2325 1575 2475 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2400 1575 2550 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1425 1575 1575 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1950 1575 2100 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2025 1575 2175 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2100 1575 2250 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1725 1575 1875 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1800 1575 1950 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1875 1575 2025 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1500 1575 1650 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1575 1575 1725 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1650 1575 1800 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1425 1500 1500 1425
2 1 0 1 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
3150 1575 3225 1500
2 2 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 5
1425 1425 3225 1425 3225 1575 1425 1575 1425 1425
-6
6 3000 2250 8700 2550
6 3075 2325 8625 2475
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
8325 2475 8475 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
8400 2475 8550 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
8475 2475 8625 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
7575 2475 7725 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
8100 2475 8250 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
8175 2475 8325 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
8250 2475 8400 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
7875 2475 8025 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
7950 2475 8100 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
8025 2475 8175 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
7650 2475 7800 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
7725 2475 7875 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
7800 2475 7950 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6825 2475 6975 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
7350 2475 7500 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
7425 2475 7575 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
7500 2475 7650 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
7125 2475 7275 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
7200 2475 7350 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
7275 2475 7425 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6900 2475 7050 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6975 2475 7125 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
7050 2475 7200 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6075 2475 6225 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6600 2475 6750 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6675 2475 6825 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6750 2475 6900 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6375 2475 6525 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6450 2475 6600 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6525 2475 6675 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6150 2475 6300 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6225 2475 6375 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6300 2475 6450 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
5325 2475 5475 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
5850 2475 6000 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
5925 2475 6075 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
6000 2475 6150 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
5625 2475 5775 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
5700 2475 5850 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
5775 2475 5925 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
5400 2475 5550 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
5475 2475 5625 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
5550 2475 5700 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
4575 2475 4725 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
5100 2475 5250 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
5175 2475 5325 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
5250 2475 5400 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
4875 2475 5025 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
4950 2475 5100 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
5025 2475 5175 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
4650 2475 4800 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
4725 2475 4875 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
4800 2475 4950 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3825 2475 3975 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
4350 2475 4500 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
4425 2475 4575 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
4500 2475 4650 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
4125 2475 4275 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
4200 2475 4350 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
4275 2475 4425 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3900 2475 4050 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3975 2475 4125 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
4050 2475 4200 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3075 2475 3225 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3600 2475 3750 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3675 2475 3825 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3750 2475 3900 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3375 2475 3525 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3450 2475 3600 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3525 2475 3675 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3150 2475 3300 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3225 2475 3375 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3300 2475 3450 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
3075 2400 3150 2325
2 1 0 1 8 7 50 -1 -1 0.000 0 0 7 0 0 2
8550 2475 8625 2400
-6
2 2 0 2 8 7 50 -1 -1 0.000 0 0 7 0 0 5
3075 2325 8625 2325 8625 2475 3075 2475 3075 2325
-6
2 1 0 4 8 7 50 -1 -1 0.000 0 0 -1 0 0 2
3150 1500 3150 2400
2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 2
3150 150 3150 1500
2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 1
1200 375
2 2 3 0 32 32 100 -1 20 2.000 0 0 -1 0 0 5
1200 0 8850 0 8850 3300 1200 3300 1200 0
4 2 8 50 -1 14 12 0.0000 4 120 1200 8625 2250 id:2 dll:0\001
4 0 8 50 -1 14 12 0.0000 4 120 600 3300 2100 dll:1\001
4 0 8 50 -1 14 12 0.0000 4 120 480 3300 1875 id:1\001
4 0 1 50 -1 14 12 0.0000 4 120 1200 1425 300 id:0 dll:0\001
4 0 1 50 -1 14 12 0.0000 4 120 1200 1425 1350 id:0 dll:0\001
4 0 0 50 -1 14 12 0.0000 4 165 2160 1350 3150 dll = _dogLegLevel\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -1,57 +0,0 @@
#FIG 3.2
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
2 2 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 5
3825 2625 3975 2625 3975 2775 3825 2775 3825 2625
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
3900 2700 11400 2700
2 2 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 5
5025 2625 5175 2625 5175 2775 5025 2775 5025 2625
2 2 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 5
11325 2625 11475 2625 11475 2775 11325 2775 11325 2625
2 2 0 1 0 7 60 -1 -1 4.000 0 0 -1 0 0 5
3600 2100 6300 2100 6300 3000 3600 3000 3600 2100
2 2 0 1 0 7 60 -1 -1 4.000 0 0 -1 0 0 5
3000 1200 4800 1200 4800 3600 3000 3600 3000 1200
2 2 0 1 0 7 60 -1 -1 4.000 0 0 -1 0 0 5
10800 2100 12000 2100 12000 3600 10800 3600 10800 2100
2 1 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
4800 3675 4800 4500
2 1 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
6300 3075 6300 4500
2 1 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 2
10800 3675 10800 4500
2 1 0 1 4 7 50 -1 -1 0.000 0 0 7 1 0 2
3 1 4.00 60.00 120.00
12900 4800 10800 4800
2 1 0 1 4 7 50 -1 -1 4.000 0 0 7 0 0 2
4800 4800 10800 4800
2 1 0 1 4 7 50 -1 -1 4.000 0 0 7 0 0 2
4800 4500 4800 5100
2 1 0 1 4 7 50 -1 -1 4.000 0 0 7 0 0 2
10800 4500 10800 5100
2 1 0 1 4 7 50 -1 -1 0.000 0 0 7 1 0 2
3 1 4.00 60.00 120.00
2700 4800 4800 4800
2 2 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 5
2100 600 13500 600 13500 5400 2100 5400 2100 600
3 0 0 1 0 7 60 -1 -1 0.000 0 0 0 3
3900 2700 3375 2025 3000 1200
0.000 1.000 0.000
3 0 0 1 0 7 60 -1 -1 4.000 0 0 0 3
5025 2700 4350 2550 3600 2100
0.000 1.000 0.000
3 0 0 1 0 7 60 -1 -1 4.000 0 0 0 3
11400 2700 11025 2475 10800 2100
0.000 1.000 0.000
4 0 0 50 -1 14 12 1.5708 4 120 630 4725 4500 CBXMax\001
4 0 0 50 -1 14 12 1.5708 4 120 630 6225 4500 CBXMax\001
4 0 0 50 -1 14 12 1.5708 4 135 630 10725 4500 CBXmin\001
4 2 4 50 -1 14 18 0.0000 4 180 1485 4500 5100 leftBound\001
4 0 4 50 -1 14 18 0.0000 4 240 1650 11100 5100 rightBound\001

View File

@ -1,51 +0,0 @@
#FIG 3.2
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
2 2 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 5
3825 2625 3975 2625 3975 2775 3825 2775 3825 2625
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
3900 2700 11400 2700
2 2 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 5
5025 2625 5175 2625 5175 2775 5025 2775 5025 2625
2 2 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 5
11325 2625 11475 2625 11475 2775 11325 2775 11325 2625
2 1 0 1 4 7 50 -1 -1 0.000 0 0 7 1 0 2
3 1 4.00 60.00 120.00
12900 4800 10800 4800
2 1 0 1 4 7 50 -1 -1 4.000 0 0 7 0 0 2
4800 4800 10800 4800
2 1 0 1 4 7 50 -1 -1 4.000 0 0 7 0 0 2
4800 4500 4800 5100
2 1 0 1 4 7 50 -1 -1 4.000 0 0 7 0 0 2
10800 4500 10800 5100
2 1 0 1 4 7 50 -1 -1 0.000 0 0 7 1 0 2
3 1 4.00 60.00 120.00
2700 4800 4800 4800
2 1 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 2
4800 3900 10800 3900
2 2 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 5
10725 3825 10875 3825 10875 3975 10725 3975 10725 3825
2 2 0 4 0 7 50 -1 -1 10.000 0 0 7 0 0 5
4725 3825 4875 3825 4875 3975 4725 3975 4725 3825
2 2 0 4 0 7 60 -1 -1 10.000 0 0 -1 0 0 5
4650 3750 4950 3750 4950 4050 4650 4050 4650 3750
2 1 3 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
3900 2700 4800 3900
2 1 3 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
5100 2700 4800 3900
2 1 3 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2
11400 2700 10800 3900
2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
3300 2100 3300 4500
2 2 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 5
2100 1500 13500 1500 13500 5400 2100 5400 2100 1500
4 2 4 50 -1 14 18 0.0000 4 180 1485 4500 5100 leftBound\001
4 0 4 50 -1 14 18 0.0000 4 240 1650 11100 5100 rightBound\001
4 1 0 60 -1 14 14 1.5708 4 150 1890 3225 3150 maximal shrunk\001

View File

@ -1,105 +0,0 @@
#FIG 3.2
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
2 2 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 5
3525 3225 3675 3225 3675 3375 3525 3375 3525 3225
2 2 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 5
5025 3225 5175 3225 5175 3375 5025 3375 5025 3225
2 2 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 5
9825 3225 9975 3225 9975 3375 9825 3375 9825 3225
2 1 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 2
3600 3300 9900 3300
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
3600 3300 3600 600
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
5100 4500 5100 1500
2 1 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 2
9900 5100 9900 3300
2 2 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 5
7125 3225 7275 3225 7275 3375 7125 3375 7125 3225
2 2 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 5
7050 3000 7350 3000 7350 3600 7050 3600 7050 3000
2 2 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 5
3525 525 3675 525 3675 675 3525 675 3525 525
2 2 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 5
5025 1425 5175 1425 5175 1575 5025 1575 5025 1425
2 2 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 5
5025 4425 5175 4425 5175 4575 5025 4575 5025 4425
2 2 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 5
3525 2025 3675 2025 3675 2175 3525 2175 3525 2025
2 2 0 4 4 7 60 -1 -1 10.000 0 0 -1 0 0 5
9825 5025 9975 5025 9975 5175 9825 5175 9825 5025
2 1 0 1 4 7 60 -1 -1 4.000 0 0 -1 0 0 2
3750 600 11700 600
2 1 0 1 4 7 60 -1 -1 4.000 0 0 -1 0 0 2
5250 1500 11700 1500
2 1 0 1 4 7 60 -1 -1 4.000 0 0 -1 0 0 2
10050 3300 11700 3300
2 1 0 1 4 7 60 -1 -1 4.000 0 0 -1 0 0 2
10050 5100 11700 5100
2 1 0 1 0 7 60 -1 -1 4.000 0 0 -1 0 0 2
3600 3450 3600 6000
2 1 0 1 0 7 60 -1 -1 4.000 0 0 -1 0 0 2
5100 4650 5100 6000
2 1 0 1 0 7 60 -1 -1 4.000 0 0 -1 0 0 2
7200 3675 7200 6000
2 1 0 1 0 7 60 -1 -1 4.000 0 0 -1 0 0 2
9900 5250 9900 6000
2 1 0 1 4 7 60 -1 -1 4.000 0 0 -1 0 0 2
5250 4500 11700 4500
2 1 0 1 0 7 60 -1 -1 0.000 0 0 -1 1 0 2
1 0 1.00 120.00 240.00
2700 5700 10500 5700
2 1 0 1 4 7 60 -1 -1 0.000 0 0 -1 1 0 2
1 0 1.00 120.00 240.00
3000 6000 3000 0
2 1 0 4 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
2925 4500 3075 4500
2 1 0 4 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
2925 5100 3075 5100
2 1 0 4 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
2925 2100 3075 2100
2 1 0 4 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
2925 3300 3075 3300
2 1 0 4 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
2925 600 3075 600
2 1 0 4 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
3600 5625 3600 5775
2 1 0 4 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
5100 5625 5100 5775
2 1 0 4 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
9900 5625 9900 5775
2 1 0 4 0 7 60 -1 -1 0.000 0 0 -1 0 0 2
7200 5625 7200 5775
2 1 0 4 4 7 60 -1 -1 0.000 0 0 -1 0 0 2
2925 1500 3075 1500
2 2 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 5
2100 -600 12300 -600 12300 6600 2100 6600 2100 -600
4 0 4 60 -1 18 14 0.0000 4 210 1260 10200 1425 right @7: 16\001
4 0 4 60 -1 18 14 0.0000 4 210 1260 10200 525 right @2: 19\001
4 0 4 60 -1 18 14 0.0000 4 210 1800 10200 3225 punctual @14: 10\001
4 0 4 60 -1 18 14 0.0000 4 180 1080 10200 5025 left @23: 4\001
4 0 4 60 -1 18 14 0.0000 4 180 960 10200 4425 left @7: 6\001
4 1 4 60 -1 18 14 0.0000 4 165 150 3450 1725 A\001
4 1 4 60 -1 18 14 0.0000 4 165 150 3750 2775 B\001
4 1 4 60 -1 18 14 0.0000 4 165 165 5250 2475 C\001
4 1 4 60 -1 18 14 0.0000 4 165 165 7500 3600 D\001
4 1 4 60 -1 18 14 0.0000 4 165 135 9750 4200 E\001
4 1 0 60 -1 18 14 0.0000 4 150 120 3600 6300 2\001
4 1 0 60 -1 18 14 0.0000 4 150 120 5100 6300 7\001
4 1 0 60 -1 18 14 0.0000 4 150 240 7200 6300 14\001
4 1 0 60 -1 18 14 0.0000 4 150 240 9900 6300 23\001
4 2 4 60 -1 18 14 0.0000 4 150 120 2850 5100 4\001
4 2 4 60 -1 18 14 0.0000 4 150 120 2850 4500 6\001
4 2 4 60 -1 18 14 0.0000 4 150 240 2850 3300 10\001
4 2 4 60 -1 18 14 0.0000 4 150 240 2850 2100 14\001
4 2 4 60 -1 18 14 0.0000 4 150 240 2850 600 19\001
4 1 4 60 -1 14 14 0.0000 4 135 135 3000 -75 Y\001
4 1 0 60 -1 14 14 0.0000 4 135 135 10650 5775 X\001
4 2 4 60 -1 18 14 0.0000 4 150 240 2850 1500 16\001

View File

@ -0,0 +1,271 @@
#FIG 3.2 Produced by xfig version 3.2.5a
Landscape
Center
Inches
Letter
100.00
Single
-2
1200 2
0 32 #ffffdd
6 450 3000 750 4350
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 3225 675 3075
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 3300 675 3150
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 3375 675 3225
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 3450 675 3300
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 3525 675 3375
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 3600 675 3450
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 3675 675 3525
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 3750 675 3600
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 3825 675 3675
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 3900 675 3750
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 3975 675 3825
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 4050 675 3900
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 4125 675 3975
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 4200 675 4050
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 4275 675 4125
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 3150 600 3075
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
600 4275 675 4200
2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5
525 3075 675 3075 675 4275 525 4275 525 3075
-6
6 1425 3075 1875 3375
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
1500 3300 1800 3300
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
1650 3150 1650 3300
-6
6 2325 3225 2775 3525
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
2400 3300 2700 3300
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
2550 3450 2550 3300
-6
6 450 900 750 2250
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 1125 675 975
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 1200 675 1050
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 1275 675 1125
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 1350 675 1200
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 1425 675 1275
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 1500 675 1350
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 1575 675 1425
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 1650 675 1500
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 1725 675 1575
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 1800 675 1650
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 1875 675 1725
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 1950 675 1800
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 2025 675 1875
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 2100 675 1950
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 2175 675 2025
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
525 1050 600 975
2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2
600 2175 675 2100
2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5
525 975 675 975 675 2175 525 2175 525 975
-6
6 1425 975 1875 1275
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
1500 1200 1800 1200
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
1650 1050 1650 1200
-6
6 2325 1125 2775 1425
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
2400 1200 2700 1200
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
2550 1350 2550 1200
-6
6 -825 6450 7425 7575
2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2
-750 6525 -150 6525
2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
-750 6825 -150 6825
2 1 0 2 4 32 40 -1 -1 0.000 0 0 -1 0 0 2
-750 7125 -150 7125
2 2 0 0 0 0 60 -1 4 2.000 0 0 -1 0 0 5
-750 7350 -150 7350 -150 7425 -750 7425 -750 7350
4 0 0 60 -1 18 12 0.0000 4 195 2115 0 6600 parallel AutoSegments\001
4 0 0 60 -1 18 12 0.0000 4 195 2715 0 6900 perpandicular AutoSegments\001
4 0 0 60 -1 18 12 0.0000 4 195 2700 0 7200 newly created AutoSegments\001
4 0 0 60 -1 18 12 0.0000 4 195 1440 0 7500 TrackSegments\001
4 0 0 60 -1 14 12 0.0000 4 165 2880 4050 6600 dogleg[N+0] = 10 (paral)\001
4 0 0 60 -1 14 12 0.0000 4 165 3120 4050 6900 dogleg[N+1] = 20 (perpand)\001
4 0 0 60 -1 14 12 0.0000 4 165 3360 4050 7200 dogleg[N+2] = 21 (new paral)\001
-6
2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5
525 3225 675 3225 675 3375 525 3375 525 3225
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
1050 3300 1050 3000 1350 3000 1350 3300
2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1650 3300 1650 2550
2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2550 3300 2550 4050
2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2
1650 3300 2550 3300
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
1950 3300 1950 3000 2250 3000 2250 3300
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
2925 3300 2925 3000 3225 3000 3225 3300
2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2
2625 3300 3450 3300
2 1 3 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2
0 0 1.00 60.00 120.00
0 0 1.00 60.00 120.00
3450 5550 450 5550
2 1 3 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2
0 0 1.00 60.00 120.00
0 0 1.00 60.00 120.00
6150 5550 3450 5550
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
3450 3300 3450 4800
2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3
3300 3300 3450 3300 3450 3450
2 1 0 2 4 32 40 -1 -1 0.000 0 0 -1 0 0 2
3450 4800 4350 4800
2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4350 4800 4350 4050
2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5250 4800 5250 4050
2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6150 4800 6150 5550
2 1 0 4 0 32 40 -1 -1 0.000 0 0 -1 0 0 3
6000 4800 6150 4800 6150 4950
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
4200 4800 4500 4800
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
4350 4650 4350 4800
2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2
4350 4800 5250 4800
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4650 4800 4650 4500 4950 4500 4950 4800
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
5100 4800 5400 4800
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
5250 4650 5250 4800
2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2
5250 4800 6150 4800
2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3
3600 4800 3450 4800 3450 4650
2 1 0 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 4
3450 4200 3150 4200 3150 3900 3450 3900
2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2
675 3300 1650 3300
2 1 0 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 4
3750 4800 3750 4500 4050 4500 4050 4800
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5550 4800 5550 4500 5850 4500 5850 4800
2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5
525 1125 675 1125 675 1275 525 1275 525 1125
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
1050 1200 1050 900 1350 900 1350 1200
2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2
3450 1200 4350 1200
2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2
2550 1200 3450 1200
2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
1650 1200 1650 450
2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
2550 1200 2550 1950
2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
4350 1200 4350 450
2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
5250 1200 5250 450
2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2
6150 1200 6150 1950
2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2
675 1200 1650 1200
2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2
1650 1200 2550 1200
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
1950 1200 1950 900 2250 900 2250 1200
2 1 0 4 0 32 40 -1 -1 0.000 0 0 -1 0 0 3
6000 1200 6150 1200 6150 1350
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
4200 1200 4500 1200
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
4350 1050 4350 1200
2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2
4350 1200 5250 1200
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
4650 1200 4650 900 4950 900 4950 1200
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
5100 1200 5400 1200
2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2
5250 1050 5250 1200
2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2
5250 1200 6150 1200
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
5550 1200 5550 900 5850 900 5850 1200
2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4
3300 1200 3300 900 3600 900 3600 1200
2 1 3 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2
3450 2700 3450 5700
2 2 0 0 4 4 60 -1 35 2.000 0 0 -1 0 0 5
3600 3300 3675 3300 3675 4800 3600 4800 3600 3300
2 2 0 0 0 0 60 -1 4 2.000 0 0 -1 0 0 5
3450 5025 6150 5025 6150 5100 3450 5100 3450 5025
2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 2
2925 3300 2925 3525
2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 2
5550 4800 5550 5100
2 1 0 1 4 0 60 -1 -1 4.000 0 0 -1 0 0 2
3450 4200 3675 4200
2 2 0 0 0 0 60 -1 4 2.000 0 0 -1 0 0 5
600 1500 6150 1500 6150 1425 600 1425 600 1500
2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 2
5550 1200 5550 1500
2 2 0 0 4 4 60 -1 35 2.000 0 0 -1 0 0 5
3450 3525 3450 3600 600 3600 600 3525 3450 3525
2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5
-900 300 7500 300 7500 7800 -900 7800 -900 300
4 1 0 50 -1 14 12 0.0000 4 120 240 1200 3225 14\001
4 1 0 50 -1 14 12 0.0000 4 120 240 2100 3225 13\001
4 1 0 50 -1 14 12 0.0000 4 120 240 3075 3225 12\001
4 1 0 50 -1 14 10 0.0000 4 105 945 1950 5700 left side\001
4 1 0 50 -1 14 10 0.0000 4 135 1050 4800 5700 right side\001
4 1 0 50 -1 14 12 0.0000 4 120 240 4800 4725 11\001
4 1 4 50 -1 14 12 0.0000 4 120 240 3300 4125 20\001
4 1 0 50 -1 14 12 0.0000 4 120 240 5700 4725 10\001
4 1 4 50 -1 14 12 0.0000 4 120 240 3900 4725 21\001
4 1 0 50 -1 14 12 0.0000 4 120 240 1200 1125 14\001
4 1 0 50 -1 14 12 0.0000 4 120 240 2100 1125 13\001
4 1 0 50 -1 14 12 0.0000 4 120 240 4800 1125 11\001
4 1 0 50 -1 14 12 0.0000 4 120 240 5700 1125 10\001
4 1 0 50 -1 14 12 0.0000 4 120 240 3450 1125 12\001
4 1 0 50 -1 14 10 0.0000 4 90 105 5700 1350 C\001
4 1 0 50 -1 14 10 0.0000 4 90 105 5700 4950 C\001
4 1 4 50 -1 14 10 0.0000 4 90 105 3525 4125 C\001
4 1 4 50 -1 14 10 0.0000 4 90 105 3075 3450 C\001

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -1,8 +1,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |
@ -15,27 +14,26 @@
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
#include <map> #include <map>
#include <list> #include <list>
#include "hurricane/Error.h"
#include "hurricane/Error.h" #include "hurricane/Warning.h"
#include "hurricane/Warning.h" #include "hurricane/DataBase.h"
#include "hurricane/DataBase.h" #include "hurricane/Technology.h"
#include "hurricane/Technology.h" #include "hurricane/BasicLayer.h"
#include "hurricane/BasicLayer.h" #include "hurricane/RegularLayer.h"
#include "hurricane/RegularLayer.h" #include "hurricane/Horizontal.h"
#include "hurricane/Horizontal.h" #include "hurricane/Vertical.h"
#include "hurricane/Vertical.h" #include "hurricane/NetExternalComponents.h"
#include "hurricane/NetExternalComponents.h" #include "hurricane/Instance.h"
#include "hurricane/Instance.h" #include "hurricane/Plug.h"
#include "hurricane/Plug.h" #include "hurricane/Path.h"
#include "hurricane/Path.h" #include "hurricane/Query.h"
#include "hurricane/Query.h" #include "crlcore/AllianceFramework.h"
#include "crlcore/AllianceFramework.h" #include "kite/RoutingPlane.h"
#include "kite/RoutingPlane.h" #include "kite/TrackFixedSegment.h"
#include "kite/TrackFixedSegment.h" #include "kite/Track.h"
#include "kite/Track.h" #include "kite/KiteEngine.h"
#include "kite/KiteEngine.h"
namespace { namespace {
@ -43,6 +41,8 @@ namespace {
using namespace std; using namespace std;
using Hurricane::tab; using Hurricane::tab;
using Hurricane::inltrace; using Hurricane::inltrace;
using Hurricane::ltracein;
using Hurricane::ltraceout;
using Hurricane::ForEachIterator; using Hurricane::ForEachIterator;
using Hurricane::Warning; using Hurricane::Warning;
using Hurricane::Error; using Hurricane::Error;
@ -72,7 +72,6 @@ namespace {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "::GlobalNetTable". // Class : "::GlobalNetTable".
class GlobalNetTable { class GlobalNetTable {
public: public:
GlobalNetTable ( Cell* ); GlobalNetTable ( Cell* );
@ -208,7 +207,7 @@ namespace {
if ( _vddi == NULL ) cerr << Error("Missing <vddi>/<vdd> net at top level." ) << endl; if ( _vddi == NULL ) cerr << Error("Missing <vddi>/<vdd> net at top level." ) << endl;
if ( _vssi == NULL ) cerr << Error("Missing <vssi>/<vss> net at top level." ) << endl; if ( _vssi == NULL ) cerr << Error("Missing <vssi>/<vss> net at top level." ) << endl;
if ( _ckc == NULL ) cerr << Warning("No <ck> net at top level." ) << endl; if ( _ckc == NULL ) cparanoid << Warning("No <ck> net at top level." ) << endl;
} }
@ -257,23 +256,23 @@ namespace {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "::PowerRailsPlanes". // Class : "::PowerRailsPlanes".
class PowerRailsPlanes { class PowerRailsPlanes {
private: public:
class Rails; class Rails;
class Plane; class Plane;
class Rail { class Rail {
public: public:
Rail ( Rails*, DbU::Unit axis, DbU::Unit width ); Rail ( Rails*, DbU::Unit axis, DbU::Unit width );
inline DbU::Unit getAxis () const; inline DbU::Unit getAxis () const;
inline DbU::Unit getWidth () const; inline DbU::Unit getWidth () const;
inline Rails* getRails () const; inline Rails* getRails () const;
inline RoutingPlane* getRoutingPlane () const; inline RoutingPlane* getRoutingPlane () const;
inline Constant::Direction getDirection () const; inline unsigned int getDirection () const;
inline Net* getNet () const; inline Net* getNet () const;
void merge ( DbU::Unit source, DbU::Unit target ); void merge ( DbU::Unit source, DbU::Unit target );
void doLayout ( const Layer* ); void doLayout ( const Layer* );
string _getString () const;
private: private:
Rails* _rails; Rails* _rails;
DbU::Unit _axis; DbU::Unit _axis;
@ -297,41 +296,47 @@ namespace {
DbU::Unit _width; DbU::Unit _width;
}; };
private: public:
class Rails { class Rails {
public: public:
Rails ( Plane*, Constant::Direction, Net* ); Rails ( Plane*, unsigned int direction, Net* );
~Rails (); ~Rails ();
inline Plane* getPlane (); inline Plane* getPlane ();
inline RoutingPlane* getRoutingPlane (); inline RoutingPlane* getRoutingPlane ();
inline Constant::Direction getDirection () const; inline unsigned int getDirection () const;
inline Net* getNet () const; inline Net* getNet () const;
void merge ( const Box& ); void merge ( const Box& );
void doLayout ( const Layer* ); void doLayout ( const Layer* );
private: private:
Plane* _plane; Plane* _plane;
Constant::Direction _direction; unsigned int _direction;
Net* _net; Net* _net;
vector<Rail*> _rails; vector<Rail*> _rails;
}; };
private: public:
class Plane { class Plane {
public: public:
Plane ( const Layer*, RoutingPlane* ); typedef map<Net*,Rails*,Net::CompareById> RailsMap;
~Plane (); public:
inline const Layer* getLayer () const; Plane ( const Layer*, RoutingPlane* );
inline RoutingPlane* getRoutingPlane (); ~Plane ();
inline Constant::Direction getDirection () const; inline const Layer* getLayer () const;
void merge ( const Box&, Net* ); inline RoutingPlane* getRoutingPlane ();
void doLayout (); inline unsigned int getDirection () const;
inline unsigned int getPowerDirection () const;
void merge ( const Box&, Net* );
void doLayout ();
private: private:
const Layer* _layer; const Layer* _layer;
RoutingPlane* _routingPlane; RoutingPlane* _routingPlane;
map<Net*,Rails*> _horizontalRails; RailsMap _horizontalRails;
map<Net*,Rails*> _verticalRails; RailsMap _verticalRails;
unsigned int _powerDirection;
}; };
public:
typedef map<const BasicLayer*,Plane*,BasicLayer::CompareByMask> PlanesMap;
public: public:
PowerRailsPlanes ( KiteEngine* ); PowerRailsPlanes ( KiteEngine* );
~PowerRailsPlanes (); ~PowerRailsPlanes ();
@ -342,73 +347,104 @@ namespace {
void merge ( const Box&, Net* ); void merge ( const Box&, Net* );
void doLayout (); void doLayout ();
private: private:
KiteEngine* _kite; KiteEngine* _kite;
GlobalNetTable _globalNets; GlobalNetTable _globalNets;
map<const BasicLayer*,Plane*> _planes; PlanesMap _planes;
Plane* _activePlane; Plane* _activePlane;
}; };
} // Anonymous namespace.
namespace {
PowerRailsPlanes::Rail::Rail ( Rails* rails, DbU::Unit axis, DbU::Unit width ) PowerRailsPlanes::Rail::Rail ( Rails* rails, DbU::Unit axis, DbU::Unit width )
: _rails (rails) : _rails (rails)
, _axis (axis) , _axis (axis)
, _width (width) , _width (width)
, _chunks() , _chunks()
{ {
ltrace(300) << " new Rail " << (void*)this ltrace(300) << " new Rail "
<< " @" << DbU::getValueString(axis) << " @" << DbU::getValueString(axis)
<< " " << getRoutingPlane()->getLayer()->getName() << " " << getRoutingPlane()->getLayer()->getName()
<< " " << getRails()->getNet() << " " << getRails()->getNet()
<< " " << getString(getDirection()) << endl; << " " << ((getDirection()==KbHorizontal) ? "Horizontal" : "Vertical")<< endl;
} }
inline DbU::Unit PowerRailsPlanes::Rail::getAxis () const { return _axis; } inline DbU::Unit PowerRailsPlanes::Rail::getAxis () const { return _axis; }
inline DbU::Unit PowerRailsPlanes::Rail::getWidth () const { return _width; } inline DbU::Unit PowerRailsPlanes::Rail::getWidth () const { return _width; }
inline PowerRailsPlanes::Rails* PowerRailsPlanes::Rail::getRails () const { return _rails; } inline PowerRailsPlanes::Rails* PowerRailsPlanes::Rail::getRails () const { return _rails; }
inline RoutingPlane* PowerRailsPlanes::Rail::getRoutingPlane () const { return _rails->getRoutingPlane(); } inline RoutingPlane* PowerRailsPlanes::Rail::getRoutingPlane () const { return _rails->getRoutingPlane(); }
inline Constant::Direction PowerRailsPlanes::Rail::getDirection () const { return _rails->getDirection(); } inline unsigned int PowerRailsPlanes::Rail::getDirection () const { return _rails->getDirection(); }
inline Net* PowerRailsPlanes::Rail::getNet () const { return _rails->getNet(); } inline Net* PowerRailsPlanes::Rail::getNet () const { return _rails->getNet(); }
void PowerRailsPlanes::Rail::merge ( DbU::Unit source, DbU::Unit target ) void PowerRailsPlanes::Rail::merge ( DbU::Unit source, DbU::Unit target )
{ {
Interval chunkMerge ( source, target ); Interval chunkToMerge ( source, target );
ltrace(300) << " Rail::merge() " << chunkMerge << endl; ltrace(300) << " Rail::merge() "
<< ((getDirection()==KbHorizontal) ? "Horizontal" : "Vertical")
<< " " << chunkToMerge << endl;
ltrace(300) << " | " << _getString() << endl;
list<Interval>::iterator imerge = _chunks.end(); list<Interval>::iterator imerge = _chunks.end();
list<Interval>::iterator ichunk = _chunks.begin(); list<Interval>::iterator ichunk = _chunks.begin();
while ( ichunk != _chunks.end() ) { while ( ichunk != _chunks.end() ) {
if ( chunkMerge.getVMax() < (*ichunk).getVMin() ) { if (imerge == _chunks.end()) {
_chunks.insert ( ichunk, chunkMerge ); if (chunkToMerge.getVMax() < (*ichunk).getVMin()) {
break; ltrace(300) << " | Insert before " << *ichunk << endl;
imerge = _chunks.insert( ichunk, chunkToMerge );
break;
}
if (chunkToMerge.intersect(*ichunk)) {
ltrace(300) << " | Merge with " << *ichunk << endl;
imerge = ichunk;
(*imerge).merge( chunkToMerge );
}
} else {
if (chunkToMerge.getVMax() >= (*ichunk).getVMin()) {
(*imerge).merge( *ichunk );
ltrace(300) << " | Absorb (erase) " << *ichunk << endl;
ichunk = _chunks.erase( ichunk );
continue;
} else
break;
} }
if ( chunkMerge.intersect(*ichunk) ) { // if (chunkToMerge.intersect(*ichunk)) {
if ( imerge == _chunks.end() ) { // if (imerge == _chunks.end()) {
imerge = ichunk; // ltrace(300) << " | Merge with " << *ichunk << endl;
(*imerge).merge ( chunkMerge ); // imerge = ichunk;
} else { // (*imerge).merge( chunkToMerge );
(*imerge).merge ( *ichunk ); // } else {
ichunk = _chunks.erase ( ichunk ); // (*imerge).merge( *ichunk );
continue; // ltrace(300) << " | Absorb (erase) " << *ichunk << endl;
} // ichunk = _chunks.erase( ichunk );
} // continue;
ichunk++; // }
// }
++ichunk;
} }
if ( imerge == _chunks.end() ) { if (imerge == _chunks.end()) {
_chunks.insert ( ichunk, chunkMerge ); _chunks.insert( ichunk, chunkToMerge );
ltrace(300) << " | Add on " << DbU::getValueString(_axis) << " " << chunkMerge << endl; ltrace(300) << " | Insert at end " << DbU::getValueString(_axis) << " " << chunkToMerge << endl;
ltrace(300) << " | " << _getString() << endl;
} }
} }
void PowerRailsPlanes::Rail::doLayout ( const Layer* layer ) void PowerRailsPlanes::Rail::doLayout ( const Layer* layer )
{ {
ltrace(300) << "Doing layout of rail: " << (void*)this ltrace(300) << "Doing layout of rail: "
<< " " << layer->getName() << " " << layer->getName()
<< " " << getString(getDirection()) << " @" << DbU::getValueString(_axis) << endl; << " " << ((getDirection()==KbHorizontal) ? "Horizontal" : "Vertical")
<< " @" << DbU::getValueString(_axis) << endl;
ltrace(300) << _getString() << endl;
Net* net = getNet(); Net* net = getNet();
RoutingPlane* plane = getRoutingPlane(); RoutingPlane* plane = getRoutingPlane();
@ -418,18 +454,33 @@ namespace {
- DbU::lambda(0.1); - DbU::lambda(0.1);
DbU::Unit extension = layer->getExtentionCap(); DbU::Unit extension = layer->getExtentionCap();
//DbU::Unit extension = Session::getExtentionCap(); //DbU::Unit extension = Session::getExtentionCap();
unsigned int type = plane->getLayerGauge()->getType(); //unsigned int type = plane->getLayerGauge()->getType();
DbU::Unit axisMin = 0; DbU::Unit axisMin = 0;
DbU::Unit axisMax = 0; DbU::Unit axisMax = 0;
if ( type == Constant::PinOnly ) { // if ( type == Constant::PinOnly ) {
ltrace(300) << " Layer is PinOnly." << endl; // ltrace(300) << " Layer is PinOnly." << endl;
return; // return;
} // }
if ( getDirection() == Constant::Horizontal ) { if ( getDirection() == KbHorizontal ) {
list<Interval>::iterator ichunk = _chunks.begin(); list<Interval>::iterator ichunk = _chunks.begin();
for ( ; ichunk != _chunks.end() ; ichunk++ ) { list<Interval>::iterator ichunknext = ichunk;
++ichunknext;
for ( ; ichunk != _chunks.end() ; ++ichunk, ++ichunknext ) {
if (ichunknext != _chunks.end()) {
if ((*ichunk).intersect(*ichunknext))
cerr << Error( "Overlaping consecutive chunks in %s %s Rail @%s:\n"
" %s"
, getString(layer->getName()).c_str()
, ((getDirection()==KbHorizontal) ? "Horizontal" : "Vertical")
, DbU::getValueString(_axis).c_str()
, _getString().c_str()
) << endl;
}
ltrace(300) << " chunk: [" << DbU::getValueString((*ichunk).getVMin()) ltrace(300) << " chunk: [" << DbU::getValueString((*ichunk).getVMin())
<< ":" << DbU::getValueString((*ichunk).getVMax()) << "]" << endl; << ":" << DbU::getValueString((*ichunk).getVMax()) << "]" << endl;
@ -447,7 +498,7 @@ namespace {
axisMax = _axis + _width/2 + delta; axisMax = _axis + _width/2 + delta;
Track* track = plane->getTrackByPosition ( axisMin, Constant::Superior ); Track* track = plane->getTrackByPosition ( axisMin, Constant::Superior );
for ( ; track and (track->getAxis() <= axisMax) ; track = track->getNext() ) { for ( ; track and (track->getAxis() <= axisMax) ; track = track->getNextTrack() ) {
TrackElement* element = TrackFixedSegment::create ( track, segment ); TrackElement* element = TrackFixedSegment::create ( track, segment );
ltrace(300) << " Insert in " << track << "+" << element << endl; ltrace(300) << " Insert in " << track << "+" << element << endl;
} }
@ -472,15 +523,32 @@ namespace {
axisMax = _axis + _width/2 + delta; axisMax = _axis + _width/2 + delta;
Track* track = plane->getTrackByPosition ( axisMin, Constant::Superior ); Track* track = plane->getTrackByPosition ( axisMin, Constant::Superior );
for ( ; track and (track->getAxis() <= axisMax) ; track = track->getNext() ) { for ( ; track and (track->getAxis() <= axisMax) ; track = track->getNextTrack() ) {
TrackElement* element = TrackFixedSegment::create ( track, segment ); TrackElement* element = TrackFixedSegment::create ( track, segment );
ltrace(300) << " Insert in " << track << "+" << (void*)element << ":" << element << endl; ltrace(300) << " Insert in " << track << "+" << element << endl;
} }
} }
} }
} }
string PowerRailsPlanes::Rail::_getString () const
{
ostringstream os;
os << "<Rail " << ((getDirection()==KbHorizontal) ? "Horizontal" : "Vertical")
<< " @" << DbU::getValueString(_axis) << " ";
list<Interval>::const_iterator ichunk = _chunks.begin();
for ( ; ichunk != _chunks.end() ; ++ichunk ) {
if (ichunk != _chunks.begin()) os << " ";
os << "[" << DbU::getValueString((*ichunk).getVMin())
<< " " << DbU::getValueString((*ichunk).getVMax()) << "]";
}
os << ">";
return os.str();
}
inline bool PowerRailsPlanes::RailCompare::operator() ( const Rail* lhs, const Rail* rhs ) inline bool PowerRailsPlanes::RailCompare::operator() ( const Rail* lhs, const Rail* rhs )
{ {
if ( lhs->getAxis () < rhs->getAxis () ) return true; if ( lhs->getAxis () < rhs->getAxis () ) return true;
@ -499,16 +567,16 @@ namespace {
{ return (rail->getAxis() == _axis) and (rail->getWidth() == _width); } { return (rail->getAxis() == _axis) and (rail->getWidth() == _width); }
PowerRailsPlanes::Rails::Rails ( PowerRailsPlanes::Plane* plane, Constant::Direction direction, Net* net ) PowerRailsPlanes::Rails::Rails ( PowerRailsPlanes::Plane* plane , unsigned int direction , Net* net )
: _plane (plane) : _plane (plane)
, _direction(direction) , _direction (direction)
, _net (net) , _net (net)
, _rails () , _rails ()
{ {
ltrace(300) << " new Rails @" ltrace(300) << " new Rails @"
<< " " << getRoutingPlane()->getLayer()->getName() << " " << getRoutingPlane()->getLayer()->getName()
<< " " << net << " " << net
<< " " << getString(getDirection()) << endl; << " " << ((getDirection()==KbHorizontal) ? "Horizontal": "Vertical") << endl;
} }
@ -521,10 +589,10 @@ namespace {
} }
inline PowerRailsPlanes::Plane* PowerRailsPlanes::Rails::getPlane () { return _plane; } inline PowerRailsPlanes::Plane* PowerRailsPlanes::Rails::getPlane () { return _plane; }
inline RoutingPlane* PowerRailsPlanes::Rails::getRoutingPlane () { return getPlane()->getRoutingPlane(); } inline RoutingPlane* PowerRailsPlanes::Rails::getRoutingPlane () { return getPlane()->getRoutingPlane(); }
inline Constant::Direction PowerRailsPlanes::Rails::getDirection () const { return _direction; } inline unsigned int PowerRailsPlanes::Rails::getDirection () const { return _direction; }
inline Net* PowerRailsPlanes::Rails::getNet () const { return _net; } inline Net* PowerRailsPlanes::Rails::getNet () const { return _net; }
void PowerRailsPlanes::Rails::merge ( const Box& bb ) void PowerRailsPlanes::Rails::merge ( const Box& bb )
@ -534,7 +602,7 @@ namespace {
DbU::Unit sourceU; DbU::Unit sourceU;
DbU::Unit targetU; DbU::Unit targetU;
if ( getDirection() == Constant::Horizontal ) { if (getDirection() == KbHorizontal) {
axis = bb.getYCenter(); axis = bb.getYCenter();
width = bb.getHeight(); width = bb.getHeight();
sourceU = bb.getXMin(); sourceU = bb.getXMin();
@ -564,7 +632,7 @@ namespace {
void PowerRailsPlanes::Rails::doLayout ( const Layer* layer ) void PowerRailsPlanes::Rails::doLayout ( const Layer* layer )
{ {
ltrace(300) << "Doing layout of rails: " << layer->getName() ltrace(300) << "Doing layout of rails: " << layer->getName()
<< " " << getString(_direction) << " " << ((_direction==KbHorizontal) ? "Horizontal" : "Vertical")
<< " " << _net->getName() << endl; << " " << _net->getName() << endl;
for ( size_t irail=0 ; irail<_rails.size() ; irail++ ) for ( size_t irail=0 ; irail<_rails.size() ; irail++ )
@ -577,14 +645,18 @@ namespace {
, _routingPlane (routingPlane) , _routingPlane (routingPlane)
, _horizontalRails () , _horizontalRails ()
, _verticalRails () , _verticalRails ()
, _powerDirection (routingPlane->getDirection())
{ {
ltrace(300) << "New Plane " << _layer->getName() << " " << _routingPlane << endl; ltrace(300) << "New Plane " << _layer->getName() << " " << _routingPlane << endl;
// Hard-coded SxLib gauge.
if (_routingPlane->getDepth() == 0) _powerDirection = KbHorizontal;
} }
PowerRailsPlanes::Plane::~Plane () PowerRailsPlanes::Plane::~Plane ()
{ {
map<Net*,Rails*>::iterator irail = _horizontalRails.begin(); RailsMap::iterator irail = _horizontalRails.begin();
for ( ; irail != _horizontalRails.end() ; ++irail ) { for ( ; irail != _horizontalRails.end() ; ++irail ) {
delete (*irail).second; delete (*irail).second;
} }
@ -595,30 +667,35 @@ namespace {
} }
inline const Layer* PowerRailsPlanes::Plane::getLayer () const { return _layer; } inline const Layer* PowerRailsPlanes::Plane::getLayer () const { return _layer; }
inline RoutingPlane* PowerRailsPlanes::Plane::getRoutingPlane () { return _routingPlane; } inline RoutingPlane* PowerRailsPlanes::Plane::getRoutingPlane () { return _routingPlane; }
inline Constant::Direction PowerRailsPlanes::Plane::getDirection () const { return (Constant::Direction)_routingPlane->getDirection(); } inline unsigned int PowerRailsPlanes::Plane::getDirection () const { return _routingPlane->getDirection(); }
inline unsigned int PowerRailsPlanes::Plane::getPowerDirection () const { return _powerDirection; }
void PowerRailsPlanes::Plane::merge ( const Box& bb, Net* net ) void PowerRailsPlanes::Plane::merge ( const Box& bb, Net* net )
{ {
Rails* rails = NULL; Rails* rails = NULL;
ltrace(300) << " Plane::merge() " << net->getName() << " " << (void*)net << endl; ltrace(300) << " Plane::merge() " << net->getName() << " " << bb << endl;
if ( getDirection() == Constant::Horizontal ) { unsigned int direction = getDirection();
map<Net*,Rails*>::iterator irails = _horizontalRails.find(net); if ( (net->getType() == Net::Type::POWER) or (net->getType() == Net::Type::GROUND) )
direction = getPowerDirection();
if (direction == KbHorizontal) {
RailsMap::iterator irails = _horizontalRails.find(net);
if ( irails == _horizontalRails.end() ) { if ( irails == _horizontalRails.end() ) {
rails = new Rails(this,Constant::Horizontal,net); rails = new Rails(this,KbHorizontal,net);
_horizontalRails.insert ( make_pair(net,rails) ); _horizontalRails.insert ( make_pair(net,rails) );
} else } else
rails = (*irails).second; rails = (*irails).second;
rails->merge ( bb ); rails->merge ( bb );
} else { } else {
map<Net*,Rails*>::iterator irails = _verticalRails.find(net); RailsMap::iterator irails = _verticalRails.find(net);
if ( irails == _verticalRails.end() ) { if ( irails == _verticalRails.end() ) {
rails = new Rails(this,Constant::Vertical,net); rails = new Rails(this,KbVertical,net);
_verticalRails.insert ( make_pair(net,rails) ); _verticalRails.insert ( make_pair(net,rails) );
} else } else
rails = (*irails).second; rails = (*irails).second;
@ -633,7 +710,7 @@ namespace {
{ {
ltrace(300) << "Doing layout of plane: " << _layer->getName() << endl; ltrace(300) << "Doing layout of plane: " << _layer->getName() << endl;
map<Net*,Rails*>::iterator irails = _horizontalRails.begin(); RailsMap::iterator irails = _horizontalRails.begin();
for ( ; irails != _horizontalRails.end() ; ++irails ) { for ( ; irails != _horizontalRails.end() ; ++irails ) {
(*irails).second->doLayout(_layer); (*irails).second->doLayout(_layer);
} }
@ -650,7 +727,7 @@ namespace {
, _planes () , _planes ()
, _activePlane(NULL) , _activePlane(NULL)
{ {
_globalNets.setBlockage ( kite->getBlockageNet() ); _globalNets.setBlockage( kite->getBlockageNet() );
Technology* technology = DataBase::getDB()->getTechnology(); Technology* technology = DataBase::getDB()->getTechnology();
RoutingGauge* rg = _kite->getConfiguration()->getRoutingGauge(); RoutingGauge* rg = _kite->getConfiguration()->getRoutingGauge();
@ -668,14 +745,12 @@ namespace {
RoutingPlane* rp = _kite->getRoutingPlaneByIndex(lg->getDepth()); RoutingPlane* rp = _kite->getRoutingPlaneByIndex(lg->getDepth());
ltrace(300) << "Plane:" << rp << endl; ltrace(300) << "Plane:" << rp << endl;
_planes.insert ( make_pair(regular->getBasicLayer(),new Plane(regular,rp)) ); _planes.insert( make_pair(regular->getBasicLayer(),new Plane(regular,rp)) );
const BasicLayer* blockageLayer = regular->getBasicLayer()->getBlockageLayer(); const BasicLayer* blockageLayer = regular->getBasicLayer()->getBlockageLayer();
if ( not blockageLayer ) continue; if (not blockageLayer) continue;
_planes.insert ( make_pair(blockageLayer,new Plane(blockageLayer,rp)) ); _planes.insert( make_pair(blockageLayer,new Plane(blockageLayer,rp)) );
ltrace(300) << "OK" << endl;
} }
} }
@ -699,7 +774,7 @@ namespace {
bool PowerRailsPlanes::setActivePlane ( const BasicLayer* layer ) bool PowerRailsPlanes::setActivePlane ( const BasicLayer* layer )
{ {
map<const BasicLayer*,Plane*>::iterator iplane = _planes.find(layer); PlanesMap::iterator iplane = _planes.find(layer);
if ( iplane == _planes.end() ) return false; if ( iplane == _planes.end() ) return false;
_activePlane = iplane->second; _activePlane = iplane->second;
@ -727,7 +802,7 @@ namespace {
void PowerRailsPlanes::doLayout () void PowerRailsPlanes::doLayout ()
{ {
map<const BasicLayer*,Plane*>::iterator iplane = _planes.begin(); PlanesMap::iterator iplane = _planes.begin();
for ( ; iplane != _planes.end() ; iplane++ ) for ( ; iplane != _planes.end() ; iplane++ )
iplane->second->doLayout (); iplane->second->doLayout ();
} }
@ -737,7 +812,6 @@ namespace {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "::QueryPowerRails". // Class : "::QueryPowerRails".
class QueryPowerRails : public Query { class QueryPowerRails : public Query {
public: public:
QueryPowerRails ( KiteEngine* ); QueryPowerRails ( KiteEngine* );
@ -811,8 +885,16 @@ namespace {
void QueryPowerRails::doQuery () void QueryPowerRails::doQuery ()
{ {
if ( not _powerRailsPlanes.getActivePlane() ) return; PowerRailsPlanes::Plane* activePlane = _powerRailsPlanes.getActivePlane();
Query::doQuery ();
if (not activePlane) return;
// if (activePlane->getRoutingPlane()->getLayerGauge()->getType() == Constant::PinOnly) {
// cmess1 << " - PowerRails in " << activePlane->getLayer()->getName() << " - Skipped (PinOnly layer)." << endl;
// return;
// }
cmess1 << " - PowerRails in " << activePlane->getLayer()->getName() << " ..." << endl;
Query::doQuery();
} }
@ -827,6 +909,8 @@ namespace {
void QueryPowerRails::goCallback ( Go* go ) void QueryPowerRails::goCallback ( Go* go )
{ {
//ltrace(80) << "QueryPowerRails::goCallback() " << go->getId() << ":" << go
// << " " << getPath().getName() << endl;
addToPowerRail ( go, getBasicLayer(), getArea(), getTransformation() ); addToPowerRail ( go, getBasicLayer(), getArea(), getTransformation() );
} }
@ -961,10 +1045,10 @@ namespace Kite {
{ {
cmess1 << " o Building power rails." << endl; cmess1 << " o Building power rails." << endl;
if ( not _blockageNet ) { if (not _blockageNet) {
_blockageNet = getCell()->getNet("blockagenet"); _blockageNet = getCell()->getNet("blockagenet");
if ( not _blockageNet ) if (not _blockageNet)
_blockageNet = Net::create ( getCell(), "blockagenet" ); _blockageNet = Net::create( getCell(), "blockagenet" );
} }
QueryPowerRails query ( this ); QueryPowerRails query ( this );
@ -974,21 +1058,18 @@ namespace Kite {
if ( (iLayer->getMaterial() != BasicLayer::Material::metal) if ( (iLayer->getMaterial() != BasicLayer::Material::metal)
and (iLayer->getMaterial() != BasicLayer::Material::blockage) ) and (iLayer->getMaterial() != BasicLayer::Material::blockage) )
continue; continue;
if ( _configuration->isGMetal(*iLayer) ) continue; if (_configuration->isGMetal(*iLayer)) continue;
if (not query.hasBasicLayer(*iLayer)) continue;
cmess1 << " - PowerRails in " << iLayer->getName() << " ..." << endl; query.setBasicLayer( *iLayer );
query.doQuery ();
if ( not query.hasBasicLayer(*iLayer) ) continue;
query.setBasicLayer ( *iLayer );
query.doQuery ();
} }
query.ringAddToPowerRails (); query.ringAddToPowerRails();
query.doLayout (); query.doLayout();
cmess1 << " - " << query.getGoMatchCount() << " power rails elements found." << endl; cmess1 << " - " << query.getGoMatchCount() << " power rails elements found." << endl;
Session::revalidate (); Session::revalidate ();
} }
} // End of Kite namespace. } // Kite namespace.

View File

@ -1,3 +1,4 @@
# -*- explicit-buffer-name: "CMakeLists.txt<kite/src>" -*-
include ( ${QT_USE_FILE} ) include ( ${QT_USE_FILE} )
@ -8,7 +9,7 @@
${Boost_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS}
${PYTHON_INCLUDE_PATH} ${PYTHON_INCLUDE_PATH}
) )
set ( includes kite/TrackSegmentCost.h set ( includes kite/Constants.h
kite/TrackCost.h kite/TrackCost.h
kite/DataNegociate.h kite/DataNegociate.h
kite/TrackElement.h kite/TrackElements.h kite/TrackElement.h kite/TrackElements.h
@ -19,12 +20,14 @@
kite/Tracks.h kite/Tracks.h
kite/HorizontalTrack.h kite/HorizontalTrack.h
kite/VerticalTrack.h kite/VerticalTrack.h
kite/RoutingPlane.h
kite/Session.h kite/Session.h
kite/Manipulator.h
kite/SegmentFsm.h
kite/RoutingEvent.h kite/RoutingEvent.h
kite/RoutingEventQueue.h kite/RoutingEventQueue.h
kite/RoutingEventHistory.h kite/RoutingEventHistory.h
kite/RoutingEventLoop.h kite/RoutingEventLoop.h
kite/RoutingPlane.h
kite/NegociateWindow.h kite/NegociateWindow.h
kite/Configuration.h kite/Configuration.h
kite/KiteEngine.h kite/KiteEngine.h
@ -34,8 +37,7 @@
kite/PyGraphicKiteEngine.h kite/PyGraphicKiteEngine.h
) )
set ( mocIncludes kite/GraphicKiteEngine.h ) set ( mocIncludes kite/GraphicKiteEngine.h )
set ( cpps TrackSegmentCost.cpp set ( cpps TrackCost.cpp
TrackCost.cpp
DataNegociate.cpp DataNegociate.cpp
TrackElement.cpp TrackElement.cpp
TrackElements.cpp TrackElements.cpp
@ -46,16 +48,18 @@
Tracks.cpp Tracks.cpp
HorizontalTrack.cpp HorizontalTrack.cpp
VerticalTrack.cpp VerticalTrack.cpp
RoutingPlane.cpp
Session.cpp Session.cpp
Manipulator.cpp
SegmentFsm.cpp
RoutingEvent.cpp RoutingEvent.cpp
RoutingEventQueue.cpp RoutingEventQueue.cpp
RoutingEventHistory.cpp RoutingEventHistory.cpp
RoutingEventLoop.cpp RoutingEventLoop.cpp
RoutingPlane.cpp NegociateWindow.cpp
BuildPowerRails.cpp BuildPowerRails.cpp
ProtectRoutingPads.cpp ProtectRoutingPads.cpp
PreProcess.cpp PreProcess.cpp
NegociateWindow.cpp
Configuration.cpp Configuration.cpp
KiteEngine.cpp KiteEngine.cpp
GraphicKiteEngine.cpp GraphicKiteEngine.cpp
@ -68,42 +72,42 @@
qt4_wrap_cpp ( mocCpps ${mocIncludes} ) qt4_wrap_cpp ( mocCpps ${mocIncludes} )
add_library ( kite ${cpps} ${mocCpps} ${pyCpps} ) add_library ( kite ${cpps} ${mocCpps} ${pyCpps} )
set_target_properties ( kite PROPERTIES VERSION 1.0 SOVERSION 1 ) set_target_properties ( kite PROPERTIES VERSION 1.0 SOVERSION 1 )
target_link_libraries ( kite ${KATABATIC_LIBRARIES} target_link_libraries ( kite ${KATABATIC_LIBRARIES}
${KNIK_LIBRARIES} ${KNIK_LIBRARIES}
${NIMBUS_LIBRARIES} ${NIMBUS_LIBRARIES}
${CORIOLIS_LIBRARIES} ${CORIOLIS_LIBRARIES}
${HURRICANE_PYTHON_LIBRARIES} ${HURRICANE_PYTHON_LIBRARIES}
${HURRICANE_GRAPHICAL_LIBRARIES} ${HURRICANE_GRAPHICAL_LIBRARIES}
${HURRICANE_LIBRARIES} ${HURRICANE_LIBRARIES}
${CONFIGURATION_LIBRARY} ${CONFIGURATION_LIBRARY}
${BOOKSHELF_LIBRARY} ${BOOKSHELF_LIBRARY}
${CIF_LIBRARY} ${CIF_LIBRARY}
${AGDS_LIBRARY} ${AGDS_LIBRARY}
${LEFDEF_LIBRARIES} ${LEFDEF_LIBRARIES}
${OA_LIBRARIES} ${OA_LIBRARIES}
${QT_LIBRARIES} ${QT_LIBRARIES}
${Boost_LIBRARIES} ${Boost_LIBRARIES}
${LIBXML2_LIBRARIES} ${LIBXML2_LIBRARIES}
${PYTHON_LIBRARIES} -lutil ${PYTHON_LIBRARIES} -lutil
${LIBEXECINFO_LIBRARIES} ${LIBEXECINFO_LIBRARIES}
) )
add_library ( pyKite MODULE ${pyCpps} ) add_library ( pyKite MODULE ${pyCpps} )
set_target_properties ( pyKite PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -D__PYTHON_MODULE__=1" set_target_properties ( pyKite PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -D__PYTHON_MODULE__=1"
PREFIX "" PREFIX ""
OUTPUT_NAME "Kite" OUTPUT_NAME "Kite"
) )
add_executable ( kite.bin ${kitecpps} ) # add_executable ( kite.bin ${kitecpps} )
target_link_libraries ( kite.bin kite ) #target_link_libraries ( kite.bin kite )
target_link_libraries ( pyKite kite target_link_libraries ( pyKite kite
${CORIOLIS_PYTHON_LIBRARIES} ${CORIOLIS_PYTHON_LIBRARIES}
) )
install ( TARGETS kite DESTINATION lib${LIB_SUFFIX} ) install ( TARGETS kite DESTINATION lib${LIB_SUFFIX} )
install ( TARGETS kite.bin DESTINATION bin ) # install ( TARGETS kite.bin DESTINATION bin )
install ( TARGETS pyKite DESTINATION ${PYTHON_SITE_PACKAGES} ) install ( TARGETS pyKite DESTINATION ${PYTHON_SITE_PACKAGES} )
install ( FILES ${includes} install ( FILES ${includes}
${mocIncludes} ${mocIncludes}

View File

@ -1,15 +1,9 @@
// -*- mode: C++; explicit-buffer-name: "Configuration.cpp<kite>" -*-
// -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved // Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,25 +11,19 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./Configuration.cpp" | // | C++ Module : "./Configuration.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <string> #include <string>
#include "vlsisapd/configuration/Configuration.h"
#include "vlsisapd/configuration/Configuration.h" #include "hurricane/Cell.h"
#include "hurricane/Cell.h" #include "crlcore/Utilities.h"
#include "crlcore/Utilities.h" #include "kite/Configuration.h"
#include "kite/Configuration.h" #include "kite/KiteEngine.h"
#include "kite/KiteEngine.h"
namespace Kite { namespace Kite {
using std::cout; using std::cout;
using std::cerr; using std::cerr;
using std::endl; using std::endl;
@ -123,6 +111,10 @@ namespace Kite {
{ return _base->isGMetal(layer); } { return _base->isGMetal(layer); }
bool Configuration::isGContact ( const Layer* layer ) const
{ return _base->isGContact(layer); }
size_t Configuration::getDepth () const size_t Configuration::getDepth () const
{ return _base->getDepth(); } { return _base->getDepth(); }
@ -281,4 +273,4 @@ namespace Kite {
} // End of Kite namespace. } // Kite namespace.

View File

@ -2,7 +2,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |
@ -15,14 +15,31 @@
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
#include <cstdlib> #include <cstdlib>
#include <sstream> #include <sstream>
#include "kite/DataNegociate.h" #include "hurricane/Bug.h"
#include "hurricane/DebugSession.h"
#include "katabatic/AutoSegment.h"
#include "kite/DataNegociate.h"
#include "kite/RoutingEvent.h"
namespace Kite { namespace Kite {
using std::cerr;
using std::endl;
using std::map;
using std::multimap;
using std::make_pair;
using std::ostringstream; using std::ostringstream;
using Hurricane::Bug;
using Hurricane::DebugSession;
using Hurricane::inltrace;
using Hurricane::ltracein;
using Hurricane::ltraceout;
using Hurricane::tab;
using Katabatic::KbHorizontal;
using Katabatic::KbPropagate;
// ------------------------------------------------------------------- // -------------------------------------------------------------------
@ -30,12 +47,19 @@ namespace Kite {
DataNegociate::DataNegociate ( TrackElement* trackSegment ) DataNegociate::DataNegociate ( TrackElement* trackSegment )
: _routingEvent(NULL) : _trackSegment (trackSegment)
, _trackSegment(trackSegment) , _childSegment (NULL)
, _cost (trackSegment) , _routingEvent (NULL)
, _state (RipupPerpandiculars) , _net (trackSegment->getNet())
, _stateCount (1) , _state (RipupPerpandiculars)
//, _z (RoutingGauge::getLayerDepth(trackSegment->getLayer())) , _stateCount (1)
, _terminals (0)
, _ripupCount (0)
, _leftMinExtend (DbU::Max)
, _rightMinExtend (DbU::Min)
, _attractors ()
, _perpandiculars ()
, _perpandicularFree(false)
{ } { }
@ -43,25 +67,164 @@ namespace Kite {
{ } { }
DbU::Unit DataNegociate::getWiringDelta ( DbU::Unit axis ) const
{
DbU::Unit attraction = 0;
for ( size_t i=0 ; i < _attractors.size() ; i++ ) {
if ( _attractors[i] > axis ) attraction += _attractors[i] - axis;
else attraction += axis - _attractors[i];
}
return attraction;
}
void DataNegociate::update () void DataNegociate::update ()
{ _cost.update ( _trackSegment ); } {
DebugSession::open( _trackSegment->getNet(), 148 );
ltrace(148) << "DataNegociate::update() - " << _trackSegment << endl;
ltracein(148);
vector<AutoSegment*> collapseds;
vector<AutoSegment*> perpandiculars;
map<DbU::Unit,int> attractorSpins;
_perpandiculars.clear();
AutoSegment::getTopologicalInfos( _trackSegment->base()
, collapseds
, perpandiculars
, _leftMinExtend
, _rightMinExtend
);
_terminals = AutoSegment::getTerminalCount( _trackSegment->base(), collapseds );
_attractors.clear();
_perpandiculars.clear();
_perpandicularFree = Interval(false);
ltrace(148) << "Extracting attractors from perpandiculars." << endl;
for ( size_t i=0 ; i < perpandiculars.size() ; i++ ) {
Interval interval;
TrackElement* perpandicular;
if (perpandiculars[i]->isCanonical()) {
perpandicular = Session::lookup( perpandiculars[i]->base() );
if (perpandicular) perpandicular->getCanonical( interval );
} else {
perpandicular = Session::lookup( perpandiculars[i]->getCanonical(interval)->base() );
}
if (not perpandicular) {
cerr << Bug( "Not a TrackSegment: %s\n (perpandicular: %s)"
//, getString((void*)perpandiculars[i]->getCanonical(interval)->base()).c_str()
, getString(perpandiculars[i]->getCanonical(interval)).c_str()
//, getString((void*)perpandiculars[i]->base()).c_str()
, getString(perpandiculars[i]).c_str()
) << endl;
continue;
}
if (RoutingEvent::getStage() == RoutingEvent::Repair)
perpandicular->base()->setFlagsOnAligneds( Katabatic::SegUnbound );
interval.inflate( DbU::lambda(-0.5) );
ltrace(148) << "| perpandicular: " << perpandiculars[i] << endl;
ltrace(148) << "| canonical: " << perpandicular << endl;
ltracein(148);
ltrace(148) << "Canonical // interval: " << interval << endl;
_perpandiculars.push_back( perpandicular );
if (perpandicular->getTrack()) {
Interval trackFree = perpandicular->getFreeInterval();
ltrace(148) << "Track Perpandicular Free: " << trackFree << endl;
_perpandicularFree.intersection( trackFree );
} else {
ltrace(148) << "Not in any track " << perpandicular << endl;
}
if (interval.isPonctual()) {
ltrace(148) << "Punctual attractor @" << DbU::getValueString(interval.getVMin()) << endl;
_attractors.push_back( interval.getVMin() );
ltraceout(148);
continue;
}
if ( (interval.getVMin() != _trackSegment->getAxis())
or AutoSegment::isTopologicalBound(perpandiculars[i]
,perpandicular->isHorizontal() ? KbHorizontal : 0
) ) {
map<DbU::Unit,int>::iterator iattractor = attractorSpins.find( interval.getVMin() );
if (iattractor == attractorSpins.end()) {
attractorSpins.insert( make_pair(interval.getVMin(),-1) );
} else {
iattractor->second -= 1;
}
ltrace(148) << "Left attractor @" << DbU::getValueString(interval.getVMin()) << endl;
}
if ( (interval.getVMax() != _trackSegment->getAxis())
or AutoSegment::isTopologicalBound(perpandiculars[i]
,KbPropagate | (perpandicular->isHorizontal() ? KbHorizontal : 0)
) ) {
map<DbU::Unit,int>::iterator iattractor = attractorSpins.find( interval.getVMax() );
if (iattractor == attractorSpins.end()) {
attractorSpins.insert( make_pair(interval.getVMax(),1) );
} else {
iattractor->second += 1;
}
ltrace(148) << "Right attractor @" << DbU::getValueString(interval.getVMax()) << endl;
}
ltraceout(148);
}
if ( not _trackSegment->isTerminal() and (_perpandiculars.size() < 2) )
cerr << Bug( "Less than two perpandiculars on %s.", getString(_trackSegment).c_str() ) << endl;
map<DbU::Unit,int>::iterator iattractor = attractorSpins.begin();
for ( ; iattractor != attractorSpins.end() ; iattractor++ ) {
if (iattractor->second != 0)
_attractors.push_back( iattractor->first );
}
ostringstream s;
s << "Attractors [";
for ( size_t i=0 ; i<_attractors.size() ; i++ ) {
if ( i ) s << ", ";
s << DbU::getValueString( _attractors[i] );
}
s << "]";
ltrace(148) << s.str() << endl;
ltrace(200) << "Perpandicular Free: " << _perpandicularFree << endl;
ltraceout(148);
DebugSession::close();
}
string DataNegociate::_getString () const string DataNegociate::_getString () const
{ {
return "<" + _getTypeName() + " " return "<" + _getTypeName() + " "
+ getString(_trackSegment) + getString(_trackSegment) + " "
+ ">"; + getString(_terminals)
+ " [" + DbU::getValueString(_leftMinExtend)
+ ":" + DbU::getValueString(_rightMinExtend)
+ "]>";
} }
Record* DataNegociate::_getRecord () const Record* DataNegociate::_getRecord () const
{ {
Record* record = new Record ( getString(this) ); Record* record = new Record ( getString(this) );
record->add ( getSlot ( "_routingEvent", _routingEvent ) ); record->add( getSlot ( "_routingEvent" , _routingEvent ) );
record->add ( getSlot ( "_trackSegment", _trackSegment ) ); record->add( getSlot ( "_trackSegment" , _trackSegment ) );
record->add ( getSlot ( "_cost" , &_cost ) ); record->add( getSlot ( "_childSegment" , _childSegment ) );
//record->add ( getSlot ( "_z" , _z ) ); record->add( getSlot ( "_terminals" , _terminals ) );
record->add( getSlot ( "_ripupCount" , _ripupCount ) );
record->add( DbU::getValueSlot( "_leftMinExtend" , &_leftMinExtend ) );
record->add( DbU::getValueSlot( "_rightMinExtend", &_rightMinExtend ) );
record->add( getSlot ( "_net" , _net ) );
return record; return record;
} }
@ -71,18 +234,17 @@ namespace Kite {
{ {
ostringstream s; ostringstream s;
switch ( data->_state ) { switch ( data->_state ) {
case RipupPerpandiculars: s << "RipupPerpandiculars"; break; case RipupPerpandiculars: s << "RipupPerpandiculars"; break;
case Minimize: s << "Minimize"; break; case Minimize: s << "Minimize"; break;
case DogLeg: s << "DogLeg"; break; case Dogleg: s << "Dogleg"; break;
case Desalignate: s << "Desalignate"; break; case Slacken: s << "Slacken"; break;
case Slacken: s << "Slacken"; break; case ConflictSolveByHistory: s << "ConflictSolveByHistory1"; break;
case ConflictSolve1: s << "ConflictSolve1"; break; case ConflictSolveByPlaceds: s << "ConflictSolveByPlaceds"; break;
case ConflictSolve2: s << "ConflictSolve2"; break; case LocalVsGlobal: s << "LocalVsGlobal"; break;
case LocalVsGlobal: s << "LocalVsGlobal"; break; case MoveUp: s << "MoveUp"; break;
case MoveUp: s << "MoveUp"; break; case MaximumSlack: s << "MaximumSlack"; break;
case MaximumSlack: s << "MaximumSlack"; break; case Unimplemented: s << "Unimplemented"; break;
case Unimplemented: s << "Unimplemented"; break; case Repair: s << "REPAIR"; break;
case Repair: s << "REPAIR"; break;
default: default:
s << "Unknown(" << data->_state << ")"; break; s << "Unknown(" << data->_state << ")"; break;
} }
@ -91,4 +253,4 @@ namespace Kite {
} }
} // End of Kite namespace. } // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved // Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,46 +12,41 @@
// | E-mail : Jean-Paul.Chaput@lip6.fr | // | E-mail : Jean-Paul.Chaput@lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Header : "./GraphicKiteEngine.cpp" | // | C++ Header : "./GraphicKiteEngine.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <functional> #include <functional>
#include <boost/bind.hpp> #include <boost/bind.hpp>
#include <QAction>
#include <QAction> #include <QMenu>
#include <QMenu> #include <QMenuBar>
#include <QMenuBar> #include <QApplication>
#include <QApplication> #include <hurricane/Warning.h>
#include <hurricane/Warning.h> #include <hurricane/Error.h>
#include <hurricane/Error.h> #include <hurricane/Breakpoint.h>
#include <hurricane/Breakpoint.h> #include <hurricane/DebugSession.h>
#include <hurricane/DebugSession.h> #include <hurricane/Go.h>
#include <hurricane/Go.h> #include <hurricane/Net.h>
#include <hurricane/Net.h> #include <hurricane/Cell.h>
#include <hurricane/Cell.h> #include <hurricane/UpdateSession.h>
#include <hurricane/UpdateSession.h> #include <hurricane/viewer/Graphics.h>
#include <hurricane/viewer/Graphics.h> #include <hurricane/viewer/CellWidget.h>
#include <hurricane/viewer/CellWidget.h> #include <hurricane/viewer/CellViewer.h>
#include <hurricane/viewer/CellViewer.h> #include <hurricane/viewer/ControllerWidget.h>
#include <hurricane/viewer/ControllerWidget.h> #include <crlcore/Utilities.h>
#include <crlcore/Utilities.h> #include <crlcore/AllianceFramework.h>
#include <crlcore/AllianceFramework.h> #include <katabatic/GCell.h>
#include <katabatic/GCell.h> #include <katabatic/GCellGrid.h>
#include <katabatic/GCellGrid.h> #include <knik/Edge.h>
#include <knik/Edge.h> #include <knik/Vertex.h>
#include <knik/Vertex.h> #include <knik/KnikEngine.h>
#include <knik/KnikEngine.h> #include <knik/GraphicKnikEngine.h>
#include <knik/GraphicKnikEngine.h> #include <kite/GraphicKiteEngine.h>
#include <kite/GraphicKiteEngine.h> //#include <kite/ConfigurationWidget.h>
//#include <kite/ConfigurationWidget.h>
namespace Kite { namespace Kite {
using namespace std; using namespace std;
using Hurricane::Error; using Hurricane::Error;
using Hurricane::Warning; using Hurricane::Warning;
@ -79,9 +69,7 @@ namespace Kite {
void GraphicKiteEngine::initKatabaticAc ( CellWidget* widget ) void GraphicKiteEngine::initKatabaticAc ( CellWidget* widget )
{ { }
//cerr << "GraphicKatabaticEngine::initKatabaticGo()" << endl;
}
void GraphicKiteEngine::drawKatabaticAc ( CellWidget* widget void GraphicKiteEngine::drawKatabaticAc ( CellWidget* widget
@ -95,11 +83,11 @@ namespace Kite {
void GraphicKiteEngine::initKatabaticGCell ( CellWidget* widget ) void GraphicKiteEngine::initKatabaticGCell ( CellWidget* widget )
{ {
widget->getDrawingPlanes().setPen ( Qt::NoPen ); widget->getDrawingPlanes().setPen( Qt::NoPen );
KiteEngine* kite = KiteEngine::get ( widget->getCell() ); KiteEngine* kite = KiteEngine::get( widget->getCell() );
if ( kite ) { if ( kite ) {
kite->getGCellGrid()->setDensityMode ( Katabatic::GCellGrid::MaxDensity ); kite->getGCellGrid()->setDensityMode( Katabatic::GCellGrid::MaxDensity );
} }
} }
@ -115,7 +103,7 @@ namespace Kite {
QPainter& painter = widget->getPainter(); QPainter& painter = widget->getPainter();
size_t density = (size_t)( gcell->getDensity() * 255.0 ); size_t density = (size_t)( gcell->getDensity() * 255.0 );
if ( density > 255 ) density = 255; if (density > 255) density = 255;
painter.setBrush painter.setBrush
( Graphics::getColorScale(ColorScale::Fire).getBrush(density,widget->getDarkening()) ); ( Graphics::getColorScale(ColorScale::Fire).getBrush(density,widget->getDarkening()) );
@ -131,12 +119,12 @@ namespace Kite {
{ {
Cell* cell = getCell (); Cell* cell = getCell ();
KiteEngine* kite = KiteEngine::get ( cell ); KiteEngine* kite = KiteEngine::get( cell );
if ( not kite ) { if (not kite) {
kite = KiteEngine::create ( cell ); kite = KiteEngine::create( cell );
kite->setPostEventCb ( boost::bind(&GraphicKiteEngine::postEvent,this) ); kite->setPostEventCb( boost::bind(&GraphicKiteEngine::postEvent,this) );
} else } else
cerr << Warning("%s already has a Kite engine.",getString(cell).c_str()) << endl; cerr << Warning( "%s already has a Kite engine.", getString(cell).c_str() ) << endl;
return kite; return kite;
} }
@ -146,13 +134,13 @@ namespace Kite {
{ {
// Currently, only one framework is avalaible: Alliance. // Currently, only one framework is avalaible: Alliance.
KiteEngine* kite = KiteEngine::get ( getCell() ); KiteEngine* kite = KiteEngine::get( getCell() );
if ( kite ) return kite; if (kite) return kite;
kite = createEngine (); kite = createEngine();
if ( not kite ) if (not kite)
throw Error("Failed to create Kite engine on %s.",getString(getCell()).c_str()); throw Error( "Failed to create Kite engine on %s.", getString(getCell()).c_str() );
return kite; return kite;
} }
@ -160,28 +148,28 @@ namespace Kite {
void GraphicKiteEngine::saveGlobalSolution () void GraphicKiteEngine::saveGlobalSolution ()
{ {
KiteEngine* kite = KiteEngine::get ( getCell() ); KiteEngine* kite = KiteEngine::get( getCell() );
if ( kite ) kite->saveGlobalSolution (); if (kite) kite->saveGlobalSolution ();
} }
void GraphicKiteEngine::loadGlobalSolution () void GraphicKiteEngine::loadGlobalSolution ()
{ {
KiteEngine* kite = getForFramework (); KiteEngine* kite = getForFramework();
emit cellPreModificated (); emit cellPreModificated();
kite->runGlobalRouter ( LoadGlobalSolution ); kite->runGlobalRouter( KtLoadGlobalRouting );
emit cellPostModificated (); emit cellPostModificated();
} }
void GraphicKiteEngine::globalRoute () void GraphicKiteEngine::globalRoute ()
{ {
KiteEngine* kite = getForFramework (); KiteEngine* kite = getForFramework();
emit cellPreModificated (); emit cellPreModificated();
kite->runGlobalRouter ( BuildGlobalSolution ); kite->runGlobalRouter( KtBuildGlobalRouting );
emit cellPostModificated (); emit cellPostModificated();
} }
@ -189,73 +177,61 @@ namespace Kite {
{ {
static KatabaticEngine::NetSet routingNets; static KatabaticEngine::NetSet routingNets;
KiteEngine* kite = KiteEngine::get ( getCell() ); KiteEngine* kite = KiteEngine::get( getCell() );
if ( not kite ) { if (not kite) {
throw Error("KiteEngine not created yet, run the global router first."); throw Error( "KiteEngine not created yet, run the global router first." );
} }
if ( cmess1.enabled() ) if (cmess1.enabled()) kite->printConfiguration();
kite->printConfiguration ();
emit cellPreModificated();
_viewer->clearToolInterrupt();
kite->loadGlobalRouting( Katabatic::EngineLoadGrByNet, routingNets );
emit cellPostModificated();
emit cellPreModificated (); emit cellPreModificated ();
kite->balanceGlobalDensity ();
_viewer->clearToolInterrupt (); kite->layerAssign ( Katabatic::EngineNoNetLayerAssign );
emit cellPostModificated();
kite->loadGlobalRouting ( Katabatic::LoadGrByNet, routingNets ); emit cellPreModificated();
emit cellPostModificated (); kite->runNegociate();
emit cellPostModificated();
//Breakpoint::stop ( 0, "Point d'arret:<br>&nbsp;&nbsp;<b>LayerAssingByTrunk()</b><br>"
// "Assignment des layers, methode globale." );
emit cellPreModificated ();
kite->layerAssign ( Katabatic::NoNetLayerAssign );
emit cellPostModificated ();
//Breakpoint::stop ( 0, "Point d'arret:<br>&nbsp;&nbsp;<b>runNegociate()</b><br>"
// "Routage par Negociation." );
emit cellPreModificated ();
kite->runNegociate ();
emit cellPostModificated ();
} }
void GraphicKiteEngine::finalize () void GraphicKiteEngine::finalize ()
{ {
emit cellPreModificated (); emit cellPreModificated();
KiteEngine* kite = KiteEngine::get ( getCell() ); KiteEngine* kite = KiteEngine::get( getCell() );
if ( kite ) { if (kite) {
kite->finalizeLayout (); kite->finalizeLayout();
//kite->dumpMeasures (); kite->destroy();
kite->destroy ();
} }
emit cellPostModificated (); emit cellPostModificated();
} }
void GraphicKiteEngine::save () void GraphicKiteEngine::save ()
{ {
//KiteEngine* kite = KiteEngine::get ( getCell() ); Cell* cell = getCell();
//if ( kite ) { AllianceFramework* af = AllianceFramework::get();
Cell* cell = getCell();
AllianceFramework* af = AllianceFramework::get ();
string name = getString(cell->getName()) + "_kite"; string name = getString(cell->getName()) + "_kite";
cell->setName ( name ); cell->setName( name );
af->saveCell ( cell, Catalog::State::Physical ); af->saveCell( cell, Catalog::State::Physical );
//}
} }
void GraphicKiteEngine::route () void GraphicKiteEngine::route ()
{ {
globalRoute (); globalRoute();
detailRoute (); detailRoute();
finalize (); finalize ();
} }
void GraphicKiteEngine::dumpMeasures () void GraphicKiteEngine::dumpMeasures ()
{ {
KiteEngine* kite = getForFramework (); KiteEngine* kite = getForFramework();
if ( kite ) kite->dumpMeasures (); if (kite) kite->dumpMeasures();
} }
@ -263,19 +239,13 @@ namespace Kite {
{ {
static unsigned int count = 0; static unsigned int count = 0;
if ( not (count++ % 500) ) { if (not (count++ % 500)) {
//UpdateSession::close (); QApplication::processEvents();
//_viewer->getCellWidget()->refresh (); if (_viewer->isToolInterrupted()) {
QApplication::processEvents (); KiteEngine* kite = KiteEngine::get( getCell() );
if (kite) kite->setInterrupt( true );
//UpdateSession::open (); _viewer->clearToolInterrupt();
if ( _viewer->isToolInterrupted() ) {
KiteEngine* kite = KiteEngine::get ( getCell() );
if ( kite ) kite->setInterrupt ( true );
_viewer->clearToolInterrupt ();
} }
} }
} }
@ -283,122 +253,109 @@ namespace Kite {
void GraphicKiteEngine::addToMenu ( CellViewer* viewer ) void GraphicKiteEngine::addToMenu ( CellViewer* viewer )
{ {
assert ( _viewer == NULL ); assert( _viewer == NULL );
_viewer = viewer; _viewer = viewer;
QMenu* prMenu = _viewer->findChild<QMenu*>("viewer.menuBar.placeAndRoute"); QMenu* prMenu = _viewer->findChild<QMenu*>("viewer.menuBar.placeAndRoute");
QMenu* stepMenu = _viewer->findChild<QMenu*>("viewer.menuBar.placeAndRoute.stepByStep"); QMenu* stepMenu = _viewer->findChild<QMenu*>("viewer.menuBar.placeAndRoute.stepByStep");
if ( !prMenu ) { if (prMenu == NULL) {
QMenuBar* menuBar = _viewer->findChild<QMenuBar*>("viewer.menuBar"); QMenuBar* menuBar = _viewer->findChild<QMenuBar*>("viewer.menuBar");
if ( !menuBar ) { if (menuBar == NULL) {
cerr << Warning("GraphicKiteEngine::addToMenu() - No MenuBar in parent widget.") << endl; cerr << Warning( "GraphicKiteEngine::addToMenu() - No MenuBar in parent widget." ) << endl;
return; return;
} }
prMenu = menuBar->addMenu ( tr("P&&R") ); prMenu = menuBar->addMenu( tr("P&&R") );
prMenu->setObjectName ( "viewer.menuBar.placeAndRoute" ); prMenu->setObjectName( "viewer.menuBar.placeAndRoute" );
stepMenu = prMenu->addMenu ( tr("&Step by Step") ); stepMenu = prMenu->addMenu( tr("&Step by Step") );
stepMenu->setObjectName ( "viewer.menuBar.placeAndRoute.stepByStep" ); stepMenu->setObjectName( "viewer.menuBar.placeAndRoute.stepByStep" );
prMenu->addSeparator (); prMenu->addSeparator();
} }
QAction* dRouteAction = _viewer->findChild<QAction*>("viewer.menuBar.placeAndRoute.detailedRoute"); QAction* dRouteAction = _viewer->findChild<QAction*>("viewer.menuBar.placeAndRoute.detailedRoute");
if ( dRouteAction ) if (dRouteAction)
cerr << Warning("GraphicKiteEngine::addToMenu() - Kite detailed router already hooked in.") << endl; cerr << Warning( "GraphicKiteEngine::addToMenu() - Kite detailed router already hooked in." ) << endl;
else { else {
stepMenu->addSeparator (); stepMenu->addSeparator();
QAction* gRouteAction = new QAction ( tr("Kite - &Global Route"), _viewer ); QAction* gRouteAction = new QAction ( tr("Kite - &Global Route"), _viewer );
gRouteAction->setObjectName ( "viewer.menuBar.placeAndRoute.stepBystep.globalRoute" ); gRouteAction->setObjectName( "viewer.menuBar.placeAndRoute.stepBystep.globalRoute" );
gRouteAction->setStatusTip ( tr("Run the <b>Knik</b> global router") ); gRouteAction->setStatusTip ( tr("Run the <b>Knik</b> global router") );
gRouteAction->setVisible ( true ); gRouteAction->setVisible ( true );
stepMenu->addAction ( gRouteAction ); stepMenu->addAction( gRouteAction );
QAction* gLoadSolutionAction = new QAction ( tr("Kite - &Load Global Routing"), _viewer ); QAction* gLoadSolutionAction = new QAction ( tr("Kite - &Load Global Routing"), _viewer );
gLoadSolutionAction->setObjectName ( "viewer.menuBar.placeAndRoute.stepByStep.loadGlobalRouting" ); gLoadSolutionAction->setObjectName( "viewer.menuBar.placeAndRoute.stepByStep.loadGlobalRouting" );
gLoadSolutionAction->setStatusTip ( tr("Load a solution for the global routing (.kgr)") ); gLoadSolutionAction->setStatusTip ( tr("Load a solution for the global routing (.kgr)") );
gLoadSolutionAction->setVisible ( true ); gLoadSolutionAction->setVisible ( true );
stepMenu->addAction ( gLoadSolutionAction ); stepMenu->addAction( gLoadSolutionAction );
QAction* gSaveSolutionAction = new QAction ( tr("Kite - &Save Global Routing"), _viewer ); QAction* gSaveSolutionAction = new QAction ( tr("Kite - &Save Global Routing"), _viewer );
gSaveSolutionAction->setObjectName ( "viewer.menuBar.placeAndRoute.stepByStep.saveGlobalRouting" ); gSaveSolutionAction->setObjectName( "viewer.menuBar.placeAndRoute.stepByStep.saveGlobalRouting" );
gSaveSolutionAction->setStatusTip ( tr("Save a global router solution (.kgr)") ); gSaveSolutionAction->setStatusTip ( tr("Save a global router solution (.kgr)") );
gSaveSolutionAction->setVisible ( true ); gSaveSolutionAction->setVisible ( true );
stepMenu->addAction ( gSaveSolutionAction ); stepMenu->addAction( gSaveSolutionAction );
dRouteAction = new QAction ( tr("Kite - &Detailed Route"), _viewer ); dRouteAction = new QAction ( tr("Kite - &Detailed Route"), _viewer );
dRouteAction->setObjectName ( "viewer.menuBar.placeAndRoute.stepBystep.detailedRoute" ); dRouteAction->setObjectName( "viewer.menuBar.placeAndRoute.stepBystep.detailedRoute" );
dRouteAction->setStatusTip ( tr("Run the <b>Kite</b> detailed router") ); dRouteAction->setStatusTip ( tr("Run the <b>Kite</b> detailed router") );
dRouteAction->setVisible ( true ); dRouteAction->setVisible ( true );
stepMenu->addAction ( dRouteAction ); stepMenu->addAction( dRouteAction );
QAction* dFinalizeAction = new QAction ( tr("Kite - &Finalize Routing"), _viewer ); QAction* dFinalizeAction = new QAction( tr("Kite - &Finalize Routing"), _viewer );
dFinalizeAction->setObjectName ( "viewer.menuBar.placeAndRoute.stepBystep.finalize" ); dFinalizeAction->setObjectName( "viewer.menuBar.placeAndRoute.stepBystep.finalize" );
dFinalizeAction->setStatusTip ( tr("Closing Routing") ); dFinalizeAction->setStatusTip ( tr("Closing Routing") );
dFinalizeAction->setVisible ( true ); dFinalizeAction->setVisible ( true );
stepMenu->addAction ( dFinalizeAction ); stepMenu->addAction( dFinalizeAction );
QAction* dDumpMeasuresAction = new QAction ( tr("Kite - Dump &Measures"), _viewer ); QAction* dDumpMeasuresAction = new QAction ( tr("Kite - Dump &Measures"), _viewer );
dDumpMeasuresAction->setObjectName ( "viewer.menuBar.placeAndRoute.stepBystep.dumpMeasures" ); dDumpMeasuresAction->setObjectName( "viewer.menuBar.placeAndRoute.stepBystep.dumpMeasures" );
dDumpMeasuresAction->setStatusTip ( tr("Dumping Measurements on the disk") ); dDumpMeasuresAction->setStatusTip ( tr("Dumping Measurements on the disk") );
dDumpMeasuresAction->setVisible ( true ); dDumpMeasuresAction->setVisible ( true );
stepMenu->addAction ( dDumpMeasuresAction ); stepMenu->addAction( dDumpMeasuresAction );
QAction* dSaveAction = new QAction ( tr("Kite - &Save Design"), _viewer ); QAction* dSaveAction = new QAction ( tr("Kite - &Save Design"), _viewer );
dSaveAction->setObjectName ( "viewer.menuBar.placeAndRoute.stepBystep.save" ); dSaveAction->setObjectName( "viewer.menuBar.placeAndRoute.stepBystep.save" );
dSaveAction->setStatusTip ( tr("Save routed design (temporary hack)") ); dSaveAction->setStatusTip ( tr("Save routed design (temporary hack)") );
dSaveAction->setVisible ( true ); dSaveAction->setVisible ( true );
stepMenu->addAction ( dSaveAction ); stepMenu->addAction( dSaveAction );
QAction* routeAction = new QAction ( tr("Kite - &Route"), _viewer ); QAction* routeAction = new QAction ( tr("Kite - &Route"), _viewer );
routeAction->setObjectName ( "viewer.menuBar.placeAndRoute.route" ); routeAction->setObjectName( "viewer.menuBar.placeAndRoute.route" );
routeAction->setStatusTip ( tr("Route the design (global & detailed)") ); routeAction->setStatusTip ( tr("Route the design (global & detailed)") );
routeAction->setVisible ( true ); routeAction->setVisible ( true );
prMenu->addAction ( routeAction ); prMenu->addAction( routeAction );
connect ( gLoadSolutionAction, SIGNAL(triggered()), this, SLOT(loadGlobalSolution()) ); connect( gLoadSolutionAction, SIGNAL(triggered()), this, SLOT(loadGlobalSolution()) );
connect ( gSaveSolutionAction, SIGNAL(triggered()), this, SLOT(saveGlobalSolution()) ); connect( gSaveSolutionAction, SIGNAL(triggered()), this, SLOT(saveGlobalSolution()) );
connect ( gRouteAction , SIGNAL(triggered()), this, SLOT(globalRoute ()) ); connect( gRouteAction , SIGNAL(triggered()), this, SLOT(globalRoute ()) );
connect ( dRouteAction , SIGNAL(triggered()), this, SLOT(detailRoute ()) ); connect( dRouteAction , SIGNAL(triggered()), this, SLOT(detailRoute ()) );
connect ( dFinalizeAction , SIGNAL(triggered()), this, SLOT(finalize ()) ); connect( dFinalizeAction , SIGNAL(triggered()), this, SLOT(finalize ()) );
connect ( dSaveAction , SIGNAL(triggered()), this, SLOT(save ()) ); connect( dSaveAction , SIGNAL(triggered()), this, SLOT(save ()) );
connect ( dDumpMeasuresAction, SIGNAL(triggered()), this, SLOT(dumpMeasures ()) ); connect( dDumpMeasuresAction, SIGNAL(triggered()), this, SLOT(dumpMeasures ()) );
connect ( routeAction , SIGNAL(triggered()), this, SLOT(route ()) ); connect( routeAction , SIGNAL(triggered()), this, SLOT(route ()) );
} }
connect ( this, SIGNAL(cellPreModificated ()), _viewer->getCellWidget(), SLOT(cellPreModificate ()) ); connect( this, SIGNAL(cellPreModificated ()), _viewer->getCellWidget(), SLOT(cellPreModificate ()) );
connect ( this, SIGNAL(cellPostModificated()), _viewer->getCellWidget(), SLOT(cellPostModificate()) ); connect( this, SIGNAL(cellPostModificated()), _viewer->getCellWidget(), SLOT(cellPostModificate()) );
// ControllerWidget* controller = _viewer->getControllerWidget();
// ConfigurationWidget* setting = controller->getSettings()
// ->findChild<ConfigurationWidget*>("controller.tabSettings.setting.kite");
// if ( setting == NULL ) {
// setting = new ConfigurationWidget ();
// setting->setObjectName ( "controller.tabSettings.setting.kite" );
// setting->setConfiguration ( Configuration::getDefault() );
// controller->addSetting ( setting, "Kite" );
// }
} }
const Name& GraphicKiteEngine::getName () const const Name& GraphicKiteEngine::getName () const
{ { return KiteEngine::staticGetName(); }
return KiteEngine::staticGetName ();
}
Cell* GraphicKiteEngine::getCell () Cell* GraphicKiteEngine::getCell ()
{ {
if ( !_viewer ) { if (_viewer == NULL) {
throw Error ( "<b>Kite:</b> GraphicKiteEngine not bound to any Viewer." ); throw Error( "<b>Kite:</b> GraphicKiteEngine not bound to any Viewer." );
return NULL; return NULL;
} }
if ( !_viewer->getCell() ) { if (_viewer->getCell() == NULL) {
throw Error ( "<b>Kite:</b> No Cell is loaded into the Viewer." ); throw Error( "<b>Kite:</b> No Cell is loaded into the Viewer." );
return NULL; return NULL;
} }
@ -408,7 +365,7 @@ namespace Kite {
GraphicKiteEngine* GraphicKiteEngine::grab () GraphicKiteEngine* GraphicKiteEngine::grab ()
{ {
if ( !_references ) { if (not _references) {
_singleton = new GraphicKiteEngine (); _singleton = new GraphicKiteEngine ();
} }
_references++; _references++;
@ -419,8 +376,8 @@ namespace Kite {
size_t GraphicKiteEngine::release () size_t GraphicKiteEngine::release ()
{ {
_references--; --_references;
if ( !_references ) { if (not _references) {
delete _singleton; delete _singleton;
_singleton = NULL; _singleton = NULL;
} }
@ -430,12 +387,12 @@ namespace Kite {
GraphicKiteEngine::GraphicKiteEngine () GraphicKiteEngine::GraphicKiteEngine ()
: GraphicTool() : GraphicTool()
, _viewer(NULL) , _viewer (NULL)
{ {
addDrawGo ( "Knik::Edge" , GraphicKnikEngine::initKnikEdges , GraphicKnikEngine::drawKnikEdges ); addDrawGo( "Knik::Edge" , GraphicKnikEngine::initKnikEdges , GraphicKnikEngine::drawKnikEdges );
addDrawGo ( "Knik::Vertex" , GraphicKnikEngine::initKnikVertex, GraphicKnikEngine::drawKnikVertex ); addDrawGo( "Knik::Vertex" , GraphicKnikEngine::initKnikVertex, GraphicKnikEngine::drawKnikVertex );
addDrawGo ( "Katabatic::Ac" , initKatabaticAc , drawKatabaticAc ); addDrawGo( "Katabatic::Ac" , initKatabaticAc , drawKatabaticAc );
addDrawGo ( "Katabatic::GCell", initKatabaticGCell, drawKatabaticGCell ); addDrawGo( "Katabatic::GCell", initKatabaticGCell, drawKatabaticGCell );
} }
@ -443,4 +400,4 @@ namespace Kite {
{ } { }
} // End of Kite namespace. } // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,13 +12,10 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./HorizontalTrack.cpp" | // | C++ Module : "./HorizontalTrack.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include "kite/HorizontalTrack.h" #include "kite/HorizontalTrack.h"
namespace Kite { namespace Kite {
@ -61,7 +53,7 @@ namespace Kite {
bool HorizontalTrack::isHorizontal () const { return true; } bool HorizontalTrack::isHorizontal () const { return true; }
bool HorizontalTrack::isVertical () const { return false; } bool HorizontalTrack::isVertical () const { return false; }
unsigned int HorizontalTrack::getDirection () const { return Constant::Horizontal; } unsigned int HorizontalTrack::getDirection () const { return KbHorizontal; }
Point HorizontalTrack::getPosition ( DbU::Unit coordinate ) const Point HorizontalTrack::getPosition ( DbU::Unit coordinate ) const
@ -81,4 +73,4 @@ namespace Kite {
} }
} // End of Kite namespace. } // Kite namespace.

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +1,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved // Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |
@ -15,31 +14,31 @@
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
#include <memory> #include <memory>
using namespace std; using namespace std;
#include <boost/program_options.hpp> #include <boost/program_options.hpp>
namespace bopts = boost::program_options; namespace bopts = boost::program_options;
#include "vlsisapd/configuration/Configuration.h" #include "vlsisapd/configuration/Configuration.h"
#include "hurricane/DebugSession.h" #include "hurricane/DebugSession.h"
#include "hurricane/DataBase.h" #include "hurricane/DataBase.h"
#include "hurricane/Cell.h" #include "hurricane/Cell.h"
#include "hurricane/Warning.h" #include "hurricane/Warning.h"
#include "hurricane/UpdateSession.h" #include "hurricane/UpdateSession.h"
using namespace Hurricane; using namespace Hurricane;
#include "crlcore/Utilities.h" #include "crlcore/Utilities.h"
#include "crlcore/Banner.h" #include "crlcore/Banner.h"
#include "crlcore/AllianceFramework.h" #include "crlcore/AllianceFramework.h"
#include "crlcore/Hierarchy.h" #include "crlcore/Hierarchy.h"
#include "crlcore/ToolBox.h" #include "crlcore/ToolBox.h"
using namespace CRL; using namespace CRL;
#include "knik/KnikEngine.h" #include "knik/KnikEngine.h"
using namespace Knik; using namespace Knik;
#include "kite/KiteEngine.h" #include "kite/KiteEngine.h"
using namespace Kite; using namespace Kite;
@ -145,8 +144,8 @@ int main ( int argc, char *argv[] )
} }
KatabaticEngine::NetSet routingNets; KatabaticEngine::NetSet routingNets;
unsigned int globalFlags = (loadGlobal) ? Kite::LoadGlobalSolution unsigned int globalFlags = (loadGlobal) ? Kite::KtLoadGlobalRouting
: Kite::BuildGlobalSolution; : Kite::KtBuildGlobalRouting;
KiteEngine* kite = KiteEngine::create( cell ); KiteEngine* kite = KiteEngine::create( cell );
if (showConf) kite->printConfiguration(); if (showConf) kite->printConfiguration();
@ -154,9 +153,10 @@ int main ( int argc, char *argv[] )
kite->runGlobalRouter( globalFlags ); kite->runGlobalRouter( globalFlags );
if (saveGlobal) kite->saveGlobalSolution (); if (saveGlobal) kite->saveGlobalSolution ();
kite->loadGlobalRouting( Katabatic::LoadGrByNet, routingNets ); kite->loadGlobalRouting ( Katabatic::EngineLoadGrByNet, routingNets );
kite->layerAssign ( Katabatic::NoNetLayerAssign ); kite->balanceGlobalDensity();
kite->runNegociate (); kite->layerAssign ( Katabatic::EngineNoNetLayerAssign );
kite->runNegociate ();
kiteSuccess = kite->getToolSuccess(); kiteSuccess = kite->getToolSuccess();
kite->finalizeLayout (); kite->finalizeLayout ();

1412
kite/src/Manipulator.cpp Normal file

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |
@ -15,34 +15,32 @@
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
#include <vector> #include <vector>
#include <algorithm> #include <algorithm>
#include <iomanip> #include <iomanip>
#include "hurricane/Warning.h"
#include "hurricane/Warning.h" #include "hurricane/Bug.h"
#include "hurricane/Bug.h" #include "hurricane/RoutingPad.h"
#include "hurricane/RoutingPad.h" #include "hurricane/Net.h"
#include "hurricane/Net.h" #include "hurricane/Cell.h"
#include "hurricane/Cell.h" #include "crlcore/Utilities.h"
#include "crlcore/Utilities.h" #include "crlcore/AllianceFramework.h"
#include "crlcore/AllianceFramework.h" #include "crlcore/Measures.h"
#include "crlcore/Measures.h" #include "crlcore/Histogram.h"
#include "crlcore/Histogram.h" #include "katabatic/AutoContact.h"
#include "katabatic/AutoContact.h" #include "katabatic/GCellGrid.h"
#include "katabatic/GCellGrid.h" #include "kite/DataNegociate.h"
#include "kite/TrackElement.h"
#include "kite/DataNegociate.h" #include "kite/TrackMarker.h"
#include "kite/TrackElement.h" #include "kite/TrackCost.h"
#include "kite/TrackMarker.h" #include "kite/Track.h"
#include "kite/TrackCost.h" #include "kite/TrackSegment.h"
#include "kite/Track.h" #include "kite/RoutingPlane.h"
#include "kite/TrackSegment.h" #include "kite/RoutingEventQueue.h"
#include "kite/RoutingPlane.h" #include "kite/RoutingEventHistory.h"
#include "kite/RoutingEventQueue.h" #include "kite/RoutingEventLoop.h"
#include "kite/RoutingEventHistory.h" #include "kite/NegociateWindow.h"
#include "kite/RoutingEventLoop.h" #include "kite/KiteEngine.h"
#include "kite/NegociateWindow.h"
#include "kite/KiteEngine.h"
namespace { namespace {
@ -57,69 +55,56 @@ namespace {
{ {
Interval intersect = segment->getCanonicalInterval(); Interval intersect = segment->getCanonicalInterval();
if ( not intersect.intersect(cost.getInterval()) ) return; if (not intersect.intersect(cost.getInterval())) return;
if ( segment->isBlockage() or segment->isFixed() ) { if (segment->isBlockage() or segment->isFixed()) {
ltrace(200) << "Infinite cost from: " << segment << endl; ltrace(200) << "Infinite cost from: " << segment << endl;
cost.setInfinite (); cost.setInfinite ();
cost.setOverlap (); cost.setOverlap ();
cost.setHardOverlap (); cost.setHardOverlap();
cost.setBlockage (); cost.setBlockage ();
return; return;
} }
if ( cost.getInterval().getVMax() > intersect.getVMax() ) cost.setLeftOverlap(); if (cost.getInterval().getVMax() > intersect.getVMax()) cost.setLeftOverlap();
if ( cost.getInterval().getVMin() < intersect.getVMin() ) cost.setRightOverlap(); if (cost.getInterval().getVMin() < intersect.getVMin()) cost.setRightOverlap();
//cost.setLonguestOverlap ( intersect.getSize() ); if (not intersect.contains(cost.getInterval()))
//intersect.intersection ( cost.getInterval() ); intersect.intersection( cost.getInterval() );
if ( not intersect.contains(cost.getInterval()) )
intersect.intersection ( cost.getInterval() );
else { else {
cost.setLonguestOverlap ( intersect.getSize() ); cost.setLonguestOverlap( intersect.getSize() );
cost.setGlobalEnclosed (); cost.setGlobalEnclosed();
} }
DataNegociate* data = segment->getDataNegociate (); DataNegociate* data = segment->getDataNegociate();
if ( not data ) return; if (not data) return;
cost.mergeRipupCount ( data->getRipupCount() ); cost.mergeRipupCount( data->getRipupCount() );
if ( segment->isLocal() ) { if ( segment->isLocal() ) {
cost.mergeDataState ( data->getState() ); cost.mergeDataState( data->getState() );
if ( data->getState() >= DataNegociate::LocalVsGlobal ) { if (data->getState() >= DataNegociate::LocalVsGlobal) {
ltrace(200) << "MaximumSlack/LocalVsGlobal for " << segment << endl; ltrace(200) << "MaximumSlack/LocalVsGlobal for " << segment << endl;
} }
} }
if ( segment->isGlobal() ) { if (segment->isGlobal()) {
//if ( data->getState() >= DataNegociate::ConflictSolve1 ) { cost.setOverlapGlobal();
cost.setOverlapGlobal(); if ( (cost.getFlags() & TrackCost::LocalAndTopDepth)
//} and (data->getState() >= DataNegociate::MoveUp) ) {
if ( (cost.getFlags() & TrackCost::LocalAndTopDepth) cost.setInfinite ();
and (data->getState() >= DataNegociate::MoveUp) ) { cost.setOverlap ();
cost.setInfinite (); cost.setHardOverlap();
cost.setOverlap (); return;
cost.setHardOverlap (); }
return;
}
} }
// if ( data->getRipupCount() > 3 ) { cost.setOverlap();
// ltrace(200) << "Infinite cost from: " << segment << endl; if ( segment->isLocal()
// cost.setFixed (); or (cost.isForGlobal() and (Session::getRoutingGauge()->getLayerDepth(segment->getLayer()) < 3)) )
// cost.setInfinite (); cost.incTerminals( data->getTerminals()*100 );
// cost.setOverlap ();
// cost.setHardOverlap ();
// return;
// }
cost.setOverlap ();
if ( segment->isLocal() or (Session::getRoutingGauge()->getLayerDepth(segment->getLayer()) < 3) )
cost.incTerminals ( data->getCost().getTerminals()*100 );
ltrace(200) << "| Increment Delta: " << DbU::getValueString(intersect.getSize()) << endl; ltrace(200) << "| Increment Delta: " << DbU::getValueString(intersect.getSize()) << endl;
cost.incDelta ( intersect.getSize() ); cost.incDelta( intersect.getSize() );
} }
@ -129,24 +114,22 @@ namespace {
RoutingGauge* rg = nw->getKiteEngine()->getRoutingGauge(); RoutingGauge* rg = nw->getKiteEngine()->getRoutingGauge();
forEach ( Net*, inet, nw->getCell()->getNets() ) { forEach ( Net*, inet, nw->getCell()->getNets() ) {
if ( inet->getType() == Net::Type::POWER ) continue; if (inet->getType() == Net::Type::POWER ) continue;
if ( inet->getType() == Net::Type::GROUND ) continue; if (inet->getType() == Net::Type::GROUND) continue;
if ( inet->getType() == Net::Type::CLOCK ) continue; if (inet->getType() == Net::Type::CLOCK ) continue;
if ( af->isBLOCKAGE(inet->getName()) ) continue; if (af->isBLOCKAGE(inet->getName())) continue;
forEach ( RoutingPad*, irp, inet->getRoutingPads() ) { forEach ( RoutingPad*, irp, inet->getRoutingPads() ) {
size_t depth = rg->getLayerDepth(irp->getLayer()); size_t depth = rg->getLayerDepth(irp->getLayer());
if ( depth > 0 ) continue; if (depth > 0) continue;
if ( depth == 0 ) { if (depth == 0)
TrackMarker::create ( *irp, 1 ); TrackMarker::create( *irp, 1 );
//TrackMarker::create ( *irp, 2 );
}
} }
} }
} }
} // End of local namespace. } // Anonymous namespace.
namespace Kite { namespace Kite {
@ -167,6 +150,8 @@ namespace Kite {
using CRL::Histogram; using CRL::Histogram;
using CRL::addMeasure; using CRL::addMeasure;
using Katabatic::AutoContact; using Katabatic::AutoContact;
using Katabatic::AutoSegmentLut;
using Katabatic::perpandicularTo;
// ------------------------------------------------------------------- // -------------------------------------------------------------------
@ -207,111 +192,115 @@ namespace Kite {
void NegociateWindow::setGCells ( const Katabatic::GCellVector& gcells ) void NegociateWindow::setGCells ( const Katabatic::GCellVector& gcells )
{ {
_gcells = gcells; _gcells = gcells;
//sort ( _gcells.begin(), _gcells.end(), Katabatic::GCell::CompareGCellById() );
loadRoutingPads ( this ); loadRoutingPads( this );
Session::revalidate (); Session::revalidate();
TrackElement* segment; TrackElement* segment;
TrackElementLut lut = Session::getKiteEngine()->_getTrackElementLut(); AutoSegmentLut lut = Session::getKiteEngine()->_getAutoSegmentLut();
TrackElementLut::iterator it = lut.begin (); AutoSegmentLut::iterator it = lut.begin ();
for ( ; it != lut.end() ; it++ ) { for ( ; it != lut.end() ; it++ ) {
segment = it->second; segment = Session::lookup( it->second );
segment->getDataNegociate()->update(); if (segment) segment->getDataNegociate()->update();
} }
_statistics.setGCellsCount ( _gcells.size() ); _statistics.setGCellsCount( _gcells.size() );
} }
void NegociateWindow::addInsertEvent ( TrackElement* segment, unsigned int level ) void NegociateWindow::addRoutingEvent ( TrackElement* segment, unsigned int level )
{ {
DataNegociate* data = segment->getDataNegociate(); DataNegociate* data = segment->getDataNegociate();
if ( not data or not data->hasRoutingEvent() ) if (not data or not data->hasRoutingEvent())
_eventQueue.add ( segment, level ); _eventQueue.add( segment, level );
else else
cerr << Bug("NegociateWidow::addInsertEvent(): Try to adds twice the same TrackElement event." cerr << Bug( "NegociateWidow::addRoutingEvent(): Try to adds twice the same TrackElement event."
"\n %p:%s." "\n %p:%s."
,(void*)segment->base()->base() , (void*)segment->base()->base()
,getString(segment).c_str() , getString(segment).c_str()
) << endl; ) << endl;
} }
TrackElement* NegociateWindow::addTrackSegment ( AutoSegment* autoSegment, bool loading ) TrackElement* NegociateWindow::createTrackSegment ( AutoSegment* autoSegment, unsigned int flags )
{ {
ltrace(200) << "NegociateWindow::addTrackSegment() - " << autoSegment << endl; ltrace(200) << "NegociateWindow::createTrackSegment() - " << autoSegment << endl;
ltracein(159); ltracein(159);
// Special case: fixed AutoSegments must not interfere with blockages. // Special case: fixed AutoSegments must not interfere with blockages.
// Ugly: uses of getExtensionCap(). // Ugly: uses of getExtensionCap().
if ( autoSegment->isFixed() ) { if (autoSegment->isFixed()) {
RoutingPlane* plane = Session::getKiteEngine()->getRoutingPlaneByLayer(autoSegment->getLayer()); RoutingPlane* plane = Session::getKiteEngine()->getRoutingPlaneByLayer(autoSegment->getLayer());
Track* track = plane->getTrackByPosition ( autoSegment->getAxis() ); Track* track = plane->getTrackByPosition( autoSegment->getAxis() );
size_t begin; size_t begin;
size_t end; size_t end;
Interval fixedSpan; Interval fixedSpan;
Interval blockageSpan; Interval blockageSpan;
autoSegment->getCanonical ( fixedSpan ); autoSegment->getCanonical( fixedSpan );
fixedSpan.inflate ( Session::getExtensionCap()-1 ); fixedSpan.inflate( Session::getExtensionCap()-1 );
track->getOverlapBounds ( fixedSpan, begin, end ); track->getOverlapBounds( fixedSpan, begin, end );
for ( ; (begin < end) ; begin++ ) { for ( ; (begin < end) ; begin++ ) {
TrackElement* other = track->getSegment(begin); TrackElement* other = track->getSegment(begin);
ltrace(200) << "| overlap: " << other << endl; ltrace(200) << "| overlap: " << other << endl;
if ( not other->isBlockage() ) continue; if (not other->isBlockage()) continue;
other->getCanonical ( blockageSpan ); other->getCanonical( blockageSpan );
blockageSpan.inflate(Session::getExtensionCap()); blockageSpan.inflate( Session::getExtensionCap() );
ltrace(200) << " fixed:" << fixedSpan << " vs. blockage:" << blockageSpan << endl; ltrace(200) << " fixed:" << fixedSpan << " vs. blockage:" << blockageSpan << endl;
if ( not fixedSpan.intersect(blockageSpan) ) continue; if (not fixedSpan.intersect(blockageSpan)) continue;
// Overlap between fixed & blockage. // Overlap between fixed & blockage.
ltrace(200) << "* Blockage overlap: " << autoSegment << endl; ltrace(200) << "* Blockage overlap: " << autoSegment << endl;
Session::destroyRequest ( autoSegment ); Session::destroyRequest( autoSegment );
cerr << Warning("Overlap between fixed %s and blockage at %s."
,getString(autoSegment).c_str(),getString(blockageSpan).c_str()) << endl;
cerr << Warning( "Overlap between fixed %s and blockage at %s."
, getString(autoSegment).c_str()
, getString(blockageSpan).c_str() ) << endl;
ltraceout(159);
return NULL; return NULL;
} }
} }
Interval span; Interval span;
autoSegment = autoSegment->getCanonical ( span ); autoSegment = autoSegment->getCanonical( span );
bool created; bool created;
TrackElement* trackSegment = TrackSegment::create ( autoSegment, NULL, created ); TrackElement* trackSegment = TrackSegment::create( autoSegment, NULL, created );
if ( not loading ) if (not (flags & KtLoadingStage))
ltrace(159) << "* lookup: " << autoSegment << endl; ltrace(159) << "* lookup: " << autoSegment << endl;
if ( created ) { if (created) {
ltrace(159) << "* " << trackSegment << endl; ltrace(159) << "* " << trackSegment << endl;
RoutingPlane* plane = Session::getKiteEngine()->getRoutingPlaneByLayer(autoSegment->getLayer()); RoutingPlane* plane = Session::getKiteEngine()->getRoutingPlaneByLayer(autoSegment->getLayer());
Track* track = plane->getTrackByPosition ( autoSegment->getAxis() ); Track* track = plane->getTrackByPosition ( autoSegment->getAxis() );
Interval uside = autoSegment->getAutoSource()->getGCell()->getUSide ( Constant::perpandicular(autoSegment->getDirection())/*, false */); Interval uside = autoSegment->getAutoSource()->getGCell()->getSide( perpandicularTo(autoSegment->getDirection()) );
if ( track->getAxis() > uside.getVMax() ) track = track->getPrevious(); if (track->getAxis() > uside.getVMax()) track = track->getPreviousTrack();
if ( track->getAxis() < uside.getVMin() ) track = track->getNext(); if (track->getAxis() < uside.getVMin()) track = track->getNextTrack();
trackSegment->setAxis ( track->getAxis(), Katabatic::Realignate|Katabatic::AxisSet ); ltrace(159) << "* GCell U-side " << uside << endl;
trackSegment->invalidate (); ltrace(159) << "* " << plane << endl;
ltrace(159) << "* " << track << endl;
if ( trackSegment->isFixed() ) { trackSegment->setAxis( track->getAxis(), Katabatic::SegAxisSet );
Session::addInsertEvent ( trackSegment, track ); trackSegment->invalidate();
if (trackSegment->isFixed()) {
Session::addInsertEvent( trackSegment, track );
} else { } else {
_segments.push_back ( trackSegment ); _segments.push_back( trackSegment );
} }
} }
if ( not created and not loading ) { if (not created and not (flags & KtLoadingStage)) {
ltrace(200) << "TrackSegment already exists (and not in loading stage)." << endl; ltrace(200) << "TrackSegment already exists (and not in loading stage)." << endl;
} }
@ -331,19 +320,19 @@ namespace Kite {
Segment* segment; Segment* segment;
TrackElement* trackSegment; TrackElement* trackSegment;
vector<AutoContact*>* contacts = _gcells[igcell]->getContacts(); const vector<AutoContact*>& contacts = _gcells[igcell]->getContacts();
for ( size_t i=0 ; i<contacts->size() ; i++ ) { for ( size_t i=0 ; i<contacts.size() ; i++ ) {
forEach ( Hook*, ihook, (*contacts)[i]->getBodyHook()->getSlaveHooks() ) { forEach ( Hook*, ihook, contacts[i]->getBodyHook()->getSlaveHooks() ) {
Hook* sourceHook = dynamic_cast<Segment::SourceHook*>(*ihook); Hook* sourceHook = dynamic_cast<Segment::SourceHook*>(*ihook);
if ( not sourceHook ) continue; if (not sourceHook) continue;
segment = dynamic_cast<Segment*>(sourceHook->getComponent()); segment = dynamic_cast<Segment*>(sourceHook->getComponent());
trackSegment = Session::lookup ( segment ); trackSegment = Session::lookup( segment );
if ( trackSegment ) { if (trackSegment) {
if ( accounteds.find(trackSegment) != accounteds.end() ) continue; if (accounteds.find(trackSegment) != accounteds.end()) continue;
accounteds.insert ( trackSegment ); accounteds.insert( trackSegment );
gcellWL += DbU::getLambda ( trackSegment->getLength() ); gcellWL += DbU::getLambda( trackSegment->getLength() );
} }
} }
} }
@ -365,14 +354,14 @@ namespace Kite {
AutoSegment* autoSegment; AutoSegment* autoSegment;
ltrace(149) << "AutoSegments from AutoContacts" << endl; ltrace(149) << "AutoSegments from AutoContacts" << endl;
vector<AutoContact*>* contacts = gcell->getContacts(); const vector<AutoContact*>& contacts = gcell->getContacts();
for ( size_t i=0 ; i<contacts->size() ; i++ ) { for ( size_t i=0 ; i<contacts.size() ; i++ ) {
forEach ( Component*, component, (*contacts)[i]->getSlaveComponents() ) { forEach ( Component*, component, contacts[i]->getSlaveComponents() ) {
segment = dynamic_cast<Segment*>(*component); segment = dynamic_cast<Segment*>(*component);
autoSegment = Session::base()->lookup ( segment ); autoSegment = Session::base()->lookup( segment );
ltrace(149) << autoSegment << endl; ltrace(149) << autoSegment << endl;
if ( autoSegment and autoSegment->isCanonical() ) { if (autoSegment and autoSegment->isCanonical()) {
addTrackSegment ( autoSegment, true ); createTrackSegment( autoSegment, KtLoadingStage );
} }
} }
} }
@ -384,21 +373,21 @@ namespace Kite {
size_t NegociateWindow::_negociate () size_t NegociateWindow::_negociate ()
{ {
ltrace(500) << "Deter| NegociateWindow::_negociate()" << endl;
ltrace(150) << "NegociateWindow::_negociate() - " << _segments.size() << endl; ltrace(150) << "NegociateWindow::_negociate() - " << _segments.size() << endl;
ltracein(149); ltracein(149);
cmess1 << " o Negociation Stage." << endl; cmess1 << " o Negociation Stage." << endl;
unsigned long limit = _kite->getEventsLimit(); unsigned long limit = _kite->getEventsLimit();
//unsigned long limit = 25586;
_eventHistory.clear(); _eventHistory.clear();
_eventQueue.load ( _segments ); _eventQueue.load( _segments );
size_t count = 0; size_t count = 0;
RoutingEvent::setStage ( RoutingEvent::Negociate ); RoutingEvent::setStage( RoutingEvent::Negociate );
while ( not _eventQueue.empty() and not isInterrupted() ) { while ( not _eventQueue.empty() and not isInterrupted() ) {
RoutingEvent* event = _eventQueue.pop (); RoutingEvent* event = _eventQueue.pop();
if (tty::enabled()) { if (tty::enabled()) {
cmess2 << " <event:" << tty::bold << setw(7) << setfill('0') cmess2 << " <event:" << tty::bold << setw(7) << setfill('0')
@ -409,100 +398,67 @@ namespace Kite {
<< RoutingEvent::getProcesseds() << setfill(' ') << " " << RoutingEvent::getProcesseds() << setfill(' ') << " "
<< event->getEventLevel() << ":" << event->getPriority() << "> " << event->getEventLevel() << ":" << event->getPriority() << "> "
<< event->getSegment() << event->getSegment()
//<< "> @" << DbU::getValueString(event->getSegment()->getAxis())
//<< " id:" << event->getSegment()->getId()
//<< " " << event->getSegment()->getNet()->getName()
<< endl; << endl;
cmess2.flush(); cmess2.flush();
} }
event->process ( _eventQueue, _eventHistory, _eventLoop ); event->process( _eventQueue, _eventHistory, _eventLoop );
count++; count++;
if ( RoutingEvent::getProcesseds() >= limit ) setInterrupt ( true ); if (RoutingEvent::getProcesseds() >= limit) setInterrupt( true );
} }
if (count and tty::enabled()) cmess1 << endl; if (count and cmess2.enabled() and tty::enabled()) cmess1 << endl;
ltrace(500) << "Deter| Repair Stage" << endl;
cmess1 << " o Repair Stage." << endl; cmess1 << " o Repair Stage." << endl;
ltrace(200) << "Loadind Repair queue." << endl; ltrace(200) << "Loadind Repair queue." << endl;
RoutingEvent::setStage ( RoutingEvent::Repair ); RoutingEvent::setStage( RoutingEvent::Repair );
for ( size_t i=0 ; (i<_eventHistory.size()) and not isInterrupted() ; i++ ) { for ( size_t i=0 ; (i<_eventHistory.size()) and not isInterrupted() ; i++ ) {
RoutingEvent* event = _eventHistory.getNth(i); RoutingEvent* event = _eventHistory.getNth(i);
if ( not event->isCloned() and event->isUnimplemented() ) { if (not event->isCloned() and event->isUnimplemented()) {
event->reschedule ( _eventQueue, 0 ); event->reschedule( _eventQueue, 0 );
} }
} }
_eventQueue.commit (); _eventQueue.commit();
count = 0; count = 0;
//_eventQueue.prepareRepair();
while ( not _eventQueue.empty() and not isInterrupted() ) { while ( not _eventQueue.empty() and not isInterrupted() ) {
RoutingEvent* event = _eventQueue.pop (); RoutingEvent* event = _eventQueue.pop();
if (tty::enabled()) { if (tty::enabled()) {
cmess2 << " <repair.event:" << tty::bold << setw(7) << setfill('0') cmess2 << " <repair.event:" << tty::bold << setw(7) << setfill('0')
<< RoutingEvent::getProcesseds() << setfill(' ') << tty::reset << ">" << tty::cr; << RoutingEvent::getProcesseds() << setfill(' ') << tty::reset << ">" << tty::cr;
cmess2.flush (); cmess2.flush();
} else { } else {
cmess2 << " <repair.event:" << setw(7) << setfill('0') cmess2 << " <repair.event:" << setw(7) << setfill('0')
<< RoutingEvent::getProcesseds() << setfill(' ') << " " << RoutingEvent::getProcesseds() << setfill(' ') << " "
<< event->getEventLevel() << ":" << event->getPriority() << "> " << event->getEventLevel() << ":" << event->getPriority() << "> "
<< event->getSegment() << event->getSegment()
//<< "> @" << DbU::getValueString(event->getSegment()->getAxis())
//<< " id:" << event->getSegment()->getId()
//<< " " << event->getSegment()->getNet()->getName()
<< endl; << endl;
cmess2.flush(); cmess2.flush();
} }
event->process ( _eventQueue, _eventHistory, _eventLoop ); event->process( _eventQueue, _eventHistory, _eventLoop );
count++; count++;
if ( RoutingEvent::getProcesseds() >= limit ) setInterrupt ( true ); if (RoutingEvent::getProcesseds() >= limit ) setInterrupt( true );
} }
// { if (count and cmess2.enabled() and tty::enabled()) cmess1 << endl;
// ltrace(200) << (void*)event << " ["
// << (event->isCloned ()?"C":"-")
// << (event->isDisabled ()?"d":"-")
// << (event->isUnimplemented()?"u":"-") << "] "
// << event->getSegment() << endl;
// if ( not event->isCloned() and event->isUnimplemented() ) {
// count++;
// event->setProcessed ( false );
// event->setMode ( RoutingEvent::Repair );
// event->process ( _eventQueue, _eventHistory, _eventLoop );
// if (tty::enabled()) {
// cmess1 << " <event:"
// << tty::bold << tty::fgcolor(tty::Red) << setw(7) << setfill('0')
// << RoutingEvent::getProcesseds() << setfill(' ') << tty::reset << ">" << tty::cr;
// cmess1.flush ();
// } else {
// cmess1 << " <event:" << setw(7) << setfill('0')
// << RoutingEvent::getProcesseds() << setfill(' ') << ">" << endl;
// }
// }
// }
if (count and tty::enabled()) cmess1 << endl;
size_t eventsCount = _eventHistory.size(); size_t eventsCount = _eventHistory.size();
_eventHistory.clear(); _eventHistory.clear();
_eventQueue.clear(); _eventQueue.clear();
if ( RoutingEvent::getAllocateds() > 0 ) { if (RoutingEvent::getAllocateds() > 0) {
cerr << Bug("%d events remains after clear.",RoutingEvent::getAllocateds()) << endl; cerr << Bug( "%d events remains after clear.", RoutingEvent::getAllocateds() ) << endl;
} }
// if ( _slowMotion && getCellWidget() ) { _statistics.setEventsCount( eventsCount );
// Session::close ();
// getCellWidget()->refresh();
// Session::open ( _kiteEngine );
// }
_statistics.setEventsCount ( eventsCount );
ltraceout(149); ltraceout(149);
return eventsCount; return eventsCount;
@ -516,28 +472,30 @@ namespace Kite {
cmess1 << " o Running Negociate Algorithm" << endl; cmess1 << " o Running Negociate Algorithm" << endl;
TrackElement::setOverlapCostCB ( NegociateOverlapCost ); TrackElement::setOverlapCostCB( NegociateOverlapCost );
RoutingEvent::resetProcesseds (); RoutingEvent::resetProcesseds();
for ( size_t igcell=0 ; igcell<_gcells.size() ; ++igcell ) { for ( size_t igcell=0 ; igcell<_gcells.size() ; ++igcell ) {
_createRouting ( _gcells[igcell] ); _createRouting( _gcells[igcell] );
} }
Session::revalidate (); Session::revalidate();
_kite->preProcess();
Session::revalidate();
getKiteEngine()->setMinimumWL ( computeWirelength() ); getKiteEngine()->setMinimumWL( computeWirelength() );
#if defined(CHECK_DATABASE) #if defined(CHECK_DATABASE)
unsigned int overlaps = 0; unsigned int overlaps = 0;
Session::getKiteEngine()->_check(overlaps,"after _createRouting(GCell*)"); Session::getKiteEngine()->_check( overlaps, "after _createRouting(GCell*)" );
#endif #endif
_slowMotion = slowMotion; _slowMotion = slowMotion;
_negociate (); _negociate();
Session::get()->isEmpty(); Session::get()->isEmpty();
# if defined(CHECK_DATABASE) # if defined(CHECK_DATABASE)
_kite->_check ( overlaps, "after negociation" ); _kite->_check( overlaps, "after negociation" );
# endif # endif
ltraceout(149); ltraceout(149);
@ -551,6 +509,7 @@ namespace Kite {
cmess1 << Dots::asSizet(" - Unique Events Total" cmess1 << Dots::asSizet(" - Unique Events Total"
,(RoutingEvent::getProcesseds() - RoutingEvent::getCloneds())) << endl; ,(RoutingEvent::getProcesseds() - RoutingEvent::getCloneds())) << endl;
cmess1 << Dots::asSizet(" - # of GCells",_statistics.getGCellsCount()) << endl; cmess1 << Dots::asSizet(" - # of GCells",_statistics.getGCellsCount()) << endl;
_kite->printCompletion();
addMeasure<size_t>( getCell(), "Events" , RoutingEvent::getProcesseds(), 12 ); addMeasure<size_t>( getCell(), "Events" , RoutingEvent::getProcesseds(), 12 );
addMeasure<size_t>( getCell(), "UEvents", RoutingEvent::getProcesseds()-RoutingEvent::getCloneds(), 12 ); addMeasure<size_t>( getCell(), "UEvents", RoutingEvent::getProcesseds()-RoutingEvent::getCloneds(), 12 );
@ -558,27 +517,27 @@ namespace Kite {
Histogram* densityHistogram = new Histogram ( 1.0, 0.1, 2 ); Histogram* densityHistogram = new Histogram ( 1.0, 0.1, 2 );
addMeasure<Histogram>( getCell(), "GCells Density Histogram", densityHistogram ); addMeasure<Histogram>( getCell(), "GCells Density Histogram", densityHistogram );
densityHistogram->setFileExtension ( ".density.histogram" ); densityHistogram->setFileExtension( ".density.histogram" );
densityHistogram->setMainTitle ( "GCell Densities" ); densityHistogram->setMainTitle ( "GCell Densities" );
densityHistogram->setTitle ( "Avg. Density", 0 ); densityHistogram->setTitle ( "Avg. Density", 0 );
densityHistogram->setTitle ( "Peak Density", 1 ); densityHistogram->setTitle ( "Peak Density", 1 );
densityHistogram->setColor ( "green", 0 ); densityHistogram->setColor ( "green", 0 );
densityHistogram->setColor ( "red" , 1 ); densityHistogram->setColor ( "red" , 1 );
const Katabatic::GCellVector* gcells = getKiteEngine()->getGCellGrid()->getGCellVector(); const Katabatic::GCellVector* gcells = getKiteEngine()->getGCellGrid()->getGCellVector();
getKiteEngine()->getGCellGrid()->setDensityMode ( Katabatic::GCellGrid::MaxHVDensity ); getKiteEngine()->getGCellGrid()->setDensityMode( Katabatic::GCellGrid::MaxHVDensity );
for ( size_t igcell=0 ; igcell<(*gcells).size() ; ++igcell ) { for ( size_t igcell=0 ; igcell<(*gcells).size() ; ++igcell ) {
densityHistogram->addSample ( (*gcells)[igcell]->getDensity(), 0 ); densityHistogram->addSample( (*gcells)[igcell]->getDensity(), 0 );
} }
getKiteEngine()->getGCellGrid()->setDensityMode ( Katabatic::GCellGrid::MaxDensity ); getKiteEngine()->getGCellGrid()->setDensityMode( Katabatic::GCellGrid::MaxDensity );
for ( size_t igcell=0 ; igcell<(*gcells).size() ; ++igcell ) { for ( size_t igcell=0 ; igcell<(*gcells).size() ; ++igcell ) {
densityHistogram->addSample ( (*gcells)[igcell]->getDensity(), 1 ); densityHistogram->addSample( (*gcells)[igcell]->getDensity(), 1 );
} }
densityHistogram->normalize ( 0 ); densityHistogram->normalize( 0 );
densityHistogram->normalize ( 1 ); densityHistogram->normalize( 1 );
} }
@ -587,7 +546,7 @@ namespace Kite {
ostringstream os; ostringstream os;
os << "<" << _getTypeName() << ">"; os << "<" << _getTypeName() << ">";
return ( os.str() ); return os.str();
} }
@ -595,9 +554,9 @@ namespace Kite {
{ {
Record* record = new Record ( _getString() ); Record* record = new Record ( _getString() );
record->add ( getSlot ( "_gcells", _gcells ) ); record->add( getSlot( "_gcells", _gcells ) );
return ( record ); return record;
} }
} // End of Kite namespace. } // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,39 +12,35 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./PreProcess.cpp" | // | C++ Module : "./PreProcess.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <sstream>
#include "hurricane/DebugSession.h"
#include <sstream> #include "hurricane/Bug.h"
#include "hurricane/Warning.h"
#include "hurricane/Bug.h" #include "hurricane/Net.h"
#include "hurricane/Warning.h" #include "hurricane/Name.h"
#include "hurricane/Net.h" #include "hurricane/RoutingPad.h"
#include "hurricane/Name.h" #include "hurricane/Horizontal.h"
#include "hurricane/RoutingPad.h" #include "katabatic/AutoContactTerminal.h"
#include "katabatic/AutoContact.h" #include "kite/DataNegociate.h"
#include "kite/DataNegociate.h" #include "kite/TrackElement.h"
#include "kite/TrackElement.h" #include "kite/Track.h"
#include "kite/Track.h" #include "kite/RoutingPlane.h"
#include "kite/RoutingPlane.h" #include "kite/NegociateWindow.h"
#include "kite/NegociateWindow.h" #include "kite/Session.h"
#include "kite/Session.h" #include "kite/KiteEngine.h"
#include "kite/KiteEngine.h"
namespace { namespace {
using namespace std; using namespace std;
using namespace Hurricane; using namespace Hurricane;
using namespace CRL; using namespace CRL;
using namespace Kite; using namespace Kite;
using Katabatic::perpandicularTo;
using Katabatic::AutoContactTerminal;
void getPerpandiculars ( TrackElement* segment void getPerpandiculars ( TrackElement* segment
@ -58,9 +49,6 @@ namespace {
, vector<TrackElement*>& perpandiculars , vector<TrackElement*>& perpandiculars
) )
{ {
//AutoContact* to = segment->base()->getAutoSource();
//to = (to != from) ? to : segment->base()->getAutoTarget();
TrackElement* perpandicular; TrackElement* perpandicular;
forEach ( Segment*, isegment, segment->base()->getAutoSource()->getSlaveComponents().getSubSet<Segment*>() ) { forEach ( Segment*, isegment, segment->base()->getAutoSource()->getSlaveComponents().getSubSet<Segment*>() ) {
perpandicular = Session::lookup ( *isegment ); perpandicular = Session::lookup ( *isegment );
@ -108,21 +96,22 @@ namespace {
void propagateCagedConstraints ( TrackElement* segment, set<TrackElement*>& faileds ) void propagateCagedConstraints ( TrackElement* segment, set<TrackElement*>& faileds )
{ {
if ( not segment->isFixed() ) return; if (not segment->isFixed()) return;
ltrace(200) << "Propagate caging: " << segment << endl; ltrace(200) << "Propagate caging: " << segment << endl;
Track* track = segment->getTrack(); Track* track = segment->getTrack();
unsigned int direction = Session::getRoutingGauge()->getLayerDirection(segment->getLayer()); //unsigned int direction = Session::getRoutingGauge()->getLayerDirection(segment->getLayer());
unsigned int direction = segment->getDirection();
Katabatic::AutoContact* source = segment->base()->getAutoSource(); Katabatic::AutoContact* source = segment->base()->getAutoSource();
RoutingPad* rp = NULL; RoutingPad* rp = NULL;
Interval uside = source->getGCell()->getUSide(direction); Interval uside = source->getGCell()->getSide(direction);
DbU::Unit minConstraint = DbU::Min; DbU::Unit minConstraint = DbU::Min;
DbU::Unit maxConstraint = DbU::Max; DbU::Unit maxConstraint = DbU::Max;
vector<TrackElement*> perpandiculars; vector<TrackElement*> perpandiculars;
if ( not track ) { if ( not track ) {
cerr << Bug("%s is not inserted in a <Track>",getString(segment).c_str()) << endl; cerr << Bug( "%s is not inserted in a <Track>", getString(segment).c_str() ) << endl;
return; return;
} }
@ -130,30 +119,30 @@ namespace {
TrackElement* parallel; TrackElement* parallel;
size_t i = segment->getIndex(); size_t i = segment->getIndex();
while ( i > 0 ) { while ( i > 0 ) {
parallel = track->getSegment(--i); parallel = track->getSegment( --i );
if ( not parallel ) continue; if (not parallel) continue;
if ( parallel->getTargetU() < uside.getVMin() ) break; if (parallel->getTargetU() < uside.getVMin()) break;
if ( parallel->getNet() == segment->getNet() ) continue; if (parallel->getNet() == segment->getNet()) continue;
if ( not parallel->isFixed() ) continue; if (not parallel->isFixed()) continue;
ltrace(200) << "Min Constraint from: " << parallel << endl; ltrace(200) << "Min Constraint from: " << parallel << endl;
minConstraint = max ( minConstraint, parallel->getTargetU() ); minConstraint = max( minConstraint, parallel->getTargetU() );
} }
i = segment->getIndex(); i = segment->getIndex();
while ( i < track->getSize()-1 ) { while ( i < track->getSize()-1 ) {
parallel = track->getSegment(++i); parallel = track->getSegment( ++i );
if ( not parallel ) continue; if (not parallel) continue;
if ( parallel->getSourceU() > uside.getVMax() ) break; if (parallel->getSourceU() > uside.getVMax()) break;
if ( parallel->getNet() == segment->getNet() ) continue; if (parallel->getNet() == segment->getNet()) continue;
if ( not parallel->isFixed() ) continue; if (not parallel->isFixed()) continue;
ltrace(200) << "Max Constraint from: " << parallel << endl; ltrace(200) << "Max Constraint from: " << parallel << endl;
maxConstraint = min ( maxConstraint, parallel->getSourceU() ); maxConstraint = min( maxConstraint, parallel->getSourceU() );
} }
if ( minConstraint > maxConstraint ) { if (minConstraint > maxConstraint) {
cerr << Bug("%s have too tight caging constraints.",getString(segment).c_str()) << endl; cerr << Bug( "%s have too tight caging constraints.", getString(segment).c_str() ) << endl;
return; return;
} }
if ( (minConstraint <= uside.getVMin()) and (maxConstraint >= uside.getVMax()) ) { if ( (minConstraint <= uside.getVMin()) and (maxConstraint >= uside.getVMax()) ) {
@ -164,29 +153,29 @@ namespace {
} }
// Finding perpandiculars, by way of the source & target RoutingPad. // Finding perpandiculars, by way of the source & target RoutingPad.
if ( source->getAnchor() ) { if (source->getAnchor()) {
rp = dynamic_cast<RoutingPad*>(source->getAnchor()); rp = dynamic_cast<RoutingPad*>(source->getAnchor());
if ( rp ) { if (rp) {
TrackElement* parallel; TrackElement* parallel;
forEach ( Segment*, isegment, rp->getSlaveComponents().getSubSet<Segment*>() ) { forEach ( Segment*, isegment, rp->getSlaveComponents().getSubSet<Segment*>() ) {
parallel = Session::lookup ( *isegment ); parallel = Session::lookup( *isegment );
ltrace(200) << "* " << parallel << endl; ltrace(200) << "* " << parallel << endl;
if ( parallel->isFixed () ) continue; if (parallel->isFixed ()) continue;
if ( parallel->isGlobal() ) continue; if (parallel->isGlobal()) continue;
getPerpandiculars ( parallel, source, direction, perpandiculars ); getPerpandiculars( parallel, source, direction, perpandiculars );
getPerpandiculars ( parallel, segment->base()->getAutoTarget(), direction, perpandiculars ); getPerpandiculars( parallel, segment->base()->getAutoTarget(), direction, perpandiculars );
} }
} else { } else {
cerr << Bug("%s is not anchored on a <RoutingPad>\n (%s)" cerr << Bug( "%s is not anchored on a <RoutingPad>\n (%s)"
,getString(source).c_str() , getString(source).c_str()
,getString(source->getAnchor()).c_str()) << endl; , getString(source->getAnchor()).c_str() ) << endl;
} }
} }
// Apply caging constraints to perpandiculars. // Apply caging constraints to perpandiculars.
ltracein(200); ltracein(200);
if ( perpandiculars.size() == 0 ) { if (perpandiculars.size() == 0) {
ltrace(200) << "No perpandiculars to " << segment << endl; ltrace(200) << "No perpandiculars to " << segment << endl;
ltraceout(200); ltraceout(200);
return; return;
@ -195,10 +184,10 @@ namespace {
Interval constraints ( minConstraint, maxConstraint ); Interval constraints ( minConstraint, maxConstraint );
for ( size_t iperpand=0 ; iperpand<perpandiculars.size() ; iperpand++ ) { for ( size_t iperpand=0 ; iperpand<perpandiculars.size() ; iperpand++ ) {
ltrace(200) << "Caged: " << constraints << " " << perpandiculars[iperpand] << endl; ltrace(200) << "Caged: " << constraints << " " << perpandiculars[iperpand] << endl;
perpandiculars[iperpand]->base()->mergeUserConstraints ( constraints ); perpandiculars[iperpand]->base()->mergeUserConstraints( constraints );
if ( perpandiculars[iperpand]->base()->getUserConstraints().isEmpty() ) { if (perpandiculars[iperpand]->base()->getUserConstraints().isEmpty()) {
ltrace(200) << "Cumulative caged constraints are too tight on " << perpandiculars[iperpand] << endl; ltrace(200) << "Cumulative caged constraints are too tight on " << perpandiculars[iperpand] << endl;
findFailedPerpandiculars ( rp, direction, faileds ); findFailedPerpandiculars( rp, direction, faileds );
} }
} }
@ -206,81 +195,108 @@ namespace {
} }
void moveUpCaged ( TrackElement* segment )
{
DebugSession::open( segment->getNet(), 150 );
ltrace(150) << "::moveUpCaged() " << segment << endl;
ltracein(150);
//Configuration* configuration = Session::getConfiguration();
//const Layer* metal2 = configuration->getRoutingLayer( 1 );
//const Layer* metal3 = configuration->getRoutingLayer( 2 );
Katabatic::AutoContact* support = segment->base()->getAutoSource();
RoutingPad* rp = dynamic_cast<RoutingPad*>(support->getAnchor());
forEach( Component*, icomponent, rp->getSlaveComponents() ) {
Horizontal* baseSegment = dynamic_cast<Horizontal*>( *icomponent );
TrackElement* accessSegment = Session::lookup( baseSegment );
if (accessSegment and not accessSegment->isFixed()) {
accessSegment->moveUp( Katabatic::KbNoFlags );
}
}
ltraceout(150);
DebugSession::close();
}
void protectCagedTerminals ( Track* track ) void protectCagedTerminals ( Track* track )
{ {
Configuration* configuration = Session::getConfiguration (); ltrace(150) << "protectCagedTerminals() " << track << endl;
const Layer* metal2 = configuration->getRoutingLayer ( 1 ); ltracein(150);
const Layer* metal3 = configuration->getRoutingLayer ( 2 );
for ( size_t i=0 ; i<track->getSize() ; i++ ) { DbU::Unit lastMovedUp = track->getMin();
TrackElement* segment = track->getSegment ( i ); unsigned int moveUpCount = 0;
Configuration* configuration = Session::getConfiguration();
const Layer* metal2 = configuration->getRoutingLayer( 1 );
const Layer* metal3 = configuration->getRoutingLayer( 2 );
Net* neighborNet = NULL;
if (track->getLayer() != metal2) {
ltraceout(150);
return;
}
for ( size_t i=0 ; i<track->getSize() ; ++i ) {
TrackElement* segment = track->getSegment(i);
if ( segment and segment->isFixed() and segment->isTerminal() ) { if ( segment and segment->isFixed() and segment->isTerminal() ) {
Interval freeInterval = track->getFreeInterval ( segment->getSourceU(), segment->getNet() ); Interval freeInterval = track->getFreeInterval( segment->getSourceU(), segment->getNet() );
if ( freeInterval.getSize() < DbU::lambda(30.0) ) { //if (freeInterval.getSize() < DbU::lambda(5.0)*6) {
if ( (segment->getSourceU() - freeInterval.getVMin() < DbU::lambda(5.0)*3)
or (freeInterval.getVMax() - segment->getTargetU() < DbU::lambda(5.0)*3) ) {
cinfo << "Caged terminal: " << segment << endl; cinfo << "Caged terminal: " << segment << endl;
if ( segment->getLayer() != metal2 ) continue; if ( (segment->getLayer() != metal2)
if ( segment->getLength() >= DbU::lambda(5.0) ) continue; or (segment->getLength() >= DbU::lambda(5.0))
or (segment->getNet() == neighborNet) ) {
neighborNet = segment->getNet();
continue;
}
if (segment->getSourceU() - lastMovedUp < DbU::lambda(5.0)*4) {
++moveUpCount;
if (moveUpCount % 2 == 0) {
moveUpCaged( segment );
}
} else {
moveUpCount = 0;
}
lastMovedUp = segment->getSourceU();
Katabatic::AutoContact* support = segment->base()->getAutoSource(); Katabatic::AutoContact* support = segment->base()->getAutoSource();
RoutingPad* rp = dynamic_cast<RoutingPad*>(support->getAnchor()); RoutingPad* rp = dynamic_cast<RoutingPad*>(support->getAnchor());
Katabatic::AutoContact* source Katabatic::AutoContact* source
= Katabatic::AutoContact::fromRp ( support->getGCell() = Katabatic::AutoContactTerminal::create( support->getGCell()
, rp , rp
, metal3 , metal3
, rp->getSourcePosition() , rp->getSourcePosition()
, DbU::lambda(1.0), DbU::lambda(1.0) , DbU::lambda(1.0), DbU::lambda(1.0)
, true );
); source->setFlags( Katabatic::CntIgnoreAnchor );
Katabatic::AutoContact* target = Katabatic::AutoContact* target =
Katabatic::AutoContact::fromRp ( support->getGCell() Katabatic::AutoContactTerminal::create( support->getGCell()
, rp , rp
, metal3 , metal3
, rp->getSourcePosition() , rp->getSourcePosition()
, DbU::lambda(1.0), DbU::lambda(1.0) , DbU::lambda(1.0), DbU::lambda(1.0)
, true );
); target->setFlags( Katabatic::CntIgnoreAnchor );
AutoSegment* segment = AutoSegment::create ( source AutoSegment* fixedSegment = AutoSegment::create( source, target, Katabatic::KbVertical );
, target fixedSegment->setFlags( Katabatic::SegFixed );
, Constant::Vertical Session::getNegociateWindow()->createTrackSegment( fixedSegment, KtLoadingStage );
, AutoSegment::Local
, true
, false
);
segment->setFixed ( true );
Session::getNegociateWindow()->addTrackSegment ( segment, true );
#if DISABLED
// Force slackening.
bool breakFlag = false;
forEach ( Contact*, icontact, rp->getSlaveComponents().getSubSet<Contact*>() ) {
forEach ( Segment*, isegment, icontact->getSlaveComponents().getSubSet<Segment*>() ) {
TrackElement* trackSegment = Session::lookup(*isegment);
if ( not trackSegment or trackSegment->isFixed() ) continue;
if ( trackSegment->isHorizontal() ) {
ltrace(200) << "M2 to slacken for " << rp << endl;
breakFlag = true;
const vector<AutoSegment*>& dogLegs = Session::getDogLegs();
trackSegment->base()->makeDogLeg ( gcell->base(), true );
GCell::addTrackSegment ( gcell, dogLegs[1], true );
GCell::addTrackSegment ( gcell, dogLegs[2], true );
Session::revalidate ();
}
if ( breakFlag ) break;
}
if ( breakFlag ) break;
}
#endif
} }
neighborNet = segment->getNet();
} }
} }
ltraceout(150);
} }
@ -293,17 +309,18 @@ namespace Kite {
using Hurricane::Bug; using Hurricane::Bug;
using Hurricane::Net; using Hurricane::Net;
using Hurricane::Name; using Hurricane::Name;
using Katabatic::AutoSegmentLut;
void KiteEngine::preProcess () void KiteEngine::preProcess ()
{ {
for ( size_t i=0 ; i<_routingPlanes.size() ; i++ ) { for ( size_t i=0 ; i<_routingPlanes.size() ; ++i ) {
RoutingPlane* plane = _routingPlanes[i]; RoutingPlane* plane = _routingPlanes[i];
Track* track = plane->getTrackByIndex ( 0 ); Track* track = plane->getTrackByIndex( 0 );
while ( track ) { while ( track ) {
protectCagedTerminals ( track ); protectCagedTerminals( track );
track = track->getNext (); track = track->getNextTrack();
} }
} }
Session::revalidate (); Session::revalidate ();
@ -314,32 +331,17 @@ namespace Kite {
{ {
set<TrackElement*> faileds; set<TrackElement*> faileds;
TrackElementLut::iterator isegment = _trackSegmentLut.begin(); TrackElement* segment = NULL;
for ( ; isegment != _trackSegmentLut.end() ; isegment++ ) { AutoSegmentLut::const_iterator isegment = _getAutoSegmentLut().begin();
if ( not isegment->second->isFixed() ) continue; for ( ; isegment != _getAutoSegmentLut().end() ; isegment++ ) {
propagateCagedConstraints ( isegment->second, faileds ); segment = _lookup( isegment->second );
if (not segment or not segment->isFixed()) continue;
DebugSession::open( segment->getNet() );
propagateCagedConstraints( segment, faileds );
DebugSession::close();
} }
} }
void KiteEngine::_computeCagedConstraints ( Net* net, set<TrackElement*>& faileds ) } // Kite namespace.
{
TrackElement* segment = NULL;
forEach ( Segment*, isegment, net->getComponents().getSubSet<Segment*>() ) {
segment = Session::lookup ( *isegment );
if ( not segment ) continue;
segment->base()->resetUserConstraints();
}
forEach ( Segment*, isegment, net->getComponents().getSubSet<Segment*>() ) {
segment = Session::lookup ( *isegment );
if ( not segment ) continue;
propagateCagedConstraints ( segment, faileds );
}
}
} // End of Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,36 +12,32 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./ProtectRoutingPads.cpp" | // | C++ Module : "./ProtectRoutingPads.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <map> #include <map>
#include <list> #include <list>
#include "hurricane/DataBase.h"
#include "hurricane/DataBase.h" #include "hurricane/Technology.h"
#include "hurricane/Technology.h" #include "hurricane/BasicLayer.h"
#include "hurricane/BasicLayer.h" #include "hurricane/RegularLayer.h"
#include "hurricane/RegularLayer.h" #include "hurricane/Horizontal.h"
#include "hurricane/Horizontal.h" #include "hurricane/Vertical.h"
#include "hurricane/Vertical.h" #include "hurricane/RoutingPad.h"
#include "hurricane/RoutingPad.h" #include "hurricane/Occurrence.h"
#include "hurricane/Occurrence.h" #include "hurricane/Cell.h"
#include "hurricane/Cell.h" #include "hurricane/NetExternalComponents.h"
#include "hurricane/NetExternalComponents.h" #include "crlcore/Catalog.h"
#include "crlcore/Catalog.h" #include "katabatic/AutoContact.h"
#include "katabatic/AutoContact.h" #include "katabatic/AutoSegment.h"
#include "katabatic/AutoSegment.h" #include "katabatic/GCell.h"
#include "katabatic/GCell.h" #include "katabatic/GCellGrid.h"
#include "katabatic/GCellGrid.h" #include "katabatic/KatabaticEngine.h"
#include "katabatic/KatabaticEngine.h" #include "kite/RoutingPlane.h"
#include "kite/RoutingPlane.h" #include "kite/TrackSegment.h"
#include "kite/TrackSegment.h" #include "kite/TrackFixedSegment.h"
#include "kite/TrackFixedSegment.h" #include "kite/Track.h"
#include "kite/Track.h" #include "kite/KiteEngine.h"
#include "kite/KiteEngine.h"
namespace { namespace {
@ -114,12 +105,12 @@ namespace {
transformation.applyOn ( bb ); transformation.applyOn ( bb );
//cinfo << "bb: " << bb << endl; //cinfo << "bb: " << bb << endl;
if ( direction == Constant::Horizontal ) { if ( direction == KbHorizontal ) {
DbU::Unit axisMin = bb.getYMin() - delta; DbU::Unit axisMin = bb.getYMin() - delta;
DbU::Unit axisMax = bb.getYMax() + delta; DbU::Unit axisMax = bb.getYMax() + delta;
Track* track = plane->getTrackByPosition ( axisMin, Constant::Superior ); Track* track = plane->getTrackByPosition ( axisMin, Constant::Superior );
for ( ; track and (track->getAxis() <= axisMax) ; track = track->getNext() ) { for ( ; track and (track->getAxis() <= axisMax) ; track = track->getNextTrack() ) {
Horizontal* segment = Horizontal::create ( rp->getNet() Horizontal* segment = Horizontal::create ( rp->getNet()
, segments[i]->getLayer() , segments[i]->getLayer()
, track->getAxis() , track->getAxis()
@ -134,7 +125,7 @@ namespace {
DbU::Unit axisMax = bb.getXMax() + delta; DbU::Unit axisMax = bb.getXMax() + delta;
Track* track = plane->getTrackByPosition ( axisMin, Constant::Superior ); Track* track = plane->getTrackByPosition ( axisMin, Constant::Superior );
for ( ; track and (track->getAxis() <= axisMax) ; track = track->getNext() ) { for ( ; track and (track->getAxis() <= axisMax) ; track = track->getNextTrack() ) {
Vertical* segment = Vertical::create ( rp->getNet() Vertical* segment = Vertical::create ( rp->getNet()
, segments[i]->getLayer() , segments[i]->getLayer()
, track->getAxis() , track->getAxis()
@ -167,9 +158,6 @@ namespace Kite {
cmess1 << " o Protect external components not useds as RoutingPads." << endl; cmess1 << " o Protect external components not useds as RoutingPads." << endl;
forEach ( Net*, inet, getCell()->getNets() ) { forEach ( Net*, inet, getCell()->getNets() ) {
// cerr << *inet << " isSupply():" << (*inet)->isSupply()
// << " " << (*inet)->getType()
// << endl;
if ( (*inet)->isSupply() ) continue; if ( (*inet)->isSupply() ) continue;
vector<RoutingPad*> rps; vector<RoutingPad*> rps;
@ -185,4 +173,4 @@ namespace Kite {
} }
} // End of Kite namespace. } // Kite namespace.

View File

@ -2,7 +2,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved // Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |

View File

@ -2,7 +2,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2012-2012, All Rights Reserved // Copyright (c) UPMC/LIP6 2012-2013, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |
@ -68,30 +68,30 @@ extern "C" {
DL_EXPORT(void) initKite () { DL_EXPORT(void) initKite () {
trace << "initKite()" << endl; trace << "initKite()" << endl;
PyKiteEngine_LinkPyType (); PyKiteEngine_LinkPyType();
PyGraphicKiteEngine_LinkPyType (); PyGraphicKiteEngine_LinkPyType();
PYTYPE_READY_SUB ( KiteEngine , ToolEngine ); PYTYPE_READY_SUB( KiteEngine , ToolEngine );
PYTYPE_READY_SUB ( GraphicKiteEngine, GraphicTool ); PYTYPE_READY_SUB( GraphicKiteEngine, GraphicTool );
PyObject* module = Py_InitModule ( "Kite", PyKite_Methods ); PyObject* module = Py_InitModule( "Kite", PyKite_Methods );
if ( module == NULL ) { if (module == NULL) {
cerr << "[ERROR]\n" cerr << "[ERROR]\n"
<< " Failed to initialize Kite module." << endl; << " Failed to initialize Kite module." << endl;
return; return;
} }
Py_INCREF ( &PyTypeKiteEngine ); Py_INCREF( &PyTypeKiteEngine );
PyModule_AddObject ( module, "KiteEngine", (PyObject*)&PyTypeKiteEngine ); PyModule_AddObject( module, "KiteEngine", (PyObject*)&PyTypeKiteEngine );
Py_INCREF ( &PyTypeGraphicKiteEngine ); Py_INCREF( &PyTypeGraphicKiteEngine );
PyModule_AddObject ( module, "GraphicKiteEngine", (PyObject*)&PyTypeGraphicKiteEngine ); PyModule_AddObject( module, "GraphicKiteEngine", (PyObject*)&PyTypeGraphicKiteEngine );
PyObject* dictionnary = PyModule_GetDict(module); PyObject* dictionnary = PyModule_GetDict( module );
PyObject* constant; PyObject* constant;
LoadObjectConstant(dictionnary,BuildGlobalSolution,"BuildGlobalSolution"); LoadObjectConstant( dictionnary, KtBuildGlobalRouting, "KtBuildGlobalRouting" );
LoadObjectConstant(dictionnary,LoadGlobalSolution ,"LoadGlobalSolution" ); LoadObjectConstant( dictionnary, KtLoadGlobalRouting , "KtLoadGlobalRouting" );
} }

View File

@ -2,7 +2,7 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2010-2012, All Rights Reserved // Copyright (c) UPMC/LIP6 2010-2013, All Rights Reserved
// //
// +-----------------------------------------------------------------+ // +-----------------------------------------------------------------+
// | C O R I O L I S | // | C O R I O L I S |

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,22 +11,17 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./RoutingEventHistory.cpp" | // | C++ Module : "./RoutingEventHistory.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <iomanip> #include <iomanip>
#include "hurricane/Error.h"
#include "hurricane/Error.h" #include "kite/RoutingEvent.h"
#include "kite/RoutingEvent.h" #include "kite/RoutingEventHistory.h"
#include "kite/RoutingEventHistory.h"
namespace Kite { namespace Kite {
using std::cerr; using std::cerr;
using std::setw; using std::setw;
using std::setfill; using std::setfill;
@ -113,4 +102,4 @@ namespace Kite {
} }
} // End of Kite namespace. } // Kite namespace.

View File

@ -1,15 +1,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,16 +11,13 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./RoutingEventLoop.cpp" | // | C++ Module : "./RoutingEventLoop.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <iostream> #include <iostream>
#include <algorithm> #include <algorithm>
#include "kite/RoutingEvent.h" #include "kite/RoutingEvent.h"
#include "kite/RoutingEventLoop.h" #include "kite/RoutingEventLoop.h"
namespace Kite { namespace Kite {
@ -91,4 +82,4 @@ namespace Kite {
} }
} // End of Kite namespace. } // Kite namespace.

View File

@ -1,43 +1,32 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
// | Author : Jean-Paul CHAPUT | // | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./RoutingEvent.cpp" | // | C++ Module : "./RoutingEventQueue.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <iostream> #include <iostream>
#include <iomanip> #include <iomanip>
#include <functional> #include <functional>
#include <algorithm> #include <algorithm>
#include "hurricane/Bug.h"
#include "hurricane/Bug.h" #include "kite/DataNegociate.h"
#include "kite/DataNegociate.h" #include "kite/TrackSegment.h"
#include "kite/TrackElement.h" #include "kite/RoutingEventQueue.h"
#include "kite/RoutingEventQueue.h" #include "kite/Session.h"
#include "kite/Session.h"
namespace Kite { namespace Kite {
using std::cerr; using std::cerr;
using std::endl; using std::endl;
using std::setw; using std::setw;
@ -72,39 +61,35 @@ namespace Kite {
void RoutingEventQueue::load ( const vector<TrackElement*>& segments ) void RoutingEventQueue::load ( const vector<TrackElement*>& segments )
{ {
for ( size_t i=0 ; i<segments.size() ; i++ ) { for ( size_t i=0 ; i<segments.size() ; i++ ) {
if ( segments[i]->getDataNegociate()->getRoutingEvent() ) { if (segments[i]->getDataNegociate()->getRoutingEvent()) {
cinfo << "[INFO] Already have a RoutingEvent - " << segments[i] << endl; cinfo << "[INFO] Already have a RoutingEvent - " << segments[i] << endl;
continue; continue;
} }
if ( segments[i]->getTrack() ) { if (segments[i]->getTrack()) {
cinfo << "[INFO] Already in Track - " << segments[i] << endl; cinfo << "[INFO] Already in Track - " << segments[i] << endl;
continue; continue;
} }
RoutingEvent* event = RoutingEvent::create(segments[i]); RoutingEvent* event = RoutingEvent::create(segments[i]);
event->updateKey (); event->updateKey();
_events.insert ( event ); _events.insert( event );
} }
} }
void RoutingEventQueue::add ( TrackElement* segment, unsigned int level ) void RoutingEventQueue::add ( TrackElement* segment, unsigned int level )
{ {
if ( segment->getTrack() ) { if (segment->getTrack()) {
cinfo << "[INFO] Already in Track " << (void*)segment->base()->base() cinfo << "[INFO] Already in Track " << (void*)segment->base()->base()
<< ":" << segment << endl; << ":" << segment << endl;
return; return;
} }
RoutingEvent* event = RoutingEvent::create(segment); RoutingEvent* event = RoutingEvent::create(segment);
event->setEventLevel ( level ); event->setEventLevel( level );
push ( event ); push( event );
} }
void RoutingEventQueue::push ( RoutingEvent* event )
{ _pushRequests.insert ( event ); }
void RoutingEventQueue::commit () void RoutingEventQueue::commit ()
{ {
ltrace(200) << "RoutingEventQueue::commit()" << endl; ltrace(200) << "RoutingEventQueue::commit()" << endl;
@ -113,31 +98,25 @@ namespace Kite {
size_t addeds = _pushRequests.size(); size_t addeds = _pushRequests.size();
size_t before = _events.size(); size_t before = _events.size();
set<RoutingEvent*>::iterator ipushEvent = _pushRequests.begin(); RoutingEventSet::iterator ipushEvent = _pushRequests.begin();
for ( ; ipushEvent != _pushRequests.end() ; ipushEvent++ ) { for ( ; ipushEvent != _pushRequests.end() ; ipushEvent++ ) {
(*ipushEvent)->updateKey (); (*ipushEvent)->updateKey();
_topEventLevel = max ( _topEventLevel, (*ipushEvent)->getEventLevel() ); _topEventLevel = max( _topEventLevel, (*ipushEvent)->getEventLevel() );
_events.insert ( (*ipushEvent) ); _events.insert( (*ipushEvent) );
ltrace(200) << "| " << (*ipushEvent) << endl; ltrace(200) << "| " << (*ipushEvent) << endl;
} }
_pushRequests.clear (); _pushRequests.clear();
#if defined(CHECK_ROUTINGEVENT_QUEUE) #if defined(CHECK_ROUTINGEVENT_QUEUE)
_keyCheck (); _keyCheck();
#endif #endif
size_t after = _events.size(); size_t after = _events.size();
if ( after-before != addeds ) { if (after-before != addeds) {
cerr << Bug("RoutingEventQueue::commit(): less than %d events pusheds (%d)." cerr << Bug( "RoutingEventQueue::commit(): less than %d events pusheds (%d)."
,addeds,(after-before)) << endl; , addeds,(after-before) ) << endl;
} }
// if ( (RoutingEvent::getProcesseds() > 61246)
// and (RoutingEvent::getProcesseds() < 61256) ) {
// cerr << "RoutingEventQueue::commit()" << endl;
// dump ();
// }
ltraceout(200); ltraceout(200);
} }
@ -151,33 +130,20 @@ namespace Kite {
_keyCheck (); _keyCheck ();
#endif #endif
if ( !_events.empty() ) { if (not _events.empty()) {
size_t beforeSize = _events.size(); size_t beforeSize = _events.size();
ievent = _events.end(); ievent = _events.end();
ievent--; ievent--;
event = (*ievent); event = (*ievent);
_events.erase ( ievent ); _events.erase( ievent );
// if ( (RoutingEvent::getProcesseds() > 61246)
// and (RoutingEvent::getProcesseds() < 61256) ) {
// cerr << "Popped: " << event << endl;
// dump ();
// }
size_t afterSize = _events.size(); size_t afterSize = _events.size();
if ( afterSize+1 != beforeSize ) { if (afterSize+1 != beforeSize) {
cerr << Bug("RoutingEventQueue::pop(): more than one event popped: %d." cerr << Bug( "RoutingEventQueue::pop(): more than one event popped: %d."
,(beforeSize-afterSize)) << endl; , (beforeSize-afterSize) ) << endl;
} }
// size_t erased = _events.erase ( event );
// if ( erased != 1 ) {
// cerr << Bug("RoutingEventQueue::pop(): %d events matches key %p.",erased,event) << endl;
// #if defined(CHECK_ROUTINGEVENT_QUEUE)
// _keyCheck ();
// #endif
// }
} }
return event; return event;
@ -192,65 +158,59 @@ namespace Kite {
multiset<RoutingEvent*,RoutingEvent::Compare>::iterator ievent = _events.find(event); multiset<RoutingEvent*,RoutingEvent::Compare>::iterator ievent = _events.find(event);
size_t count = _events.count(event); size_t count = _events.count(event);
if ( count > 1 ) { if (count > 1) {
cerr << Bug("RoutingEventQueue::repush(): %d events matches key %p.",count,event) << endl; cerr << Bug("RoutingEventQueue::repush(): %d events matches key %p.",count,event) << endl;
#if defined(CHECK_ROUTINGEVENT_QUEUE) #if defined(CHECK_ROUTINGEVENT_QUEUE)
_keyCheck (); _keyCheck ();
#endif #endif
} }
if ( ievent != _events.end() ) { if (ievent != _events.end()) {
// if ( (RoutingEvent::getProcesseds() > 61246) _events.erase( ievent );
// and (RoutingEvent::getProcesseds() < 61256) ) {
// cerr << "Erasing: " << *ievent << endl;
// }
_events.erase ( ievent );
} }
push ( event ); push ( event );
// if ( (RoutingEvent::getProcesseds() > 61246)
// and (RoutingEvent::getProcesseds() < 61256) ) {
// cerr << "After repush: " << event << endl;
// dump();
// }
} }
void RoutingEventQueue::repushInvalidateds () void RoutingEventQueue::repushInvalidateds ()
{ {
const vector<AutoSegment*>& invalidateds0 = Session::getInvalidateds(); const vector<AutoSegment*>& invalidateds0 = Session::getInvalidateds();
set<TrackElement*> invalidateds1; TrackSegmentSet invalidateds1;
for ( size_t i=0 ; i<invalidateds0.size() ; i++ ) { for ( size_t i=0 ; i<invalidateds0.size() ; i++ ) {
TrackElement* segment = Session::lookup ( invalidateds0[i] ); TrackSegment* segment = dynamic_cast<TrackSegment*>( Session::lookup(invalidateds0[i]) );
if ( segment ) if (segment)
invalidateds1.insert ( segment ); invalidateds1.insert( segment );
} }
set<TrackElement*>::iterator isegment = invalidateds1.begin(); TrackSegmentSet::iterator isegment = invalidateds1.begin();
for ( ; isegment != invalidateds1.end() ; isegment++ ) { for ( ; isegment != invalidateds1.end() ; isegment++ ) {
RoutingEvent* event = (*isegment)->getDataNegociate()->getRoutingEvent(); RoutingEvent* event = (*isegment)->getDataNegociate()->getRoutingEvent();
if ( event if ( event
and not event->isUnimplemented() and not event->isUnimplemented()
and not event->isDisabled () and not event->isDisabled ()
and not event->isProcessed () ) { and not event->isProcessed () ) {
repush ( event ); repush( event );
} else {
// if ( (RoutingEvent::getProcesseds() > 61246)
// and (RoutingEvent::getProcesseds() < 61256) ) {
// cerr << "NOT repushed: " << event << endl;
// }
} }
} }
} }
void RoutingEventQueue::prepareRepair ()
{
multiset<RoutingEvent*,RoutingEvent::Compare>::const_iterator ievent = _events.begin ();
for ( ; ievent != _events.end(); ++ievent ) {
(*ievent)->getSegment()->base()->toOptimalAxis();
}
}
void RoutingEventQueue::clear () void RoutingEventQueue::clear ()
{ {
if ( not _events.empty() ) { if (not _events.empty()) {
cerr << Bug("RoutingEvent queue is not empty, %d events remains." cerr << Bug("RoutingEvent queue is not empty, %d events remains."
,_events.size()) << endl; ,_events.size()) << endl;
} }
_events.clear (); _events.clear();
} }
@ -316,4 +276,4 @@ namespace Kite {
} }
} // End of Kite namespace. } // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,22 +12,17 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./RoutingPlane.cpp" | // | C++ Module : "./RoutingPlane.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include "hurricane/Error.h" #include "hurricane/Error.h"
#include "hurricane/Box.h" #include "hurricane/Box.h"
#include "hurricane/Cell.h" #include "hurricane/Cell.h"
#include "crlcore/RoutingLayerGauge.h"
#include "crlcore/RoutingLayerGauge.h" #include "kite/HorizontalTrack.h"
#include "kite/VerticalTrack.h"
#include "kite/HorizontalTrack.h" #include "kite/RoutingPlane.h"
#include "kite/VerticalTrack.h" #include "kite/KiteEngine.h"
#include "kite/RoutingPlane.h"
#include "kite/KiteEngine.h"
namespace { namespace {
@ -48,7 +38,6 @@ namespace {
namespace Kite { namespace Kite {
using std::cerr; using std::cerr;
using std::endl; using std::endl;
using Hurricane::tab; using Hurricane::tab;
@ -68,8 +57,21 @@ namespace Kite {
: _kite (kite) : _kite (kite)
, _layerGauge(kite->getLayerGauge(depth)) , _layerGauge(kite->getLayerGauge(depth))
, _depth (depth) , _depth (depth)
, _flags (0)
, _axisMin (0)
, _axisMax (0)
, _trackMin (0)
, _trackMax (0)
, _tracks () , _tracks ()
{ } {
switch ( _layerGauge->getDirection() ) {
case Constant::Horizontal: _flags |= KbHorizontal; break;
case Constant::Vertical: _flags |= KbVertical; break;
default:
cerr << Error( "RoutingPlane::RoutingPlane() - Unknown plane direction from LayerGauge: %u"
, _layerGauge->getDirection() ) << endl;
}
}
RoutingPlane::~RoutingPlane () RoutingPlane::~RoutingPlane ()
@ -82,8 +84,8 @@ namespace Kite {
<< (void*)this << " " << this << endl; << (void*)this << " " << this << endl;
ltracein(90); ltracein(90);
for ( size_t index = 0 ; index < _tracks.size() ; index++ ) for ( size_t index=0 ; index<_tracks.size() ; ++index )
_tracks[index]->destroy (); _tracks[index]->destroy();
delete this; delete this;
@ -95,40 +97,41 @@ namespace Kite {
{ {
RoutingPlane* plane = new RoutingPlane ( kite, depth ); RoutingPlane* plane = new RoutingPlane ( kite, depth );
if ( !plane->_layerGauge ) if (not plane->_layerGauge)
throw Error ( badLayerGauge, depth, getString(kite->getRoutingGauge()).c_str() ); throw Error( badLayerGauge, depth, getString(kite->getRoutingGauge()).c_str() );
size_t trackNumber; size_t trackNumber;
Box abutmentBox = kite->getCell()->getAbutmentBox(); Box abutmentBox = kite->getCell()->getAbutmentBox();
if ( plane->getLayerGauge()->getDirection() & Constant::Horizontal ) { // HARD CODED.
plane->_trackMin = abutmentBox.getXMin () - DbU::lambda (2.0); if (plane->getDirection() == KbHorizontal) {
plane->_trackMax = abutmentBox.getXMax () + DbU::lambda (2.0); plane->_trackMin = abutmentBox.getXMin() - DbU::lambda(2.0);
plane->_axisMin = abutmentBox.getYMin (); plane->_trackMax = abutmentBox.getXMax() + DbU::lambda(2.0);
plane->_axisMax = abutmentBox.getYMax (); plane->_axisMin = abutmentBox.getYMin();
trackNumber = plane->computeTracksSize (); plane->_axisMax = abutmentBox.getYMax();
trackNumber = plane->computeTracksSize();
} else { } else {
plane->_trackMin = abutmentBox.getYMin () - DbU::lambda (2.0); plane->_trackMin = abutmentBox.getYMin() - DbU::lambda(2.0);
plane->_trackMax = abutmentBox.getYMax () + DbU::lambda (2.0); plane->_trackMax = abutmentBox.getYMax() + DbU::lambda(2.0);
plane->_axisMin = abutmentBox.getXMin (); plane->_axisMin = abutmentBox.getXMin();
plane->_axisMax = abutmentBox.getXMax (); plane->_axisMax = abutmentBox.getXMax();
trackNumber = plane->computeTracksSize (); trackNumber = plane->computeTracksSize();
} }
plane->_tracks.reserve ( trackNumber ); plane->_tracks.reserve( trackNumber );
for ( size_t index = 0 ; index < trackNumber ; index++ ) { for ( size_t index=0 ; index<trackNumber ; ++index ) {
if ( plane->getLayerGauge()->getDirection() & Constant::Horizontal ) { if (plane->getDirection() == KbHorizontal) {
plane->_tracks.push_back ( HorizontalTrack::create ( plane, index ) ); plane->_tracks.push_back( HorizontalTrack::create( plane, index ) );
// Ugly: Direct uses of CellGauge (middle tracks 4 & 5 for local use). // Ugly: Direct uses of CellGauge (middle tracks 4 & 5 for local use).
if ( depth == 1 ) { if (depth == 1) {
switch ( index % 10 ) { switch ( index%10 ) {
case 4: case 4:
case 5: case 5:
plane->_tracks.back()->setLocalAssigned ( true ); plane->_tracks.back()->setLocalAssigned( true );
break; break;
} }
} }
} else { } else {
plane->_tracks.push_back ( VerticalTrack::create ( plane, index ) ); plane->_tracks.push_back( VerticalTrack::create( plane, index ) );
} }
} }
@ -137,30 +140,30 @@ namespace Kite {
RoutingPlane* RoutingPlane::getTop () const RoutingPlane* RoutingPlane::getTop () const
{ return getKiteEngine()->getRoutingPlaneByIndex ( getDepth()+1 ); } { return getKiteEngine()->getRoutingPlaneByIndex( getDepth()+1 ); }
RoutingPlane* RoutingPlane::getBottom () const RoutingPlane* RoutingPlane::getBottom () const
{ {
if ( !getDepth() ) return NULL; if (not getDepth()) return NULL;
return getKiteEngine()->getRoutingPlaneByIndex ( getDepth()-1 ); return getKiteEngine()->getRoutingPlaneByIndex( getDepth()-1 );
} }
Track* RoutingPlane::getTrackByIndex ( size_t index ) const Track* RoutingPlane::getTrackByIndex ( size_t index ) const
{ {
if ( index >= getTracksSize() ) return NULL; if (index >= getTracksSize()) return NULL;
return _tracks[index]; return _tracks[index];
} }
Track* RoutingPlane::getTrackByPosition ( DbU::Unit axis, unsigned int mode ) const Track* RoutingPlane::getTrackByPosition ( DbU::Unit axis, unsigned int mode ) const
{ {
return getTrackByIndex ( getLayerGauge()->getTrackIndex ( getAxisMin() return getTrackByIndex( getLayerGauge()->getTrackIndex( getAxisMin()
, getAxisMax() , getAxisMax()
, axis , axis
, mode , mode
) ); ) );
} }
@ -168,8 +171,8 @@ namespace Kite {
{ {
bool coherency = true; bool coherency = true;
for ( size_t i=0 ; i<_tracks.size() ; i++ ) { for ( size_t i=0 ; i<_tracks.size() ; ++i ) {
coherency = _tracks[i]->_check(overlaps) and coherency; coherency = _tracks[i]->check(overlaps) and coherency;
} }
return coherency; return coherency;
@ -179,7 +182,9 @@ namespace Kite {
string RoutingPlane::_getString () const string RoutingPlane::_getString () const
{ {
return "<" + _getTypeName() + " @" return "<" + _getTypeName() + " @"
+ getString(_depth) + " [" + getString(_depth) + " "
+ getString(getLayer()) + " [ "
+ ((getDirection() == KbHorizontal) ? " horizontal [" : " vertical [")
+ getString(_tracks.size()) + "/" + getString(_tracks.size()) + "/"
+ getString(_tracks.capacity()) + getString(_tracks.capacity())
+ "]>"; + "]>";
@ -189,17 +194,17 @@ namespace Kite {
Record* RoutingPlane::_getRecord () const Record* RoutingPlane::_getRecord () const
{ {
Record* record = new Record ( getString(this) ); Record* record = new Record ( getString(this) );
record->add ( getSlot ( "_kite" , _kite ) ); record->add( getSlot ( "_kite" , _kite ) );
record->add ( getSlot ( "_layerGauge" , _layerGauge ) ); record->add( getSlot ( "_layerGauge" , _layerGauge ) );
record->add ( getSlot ( "_depth" , &_depth ) ); record->add( getSlot ( "_depth" , &_depth ) );
record->add ( DbU::getValueSlot ( "_axisMin" , &_axisMin ) ); record->add( DbU::getValueSlot( "_axisMin" , &_axisMin ) );
record->add ( DbU::getValueSlot ( "_axisMax" , &_axisMax ) ); record->add( DbU::getValueSlot( "_axisMax" , &_axisMax ) );
record->add ( DbU::getValueSlot ( "_trackMin" , &_trackMin ) ); record->add( DbU::getValueSlot( "_trackMin" , &_trackMin ) );
record->add ( DbU::getValueSlot ( "_trackMax" , &_trackMax ) ); record->add( DbU::getValueSlot( "_trackMax" , &_trackMax ) );
record->add ( getSlot ( "_tracks" , &_tracks ) ); record->add( getSlot ( "_tracks" , &_tracks ) );
return record; return record;
} }
} // End of Kite namespace. } // Kite namespace.

1241
kite/src/SegmentFsm.cpp Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,9 @@
// -*- mode: C++; explicit-buffer-name: "Session.cpp<kite>" -*-
// -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,13 +11,11 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./Session.cpp" | // | C++ Module : "./Session.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include "hurricane/Bug.h" #include "hurricane/Bug.h"
#include "hurricane/Point.h"
#include "hurricane/Error.h" #include "hurricane/Error.h"
#include "katabatic/GCellGrid.h" #include "katabatic/GCellGrid.h"
#include "kite/Session.h" #include "kite/Session.h"
@ -34,7 +26,6 @@
namespace { namespace {
using namespace Kite; using namespace Kite;
@ -43,12 +34,11 @@ namespace {
" Session already open for %s (internal error)."; " Session already open for %s (internal error).";
} // End of local namespace. } // Anonymous namespace.
namespace Kite { namespace Kite {
using std::cerr; using std::cerr;
using std::endl; using std::endl;
using Hurricane::tab; using Hurricane::tab;
@ -57,39 +47,32 @@ namespace Kite {
using Hurricane::ltraceout; using Hurricane::ltraceout;
using Hurricane::Error; using Hurricane::Error;
using Hurricane::Bug; using Hurricane::Bug;
using Hurricane::Point;
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "Session". // Class : "Session".
Session::Session ( KiteEngine* kite ) Session::Session ( KiteEngine* kite )
: Katabatic::Session(kite) : Katabatic::Session(kite)
, _insertEvents() , _insertEvents()
, _removeEvents() , _removeEvents()
, _sortEvents () , _sortEvents ()
{ { }
//_addCanonizeCb ( _computeCagedConstraints );
}
void Session::_postCreate () void Session::_postCreate ()
{ { Katabatic::Session::_postCreate(); }
Katabatic::Session::_postCreate ();
}
Session::~Session () Session::~Session ()
{ } { }
size_t Session::_preDestroy () void Session::_preDestroy ()
{ {
_isEmpty (); _isEmpty();
Katabatic::Session::_preDestroy();
size_t count = Katabatic::Session::_preDestroy ();
return count;
} }
@ -97,16 +80,16 @@ namespace Kite {
{ {
ltrace(110) << "Kite::Session::open()" << endl; ltrace(110) << "Kite::Session::open()" << endl;
Session* session = Session::get (); Session* session = Session::get();
if ( session ) { if (session) {
if ( session->_getKiteEngine() != kite ) if (session->_getKiteEngine() != kite)
throw Error ( reopenSession, getString(session->getKiteEngine()).c_str() ); throw Error( reopenSession, getString(session->getKiteEngine()).c_str() );
return session; return session;
} }
session = new Session ( kite ); session = new Session ( kite );
session->_postCreate (); session->_postCreate();
return session; return session;
} }
@ -120,14 +103,6 @@ namespace Kite {
{ return Session::getKiteEngine()->getConfiguration(); } { return Session::getKiteEngine()->getConfiguration(); }
void Session::link ( TrackElement* trackSegment )
{ Session::get("link(TrackElement*)")->_getKiteEngine()->_link(trackSegment); }
void Session::unlink ( TrackElement* trackSegment )
{ Session::get("unlink(TrackElement*)")->_getKiteEngine()->_unlink(trackSegment); }
TrackElement* Session::lookup ( Segment* segment ) TrackElement* Session::lookup ( Segment* segment )
{ return Session::get("Session::lookup(Segment*)")->_getKiteEngine()->_lookup(segment); } { return Session::get("Session::lookup(Segment*)")->_getKiteEngine()->_lookup(segment); }
@ -136,10 +111,6 @@ namespace Kite {
{ return Session::get("lookup(AutoSegment*)")->_getKiteEngine()->_lookup ( segment ); } { return Session::get("lookup(AutoSegment*)")->_getKiteEngine()->_lookup ( segment ); }
Katabatic::GCell* Session::lookup ( Katabatic::GCell* gcell )
{ return Session::get("lookup(Katabatic::GCell*)")->_getKiteEngine()->getGCellGrid()->getGCell(gcell->getIndex()); }
void Session::setInterrupt ( bool state ) void Session::setInterrupt ( bool state )
{ Session::get("setInterrupt()")->_getKiteEngine()->setInterrupt(state); } { Session::get("setInterrupt()")->_getKiteEngine()->setInterrupt(state); }
@ -166,115 +137,102 @@ namespace Kite {
size_t Session::_revalidate () size_t Session::_revalidate ()
{ {
ltrace(90) << "Kite::Session::_revalidate()" << endl;
ltracein(90);
set<Track*> packTracks; set<Track*> packTracks;
for ( size_t i=0 ; i < _removeEvents.size() ; i++ ) { for ( size_t i=0 ; i<_removeEvents.size() ; ++i ) {
if ( !_removeEvents[i]._segment->getTrack() ) continue; if (not _removeEvents[i]._segment->getTrack()) continue;
packTracks.insert ( _removeEvents[i]._segment->getTrack() ); packTracks.insert( _removeEvents[i]._segment->getTrack() );
_removeEvents[i]._segment->detach (); _removeEvents[i]._segment->detach();
} }
_removeEvents.clear (); _removeEvents.clear();
for ( set<Track*>::iterator it=packTracks.begin() ; it != packTracks.end() ; it++ ) for ( set<Track*>::iterator it=packTracks.begin() ; it != packTracks.end() ; ++it )
(*it)->pack (); (*it)->doRemoval();
for ( size_t i=0 ; i < _insertEvents.size() ; i++ ) { for ( size_t i=0 ; i<_insertEvents.size() ; ++i ) {
if ( _insertEvents[i]._segment ) { if (_insertEvents[i]._segment) {
_insertEvents[i]._track->insert ( _insertEvents[i]._segment ); _insertEvents[i]._track->insert( _insertEvents[i]._segment );
} }
if ( _insertEvents[i]._marker ) _insertEvents[i]._track->insert ( _insertEvents[i]._marker ); if (_insertEvents[i]._marker) _insertEvents[i]._track->insert( _insertEvents[i]._marker );
} }
_insertEvents.clear (); _insertEvents.clear();
// Check if to be destroyeds are not associateds with TrackSegments. // Check if to be destroyeds are not associateds with TrackSegments.
const set<AutoSegment*>& destroyeds = getDestroyeds(); const set<AutoSegment*>& destroyeds = getDestroyeds();
set<AutoSegment*>::const_iterator idestroyed = destroyeds.begin(); set<AutoSegment*>::const_iterator idestroyed = destroyeds.begin();
for ( ; idestroyed != destroyeds.end() ; idestroyed++ ) { for ( ; idestroyed != destroyeds.end() ; ++idestroyed ) {
if ( lookup(*idestroyed) ) { if (lookup(*idestroyed)) {
throw Error("Destroyed AutoSegment is associated with a TrackSegment\n" ltraceout(90);
" (%s)" throw Error( "Destroyed AutoSegment is associated with a TrackSegment\n"
,getString(*idestroyed).c_str()); " (%s)"
, getString(*idestroyed).c_str());
} }
} }
size_t count = Katabatic::Session::_revalidate (); size_t count = Katabatic::Session::_revalidate();
Interval span; Interval span;
vector<TrackElement*> processeds; const vector<AutoSegment*>& revalidateds = getRevalidateds();
const vector<AutoSegment*>& revalidateds = getRevalidateds (); //const set<Net*>& netsModificateds = getNetsModificateds();
const set<Net*>& netsModificateds = getNetsModificateds ();
for ( size_t i=0 ; i<revalidateds.size() ; i++ ) { for ( size_t i=0 ; i<revalidateds.size() ; ++i ) {
Net* currentNet = NULL; if (not revalidateds[i]->isCanonical()) continue;
bool invalidEvent = false;
TrackElement* trackSegment = lookup ( revalidateds[i]->base() ); //Net* currentNet = NULL;
TrackElement* trackSegment = lookup( revalidateds[i] );
if ( trackSegment && !trackSegment->isRevalidated() ) { if (trackSegment and trackSegment->isInvalidated()) {
if ( trackSegment->getNet() != currentNet ) { trackSegment->revalidate();
currentNet = trackSegment->getNet();
invalidEvent = (netsModificateds.find(currentNet) != netsModificateds.end());
}
trackSegment->revalidate ( invalidEvent );
processeds.push_back ( trackSegment );
Track* track = trackSegment->getTrack();
if ( track ) {
track->forceSort ();
_sortEvents.insert ( track );
}
} }
} }
for ( size_t i=0 ; i<processeds.size() ; i++ ) _doglegReset();
processeds[i]->setRevalidated ( false );
# if defined(CHECK_DATABASE) # if defined(CHECK_DATABASE)
unsigned int overlaps = 0; unsigned int overlaps = 0;
# endif # endif
for ( set<Track*>::iterator it=_sortEvents.begin() for ( set<Track*>::iterator it=_sortEvents.begin() ; it!=_sortEvents.end() ; ++it ) {
; it != _sortEvents.end() (*it)->doReorder();
; it++
) {
(*it)->sort ();
# if defined(CHECK_DATABASE) # if defined(CHECK_DATABASE)
(*it)->_check ( overlaps, "Session::_revalidate() - track sorting." ); (*it)->check( overlaps, "Session::_revalidate() - track sorting." );
# endif # endif
} }
set<TrackElement*> faileds;
for ( set<Net*>::iterator inet=netsModificateds.begin() ; inet != netsModificateds.end() ; inet++ ) {
_getKiteEngine()->_computeCagedConstraints ( *inet, faileds );
}
# if defined(CHECK_DATABASE) # if defined(CHECK_DATABASE)
for ( set<Track*>::iterator it=packTracks.begin() ; it != packTracks.end() ; it++ ) for ( set<Track*>::iterator it=packTracks.begin() ; it != packTracks.end() ; ++it )
(*it)->_check ( overlaps, "Session::_revalidate() - on packed track." ); (*it)->check( overlaps, "Session::_revalidate() - on packed track." );
//_getKiteEngine()->_showOverlap (); //_getKiteEngine()->_showOverlap ();
# endif # endif
_sortEvents.clear (); _sortEvents.clear();
if ( not faileds.empty() ) { #if THIS_IS_DISABLED
if (not faileds.empty()) {
set<TrackElement*>::iterator ifailed = faileds.begin(); set<TrackElement*>::iterator ifailed = faileds.begin();
Katabatic::GCellVector gcells; Katabatic::GCellVector gcells;
for ( ; ifailed != faileds.end() ; ++ifailed ) { for ( ; ifailed != faileds.end() ; ++ifailed ) {
(*ifailed)->getGCells ( gcells ); (*ifailed)->getGCells ( gcells );
(*ifailed)->makeDogLeg ( gcells[0] ); (*ifailed)->makeDogLeg( gcells[0] );
} }
count += _revalidate (); count += _revalidate();
} }
#endif
ltraceout(90);
return count; return count;
} }
bool Session::_isEmpty () const bool Session::_isEmpty () const
{ {
if ( !_insertEvents.empty() || !_removeEvents.empty() || !_sortEvents.empty() ) { if ( not _insertEvents.empty() or not _removeEvents.empty() or not _sortEvents.empty() ) {
cerr << Bug(" Session::checkEmpty() failed :\n" cerr << Bug( " Session::checkEmpty() failed :\n"
" %u inserts, %u removes and %u sort events remains." " %u inserts, %u removes and %u sort events remains."
, _insertEvents.size() , _insertEvents.size()
, _removeEvents.size() , _removeEvents.size()
, _sortEvents .size() ) << endl; , _sortEvents .size() ) << endl;
@ -287,17 +245,13 @@ namespace Kite {
void Session::_addInsertEvent ( TrackMarker* marker, Track* track ) void Session::_addInsertEvent ( TrackMarker* marker, Track* track )
{ {
_insertEvents.push_back ( Event(marker,track) ); _insertEvents.push_back( Event(marker,track) );
_addSortEvent ( track, true ); _addSortEvent( track, true );
} }
void Session::_addInsertEvent ( TrackElement* segment, Track* track ) void Session::_addInsertEvent ( TrackElement* segment, Track* track )
{ {
#if defined(CHECK_DETERMINISM)
cerr << "Order: Insert in @" << DbU::getValueString(track->getAxis())
<< " " << segment << endl;
#endif
ltrace(200) << "addInsertEvent() " << segment ltrace(200) << "addInsertEvent() " << segment
<< "\n @" << track << endl; << "\n @" << track << endl;
@ -311,46 +265,46 @@ namespace Kite {
return; return;
} }
_insertEvents.push_back ( Event(segment,track) ); _insertEvents.push_back( Event(segment,track) );
_addSortEvent ( track, true ); _addSortEvent( track, true );
} }
void Session::_addRemoveEvent ( TrackElement* segment ) void Session::_addRemoveEvent ( TrackElement* segment )
{ {
if ( not segment->getTrack() ) { if (not segment->getTrack()) {
cerr << Bug(" Kite::Session::addRemoveEvent() : %s is not in any Track." cerr << Bug( " Kite::Session::addRemoveEvent() : %s is not in any Track."
,getString(segment).c_str()) << endl; , getString(segment).c_str() ) << endl;
return; return;
} }
ltrace(200) << "Ripup: @" << DbU::getValueString(segment->getAxis()) << " " << segment << endl; ltrace(200) << "Ripup: @" << DbU::getValueString(segment->getAxis()) << " " << segment << endl;
_removeEvents.push_back ( Event(segment,segment->getTrack()) ); _removeEvents.push_back( Event(segment,segment->getTrack()) );
_addSortEvent ( segment->getTrack(), true ); _addSortEvent( segment->getTrack(), true );
} }
void Session::_addMoveEvent ( TrackElement* segment, Track* track ) void Session::_addMoveEvent ( TrackElement* segment, Track* track )
{ {
if ( !segment->getTrack() ) { if (not segment->getTrack()) {
cerr << Bug(" Kite::Session::addMoveEvent() : %s has no target Track." cerr << Bug( " Kite::Session::addMoveEvent() : %s has no target Track."
,getString(segment).c_str()) << endl; , getString(segment).c_str() ) << endl;
return; return;
} }
_addRemoveEvent ( segment ); _addRemoveEvent( segment );
_addInsertEvent ( segment, track ); _addInsertEvent( segment, track );
} }
void Session::_addSortEvent ( Track* track, bool forced ) void Session::_addSortEvent ( Track* track, bool forced )
{ {
if ( !track ) { if (not track ) {
cerr << Bug(" Kite::Session::addSortEvent() : no Track to sort.") << endl; cerr << Bug( " Kite::Session::addSortEvent() : no Track to sort." ) << endl;
return; return;
} }
if ( forced ) track->forceSort (); if (forced) track->invalidate();
_sortEvents.insert ( track ); _sortEvents.insert( track );
} }
@ -361,10 +315,10 @@ namespace Kite {
Record* Session::_getRecord () const Record* Session::_getRecord () const
{ {
Record* record = Session::_getRecord (); Record* record = Session::_getRecord ();
record->add ( getSlot ( "_sortEvents" , &_sortEvents ) ); record->add( getSlot( "_sortEvents" , &_sortEvents ) );
return record; return record;
} }
} // End of Kite namespace. } // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,39 +12,32 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./Track.cpp" | // | C++ Module : "./Track.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <cstdlib>
#include <sstream>
#include <cstdlib> #include <memory>
#include <sstream> #include <algorithm>
#include <memory> #include "hurricane/Warning.h"
#include <algorithm> #include "hurricane/Bug.h"
#include "hurricane/Layer.h"
#include "hurricane/Warning.h" #include "hurricane/Net.h"
#include "hurricane/Bug.h" #include "kite/RoutingPlane.h"
#include "hurricane/Layer.h" #include "kite/Track.h"
#include "hurricane/Net.h" #include "kite/TrackMarker.h"
#include "kite/RoutingPlane.h" #include "kite/DataNegociate.h"
#include "kite/Track.h"
#include "kite/TrackMarker.h"
#include "kite/DataNegociate.h"
namespace { namespace {
using namespace std; using namespace std;
using namespace CRL; using namespace CRL;
using namespace Kite; using namespace Kite;
struct isDetachedSegment { struct isDetachedSegment {
bool operator() ( const TrackElement* s ) { return !s->getTrack(); }; bool operator() ( const TrackElement* s ) { return not s->getTrack(); };
}; };
@ -57,12 +45,11 @@ namespace {
{ return (*(v.begin()+i))->getSourceU(); } { return (*(v.begin()+i))->getSourceU(); }
} // End of local namespace. } // Anonymous namespace.
namespace Kite { namespace Kite {
using std::lower_bound; using std::lower_bound;
using std::remove_if; using std::remove_if;
using std::sort; using std::sort;
@ -81,7 +68,7 @@ namespace Kite {
// Class : "Track". // Class : "Track".
const size_t Track::NPOS = (size_t)-1; const size_t Track::npos = (size_t)-1;
Track::Track ( RoutingPlane* routingPlane, unsigned int index ) Track::Track ( RoutingPlane* routingPlane, unsigned int index )
@ -103,9 +90,7 @@ namespace Kite {
Track::~Track () Track::~Track ()
{ { ltrace(90) << "Track::~Track() - " << (void*)this << endl; }
ltrace(90) << "Track::~Track() - " << (void*)this << endl;
}
void Track::_preDestroy () void Track::_preDestroy ()
@ -114,10 +99,10 @@ namespace Kite {
ltracein(90); ltracein(90);
for ( size_t i=0 ; i<_segments.size() ; i++ ) for ( size_t i=0 ; i<_segments.size() ; i++ )
if ( _segments[i] ) _segments[i]->detach(); if (_segments[i]) _segments[i]->detach();
for ( size_t i=0 ; i<_markers.size() ; i++ ) for ( size_t i=0 ; i<_markers.size() ; i++ )
if ( _markers[i] ) _markers[i]->destroy(); if (_markers[i]) _markers[i]->destroy();
ltraceout(90); ltraceout(90);
} }
@ -127,7 +112,7 @@ namespace Kite {
{ {
ltrace(90) << "Track::destroy() - " << (void*)this << " " << this << endl; ltrace(90) << "Track::destroy() - " << (void*)this << " " << this << endl;
Track::_preDestroy (); Track::_preDestroy();
delete this; delete this;
} }
@ -148,9 +133,20 @@ namespace Kite {
{ return _routingPlane->getBlockageLayer(); } { return _routingPlane->getBlockageLayer(); }
Track* Track::getNextTrack () const
{ return getRoutingPlane()->getTrackByIndex( getIndex()+1 ); }
Track* Track::getPreviousTrack () const
{
if (not getIndex()) return NULL;
return getRoutingPlane()->getTrackByIndex( getIndex()-1 );
}
TrackElement* Track::getSegment ( size_t index ) const TrackElement* Track::getSegment ( size_t index ) const
{ {
if ( (index == NPOS) || (index >= getSize()) ) return NULL; if ( (index == npos) or (index >= getSize()) ) return NULL;
return _segments[index]; return _segments[index];
} }
@ -159,12 +155,9 @@ namespace Kite {
{ {
unsigned int state; unsigned int state;
size_t begin; size_t begin;
size_t end;
getIBounds ( position, begin, end, state );
if ( state & (MinTrackMin|MaxTrackMax) ) return NULL;
getBeginIndex( position, begin, state );
if (state & (BeginIsTrackMin|EndIsTrackMax)) return NULL;
return getSegment(begin); return getSegment(begin);
} }
@ -172,10 +165,10 @@ namespace Kite {
TrackElement* Track::getNext ( size_t& index, Net* net ) const TrackElement* Track::getNext ( size_t& index, Net* net ) const
{ {
for ( index++ ; index < _segments.size() ; index++ ) { for ( index++ ; index < _segments.size() ; index++ ) {
if ( _segments[index]->getNet() == net ) continue; if (_segments[index]->getNet() == net) continue;
return _segments[index]; return _segments[index];
} }
index = NPOS; index = npos;
return NULL; return NULL;
} }
@ -183,15 +176,15 @@ namespace Kite {
TrackElement* Track::getPrevious ( size_t& index, Net* net ) const TrackElement* Track::getPrevious ( size_t& index, Net* net ) const
{ {
for ( index-- ; index != NPOS ; index-- ) { for ( index-- ; index != npos ; index-- ) {
if ( inltrace(148) ) { if (inltrace(148)) {
cerr << tab << index << ":"; cerr.flush(); cerr << tab << index << ":"; cerr.flush();
cerr << _segments[index] << endl; cerr << _segments[index] << endl;
} }
if ( _segments[index]->getNet() == net ) continue; if (_segments[index]->getNet() == net) continue;
return _segments[index]; return _segments[index];
} }
index = NPOS; index = npos;
return NULL; return NULL;
} }
@ -208,56 +201,59 @@ namespace Kite {
} }
void Track::getIBounds ( DbU::Unit position, size_t& begin, size_t& end, unsigned int& state ) const void Track::getBeginIndex ( DbU::Unit position, size_t& begin, unsigned int& state ) const
{ {
if ( _segments.empty() ) { if (_segments.empty()) {
state = EmptyTrack; state = EmptyTrack;
begin = end = 0; begin = 0;
return; return;
} }
if ( position < _min ) { if (position < _min) {
cerr << Warning ( " Position %s inferior to the lower bound of %s. Returning NPOS." cerr << Warning( " Position %s inferior to the lower bound of %s. Returning npos."
, DbU::getValueString(position).c_str() , DbU::getValueString(position).c_str()
, getString(this).c_str() ) << endl; , getString(this).c_str() ) << endl;
state = BeforeFirst; state = BeforeFirstElement;
begin = end = 0; begin = 0;
return; return;
} }
if ( position > _max ) { if (position > _max) {
cerr << Warning ( " Position %s superior to the upper bound of %s. Returning NPOS." cerr << Warning( " Position %s superior to the upper bound of %s. Returning npos."
, DbU::getValueString(position).c_str() , DbU::getValueString(position).c_str()
, getString(this).c_str() ) << endl; , getString(this).c_str() ) << endl;
state = AfterLast; state = AfterLastElement;
begin = end = _segments.size() - 1; begin = _segments.size()-1;
return; return;
} }
vector<TrackElement*>::const_iterator lowerBound vector<TrackElement*>::const_iterator lowerBound
= lower_bound ( _segments.begin(), _segments.end(), position, SourceCompare() ); = lower_bound( _segments.begin(), _segments.end(), position, SourceCompare() );
begin = end = lowerBound - _segments.begin(); begin = lowerBound - _segments.begin();
if ( begin < _segments.size() ) // This is suspicious.
for ( ; (begin > 0) && (_segments[begin-1]->getNet() == _segments[begin]->getNet()) ; --begin ); // I guess this has been written for the case of overlapping segments from the same
// net, we find the first one of the overlapped sets. But what if they are not overlapping
// but still from the same net?
if (begin < _segments.size())
for ( ; (begin > 0) and (_segments[begin-1]->getNet() == _segments[begin]->getNet()) ; --begin );
state = 0; state = 0;
if ( (begin == 0) && (position < _segments[0]->getSourceU()) ) { if ( (begin == 0) and (position < _segments[0]->getSourceU()) ) {
state = BeforeFirst; state = BeforeFirstElement;
} else { } else {
if ( begin ) end = begin -= 1; if (begin) begin -= 1;
size_t usedBegin = begin; size_t usedBegin = begin;
size_t usedEnd = begin; Interval usedInterval = getOccupiedInterval( usedBegin );
Interval usedInterval = expandUsedInterval ( usedBegin, usedEnd );
if ( position < usedInterval.getVMax() ) if (position < usedInterval.getVMax())
state = Inside; state = InsideElement;
else else
if ( begin+1 == _segments.size() ) if (begin+1 == _segments.size())
state = AfterLast; state = AfterLastElement;
else else
state = Outside; state = OutsideElement;
} }
} }
@ -265,22 +261,20 @@ namespace Kite {
void Track::getOverlapBounds ( Interval interval, size_t& begin, size_t& end ) const void Track::getOverlapBounds ( Interval interval, size_t& begin, size_t& end ) const
{ {
unsigned int iState; unsigned int iState;
size_t iBegin;
size_t iEnd;
if ( _segments.empty() if ( _segments.empty()
|| (interval.getVMax() <= _min) or (interval.getVMax() <= _min)
|| (interval.getVMin() >= _max)) { or (interval.getVMin() >= _max)) {
begin = end = NPOS; begin = end = npos;
return; return;
} }
getIBounds ( interval.getVMin(), begin, iEnd, iState ); getBeginIndex ( interval.getVMin(), begin, iState );
expandUsedInterval ( begin, iEnd ); getOccupiedInterval( begin );
getIBounds ( interval.getVMax(), iBegin, end, iState ); getBeginIndex( interval.getVMax(), end, iState );
while ( end < _segments.size() ) { while ( end < _segments.size() ) {
if ( _segments[end++]->getSourceU() >= interval.getVMax() ) break; if (_segments[end++]->getSourceU() >= interval.getVMax()) break;
} }
} }
@ -302,34 +296,32 @@ namespace Kite {
ltracein(148); ltracein(148);
vector<TrackMarker*>::const_iterator lowerBound vector<TrackMarker*>::const_iterator lowerBound
= lower_bound ( _markers.begin(), _markers.end(), interval.getVMin(), TrackMarker::Compare() ); = lower_bound( _markers.begin(), _markers.end(), interval.getVMin(), TrackMarker::Compare() );
size_t mbegin = lowerBound - _markers.begin(); size_t mbegin = lowerBound - _markers.begin();
for ( ; (mbegin < _markers.size()) for ( ; (mbegin < _markers.size())
&& (_markers[mbegin]->getSourceU() <= interval.getVMax()) ; mbegin++ ) { and (_markers[mbegin]->getSourceU() <= interval.getVMax()) ; mbegin++ ) {
ltrace(148) << "| @" << DbU::getValueString(_axis) << _markers[mbegin] << endl; ltrace(148) << "| @" << DbU::getValueString(_axis) << _markers[mbegin] << endl;
if ( _markers[mbegin]->getNet() != net ) { if ( _markers[mbegin]->getNet() != net ) {
ltrace(148) << "* Mark: @" << DbU::getValueString(_axis) << " " << _markers[mbegin] << endl; ltrace(148) << "* Mark: @" << DbU::getValueString(_axis) << " " << _markers[mbegin] << endl;
cost.incTerminals ( _markers[mbegin]->getWeight(this) ); cost.incTerminals( _markers[mbegin]->getWeight(this) );
} }
} }
if ( begin == NPOS ) { if (begin == npos) {
ltrace(148) << " begin == NPOS (after last TrackElement)." << endl; ltrace(148) << " begin == npos (after last TrackElement)." << endl;
ltraceout(148); ltraceout(148);
return cost; return cost;
} }
for ( ; begin < end ; begin++ ) { for ( ; begin < end ; begin++ ) {
Interval overlap = interval.getIntersection ( _segments[begin]->getCanonicalInterval() ); Interval overlap = interval.getIntersection( _segments[begin]->getCanonicalInterval() );
//if ( not overlap.isEmpty() ) { if ( _segments[begin]->getNet() == net ) {
if ( _segments[begin]->getNet() == net ) { cost.incDeltaShared ( overlap.getSize() );
cost.incDeltaShared ( overlap.getSize() ); }
} ltrace(190) << "| overlap: " << _segments[begin] << endl;
ltrace(190) << "| overlap: " << _segments[begin] << endl; _segments[begin]->incOverlapCost( net, cost );
_segments[begin]->incOverlapCost ( net, cost ); if (cost.isInfinite()) break;
if ( cost.isInfinite() ) break;
//}
} }
ltraceout(148); ltraceout(148);
@ -343,16 +335,14 @@ namespace Kite {
size_t begin; size_t begin;
size_t end; size_t end;
getOverlapBounds ( interval, begin, end ); getOverlapBounds( interval, begin, end );
return getOverlapCost ( interval, net, begin, end, flags ); return getOverlapCost( interval, net, begin, end, flags );
} }
TrackCost Track::getOverlapCost ( TrackElement* segment, unsigned int flags ) const TrackCost Track::getOverlapCost ( TrackElement* segment, unsigned int flags ) const
{ { return getOverlapCost ( segment->getCanonicalInterval(), segment->getNet(), flags ); }
return getOverlapCost ( segment->getCanonicalInterval(), segment->getNet(), flags );
}
void Track::getTerminalWeight ( Interval interval, Net* net, size_t& count, unsigned int& weight ) const void Track::getTerminalWeight ( Interval interval, Net* net, size_t& count, unsigned int& weight ) const
@ -381,39 +371,25 @@ namespace Kite {
} }
Track* Track::getNext () const
{
return getRoutingPlane()->getTrackByIndex ( getIndex()+1 );
}
Track* Track::getPrevious () const
{
if ( !getIndex() ) return NULL;
return getRoutingPlane()->getTrackByIndex ( getIndex()-1 );
}
size_t Track::find ( const TrackElement* segment ) const size_t Track::find ( const TrackElement* segment ) const
{ {
if ( !_segments.size() ) return NPOS; if (_segments.empty()) return npos;
vector<TrackElement*>::const_iterator lowerBound vector<TrackElement*>::const_iterator lowerBound
= lower_bound ( _segments.begin() = lower_bound( _segments.begin()
, _segments.end() , _segments.end()
, segment , segment
, SegmentCompare() , SegmentCompare()
); );
if ( lowerBound != _segments.end() ) { if (lowerBound != _segments.end()) {
while ( segment->getSourceU() == (*lowerBound)->getSourceU() ) { while ( segment->getSourceU() == (*lowerBound)->getSourceU() ) {
if ( *lowerBound == segment ) return (size_t)(lowerBound-_segments.begin()); if (*lowerBound == segment) return (size_t)(lowerBound-_segments.begin());
lowerBound++; lowerBound++;
} }
} }
return NPOS; return npos;
} }
@ -423,13 +399,14 @@ namespace Kite {
size_t begin; size_t begin;
size_t end; size_t end;
if ( !_segments.size() ) return Interval(_min,_max); if (_segments.empty()) return Interval(_min,_max);
getIBounds ( position, begin, end, state ); getBeginIndex( position, begin, state );
if ( (state == Inside) && (_segments[begin]->getNet() != net) ) if ( (state == InsideElement) and (_segments[begin]->getNet() != net) )
return Interval(); return Interval();
return expandFreeInterval ( begin, end, state, net ); end = begin;
return expandFreeInterval( begin, end, state, net );
} }
@ -437,37 +414,34 @@ namespace Kite {
{ {
DbU::Unit minFree = _min; DbU::Unit minFree = _min;
if ( !(state & MinTrackMin) ) { if (not (state & BeginIsTrackMin) ) {
if ( _segments[begin]->getNet() == net ) if (_segments[begin]->getNet() == net)
getPrevious ( begin, net ); getPrevious( begin, net );
if ( begin != NPOS ) { if (begin != npos) {
size_t usedEnd; minFree = getOccupiedInterval(begin).getVMax();
minFree = expandUsedInterval ( begin, usedEnd ).getVMax();
} }
} }
if ( !(state & MaxTrackMax) ) { if (not (state & EndIsTrackMax) ) {
if ( _segments[end]->getNet() == net ) { if (_segments[end]->getNet() == net) {
getNext ( end, net ); getNext( end, net );
if ( end == NPOS ) { if (end == npos) {
end = _segments.size() - 1; end = _segments.size() - 1;
setMaximalFlags ( state, MaxTrackMax ); setMaximalFlags( state, EndIsTrackMax );
} else { } else {
setMaximalFlags ( state, MaxSegmentMin ); setMaximalFlags( state, EndIsSegmentMin );
} }
} }
} }
return Interval ( minFree, getMaximalPosition(end,state) ); return Interval( minFree, getMaximalPosition(end,state) );
} }
void Track::forceSort () void Track::invalidate ()
{ { _segmentsValid = false; }
_segmentsValid = false;
}
void Track::insert ( TrackMarker* marker ) void Track::insert ( TrackMarker* marker )
@ -499,54 +473,53 @@ namespace Kite {
void Track::setSegment ( TrackElement* segment, size_t index ) void Track::setSegment ( TrackElement* segment, size_t index )
{ {
if ( index >= _segments.size() ) return; if ( index >= _segments.size() ) return;
_segments[index] = segment; _segments[index] = segment;
} }
bool Track::_check ( unsigned int& overlaps, const char* message ) const bool Track::check ( unsigned int& overlaps, const char* message ) const
{ {
bool coherency = true; bool coherency = true;
bool holes = false; bool holes = false;
if ( message ) cerr << " o Checking Track - " << message << endl; if (message) cerr << " o Checking Track - " << message << endl;
ltrace(90) << "[CHECK] " << (void*)this << ":" << this << endl; ltrace(90) << (void*)this << ":" << this << endl;
for ( size_t i=0 ; i<_segments.size() ; i++ ) { for ( size_t i=0 ; i<_segments.size() ; i++ ) {
if ( _segments[i] ) { if (_segments[i]) {
if ( i ) { if (i) {
if ( _segments[i-1] == _segments[i] ) { if (_segments[i-1] == _segments[i]) {
cerr << "[CHECK] incoherency at " << i << " " cerr << "[CHECK] incoherency at " << i << " "
<< _segments[i] << " is duplicated. " << endl; << _segments[i] << " is duplicated. " << endl;
coherency = false; coherency = false;
} }
} }
if ( !_segments[i]->getTrack() ) { if (not _segments[i]->getTrack()) {
cerr << "[CHECK] incoherency at " << i << " " cerr << "[CHECK] incoherency at " << i << " "
<< _segments[i] << " is detached." << endl; << _segments[i] << " is detached." << endl;
coherency = false; coherency = false;
} else { } else {
if ( _segments[i]->getTrack() != this ) { if (_segments[i]->getTrack() != this) {
cerr << "[CHECK] incoherency at " << i << " " cerr << "[CHECK] incoherency at " << i << " "
<< _segments[i] << " is in track " << _segments[i] << " is in track "
<< _segments[i]->getTrack() << endl; << _segments[i]->getTrack() << endl;
coherency = false; coherency = false;
} }
if ( _segments[i]->getIndex() != i ) { if (_segments[i]->getIndex() != i) {
cerr << "[CHECK] incoherency at " << i << " " cerr << "[CHECK] incoherency at " << i << " "
<< _segments[i] << " has bad index " << _segments[i] << " has bad index "
<< _segments[i]->getIndex() << endl; << _segments[i]->getIndex() << endl;
coherency = false; coherency = false;
} }
} }
if ( _segments[i]->getAxis() != getAxis() ) { if (_segments[i]->getAxis() != getAxis()) {
cerr << "[CHECK] incoherency at " << i << " " cerr << "[CHECK] incoherency at " << i << " "
<< _segments[i] << " is not on Track axis " << _segments[i] << " is not on Track axis "
<< DbU::getValueString(getAxis()) << "." << endl; << DbU::getValueString(getAxis()) << "." << endl;
coherency = false; coherency = false;
} }
coherency = _segments[i]->_check () and coherency; coherency = _segments[i]->_check() and coherency;
} else { } else {
cerr << "[CHECK] Hole at position " << i << "." << endl; cerr << "[CHECK] Hole at position " << i << "." << endl;
holes = true; holes = true;
@ -554,7 +527,7 @@ namespace Kite {
} }
} }
if ( !holes ) if (not holes)
coherency = (checkOverlap(overlaps) == 0) and coherency; coherency = (checkOverlap(overlaps) == 0) and coherency;
return coherency; return coherency;
@ -563,7 +536,7 @@ namespace Kite {
DbU::Unit Track::getSourcePosition ( size_t i ) const DbU::Unit Track::getSourcePosition ( size_t i ) const
{ {
if ( i == NPOS) return 0; if ( i == npos) return 0;
return _segments[i]->getSourceU(); return _segments[i]->getSourceU();
} }
@ -581,14 +554,14 @@ namespace Kite {
{ {
Interval canonical; Interval canonical;
switch ( state & MinMask ) { switch ( state & BeginMask ) {
case MinTrackMin: return _min; case BeginIsTrackMin: return _min;
case MinSegmentMin: return _segments[index]->getSourceU (); case BeginIsSegmentMin: return _segments[index]->getSourceU ();
case MinSegmentMax: return _segments[index]->getTargetU (); case BeginIsSegmentMax: return _segments[index]->getTargetU ();
} }
cerr << Bug ( " Track::getMinimalPosition(size_t,unsigned int) :" cerr << Bug( " Track::getMinimalPosition(size_t,unsigned int) :"
" invalid state value %ud.", state ) << endl; " invalid state value %ud.", state ) << endl;
return _min; return _min;
} }
@ -598,104 +571,79 @@ namespace Kite {
{ {
Interval canonical; Interval canonical;
switch ( state & MaxMask ) { switch ( state & EndMask ) {
case MaxTrackMax: return _max; case EndIsTrackMax: return _max;
case MaxSegmentMin: return _segments[index ]->getSourceU (); case EndIsSegmentMin: return _segments[index ]->getSourceU ();
case MaxNextSegmentMin: if ( index+1 >= getSize() ) return _max; case EndIsNextSegmentMin: if (index+1 >= getSize()) return _max;
return _segments[index+1]->getSourceU (); return _segments[index+1]->getSourceU ();
case MaxSegmentMax: return _segments[index ]->getTargetU (); case EndIsSegmentMax: return _segments[index ]->getTargetU ();
} }
cerr << Bug ( " Track::getMaximalPosition(size_t,unsigned int) :" cerr << Bug( " Track::getMaximalPosition(size_t,unsigned int) :"
" invalid state value %ud.", state ) << endl; " invalid state value %ud.", state ) << endl;
return _min; return _min;
} }
Interval Track::expandUsedInterval ( size_t& begin, size_t& end ) const Interval Track::getOccupiedInterval ( size_t& begin ) const
{ {
if ( begin == NPOS ) return Interval(); if (begin == npos) return Interval();
size_t seed = begin; size_t seed = begin;
Net* owner = _segments[seed]->getNet(); Net* owner = _segments[seed]->getNet();
Interval expandInterval; Interval segmentInterval;
Interval ownerInterval; Interval mergedInterval;
_segments[seed]->getCanonical ( ownerInterval ); _segments[seed]->getCanonical( mergedInterval );
size_t i = seed; size_t i = seed;
while ( --i != NPOS ) { while ( --i != npos ) {
if ( _segments[i]->getNet() != owner ) break; if (_segments[i]->getNet() != owner) break;
_segments[i]->getCanonical ( expandInterval ); _segments[i]->getCanonical ( segmentInterval );
if ( expandInterval.getVMax() >= ownerInterval.getVMin() ) { if (segmentInterval.getVMax() >= mergedInterval.getVMin()) {
ownerInterval.merge ( expandInterval ); mergedInterval.merge( segmentInterval );
begin = i; begin = i;
} }
} }
end = i = seed; i = seed;
while ( ++i < _segments.size() ) { while ( ++i < _segments.size() ) {
if ( _segments[i]->getNet() != owner ) break; if (_segments[i]->getNet() != owner) break;
_segments[i]->getCanonical ( expandInterval ); _segments[i]->getCanonical( segmentInterval );
if ( expandInterval.getVMin() > ownerInterval.getVMax() ) break; if (segmentInterval.getVMin() > mergedInterval.getVMax()) break;
if ( expandInterval.getVMax() > ownerInterval.getVMax() ) end = i;
ownerInterval.merge ( expandInterval ); mergedInterval.merge( segmentInterval );
} }
return ownerInterval; return mergedInterval;
} }
size_t Track::pack () size_t Track::doRemoval ()
{ {
ltrace(148) << "Track::pack() - " << this << endl; ltrace(148) << "Track::doRemoval() - " << this << endl;
ltracein(148); ltracein(148);
size_t size = _segments.size(); size_t size = _segments.size();
vector<TrackElement*>::iterator beginRemove vector<TrackElement*>::iterator beginRemove
= remove_if ( _segments.begin(), _segments.end(), isDetachedSegment() ); = remove_if( _segments.begin(), _segments.end(), isDetachedSegment() );
_segments.erase ( beginRemove, _segments.end() ); _segments.erase( beginRemove, _segments.end() );
# if 0 ltrace(148) << "After doRemoval " << this << endl;
size_t first = 0;
size_t last = 0;
bool erase = false;
while ( last < _segments.size() ) {
if ( _segments[last] ) {
if ( erase ) {
_segments.erase ( _segments.begin()+first, _segments.begin()+last );
erase = false;
last = first;
} else {
first = last;
}
} else {
erase = true;
}
}
if ( erase )
_segments.erase ( _segments.begin()+first, _segments.end() );
# endif
ltrace(148) << "After packing " << this << endl;
ltraceout(148); ltraceout(148);
return size - _segments.size(); return size - _segments.size();
} }
void Track::sort () void Track::doReorder ()
{ {
if ( !_segmentsValid ) { if (not _segmentsValid ) {
std::sort ( _segments.begin(), _segments.end(), SegmentCompare() ); std::sort ( _segments.begin(), _segments.end(), SegmentCompare() );
for ( size_t i=0 ; i < _segments.size() ; i++ ) { for ( size_t i=0 ; i < _segments.size() ; i++ ) {
_segments[i]->setIndex ( i ); _segments[i]->setIndex ( i );
@ -703,7 +651,7 @@ namespace Kite {
_segmentsValid = true; _segmentsValid = true;
} }
if ( !_markersValid ) { if (not _markersValid ) {
std::sort ( _markers.begin(), _markers.end(), TrackMarker::Compare() ); std::sort ( _markers.begin(), _markers.end(), TrackMarker::Compare() );
_markersValid = true; _markersValid = true;
} }
@ -719,10 +667,10 @@ namespace Kite {
if ( _segments[i]->getNet() == _segments[i+1]->getNet() ) { if ( _segments[i]->getNet() == _segments[i+1]->getNet() ) {
if ( _segments[i]->getSourceU() == _segments[i+1]->getSourceU() ) { if ( _segments[i]->getSourceU() == _segments[i+1]->getSourceU() ) {
if ( _segments[i]->getTargetU() < _segments[i+1]->getTargetU() ) { if ( _segments[i]->getTargetU() < _segments[i+1]->getTargetU() ) {
cerr << Warning(" Invalid sorting length order in %s:\n%s \n%s " cerr << Error(" Invalid sorting length order in %s:\n%s \n%s "
,getString(this).c_str() ,getString(this).c_str()
,getString(_segments[i ]).c_str() ,getString(_segments[i ]).c_str()
,getString(_segments[i+1]).c_str()) << endl; ,getString(_segments[i+1]).c_str()) << endl;
} }
} }
for ( j=i+1 ; (j<_segments.size()) && (_segments[i]->getNet() == _segments[j]->getNet()) ; j++ ); for ( j=i+1 ; (j<_segments.size()) && (_segments[i]->getNet() == _segments[j]->getNet()) ; j++ );
@ -732,10 +680,10 @@ namespace Kite {
if ( (j<_segments.size()) if ( (j<_segments.size())
&& (_segments[i]->getTargetU() > _segments[j]->getSourceU()) ) { && (_segments[i]->getTargetU() > _segments[j]->getSourceU()) ) {
cerr << Warning("Overlap in %s between:\n %s\n %s" cerr << Error("Overlap in %s between:\n %s\n %s"
,getString(this).c_str() ,getString(this).c_str()
,getString(_segments[i]).c_str() ,getString(_segments[i]).c_str()
,getString(_segments[j]).c_str()) << endl; ,getString(_segments[j]).c_str()) << endl;
overlaps++; overlaps++;
} }
} }
@ -760,13 +708,13 @@ namespace Kite {
Record* Track::_getRecord () const Record* Track::_getRecord () const
{ {
Record* record = new Record ( _getString() ); Record* record = new Record ( _getString() );
record->add ( getSlot ( "_routingPlane", _routingPlane ) ); record->add ( getSlot ( "_routingPlane", _routingPlane ) );
record->add ( getSlot ( "_index" , &_index ) ); record->add ( getSlot ( "_index" , &_index ) );
record->add ( DbU::getValueSlot ( "_axis" , &_axis ) ); record->add ( DbU::getValueSlot ( "_axis" , &_axis ) );
record->add ( getSlot ( "_segments" , &_segments ) ); record->add ( getSlot ( "_segments" , &_segments ) );
return record; return record;
} }
} // End of Kite namespace. } // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,28 +12,19 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./TrackCost.cpp" | // | C++ Module : "./TrackCost.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <cstdlib>
#include <sstream>
#include <iostream>
#include "kite/Track.h"
#include "kite/TrackCost.h"
#include "kite/Session.h"
#include <cstdlib>
#include <sstream>
#include <iostream>
#include "kite/Track.h"
#include "kite/TrackCost.h"
#include "kite/Session.h"
namespace Kite { namespace Kite {
using std::cerr; using std::cerr;
using std::endl; using std::endl;
@ -46,7 +32,6 @@ namespace Kite {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "TrackCost". // Class : "TrackCost".
TrackCost::TrackCost ( Track* track TrackCost::TrackCost ( Track* track
, const Interval& interval , const Interval& interval
, size_t begin , size_t begin
@ -79,7 +64,7 @@ namespace Kite {
, _ripupCount (0) , _ripupCount (0)
{ {
TrackElement* neighbor; TrackElement* neighbor;
if ( _begin != Track::NPOS ) { if ( _begin != Track::npos ) {
neighbor = _track->getSegment(_begin); neighbor = _track->getSegment(_begin);
if ( neighbor and (neighbor->getNet() != net) ) { if ( neighbor and (neighbor->getNet() != net) ) {
DbU::Unit distance = interval.getVMin() - neighbor->getTargetU(); DbU::Unit distance = interval.getVMin() - neighbor->getTargetU();
@ -91,7 +76,7 @@ namespace Kite {
// _distanceToFixed += interval.getVMin() - neighbor->getTargetU(); // _distanceToFixed += interval.getVMin() - neighbor->getTargetU();
// } // }
} }
if ( _end != Track::NPOS ) { if ( _end != Track::npos ) {
neighbor = _track->getSegment(_end); neighbor = _track->getSegment(_end);
if ( neighbor and (neighbor->getNet() != net) ) { if ( neighbor and (neighbor->getNet() != net) ) {
DbU::Unit distance = neighbor->getSourceU() - interval.getVMax(); DbU::Unit distance = neighbor->getSourceU() - interval.getVMax();
@ -190,6 +175,7 @@ namespace Kite {
s += "+" + getString(_ripupCount); s += "+" + getString(_ripupCount);
s += ":" + getString((_dataState<<2)+_ripupCount); s += ":" + getString((_dataState<<2)+_ripupCount);
s += " " + string ( (_blockage )?"b":"-" ); s += " " + string ( (_blockage )?"b":"-" );
s += string ( (_blockage )?"f":"-" );
s += string ( (_hardOverlap )?"h":"-" ); s += string ( (_hardOverlap )?"h":"-" );
s += string ( (_overlap )?"o":"-" ); s += string ( (_overlap )?"o":"-" );
s += string ( (_overlapGlobal )?"g":"-" ); s += string ( (_overlapGlobal )?"g":"-" );
@ -210,17 +196,22 @@ namespace Kite {
Record* TrackCost::_getRecord () const Record* TrackCost::_getRecord () const
{ {
Record* record = new Record ( _getString() ); Record* record = new Record ( _getString() );
record->add ( getSlot ( "_track" , _track ) ); record->add( getSlot ( "_track" , _track ) );
record->add ( getSlot ( "_begin" , &_begin ) ); record->add( getSlot ( "_begin" , &_begin ) );
record->add ( getSlot ( "_end" , &_end ) ); record->add( getSlot ( "_end" , &_end ) );
record->add ( getSlot ( "_interval" , &_interval ) ); record->add( getSlot ( "_interval" , &_interval ) );
record->add ( getSlot ( "_infinite" , _infinite ) ); record->add( getSlot ( "_infinite" , _infinite ) );
record->add ( getSlot ( "_overlap" , _overlap ) ); record->add( getSlot ( "_overlap" , _overlap ) );
record->add ( getSlot ( "_terminals", _terminals ) ); record->add( getSlot ( "_terminals" , _terminals ) );
record->add ( getSlot ( "_delta" , &_delta ) ); record->add( DbU::getValueSlot( "_delta" , &_delta ) );
record->add( DbU::getValueSlot( "_deltaShared" , &_deltaShared ) );
record->add( DbU::getValueSlot( "_deltaPerpand" , &_deltaPerpand ) );
record->add( DbU::getValueSlot( "_axisWeight" , &_axisWeight ) );
record->add( DbU::getValueSlot( "_distanceToFixed", &_distanceToFixed ) );
record->add( DbU::getValueSlot( "_longuestOverlap", &_longuestOverlap ) );
return record; return record;
} }
} // End of Kite namespace. } // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,60 +12,51 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./TrackElement.cpp" | // | C++ Module : "./TrackElement.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <limits>
#include <sstream>
#include <limits> #include "hurricane/Bug.h"
#include <sstream> #include "hurricane/Warning.h"
#include "hurricane/Net.h"
#include "hurricane/Bug.h" #include "hurricane/Name.h"
#include "hurricane/Warning.h" #include "katabatic/AutoContact.h"
#include "hurricane/Net.h" #include "katabatic/GCell.h"
#include "hurricane/Name.h" #include "crlcore/RoutingGauge.h"
#include "katabatic/AutoContact.h" #include "kite/DataNegociate.h"
#include "katabatic/GCell.h" #include "kite/TrackElement.h"
#include "crlcore/RoutingGauge.h" #include "kite/TrackCost.h"
#include "kite/DataNegociate.h" #include "kite/Track.h"
#include "kite/TrackElement.h" #include "kite/Session.h"
#include "kite/TrackCost.h" #include "kite/RoutingEvent.h"
#include "kite/Track.h" #include "kite/NegociateWindow.h"
#include "kite/Session.h"
#include "kite/RoutingEvent.h"
#include "kite/NegociateWindow.h"
namespace { namespace {
using namespace std; using namespace std;
using namespace Hurricane; using namespace Hurricane;
using namespace CRL; using namespace CRL;
using namespace Kite; using namespace Kite;
// --------------------------------------------------------------- void dummyOverlapCost ( const TrackElement* segment, TrackCost& cost )
// Function : "DummyOverlapCost ()".
void DummyOverlapCost ( const TrackElement* segment, TrackCost& cost )
{ {
cerr << Warning("No overlapCost callback has been set (%s)." cerr << Warning("No overlapCost callback has been set (%s)."
,getString(segment).c_str()) << endl; ,getString(segment).c_str()) << endl;
} }
} // End of local namespace. } // Anonymous namespace.
namespace Kite { namespace Kite {
using Hurricane::inltrace;
using Hurricane::ltracein;
using Hurricane::ltraceout;
using Hurricane::tab;
using Hurricane::Bug; using Hurricane::Bug;
using Hurricane::Net; using Hurricane::Net;
using Hurricane::Name; using Hurricane::Name;
@ -78,144 +64,141 @@ namespace Kite {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "TrackElement::Compare". // Comparison Classes.
bool TrackElement::Compare::operator() ( TrackElement* lhs, TrackElement* rhs )
{
return lhs->getArea() > rhs->getArea();
}
// -------------------------------------------------------------------
// Class : "TrackElement::CompareByPosition".
// //
// Return: lhs < rhs. // Return: lhs < rhs.
bool TrackElement::CompareByPosition::operator() ( const TrackElement* lhs, const TrackElement* rhs ) const bool Compare::operator() ( TrackElement* lhs, TrackElement* rhs )
{ return lhs->getFreedomDegree() > rhs->getFreedomDegree(); }
bool CompareByPosition::operator() ( const TrackElement* lhs, const TrackElement* rhs ) const
{ {
if ( lhs == rhs ) return false; if (lhs == rhs) return false;
if ( lhs->isBlockage() xor rhs->isBlockage() ) if (lhs->isBlockage() xor rhs->isBlockage()) return lhs->isBlockage();
return lhs->isBlockage();
if ( lhs->getLength() < rhs->getLength() ) return true; if (lhs->getLength() < rhs->getLength()) return true;
if ( lhs->getLength() > rhs->getLength() ) return false; if (lhs->getLength() > rhs->getLength()) return false;
if ( lhs->isHorizontal() xor rhs->isHorizontal() ) if (lhs->isHorizontal() xor rhs->isHorizontal()) return rhs->isHorizontal();
return rhs->isHorizontal();
if ( lhs->getAxis() > rhs->getAxis() ) return true; if (lhs->getAxis() > rhs->getAxis()) return true;
if ( lhs->getAxis() < rhs->getAxis() ) return false; if (lhs->getAxis() < rhs->getAxis()) return false;
if ( lhs->getSourceU() > rhs->getSourceU() ) return true; if (lhs->getSourceU() > rhs->getSourceU()) return true;
if ( lhs->getSourceU() < rhs->getSourceU() ) return false; if (lhs->getSourceU() < rhs->getSourceU()) return false;
if ( lhs->isBlockage() and rhs->isBlockage() ) return false; if (lhs->isBlockage() and rhs->isBlockage()) return false;
//return lhs->getNet()->getName() < rhs->getNet()->getName();
return lhs->getId() < rhs->getId(); return lhs->getId() < rhs->getId();
} }
// -------------------------------------------------------------------
// Class : "SegmentObserver".
void SegmentObserver::notify ( unsigned int flags )
{
TrackElement* segment = getOwner();
switch ( flags ) {
case AutoSegment::Invalidate:
if (not segment->isInvalidated()) {
ltrace(200) << "::notify() <Invalidate> on " << segment << endl;
segment->invalidate();
}
break;
case AutoSegment::Revalidate:
// Revalidation must be delayed until *all* the AutoSegments have been revalidated.
// if (segment->isInvalidated()) {
// ltrace(200) << "::notify() <Revalidate> on " << segment << endl;
// segment->revalidate( true );
// }
break;
}
}
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "TrackElement". // Class : "TrackElement".
SegmentOverlapCostCB* TrackElement::_overlapCostCallback = DummyOverlapCost; SegmentOverlapCostCB* TrackElement::_overlapCostCallback = dummyOverlapCost;
SegmentOverlapCostCB* TrackElement::setOverlapCostCB ( SegmentOverlapCostCB* cb ) SegmentOverlapCostCB* TrackElement::setOverlapCostCB ( SegmentOverlapCostCB* cb )
{ {
SegmentOverlapCostCB* oldCb = _overlapCostCallback; SegmentOverlapCostCB* oldCb = _overlapCostCallback;
_overlapCostCallback = cb; _overlapCostCallback = cb;
return oldCb; return oldCb;
} }
// Former inline functions. // Wrapped AutoSegment Functions.
AutoSegment* TrackElement::base () const { return NULL; } AutoSegment* TrackElement::base () const { return NULL; }
bool TrackElement::isBipoint () const { return false; } bool TrackElement::isFixed () const { return false; }
bool TrackElement::isCreated () const { return false; } bool TrackElement::isLocal () const { return true; }
bool TrackElement::isFixed () const { return false; } bool TrackElement::isGlobal () const { return not isLocal(); }
bool TrackElement::isBlockage () const { return false; } bool TrackElement::isBipoint () const { return false; }
bool TrackElement::isStrap () const { return false; } bool TrackElement::isTerminal () const { return false; }
bool TrackElement::isSlackenStrap () const { return false; } bool TrackElement::isStrongTerminal ( unsigned int ) const { return false; }
bool TrackElement::isLocal () const { return true; } bool TrackElement::isStrap () const { return false; }
bool TrackElement::isGlobal () const { return not isLocal(); } bool TrackElement::isSlackened () const { return false; }
bool TrackElement::isLocked () const { return false; } bool TrackElement::isDogleg () const { return false; }
bool TrackElement::isTerminal () const { return false; } // Predicates.
bool TrackElement::isDogleg () const { return false; } bool TrackElement::canSlacken () const { return false; }
bool TrackElement::isRevalidated () const { return false; } bool TrackElement::canPivotUp ( float ) const { return false; };
bool TrackElement::isRouted () const { return true; } bool TrackElement::canPivotDown ( float ) const { return false; };
bool TrackElement::isSlackened () const { return false; } bool TrackElement::canMoveUp ( float, unsigned int ) const { return false; };
bool TrackElement::isSlackenDogLeg () const { return false; } bool TrackElement::canDogleg () { return false; };
bool TrackElement::hasSourceDogLeg () const { return false; } bool TrackElement::canDogleg ( Interval ) { return false; };
bool TrackElement::hasTargetDogLeg () const { return false; } bool TrackElement::canDogleg ( Katabatic::GCell*, unsigned int ) { return false; };
bool TrackElement::allowOutsideGCell () const { return false; } // Accessors.
bool TrackElement::canGoOutsideGCell () const { return false; } unsigned long TrackElement::getId () const { return 0; }
bool TrackElement::canRipple () const { return false; } unsigned long TrackElement::getFreedomDegree () const { return 0; }
unsigned long TrackElement::getId () const { return 0; } float TrackElement::getMaxUnderDensity ( unsigned int ) const { return 0.0; };
unsigned long TrackElement::getArea () const { return 0; } unsigned int TrackElement::getDoglegLevel () const { return 0; }
unsigned int TrackElement::getDogLegLevel () const { return 0; } TrackElement* TrackElement::getParent () const { return NULL; }
unsigned int TrackElement::getDogLegOrder () const { return 0; } Interval TrackElement::getSourceConstraints () const { return Interval(); }
Interval TrackElement::getSourceConstraints () const { return Interval(); } Interval TrackElement::getTargetConstraints () const { return Interval(); }
Interval TrackElement::getTargetConstraints () const { return Interval(); } DataNegociate* TrackElement::getDataNegociate ( unsigned int ) const { return NULL; }
DataNegociate* TrackElement::getDataNegociate ( unsigned int ) const { return NULL; } TrackElements TrackElement::getPerpandiculars () { return new TrackElements_Perpandiculars(NULL); }
TrackElements TrackElement::getCollapsedPerpandiculars () { return new TrackElements_CollapsedPerpandicular(NULL); } void TrackElement::invalidate () { }
void TrackElement::setAllowOutsideGCell ( bool ) { } TrackElement* TrackElement::getCanonical ( Interval& i ) { i=Interval(getSourceU(),getTargetU()); return this; }
void TrackElement::setLock ( bool ) { } TrackElement* TrackElement::getSourceDogleg () { return NULL; }
void TrackElement::setRevalidated ( bool ) { } TrackElement* TrackElement::getTargetDogleg () { return NULL; }
void TrackElement::invalidate () { } // Mutators.
void TrackElement::setCanRipple ( bool ) { } void TrackElement::setTrack ( Track* track ) { _track = track; }
void TrackElement::setSourceDogLeg ( bool ) { } void TrackElement::updateFreedomDegree () { }
void TrackElement::setTargetDogLeg ( bool ) { } void TrackElement::setDoglegLevel ( unsigned int ) { }
TrackElement* TrackElement::getCanonical ( Interval& i ) { i=Interval(getSourceU(),getTargetU()); return this; } void TrackElement::swapTrack ( TrackElement* ) { }
bool TrackElement::canSlacken () const { return false; } void TrackElement::reschedule ( unsigned int ) { }
void TrackElement::detach () { }
void TrackElement::revalidate () { }
bool TrackElement::canDesalignate () const { return false; } void TrackElement::setAxis ( DbU::Unit, unsigned int flags ) { }
bool TrackElement::canPivotUp ( float ) const { return false; }; TrackElement* TrackElement::makeDogleg () { return NULL; }
bool TrackElement::canPivotDown ( float ) const { return false; }; TrackElement* TrackElement::makeDogleg ( Interval, unsigned int& ) { return NULL; }
bool TrackElement::canMoveUp ( float, unsigned int ) const { return false; }; TrackElement* TrackElement::makeDogleg ( Katabatic::GCell*, TrackElement*&, TrackElement*& ) { return NULL; }
float TrackElement::getMaxUnderDensity ( unsigned int ) const { return 0.0; }; void TrackElement::_postDoglegs ( TrackElement*&, TrackElement*& ) { }
bool TrackElement::canDogLeg () { return false; }; bool TrackElement::moveAside ( unsigned int ) { return false; }
bool TrackElement::canDogLeg ( Interval ) { return false; }; bool TrackElement::slacken ( unsigned int ) { return false; }
bool TrackElement::canDogLegAt ( Katabatic::GCell*, unsigned int ) { return false; }; bool TrackElement::moveUp ( unsigned int ) { return false; }
TrackElement* TrackElement::getSourceDogLeg () { return NULL; } bool TrackElement::moveDown ( unsigned int ) { return false; }
TrackElement* TrackElement::getTargetDogLeg () { return NULL; } #if THIS_IS_DISABLED
TrackElement* TrackElement::getParent () const { return NULL; } void TrackElement::desalignate () { }
void TrackElement::dataInvalidate () { } #endif
void TrackElement::eventInvalidate () { } bool TrackElement::_check () const { return true; }
void TrackElement::setArea () { }
void TrackElement::setRouted ( bool ) { }
void TrackElement::setTrack ( Track* track ) { _track = track; }
void TrackElement::setDogLegLevel ( unsigned int ) { }
void TrackElement::setDogLegOrder ( unsigned int ) { }
void TrackElement::swapTrack ( TrackElement* ) { }
void TrackElement::reschedule ( unsigned int ) { }
void TrackElement::detach () { }
void TrackElement::revalidate ( bool invalidEvent ) { }
void TrackElement::setAxis ( DbU::Unit, unsigned int flags ) { }
void TrackElement::slacken () { }
bool TrackElement::moveUp ( unsigned int ) { return false; }
bool TrackElement::moveDown ( unsigned int ) { return false; }
bool TrackElement::moveAside ( bool onLeft ) { return false; }
TrackElement* TrackElement::makeDogLeg () { return NULL; }
TrackElement* TrackElement::makeDogLeg ( Interval, bool& leftDogleg ) { return NULL; }
TrackElement* TrackElement::makeDogLeg ( Katabatic::GCell* ) { return NULL; }
TrackElement* TrackElement::_postDogLeg ( Katabatic::GCell* ) { return NULL; }
void TrackElement::_postModify () { }
void TrackElement::desalignate () { }
bool TrackElement::_check () const { return true; }
TrackElement::TrackElement ( Track* track ) TrackElement::TrackElement ( Track* track )
: _track(track) : _flags (0)
, _index((size_t)-1) , _track (track)
, _index ((size_t)-1)
, _sourceU (0)
, _targetU (0)
, _observer(this)
{ } { }
@ -241,50 +224,38 @@ namespace Kite {
TrackElement* TrackElement::getNext () const TrackElement* TrackElement::getNext () const
{ {
size_t dummy = _index; size_t dummy = _index;
return _track->getNext ( dummy, getNet() ); return _track->getNext( dummy, getNet() );
} }
TrackElement* TrackElement::getPrevious () const TrackElement* TrackElement::getPrevious () const
{ {
size_t dummy = _index; size_t dummy = _index;
return _track->getPrevious ( dummy, getNet() ); return _track->getPrevious( dummy, getNet() );
} }
Interval TrackElement::getFreeInterval () const Interval TrackElement::getFreeInterval () const
{ {
if ( !_track ) return Interval(false); if (not _track) return Interval(false);
size_t begin = _index; size_t begin = _index;
size_t end = _index; size_t end = _index;
return _track->expandFreeInterval ( begin, end, Track::Inside, getNet() ); return _track->expandFreeInterval( begin, end, Track::InsideElement, getNet() );
} }
size_t TrackElement::getGCells ( vector<GCell*>& gcells ) const size_t TrackElement::getGCells ( Katabatic::GCellVector& gcells ) const
{ {
vector<GCell*>().swap ( gcells ); vector<GCell*>().swap( gcells );
return gcells.size(); return gcells.size();
} }
size_t TrackElement::getPerpandicularsBound ( set<TrackElement*>& bounds )
{
bounds.clear ();
return 0;
}
unsigned int TrackElement::getOrder () const
{ return numeric_limits<unsigned int>::max(); }
void TrackElement::incOverlapCost ( Net* net, TrackCost& cost ) const void TrackElement::incOverlapCost ( Net* net, TrackCost& cost ) const
{ {
if ( not _track or (getNet() == net) ) return; if (not _track or (getNet() == net)) return;
_overlapCostCallback( this, cost );
_overlapCostCallback ( this, cost );
} }
@ -293,17 +264,20 @@ namespace Kite {
string TrackElement::_getString () const string TrackElement::_getString () const
{ return "<" + _getTypeName() + ">"; } { return "<"+_getTypeName()+">"; }
Record* TrackElement::_getRecord () const Record* TrackElement::_getRecord () const
{ {
Record* record = new Record ( _getString() ); Record* record = new Record( _getString() );
record->add ( getSlot ( "_track", _track ) ); record->add( getSlot( "_flags", _track ) );
record->add ( getSlot ( "_index", _index ) ); record->add( getSlot( "_track", _track ) );
record->add( getSlot( "_index", _index ) );
record->add( DbU::getValueSlot( "_sourceU", &_sourceU ) );
record->add( DbU::getValueSlot( "_targetU", &_targetU ) );
return record; return record;
} }
} // End of Kite namespace. } // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,10 +12,7 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./TrackElements.cpp" | // | C++ Module : "./TrackElements.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include "hurricane/Bug.h" #include "hurricane/Bug.h"
@ -31,7 +23,6 @@
namespace Kite { namespace Kite {
using namespace std; using namespace std;
using Hurricane::tab; using Hurricane::tab;
using Hurricane::inltrace; using Hurricane::inltrace;
@ -43,20 +34,20 @@ namespace Kite {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "TrackElements_CollapsedPerpandicular". // Class : "TrackElements_Perpandiculars".
TrackElements_CollapsedPerpandicular::Locator::Locator ( TrackElement* segment ) TrackElements_Perpandiculars::Locator::Locator ( TrackElement* segment )
: TrackElementHL () : TrackElementHL ()
, _locator (segment->base()) , _locator (segment->base())
, _element (NULL) , _element (NULL)
{ {
ltrace(80) << "TrackElements_CollapsedPerpandicular::Locator::Locator()" << endl; ltrace(80) << "TrackElements_Perpandiculars::Locator::Locator()" << endl;
ltrace(80) << " " << segment << endl; ltrace(80) << " " << segment << endl;
Interval bounds; Interval bounds;
if ( _locator.isValid() ) { if ( _locator.isValid() ) {
_element = Session::lookup ( _locator.getElement()->getCanonical(bounds)->base() ); _element = Session::lookup( _locator.getElement()->getCanonical(bounds)->base() );
if ( !_element ) { if ( !_element ) {
cerr << Bug("Canonical segment without TrackElement.") << endl; cerr << Bug("Canonical segment without TrackElement.") << endl;
progress (); progress ();
@ -65,20 +56,20 @@ namespace Kite {
} }
TrackElement* TrackElements_CollapsedPerpandicular::Locator::getElement () const TrackElement* TrackElements_Perpandiculars::Locator::getElement () const
{ return _element; } { return _element; }
void TrackElements_CollapsedPerpandicular::Locator::progress () void TrackElements_Perpandiculars::Locator::progress ()
{ {
ltrace(80) << "TrackElements_CollapsedPerpandicular::Locator::progress()" << endl; ltrace(80) << "TrackElements_Perpandiculars::Locator::progress()" << endl;
Interval bounds; Interval bounds;
while ( _locator.isValid() ) { while ( _locator.isValid() ) {
_locator.progress (); _locator.progress ();
if ( _locator.isValid() ) { if ( _locator.isValid() ) {
_element = Session::lookup ( _locator.getElement()->getCanonical(bounds)->base() ); _element = Session::lookup( _locator.getElement()->getCanonical(bounds)->base() );
if ( !_element ) { if ( !_element ) {
cerr << Bug("Canonical segment whithout TrackElement.") << endl; cerr << Bug("Canonical segment whithout TrackElement.") << endl;
continue; continue;
@ -90,32 +81,32 @@ namespace Kite {
} }
TrackElementHL* TrackElements_CollapsedPerpandicular::Locator::getClone () const TrackElementHL* TrackElements_Perpandiculars::Locator::getClone () const
{ return new Locator(*this); } { return new Locator(*this); }
bool TrackElements_CollapsedPerpandicular::Locator::isValid () const bool TrackElements_Perpandiculars::Locator::isValid () const
{ return _locator.isValid(); } { return _locator.isValid(); }
TrackElementHC* TrackElements_CollapsedPerpandicular::getClone () const TrackElementHC* TrackElements_Perpandiculars::getClone () const
{ return new TrackElements_CollapsedPerpandicular(*this); } { return new TrackElements_Perpandiculars(*this); }
TrackElementHL* TrackElements_CollapsedPerpandicular::getLocator () const TrackElementHL* TrackElements_Perpandiculars::getLocator () const
{ return new Locator(_segment); } { return new Locator(_segment); }
string TrackElements_CollapsedPerpandicular::Locator::_getString () const string TrackElements_Perpandiculars::Locator::_getString () const
{ {
string s = "<TrackElements_CollapsedPerpandicular::Locator>"; string s = "<TrackElements_Perpandiculars::Locator>";
return s; return s;
} }
string TrackElements_CollapsedPerpandicular::_getString () const string TrackElements_Perpandiculars::_getString () const
{ {
string s = "<TrackElements_CollapsedPerpandicular " string s = "<TrackElements_Perpandiculars "
+ getString(_segment) + getString(_segment)
+ ">"; + ">";
return s; return s;
@ -132,8 +123,8 @@ namespace Kite {
bool TrackElements_UniqCanonical::accept ( TrackElement* segment ) const bool TrackElements_UniqCanonical::accept ( TrackElement* segment ) const
{ {
if ( _canonicals.find(segment) == _canonicals.end() ) { if (_canonicals.find(segment) == _canonicals.end()) {
_canonicals.insert ( segment ); _canonicals.insert( segment );
return true; return true;
} }
@ -145,4 +136,4 @@ namespace Kite {
{ return "<TrackElements_UniqCanonical>"; } { return "<TrackElements_UniqCanonical>"; }
} // End of Kite namespace. } // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,41 +12,34 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./TrackFixedSegment.cpp" | // | C++ Module : "./TrackFixedSegment.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <sstream>
#include "hurricane/Bug.h"
#include <sstream> #include "hurricane/Warning.h"
#include "hurricane/Net.h"
#include "hurricane/Bug.h" #include "hurricane/Name.h"
#include "hurricane/Warning.h" #include "hurricane/RegularLayer.h"
#include "hurricane/Net.h" #include "hurricane/Technology.h"
#include "hurricane/Name.h" #include "hurricane/DataBase.h"
#include "hurricane/RegularLayer.h" #include "hurricane/Horizontal.h"
#include "hurricane/Technology.h" #include "hurricane/Vertical.h"
#include "hurricane/DataBase.h" #include "katabatic/AutoContact.h"
#include "hurricane/Horizontal.h" #include "katabatic/GCellGrid.h"
#include "hurricane/Vertical.h" #include "crlcore/RoutingGauge.h"
#include "katabatic/AutoContact.h" #include "kite/DataNegociate.h"
#include "katabatic/GCellGrid.h" #include "kite/TrackFixedSegment.h"
#include "crlcore/RoutingGauge.h" #include "kite/TrackCost.h"
#include "kite/DataNegociate.h" #include "kite/Track.h"
#include "kite/TrackFixedSegment.h" #include "kite/Session.h"
#include "kite/TrackCost.h" #include "kite/RoutingEvent.h"
#include "kite/Track.h" #include "kite/NegociateWindow.h"
#include "kite/Session.h" #include "kite/KiteEngine.h"
#include "kite/RoutingEvent.h"
#include "kite/NegociateWindow.h"
#include "kite/KiteEngine.h"
namespace Kite { namespace Kite {
using namespace std; using namespace std;
using Hurricane::inltrace; using Hurricane::inltrace;
using Hurricane::ltracein; using Hurricane::ltracein;
@ -80,79 +68,81 @@ namespace Kite {
TrackFixedSegment::TrackFixedSegment ( Track* track, Segment* segment ) TrackFixedSegment::TrackFixedSegment ( Track* track, Segment* segment )
: TrackElement (NULL) : TrackElement (NULL)
, _segment (segment) , _segment (segment)
, _isBlockage (segment->getNet() == _blockageNet)
{ {
Box boundingBox = segment->getBoundingBox(); Box boundingBox = segment->getBoundingBox();
if ( track ) { unsigned int flags = TElemFixed | ((segment->getNet() == _blockageNet) ? TElemBlockage : 0);
setFlags( flags );
if (track) {
unsigned int depth = track->getDepth(); unsigned int depth = track->getDepth();
Technology* technology = DataBase::getDB()->getTechnology(); Technology* technology = DataBase::getDB()->getTechnology();
const Layer* layer1 = track->getLayer()->getBlockageLayer(); const Layer* layer1 = track->getLayer()->getBlockageLayer();
RegularLayer* layer2 = dynamic_cast<RegularLayer*>(technology->getLayer(layer1->getMask())); RegularLayer* layer2 = dynamic_cast<RegularLayer*>(technology->getLayer(layer1->getMask()));
if ( layer2 ) { if ( layer2 ) {
//DbU::Unit extention = layer2->getExtentionCap(); //DbU::Unit extention = layer2->getExtentionCap();
if ( track->getDirection() == Constant::Horizontal ) { if (track->getDirection() == KbHorizontal) {
Interval uside = track->getKiteEngine()->getGCellGrid()->getUSide ( Constant::Horizontal ); Interval uside = track->getKiteEngine()->getGCellGrid()->getUSide( KbHorizontal );
_sourceU = max ( boundingBox.getXMin(), uside.getVMin()); _sourceU = max( boundingBox.getXMin(), uside.getVMin());
_targetU = min ( boundingBox.getXMax(), uside.getVMax()); _targetU = min( boundingBox.getXMax(), uside.getVMax());
Katabatic::GCell* gcell = track->getKiteEngine()->getGCellGrid()->getGCell ( Point(_sourceU,track->getAxis()) ); Katabatic::GCell* gcell = track->getKiteEngine()->getGCellGrid()->getGCell( Point(_sourceU,track->getAxis()) );
Katabatic::GCell* end = track->getKiteEngine()->getGCellGrid()->getGCell ( Point(_targetU,track->getAxis()) ); Katabatic::GCell* end = track->getKiteEngine()->getGCellGrid()->getGCell( Point(_targetU,track->getAxis()) );
Katabatic::GCell* right = NULL; Katabatic::GCell* right = NULL;
Interval guside = gcell->getUSide ( Constant::Horizontal /*, true*/ ); Interval guside = gcell->getSide( KbHorizontal );
Interval segside ( boundingBox.getXMin(), boundingBox.getXMax() ); Interval segside ( boundingBox.getXMin(), boundingBox.getXMax() );
if ( gcell ) { if (gcell) {
while ( gcell and (gcell != end) ) { while ( gcell and (gcell != end) ) {
right = gcell->getRight(); right = gcell->getRight();
if ( right == NULL ) break; if (right == NULL) break;
guside = gcell->getUSide ( Constant::Horizontal /*, true*/ ); guside = gcell->getSide( KbHorizontal );
Interval usedLength = guside.getIntersection ( segside ); Interval usedLength = guside.getIntersection( segside );
gcell->addBlockage ( depth, usedLength.getSize() ); gcell->addBlockage ( depth, usedLength.getSize() );
//gcell->addBlockedAxis ( depth, track->getAxis() ); //gcell->addBlockedAxis( depth, track->getAxis() );
gcell = right; gcell = right;
} }
if ( end ) { if (end) {
guside = gcell->getUSide ( Constant::Horizontal /*, true*/ ); guside = gcell->getSide( KbHorizontal );
Interval usedLength = guside.getIntersection ( segside ); Interval usedLength = guside.getIntersection( segside );
end->addBlockage ( depth, usedLength.getSize() ); end->addBlockage ( depth, usedLength.getSize() );
//end->addBlockedAxis ( depth, track->getAxis() ); //end->addBlockedAxis( depth, track->getAxis() );
} }
} else } else
cerr << Warning("TrackFixedSegment(): TrackFixedElement outside GCell grid.") << endl; cerr << Warning("TrackFixedSegment(): TrackFixedElement outside GCell grid.") << endl;
} else { } else {
Interval uside = track->getKiteEngine()->getGCellGrid()->getUSide ( Constant::Vertical ); Interval uside = track->getKiteEngine()->getGCellGrid()->getUSide( KbVertical );
_sourceU = max ( boundingBox.getYMin(), uside.getVMin()); _sourceU = max( boundingBox.getYMin(), uside.getVMin());
_targetU = min ( boundingBox.getYMax(), uside.getVMax()); _targetU = min( boundingBox.getYMax(), uside.getVMax());
Katabatic::GCell* gcell = track->getKiteEngine()->getGCellGrid()->getGCell ( Point(track->getAxis(),_sourceU) ); Katabatic::GCell* gcell = track->getKiteEngine()->getGCellGrid()->getGCell( Point(track->getAxis(),_sourceU) );
Katabatic::GCell* end = track->getKiteEngine()->getGCellGrid()->getGCell ( Point(track->getAxis(),_targetU) ); Katabatic::GCell* end = track->getKiteEngine()->getGCellGrid()->getGCell( Point(track->getAxis(),_targetU) );
Katabatic::GCell* up = NULL; Katabatic::GCell* up = NULL;
Interval guside = gcell->getUSide ( Constant::Vertical /*, true*/ ); Interval guside = gcell->getSide( KbVertical );
Interval segside ( boundingBox.getYMin(), boundingBox.getYMax() ); Interval segside ( boundingBox.getYMin(), boundingBox.getYMax() );
if ( gcell ) { if (gcell) {
while ( gcell and (gcell != end) ) { while ( gcell and (gcell != end) ) {
up = gcell->getUp(); up = gcell->getUp();
if ( up == NULL ) break; if (up == NULL) break;
guside = gcell->getUSide ( Constant::Vertical /*, true*/ ); guside = gcell->getSide( KbVertical );
Interval usedLength = guside.getIntersection ( segside ); Interval usedLength = guside.getIntersection( segside );
gcell->addBlockage ( depth, usedLength.getSize() ); gcell->addBlockage ( depth, usedLength.getSize() );
//gcell->addBlockedAxis ( depth, track->getAxis() ); //gcell->addBlockedAxis( depth, track->getAxis() );
gcell = up; gcell = up;
} }
if ( end ) { if ( end ) {
guside = gcell->getUSide ( Constant::Vertical /*, true*/ ); guside = gcell->getSide( KbVertical /*, true*/ );
Interval usedLength = guside.getIntersection ( segside ); Interval usedLength = guside.getIntersection( segside );
end->addBlockage ( depth, usedLength.getSize() ); end->addBlockage ( depth, usedLength.getSize() );
//end->addBlockedAxis ( depth, track->getAxis() ); //end->addBlockedAxis( depth, track->getAxis() );
} }
} else } else
cerr << Warning("TrackFixedSegment(): TrackFixedElement outside GCell grid.") << endl; cerr << Warning("TrackFixedSegment(): TrackFixedElement outside GCell grid.") << endl;
@ -163,7 +153,7 @@ namespace Kite {
void TrackFixedSegment::_postCreate () void TrackFixedSegment::_postCreate ()
{ TrackElement::_postCreate (); } { TrackElement::_postCreate(); }
TrackFixedSegment::~TrackFixedSegment () TrackFixedSegment::~TrackFixedSegment ()
@ -173,7 +163,7 @@ namespace Kite {
void TrackFixedSegment::_preDestroy () void TrackFixedSegment::_preDestroy ()
{ {
ltrace(90) << "TrackFixedSegment::_preDestroy() - " << (void*)this << endl; ltrace(90) << "TrackFixedSegment::_preDestroy() - " << (void*)this << endl;
TrackElement::_preDestroy (); TrackElement::_preDestroy();
} }
@ -182,27 +172,28 @@ namespace Kite {
if ( not _blockageNet ) _blockageNet = Session::getBlockageNet(); if ( not _blockageNet ) _blockageNet = Session::getBlockageNet();
TrackFixedSegment* trackFixedSegment = NULL; TrackFixedSegment* trackFixedSegment = NULL;
if ( track ) { if (track) {
trackFixedSegment = new TrackFixedSegment ( track, segment ); trackFixedSegment = new TrackFixedSegment ( track, segment );
trackFixedSegment->_postCreate (); trackFixedSegment->_postCreate();
Session::addInsertEvent ( trackFixedSegment, track );
ltrace(190) << "Adding: " << segment << " on " << track << endl; ltrace(190) << "Adding: " << segment << " on " << track << endl;
ltrace(200) << "TrackFixedSegment::create(): " << trackFixedSegment << endl; ltrace(200) << "TrackFixedSegment::create(): " << trackFixedSegment << endl;
Session::addInsertEvent( trackFixedSegment, track );
} }
return trackFixedSegment; return trackFixedSegment;
} }
AutoSegment* TrackFixedSegment::base () const { return NULL; } AutoSegment* TrackFixedSegment::base () const { return NULL; }
bool TrackFixedSegment::isFixed () const { return true; }
bool TrackFixedSegment::isBlockage () const { return _isBlockage; }
DbU::Unit TrackFixedSegment::getAxis () const { return getTrack()->getAxis(); } DbU::Unit TrackFixedSegment::getAxis () const { return getTrack()->getAxis(); }
bool TrackFixedSegment::isHorizontal () const { return getTrack()->isHorizontal(); } bool TrackFixedSegment::isHorizontal () const { return getTrack()->isHorizontal(); }
bool TrackFixedSegment::isVertical () const { return getTrack()->isVertical(); } bool TrackFixedSegment::isVertical () const { return getTrack()->isVertical(); }
bool TrackFixedSegment::isFixed () const { return true; }
unsigned int TrackFixedSegment::getDirection () const { return getTrack()->getDirection(); } unsigned int TrackFixedSegment::getDirection () const { return getTrack()->getDirection(); }
const Layer* TrackFixedSegment::getLayer () const { return _segment->getLayer(); } const Layer* TrackFixedSegment::getLayer () const { return _segment->getLayer(); }
Interval TrackFixedSegment::getFreeInterval ( bool useOrder ) const { return Interval(); } Interval TrackFixedSegment::getFreeInterval () const { return Interval(); }
unsigned long TrackFixedSegment::getId () const unsigned long TrackFixedSegment::getId () const
@ -215,7 +206,7 @@ namespace Kite {
Net* TrackFixedSegment::getNet () const Net* TrackFixedSegment::getNet () const
{ {
Net* realNet = _segment->getNet(); Net* realNet = _segment->getNet();
if ( realNet->isSupply() or realNet->isClock() ) if (realNet->isSupply() or realNet->isClock())
return _blockageNet; return _blockageNet;
return realNet; return realNet;
} }
@ -224,14 +215,14 @@ namespace Kite {
TrackElement* TrackFixedSegment::getNext () const TrackElement* TrackFixedSegment::getNext () const
{ {
size_t dummy = _index; size_t dummy = _index;
return _track->getNext ( dummy, getNet() ); return _track->getNext( dummy, getNet() );
} }
TrackElement* TrackFixedSegment::getPrevious () const TrackElement* TrackFixedSegment::getPrevious () const
{ {
size_t dummy = _index; size_t dummy = _index;
return _track->getPrevious ( dummy, getNet() ); return _track->getPrevious( dummy, getNet() );
} }
@ -247,7 +238,7 @@ namespace Kite {
+ " " + DbU::getValueString(_targetU-_sourceU) + " " + DbU::getValueString(_targetU-_sourceU)
+ " [" + ((_track) ? getString(_index) : "npos") + "] " + " [" + ((_track) ? getString(_index) : "npos") + "] "
+ "F" + "F"
+ ((_isBlockage) ? "B" : "-"); + ((isBlockage()) ? "B" : "-");
s1.insert ( s1.size()-1, s2 ); s1.insert ( s1.size()-1, s2 );
return s1; return s1;
@ -256,11 +247,10 @@ namespace Kite {
Record* TrackFixedSegment::_getRecord () const Record* TrackFixedSegment::_getRecord () const
{ {
Record* record = TrackElement::_getRecord (); Record* record = TrackElement::_getRecord();
record->add ( getSlot ( "_segment", _segment ) ); record->add( getSlot( "_segment", _segment ) );
return record; return record;
} }
} // End of Kite namespace. } // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,35 +12,28 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./TrackMarker.cpp" | // | C++ Module : "./TrackMarker.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <iomanip>
#include <sstream>
#include <iomanip> #include "hurricane/Bug.h"
#include <sstream> #include "hurricane/Warning.h"
#include "hurricane/RoutingPad.h"
#include "hurricane/Bug.h" #include "hurricane/Net.h"
#include "hurricane/Warning.h" #include "hurricane/Name.h"
#include "hurricane/RoutingPad.h" #include "crlcore/RoutingGauge.h"
#include "hurricane/Net.h" #include "katabatic/GCell.h"
#include "hurricane/Name.h" #include "kite/TrackMarker.h"
#include "crlcore/RoutingGauge.h" #include "kite/Track.h"
#include "katabatic/GCell.h" #include "kite/RoutingPlane.h"
#include "kite/TrackMarker.h" #include "kite/Session.h"
#include "kite/Track.h" #include "kite/RoutingEvent.h"
#include "kite/RoutingPlane.h" #include "kite/KiteEngine.h"
#include "kite/Session.h"
#include "kite/RoutingEvent.h"
#include "kite/KiteEngine.h"
namespace Kite { namespace Kite {
using std::cerr; using std::cerr;
using std::endl; using std::endl;
using std::ostringstream; using std::ostringstream;
@ -101,7 +89,7 @@ namespace Kite {
Track* track = rp->getTrackByPosition ( trackSpan.getVMin() ); Track* track = rp->getTrackByPosition ( trackSpan.getVMin() );
while ( track && (track->getAxis() <= trackSpan.getVMax()) ) { while ( track && (track->getAxis() <= trackSpan.getVMax()) ) {
Session::addInsertEvent ( this, track ); Session::addInsertEvent ( this, track );
track = track->getNext (); track = track->getNextTrack();
_refcount++; _refcount++;
} }
} }
@ -139,7 +127,6 @@ namespace Kite {
return record; return record;
} }
} // End of Kite namespace. } // Kite namespace.

File diff suppressed because it is too large Load Diff

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,12 +12,7 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./TrackSegmentCost.cpp" | // | C++ Module : "./TrackSegmentCost.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <cstdlib> #include <cstdlib>

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,22 +12,17 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./Tracks.cpp" | // | C++ Module : "./Tracks.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include <iostream> #include <iostream>
#include "kite/Track.h"
#include "kite/Track.h" #include "kite/Tracks.h"
#include "kite/Tracks.h" #include "kite/RoutingPlane.h"
#include "kite/RoutingPlane.h"
namespace Kite { namespace Kite {
using std::cerr; using std::cerr;
using std::endl; using std::endl;
using Hurricane::tab; using Hurricane::tab;
@ -56,8 +46,8 @@ namespace Kite {
_track = routingPlane->getTrackByPosition ( _constraints.getVMin() ); _track = routingPlane->getTrackByPosition ( _constraints.getVMin() );
if ( _track && (_track->getAxis() < _constraints.getVMin()) ) _track = _track->getNext(); if ( _track and (_track->getAxis() < _constraints.getVMin()) ) _track = _track->getNextTrack();
if ( _track && (_track->getAxis() > _constraints.getVMax()) ) _track = NULL; if ( _track and (_track->getAxis() > _constraints.getVMax()) ) _track = NULL;
ltrace(147) << "_track: " << _track << endl;; ltrace(147) << "_track: " << _track << endl;;
} }
@ -87,8 +77,8 @@ namespace Kite {
{ {
if ( !_track ) return; if ( !_track ) return;
_track = _track->getNext (); _track = _track->getNextTrack();
if ( _track && (_track->getAxis() > _constraints.getVMax()) ) _track = NULL; if ( _track and (_track->getAxis() > _constraints.getVMax()) ) _track = NULL;
} }
@ -170,12 +160,12 @@ namespace Kite {
if ( _maxTrack->getAxis() > _constraints.getVMax() ) _maxTrack = NULL; if ( _maxTrack->getAxis() > _constraints.getVMax() ) _maxTrack = NULL;
if ( _minTrack && !_maxTrack ) { if ( _minTrack && !_maxTrack ) {
_minTrack = _minTrack->getPrevious (); _minTrack = _minTrack->getPreviousTrack();
if ( _minTrack->getAxis() < _constraints.getVMin() ) _minTrack = NULL; if (_minTrack->getAxis() < _constraints.getVMin()) _minTrack = NULL;
} }
if ( _maxTrack && !_minTrack ) { if ( _maxTrack && !_minTrack ) {
_maxTrack = _maxTrack->getNext (); _maxTrack = _maxTrack->getNextTrack();
if ( _maxTrack->getAxis() > _constraints.getVMax() ) _maxTrack = NULL; if ( _maxTrack->getAxis() > _constraints.getVMax() ) _maxTrack = NULL;
} }
@ -237,7 +227,7 @@ namespace Kite {
if ( _onMin ) { if ( _onMin ) {
_onMin = (_maxTrack == NULL); _onMin = (_maxTrack == NULL);
if ( _minTrack ) { if ( _minTrack ) {
_minTrack = _minTrack->getPrevious(); _minTrack = _minTrack->getPreviousTrack();
if ( _minTrack ) { if ( _minTrack ) {
if ( _minTrack->getAxis() < _optimal.getVMin() ) _inMinOptimal = false; if ( _minTrack->getAxis() < _optimal.getVMin() ) _inMinOptimal = false;
@ -248,7 +238,7 @@ namespace Kite {
} else { } else {
_onMin = (_minTrack != NULL); _onMin = (_minTrack != NULL);
if ( _maxTrack ) { if ( _maxTrack ) {
_maxTrack = _maxTrack->getNext(); _maxTrack = _maxTrack->getNextTrack();
if ( _maxTrack ) { if ( _maxTrack ) {
if ( _maxTrack->getAxis() > _optimal.getVMax() ) _inMaxOptimal = false; if ( _maxTrack->getAxis() > _optimal.getVMax() ) _inMaxOptimal = false;
@ -326,4 +316,4 @@ namespace Kite {
} }
} // End of Katabatic namespace. } // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*- // -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
@ -17,13 +12,10 @@
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Module : "./VerticalTrack.cpp" | // | C++ Module : "./VerticalTrack.cpp" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#include "kite/VerticalTrack.h" #include "kite/VerticalTrack.h"
namespace Kite { namespace Kite {
@ -62,7 +54,7 @@ namespace Kite {
bool VerticalTrack::isHorizontal () const { return false; } bool VerticalTrack::isHorizontal () const { return false; }
bool VerticalTrack::isVertical () const { return true; } bool VerticalTrack::isVertical () const { return true; }
unsigned int VerticalTrack::getDirection () const { return Constant::Vertical; } unsigned int VerticalTrack::getDirection () const { return KbVertical; }
Point VerticalTrack::getPosition ( DbU::Unit coordinate ) const Point VerticalTrack::getPosition ( DbU::Unit coordinate ) const
@ -80,4 +72,4 @@ namespace Kite {
} }
} // End of Kite namespace. } // Kite namespace.

View File

@ -1,34 +1,24 @@
// -*- mode: C++; explicit-buffer-name: "Configuration.h<kite>" -*-
// -*- C++ -*-
// //
// This file is part of the Coriolis Software. // This file is part of the Coriolis Software.
// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved // Copyright (c) UPMC 2008-2013, All Rights Reserved
// //
// =================================================================== // +-----------------------------------------------------------------+
//
// $Id$
//
// x-----------------------------------------------------------------x
// | |
// | C O R I O L I S | // | C O R I O L I S |
// | K i t e - D e t a i l e d R o u t e r | // | K i t e - D e t a i l e d R o u t e r |
// | | // | |
// | Author : Jean-Paul CHAPUT | // | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== | // | =============================================================== |
// | C++ Header : "./Configuration.h" | // | C++ Header : "./kite/Configuration.h" |
// | *************************************************************** | // +-----------------------------------------------------------------+
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
#ifndef __KITE_CONFIGURATION__ #ifndef KITE_CONFIGURATION_H
#define __KITE_CONFIGURATION__ #define KITE_CONFIGURATION_H
#include <boost/function.hpp> #include <boost/function.hpp>
#include "katabatic/Configuration.h"
#include "katabatic/Configuration.h"
namespace Kite { namespace Kite {
@ -47,7 +37,6 @@ namespace Kite {
// ------------------------------------------------------------------- // -------------------------------------------------------------------
// Class : "Kite::Configuration". // Class : "Kite::Configuration".
class Configuration : public Katabatic::Configuration { class Configuration : public Katabatic::Configuration {
public: public:
typedef boost::function< void(void) > PostEventCb_t; typedef boost::function< void(void) > PostEventCb_t;
@ -68,6 +57,7 @@ namespace Kite {
~Configuration (); ~Configuration ();
// Decorateds. // Decorateds.
virtual bool isGMetal ( const Layer* ) const; virtual bool isGMetal ( const Layer* ) const;
virtual bool isGContact ( const Layer* ) const;
virtual size_t getDepth () const; virtual size_t getDepth () const;
virtual size_t getAllowedDepth () const; virtual size_t getAllowedDepth () const;
virtual size_t getLayerDepth ( const Layer* ) const; virtual size_t getLayerDepth ( const Layer* ) const;
@ -137,10 +127,10 @@ namespace Kite {
} // End of Kite namespace. } // Kite namespace.
INSPECTOR_P_SUPPORT(Kite::Configuration); INSPECTOR_P_SUPPORT(Kite::Configuration);
#endif // __KITE_CONFIGURATION__ #endif // KITE_CONFIGURATION_H

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