* ./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)
@ -40,6 +41,6 @@
add_subdirectory(src)
add_subdirectory(cmake_modules)
if(BUILD_DOC AND DOXYGEN_FOUND AND IS_DIRECTORY doc)
if(BUILD_DOC AND DOXYGEN_FOUND)
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 ( latexInstallDir share/doc/coriolis2/en/latex/kite )
@ -5,8 +6,8 @@
add_custom_target ( doc ALL cd ${KITE_SOURCE_DIR}/doc && ${DOXYGEN_EXECUTABLE} doxyfile )
install ( DIRECTORY html/ DESTINATION ${htmlInstallDir} )
# install ( FILES customHierarchy.html DESTINATION ${htmlInstallDir} )
# install ( FILES customSummary.html DESTINATION ${htmlInstallDir} )
install ( FILES customHierarchy.html DESTINATION ${htmlInstallDir} )
install ( FILES customSummary.html DESTINATION ${htmlInstallDir} )
install ( DIRECTORY latex/ DESTINATION ${latexInstallDir} )
install ( FILES asimbook.cls DESTINATION ${latexInstallDir} )

View File

@ -1,597 +1,246 @@
// -*- C++ -*-
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
* \brief Manage TrackSegment routing requests.
* \brief Atomic Placement Request for a TrackSegment
*
* The \RoutingEvent is the workhorse of Kite. A \RoutingEvent is
* 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).
* \red{The trackFrees attribute has to be reviewed not sure it's still useful.}
*
* \see ClassManipulator.
*
* \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>
* Cached key for stable sorting, see RoutingEvent::Key.
*/
/*! \function bool RoutingEvent::isProcessed () const;
* \return \true if this event has already been processed.
*
* \remark Note that inside a _setAside() a \RoutingEvent can be re-posted for
* a given \TrackSegment which has been processed yet. This can lead
* to two or more \RoutingEvent in the queue (as we cannot easily remove
* a \RoutingEvent already in the queue). We need this new \RoutingEvent
* because we want to reschedule with a new priority/slack.
* As we cannot remove the previous \RoutingEvent, we mark it as
* processed for it to be ignored by the scheduler.
//! \enum RoutingEvent::Mode
//! The working mode of the router, affect how events are to
//! be handled.
//! \var RoutingEvent::Negociate
//! This is the normal mode of operation, topological modifications
//! and ripup are enableds.
//! \var RoutingEvent::Pack
//! 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;
* \Return The associated and unique \TrackSegment.
*/
//! \function unsigned int RoutingEvent::getEventLevel () const;
//! \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;
* \Return The second criterion used to sort \RoutingEvents in the negociation queue.
* 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::getTracksNb () const;
//! \sreturn The number of tracks avalaibles for the segment to be placed.
/*! \function unsigned int RoutingEvent::getEventLevel () const;
* \Return The first criterion used to sort \RoutingEvents in the negociation queue.
* It is used to re-schedule a \RoutingEvent and make the new event be
* processed <i>before</i> the original one, which is marked as
* <i>processed</i> to be ignored.
*
* \see setEventLevel().
*/
//! \function unsigned int RoutingEvent::getInsertState () const;
//! \return The kind of track insertion that will be intended. It's a counter
//! whose values have the following meaning:
//! - \b 1 : normal insert.
//! - \b 2 : shrink the segment to it's minimum before inserting.
//! - \b 3 : attempt to ripup conflicting others before inserting.
/*! \function RoutingEvent* RoutingEvent::getClone () const;
* \Return An exact copy of the current \RoutingEvent.
*/
//! \function void RoutingEvent::revalidate ();
//! Perform an event revalidation.
/*! \function RoutingEvent* RoutingEvent::reschedule ( RoutingEventQueue& queue );
* \param queue The \RoutingEvent queue.
* \return The rescheduled \RoutingEvent. May be \NULL if it cannot be rescheduled.
*/
//! \function void RoutingEvent::updateKey ();
//! Update the key with the new values from the event, the key \e must
//! not be inserted in the queue when this method is called.
/*! \function void RoutingEvent::setProcessed ( bool state=true );
* \param state The state into which the event is to be put.
*
* Mark the event as processed. This arises in two cases :
* <ul>
* <li>The event has really been processed by the process() member
* function.
* <li>There has been a fork from this event and it has been
* superseded by a newly rescheduled one, so we have to
* invalidate this one.
* </ul>
*/
//! \function void RoutingEvent::process ( RoutingEventQueue& queue, RoutingEventHistory& history, RoutingEventLoop& loop );
//! \param queue The main event queue.
//! \param history The event's history list.
//! \param loop The loop detector.
//!
//! Process the event, that is:
//! - First, check if there is no looping, if any, do not process the
//! event but dicard it (marked as unimplemented).
//! - Second, attempt to place the associated segment. Pass it to the relevant
//! function, according to the router's mode (\c _processNegociate(),
//! \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 );
* \param level The new event level.
*
* \see getEventLevel().
*/
//! \function void RoutingEvent::setSegment ( TrackElement* element );
//! Change the associated \c segment. \red{Used only by TrackSegment::swapTrack().}
/*! \function void RoutingEvent::process ( RoutingEventQueue& queue, RoutingEventHistory& history );
* \param queue The event queue from the negociate algorithm.
* \param history The event history.
*
* Perform all the operations shared by all \RoutingEvent classes then
* calls the virtual _subProcess() functions.
*
* Shared operations are :
* <ol>
* <li>Invalidating all perpandicular \TrackSegments.
* <li>Computing the free interval allowed by the free intervals
* in perpandicular \Tracks holding the perpandicular \TrackSegments.
* <li>Merging in the various constraints intervals : from the
* \TrackSegment itself, from the free intervals in the
* perpandicular \Tracks and from the \RoutingEvent bound
* constraints.
* <li>Finding the candidate \Tracks for the \RoutingEvent,
* using \c Track_Spiral \Collection.
* </ol>
* The results of the shared operation are passed to derived classes
* trough the \c State internal structure.
*/
//! \function RoutingEvent* RoutingEvent::reschedule ( RoutingEventQueue& queue, unsigned int eventLevel);
//! \return The newly reinserted event. Depending on the cases it could be itself.
//!
//! Insert or reinsert an event in the scheduler. The \c eventLevel parameter only
//! allows to increase the level (if it is less than the current level of the
//! event, it will be ignored).
//!
//! <b>Cloning Management.</b> As an event could be cloned, if we try to re-insert
//! a disabled original, we must first lookup the currently cloned active event.
//! This is done through the associated \c segment which must always be associated
//! with the active event (if any).
//!
//! <b>Unimplemented Protection.</b> If the unimplemented flag is set the reschedule
//! is cancelled (\c NULL is returned).
//!
//! <b>Unprocessed Event.</b> The event is still in queue, waiting to be
//! processed, then just repush it in the queue with it's new level.
//!
//! <b>Processed Event.</b> Clone the already processed one, activate it
//! and push it on the queue.
//!
//! <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 );
* \param track The track in wich to make free space.
* \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::setMode ( unsigned int mode );
//! Set the mode in which the event must be processed (see RoutingEvent::Mode).
/* \function void RoutingEvent::_ripup ( Track* track, Net* net, Interval interval, size_t begin, size_t end, RoutingEventQueue& queue );
* \param track The track in wich to make free space.
* \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.
*/
//! \function void RoutingEvent::setState ( unsigned int state );
//! Proxy mutator for DataNegociate::setState().
} // 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 @@
// -*- C++ -*-
// -*- mode: C++; explicit-buffer-name: "Session.dox<kite>" -*-
namespace Kite {
/*! \class Session
* \brief Kite update Session (\b API).
* \brief Kite update Session
*
* Session extend the Katabatic update session to the Kite
* 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
* \ref katabaticSession.
* Katabatic::Session.
*
*
* \section secSessionMechanism The Session Mechanism.
*
* Delayed modification procedure :
* <ol>
* <li>Modifications events are recorded into the Session.
* At this step, no modification are actually done, the
* data-base retains it's previous state and coherency.
* <li>The Revalidate() procedure is called (or the Session
* is closed), then all the modification events are applied.
* the data-base is in it's new state.
* </ol>
* - Modifications events are recorded (queued) into the Session.
* At this step, no modification are actually done, the
* data-base retains it's previous state and coherency.
* - The \c revalidate() procedure is called (or the Session
* is closed), then all the modification events are applied.
* The data-base is in now in it's new state.
*
*
* \section secKiteSessionRevalidate The Revalidate Algorithm.
*
* Revalidation steps :
* <ol>
* <li>process all remove events. detach TrackSegment from
* their Track, but do not remove the pointer from the
* internal \vector.
* <li>Pack all Track in which removal have took place.
* <li>process all insert events. This is the time TrackSegment
* are moved into their new Track (physical displacement).
* <li>Call the Katabatic::Session::revalidate() method.
* <li>Recompute the canonical position of source and target
* of all invalidateds TrackSegment (take account of
* extention modifications).
* <li>Perform a sort() on all Track that have been modifieds.
* </ol>
*/
/*! \name Accessors
*/
// \{
/*! \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.
* - Process all remove events. detach TrackSegment from
* their Track, but do not remove the pointer from the
* internal \vector.
* - Pack all Track in which removal have took place.
* - Process all insert events. <b>This is the time TrackSegment
* are moved into their new Track (physical displacement)</b>.
* It is at this point that the invalidation of both AutoSegment
* and TrackSEgment is done.
* - Call the Katabatic::Session::revalidate() method which
* will recompute the correct contact extensions and topologies.
* \e After this step the Katabatic data-base is up to date,
* but \e not the Kite one. AutoSEgment are revalidated.
* - 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
* AutoSegment that are canonical.
* - Perform a sort() on all Track that have been modifieds.
*
* Open a new Kite update Session on the \c kite \c ToolEngine.
* At this point only one session can be opened at a time. Attempt
* to open a second one will result in an exception.
*/
// \}
/*! \name Event Scheduling
*/
// \{
/* \function void Session::addInvalidated ( TrackSegment* segment );
* \param segment An AutoSegment that has been moved.
* <b>Note:</b> We cannot use the Observer mechanism to automatically
* update TrackSegment from an AutoSegment, because we must wait for all
* AutoSegments (canonical or not) involved into the TrackSegment to be
* up to date before we can update it.
*
* add \e segment to the \vector of TrackSegment for which we
* have to recompute the canonical size (i.e. extentions may
* have moved).
* <b>Note:</b> Have to talk about the special case when new canonical
* AutoSegment appears after dogleg creation.
*
*
* \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 );
* \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 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.
//! 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 );
* \param segment An AutoSegment to remove from a Track.
*
* Schedule the removal of \e segment from Track \e track.
*/
//! \function Session* Session::get ( const char* message=NULL );
//! \sreturn The currently opened session, \c NULL if no session has
//! been opened.
/*! \function void Session::addMoveEvent ( TrackSegment* 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 Katabatic::Session* Session::base ();
//! \sreturn The Session, casted as it's base object.
/*! \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.
*
* \see Track::pack() & Track::sort().
*/
//! \function bool Session::isEmpty ();
//! Ensure that the Session is empty and can be closed (deleted)
//! safely.
//! \function Configuration* Session::getConfiguration ();
//! \sreturn The Kite Configuration of the Router (proxy helper).
//! \function Net* Session::getBlockageNet ();
//! \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
* \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
*
* Basically a Track is a sorted vector of TrackSegment, TrackSegment
* beeing a decoration of the Katabatic::AutoSegment. Managment rules :
* <ul>
* <li><b>Rule 1 :</b> the vector of TrackSegment is sorted by
* increasing source positions.
* <li><b>Rule 2 :</b> two consecutives segments TrackSegment do
* not overlap, except in case of <b>rule 3</b>.
* <li><b>Rule 3 :</b> if they belongs to the same \Net, two
* consecutive segments can overlap, see Track::getNetUsedInterval().
* </ul>
* A Track is implemented with a sorted vector of TrackElement.
* TrackElements from differents nets must not overlap.
* The sorting order is defined as follow:
* - TrackElements are sorted by increasing source (\e min)
* positions.
* - In case of overlap (i.e. belongs to the same net), if
* they share the same source position, then they are sorted
* by \e decreasing length. This way, the longest one will be
* the first encountered when walking through the Track in
* 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
*
* 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
* modifications.
*
* <b>Indexes vs. Iterators</b>
* \subsection ssecTrackIndexes Indexes vs. Iterators
*
* Numerical indexes have been prefered over iterators because they can
* be used more easily by objects other the Track itself for referencing.
* So internal managment follow the same rule, handling indexes or
* reference to indexes.
*
* <b>Looking up free/used zones</b>
*
* The most important operation performed on a Track is to locate
* 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()).
* \subsection ssecTrackUpdate Update Mechanism
*
* \image html Track-2.png "Track Zones - First Approach"
* \image latex Track-2.pdf "Track Zones - First Approach" width=0.7\textwidth
* When a TrackElement is normaly inserted in a Track, a two way link
* 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
* efficient to work on \c lower_bound-1 instead of \c lower_bound.
* <b>TrackElement Removal</b>
*
* \image html Track-3.png "Track Zones - Optimized"
* \image latex Track-3.pdf "Track Zones - Optimized" width=0.7\textwidth
*/
/*! \enum Track::IndexState
* Indicates how to compute the bounds of the interval enclosing
* a given position.
* To remove a TrackElement from a Track, we break one of those two links:
* 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
* marked for removal.
*
* \note According to \e position, the interval can be a free interval
* 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).
* \image html Track-2.png "Fig 3: TrackElement Removal"
*
* 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).
* <b>TrackElement Insertion</b>
*
* 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.
* When a TrackElement is inserted into a Track, the two way link is
* immediatly created (but the TrackElement is not yet at it's final
* place in the Track's vector). Before inserting a TrackElement we
* check that it's been already detached (\c track field to \c NULL).
*
* 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 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.
* It is at that step that the TrackElement axis is actually updated
* through a call to TrackElement::setAxis().
*
* <b>Revalidation Sequence</b>
*
* The relation between the returned \e index and the position is
* given through the \e state parameter.
* After a Track has been modificated either the Track element vector or
* 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.
*/
/*! \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.
* 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.
*
*
*
* \see Track::IndexState.
*/
/*! \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.
* \subsection ssecTrackOperations Main Operations on Tracks
*
* \see Track::IndexState.
*/
/*! \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.
* <b>Helper Function:</b> Track::getBeginIndex()
*
* \image html Track-4.png "Overlap - Example 1"
* \image html Track-5.png "Overlap - Example 2"
* \image latex Track-4.pdf "Overlap - Example 1" width=0.7\textwidth
* \image latex Track-5.pdf "Overlap - Example 2" width=0.7\textwidth
*/
/*! \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[ .
* 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.
*
* \note \c ]begin,end[ must define a free interval between two TrackSegment.
*/
/*! \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.
* <b>Helper Function:</b> Track::getOccupiedInterval()
*
* Perform a complete Track check. Looks for the following incoherencies :
* <ul>
* <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>
* Returns the complete interval of a set of overlapping TrackElement from
* the same net.
*/
/*! \function void Track::checkOverlap () const;
* \return the number of overlaping TrackSegment.
*
* Perform the following checks :
* <ul>
* <li>Two consecutive TrackSegment from different \Net must not
* overlap.
* <li>For TrackSegment starting from the same position, the
* longuest must be first.
* </ul>
*/
//! \enum Track::IndexState
//! Indicates how to compute the bounds of the interval enclosing
//! a given \c position on track axis.
//!
//! \note According to \e position, the interval can be a free interval
//! or a used interval.
/*! \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.
*/
//! \var Track::BeginIsTrackMin
//! (implies \c begin=0) there is no TrackElement \e before \c position
/*! \function DbU::Unit Track::getOverlapCost ( Interval interval, Net* net, size_t begin, size_t end ) const;
* \param interval the overlaping interval.
* \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.
*/
//! \var Track::BeginIsSegmentMin
//! The \c begin segment starts \e before \c position and ends \e after.
/*! \function DbU::Unit Track::getOverlapCost ( Interval interval, Net* net ) const;
* \param interval the overlaping interval.
* \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::BeginIsSegmentMax
//! The \c begin segment starts and ends \e before \c position.
// \}
//! \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 );
* adds \e segment to the Track. Must only be used inside a
* TrackSession.
*
* \see TrackSession.
*/
//! \var Track::EndIsSegmentMax
//! The \c begin segment starts \e before \c position and ends \e after.
/*! \function size_t Track::pack ();
* \Return 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).
*/
//! \var Track::BeforeFirstElement
//! the \c position is before the first TrackElement.
/*! \function void Track::sort ();
*
* sort the the vector. Must be called \e after the Pack() method,
* so no detached TrackSegment are presents.
*/
//! \var Track::InsideElement
//! the \c position is inside a TrackElement.
// \}
//! \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++ -*-
namespace Kite {
/*! \typedef SegmentOverlapCostCB
* Prototype of overlap cost callback functions.
*
* \see TrackSegment::setOverlapCostCB(), TrackSegment::getOverlapCost().
*/
/*! \class TrackSegment
* \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,
* 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
* set has it's extention modified, the full extention must be
* 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.
*/
// \}
/*! \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).
* \section secTSLazyRevalidate Lazy Revalidate
*
* \see Track::getNext().
*/
/*! \function TrackSegment* TrackSegment::getPrevious () const;
* \Return The previous TrackSegment in the Track (can be \NULL).
* 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.
*
* \see Track::getPrevious().
*/
/*! \function Interval TrackSegment::getFreeInterval () const;
* \Return The free interval around this TrackSegment in the Track.
*/
/*! \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.
* 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
* SegmentFsm constructor. This should be optimzed in the future.
* - 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.
*
* \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 ();
* add \e this TrackSegment to the Kite level update Session.
* Something maybe buggy here, or at least not very clean.
*/
//! \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.
/* \function void TrackSegment::refreshCanonical ();
* Recompute the letfmost & rightmost position of the collapsed set.
* Must be done after each modification of the TrackSegment.
* Dealt by the TrackSession mechanism.
*
*/
//! \function unsigned long TrackElement::getFreedomDegree() const;
//! \sreturn The degree of freedom of the element. It is used as a priority value
//! when sorting TrackElement (in RoutingEvent).
//!
//! 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
# --------------------------------------------------------------------
@ -24,7 +26,8 @@ TAB_SIZE = 2
ALIASES = "function=\fn"\
"important=\par Important:\n"\
"remark=\par Remark:\n"\
"Return=<b>Returns:</b>"\
"sreturn=\b Returns:"\
"sa=<b>See also:</b>&nbsp;"\
"True=\b True"\
"true=\b true"\
"False=\b False"\
@ -33,7 +36,7 @@ ALIASES = "function=\fn"\
"HORIZONTAL=\b HORIZONTAL"\
"NULL=\c NULL"\
"vector=\c vector"\
"lower_bound=\c lower_bound"\
"lower_bound=\c lower_bound()"\
"Collection=\c Collection"\
"Collections=\c Collections"\
"Interval=\c Interval"\
@ -72,7 +75,9 @@ ALIASES = "function=\fn"\
"Session=\c Session"\
"Sessions=\c Sessions"\
"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_JAVA = NO
SUBGROUPING = YES
@ -91,7 +96,7 @@ HIDE_FRIEND_COMPOUNDS = NO
HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO
CASE_SENSE_NAMES = YES
HIDE_SCOPE_NAMES = NO
HIDE_SCOPE_NAMES = YES
SHOW_INCLUDE_FILES = YES
INLINE_INFO = YES
SORT_MEMBER_DOCS = NO
@ -117,13 +122,30 @@ WARN_LOGFILE =
# Configuration options related to the input files
INPUT = \
../src/kite/TrackSegment.h ../src/TrackSegment.cpp TrackSegment.dox \
../src/kite/TrackSegmentCost.h ../src/TrackSegmentCost.cpp TrackSegmentCost.dox \
../src/kite/Track.h ../src/Track.cpp Track.dox \
../src/kite/TrackCost.h ../src/TrackCost.cpp TrackCost.dox \
../src/kite/RoutingEvent.h ../src/RoutingEvent.cpp RoutingEvent.dox \
../src/kite/Session.h Session.dox \
Kite.dox
../src/kite/Constants.h Constants.dox \
../src/kite/KiteEngine.h KiteEngine.dox \
../src/kite/DataNegociate.h ../src/DataNegociate.cpp DataNegociate.dox \
../src/kite/TrackMarker.h ../src/TrackMarker.cpp TrackMarker.dox \
../src/kite/TrackElement.h ../src/TrackElement.cpp TrackElement.dox \
../src/kite/TrackSegment.h ../src/TrackSegment.cpp TrackSegment.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 \
*.cpp \
@ -166,7 +188,7 @@ HTML_OUTPUT = html
HTML_FILE_EXTENSION = .html
HTML_HEADER = header.html
HTML_FOOTER = footer.html
HTML_STYLESHEET = ASIM.css
HTML_STYLESHEET = SoC.css
HTML_ALIGN_MEMBERS = YES
GENERATE_HTMLHELP = NO
CHM_FILE =
@ -250,7 +272,7 @@ SKIP_FUNCTION_MACROS = YES
# --------------------------------------------------------------------
# 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
GENERATE_TAGFILE = html/kite.tag
ALLEXTERNALS = NO

View File

@ -9,7 +9,7 @@
<table class="footer2">
<tr>
<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>
</table>
</body>

View File

@ -1,17 +1,16 @@
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Kite - Detailed Router: Router Documentation</title>
<link href="ASIM.css" rel="stylesheet" type="text/css">
<title>Kite - Detailed Router</title>
<link href="SoC.css" rel="stylesheet" type="text/css">
</head>
<h1 class="header">Kite - Detailed Router</h1>
<center class="header">
<table class="header">
<tr>
<td><a href="index.html">Summary</a></td>
<td><a href="modules.html">Concepts</a></td>
<td><a href="customSummary.html">Summary</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="functions.html">Member Index</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
Center
Metric
Inches
Letter
100.00
Single
-2
1200 2
6 495 405 4320 6120
1 4 0 1 0 7 50 -1 -1 4.000 1 0.0000 1800 585 45 45 1755 585 1845 585
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
0 32 #ffffdd
6 1500 1725 2100 5325
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
2 1 0 3 0 7 60 -1 10 0.000 0 0 -1 1 0 2
3 1 2.00 120.00 240.00
1575 5850 4275 5850
2 1 0 3 0 7 60 -1 10 0.000 0 0 -1 0 0 2
1575 5805 1575 5895
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
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
1575 2250 2025 2250 2025 5250 1575 5250 1575 2250
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
1575 3750 2025 3750
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
1575 2250 1575 1800 2025 1800 2025 2250 1575 2250
4 0 0 50 -1 14 16 1.5708 4 165 990 1875 3450 net<a>\001
4 0 0 50 -1 14 16 1.5708 4 210 825 1875 4950 [5,8[\001
4 1 7 40 -1 14 16 1.5708 4 165 330 1875 2025 TS\001
-6
2 2 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 5
0 0 4725 0 4725 6525 0 6525 0 0
6 2100 1725 2700 5325
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
Center
Metric
Inches
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
0 32 #ffffdd
6 600 -525 8175 3075
6 3525 1275 7575 1875
6 3525 1275 4125 1875
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 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
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 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5550 1350 5550 1800
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
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 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 3525 1875 7575 2475
6 3525 1875 4125 2475
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
3600 1950 4050 1950 4050 2400 3600 2400 3600 1950
4 1 7 40 -1 14 16 0.0000 4 165 330 3825 2250 TS\001
-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 1 0 7 50 -1 0 0.000 1 0.0000 2160 1935 135 135 2025 1935 2295 1935
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 3510 1935 135 135 3375 1935 3645 1935
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 5310 1935 135 135 5175 1935 5445 1935
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 6300 1935 135 135 6165 1935 6435 1935
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 900 2610 135 135 765 2610 1035 2610
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 3060 135 135 765 3060 1035 3060
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 3510 135 135 765 3510 1035 3510
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 3960 135 135 765 3960 1035 3960
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 4410 135 135 765 4410 1035 4410
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 900 4860 135 135 765 4860 1035 4860
1 4 0 1 0 7 50 -1 0 0.000 1 0.0000 810 1935 135 135 675 1935 945 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
-1575 -675 8325 -675 8325 5400 -1575 5400 -1575 -675
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
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
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
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
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
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
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
1170 945 1125 945 1125 1305 1170 1305
2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
675 2385 4410 2385 4410 5085 675 5085 675 2385
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 [1]\001
4 1 0 50 -1 14 12 0.0000 4 165 315 2925 225 [2]\001
4 1 0 50 -1 14 12 0.0000 4 165 315 4635 225 [3]\001
4 1 0 50 -1 14 12 0.0000 4 165 315 6975 225 [4]\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 1125 -90 405 lower_bound\001
4 1 7 40 -1 18 14 0.0000 4 150 120 810 2025 1\001
4 1 7 40 -1 18 14 0.0000 4 150 120 1485 2025 2\001
4 1 7 40 -1 18 14 0.0000 4 150 120 2160 2025 3\001
4 1 7 40 -1 18 14 0.0000 4 150 120 3510 2025 2\001
4 1 7 40 -1 18 14 0.0000 4 150 120 5310 2025 3\001
4 1 7 40 -1 18 14 0.0000 4 150 120 6300 2025 4\001
4 1 7 40 -1 18 14 0.0000 4 150 120 7335 2025 5\001
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 4905 [\001
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 4455 [\001
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 4005 [\001
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 3555 [\001
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 3105 [\001
4 0 0 50 -1 14 14 0.0000 4 180 135 1215 2655 [\001
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 3105 ]\001
4 0 0 50 -1 14 14 0.0000 4 180 540 1395 2655 _min\001
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 3150 ,\001
4 0 0 50 -1 14 14 0.0000 4 180 1080 2925 3105 max(i-1)\001
4 0 0 50 -1 14 14 0.0000 4 180 1080 1440 3105 min(i-1)\001
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 2655 ]\001
4 0 0 50 -1 14 14 0.0000 4 180 810 2925 2655 min(i)\001
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 2700 ,\001
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 3555 ]\001
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 4005 ]\001
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 4455 ]\001
4 0 0 50 -1 14 14 0.0000 4 180 135 4140 4905 ]\001
4 0 0 50 -1 14 14 0.0000 4 180 810 2925 3555 min(i)\001
4 0 0 50 -1 14 14 0.0000 4 180 1080 2925 4005 max(i-1)\001
4 0 0 50 -1 14 14 0.0000 4 135 540 2925 4455 _max\001
4 0 0 50 -1 14 14 0.0000 4 135 540 2925 4905 _max\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 14 0.0000 4 180 1080 1440 4005 min(i-1)\001
4 0 0 50 -1 14 14 0.0000 4 180 1080 1440 4455 max(i-1)\001
4 0 0 50 -1 14 14 0.0000 4 180 540 1440 4905 _min\001
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 3600 ,\001
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 4050 ,\001
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 4500 ,\001
4 0 0 50 -1 14 14 0.0000 4 60 135 2700 4950 ,\001
4 1 7 40 -1 10 14 0.0000 4 135 90 900 2700 1\001
4 1 7 40 -1 18 14 0.0000 4 150 120 900 3150 2\001
4 1 7 40 -1 18 14 0.0000 4 150 120 900 3600 3\001
4 1 7 40 -1 18 14 0.0000 4 150 120 900 4050 4\001
4 1 7 40 -1 18 14 0.0000 4 150 120 900 4500 5\001
4 1 7 40 -1 18 14 0.0000 4 150 120 900 4950 6\001
1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 7275 2175 75 75 7200 2175 7350 2175
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5550 1950 5550 2400
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
7500 1950 7500 2400 4050 2400 4050 1950 7500 1950
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7050 1950 7050 2400
4 0 0 50 -1 14 16 0.0000 4 165 990 5850 2250 net<b>\001
4 0 0 50 -1 14 16 0.0000 4 225 990 4350 2250 [8,10[\001
-6
6 3525 2475 7575 3075
6 3525 2475 4125 3075
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
3600 2550 4050 2550 4050 3000 3600 3000 3600 2550
4 1 7 40 -1 14 16 0.0000 4 165 330 3825 2850 TS\001
-6
1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 7275 2775 75 75 7200 2775 7350 2775
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5550 2550 5550 3000
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
7500 2550 7500 3000 4050 3000 4050 2550 7500 2550
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7050 2550 7050 3000
4 0 0 50 -1 14 16 0.0000 4 165 990 5850 2850 net<c>\001
4 0 0 50 -1 14 16 0.0000 4 225 1155 4350 2850 [12,30[\001
-6
6 1425 225 6375 975
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 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
4 1 7 40 -1 14 16 0.0000 4 165 825 2100 525 Track\001
-6
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 825 3000 1425 3150 1575 3600 1575
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
2400 825 2400 2025 2550 2175 3600 2175
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 825 1800 2625 1950 2775 3600 2775
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 300 2550 0 2700 -150 7650 -150 7800 0 7800 1425
7650 1575 7350 1575
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
2400 300 2400 -150 2550 -300 7800 -300 7950 -150 7950 2025
7800 2175 7500 2175
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 300 2250 -300 2400 -450 7950 -450 8100 -300 8100 2625
7950 2775 7500 2775
2 1 0 4 4 7 40 -1 -1 0.000 0 0 -1 0 0 2
7650 1950 7800 2400
2 1 0 4 4 7 40 -1 -1 0.000 0 0 -1 0 0 2
7800 1950 7650 2400
4 0 0 50 -1 18 16 0.0000 4 255 330 600 675 (a)\001
-6
6 3525 6525 7575 7125
6 3525 6525 4125 7125
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
3600 6600 4050 6600 4050 7050 3600 7050 3600 6600
4 1 7 40 -1 14 16 0.0000 4 165 330 3825 6900 TS\001
-6
1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 7275 6825 75 75 7200 6825 7350 6825
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5550 6600 5550 7050
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
7500 6600 7500 7050 4050 7050 4050 6600 7500 6600
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7050 6600 7050 7050
4 0 0 50 -1 14 16 0.0000 4 165 990 5850 6900 net<c>\001
4 0 0 50 -1 14 16 0.0000 4 225 1155 4350 6900 [12,30[\001
-6
6 3525 5325 7575 5925
6 3525 5325 4125 5925
2 2 0 2 0 7 50 -1 0 0.000 0 0 -1 0 0 5
3600 5400 4050 5400 4050 5850 3600 5850 3600 5400
4 1 7 40 -1 14 16 0.0000 4 165 330 3825 5700 TS\001
-6
1 4 0 2 0 7 50 -1 -1 0.000 1 0.0000 7275 5625 75 75 7200 5625 7350 5625
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
5550 5400 5550 5850
2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5
7500 5400 4050 5400 4050 5850 7500 5850 7500 5400
2 1 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 2
7050 5400 7050 5850
4 0 0 50 -1 14 16 0.0000 4 165 990 5850 5700 net<a>\001
4 0 0 50 -1 14 16 0.0000 4 210 825 4350 5700 [5,8[\001
-6
6 3525 5925 7575 6525
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
5550 6000 5550 6450
2 2 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 5
7500 6000 4050 6000 4050 6450 7500 6450 7500 6000
2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2
7050 6000 7050 6450
2 2 0 2 4 4 50 -1 20 0.000 0 0 -1 0 0 5
3600 6000 4050 6000 4050 6450 3600 6450 3600 6000
4 0 4 50 -1 14 16 0.0000 4 165 990 5850 6300 net<b>\001
4 0 4 50 -1 14 16 0.0000 4 225 990 4350 6300 [8,10[\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++ -*-
//
// 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 |
@ -15,27 +14,26 @@
// +-----------------------------------------------------------------+
#include <map>
#include <list>
#include "hurricane/Error.h"
#include "hurricane/Warning.h"
#include "hurricane/DataBase.h"
#include "hurricane/Technology.h"
#include "hurricane/BasicLayer.h"
#include "hurricane/RegularLayer.h"
#include "hurricane/Horizontal.h"
#include "hurricane/Vertical.h"
#include "hurricane/NetExternalComponents.h"
#include "hurricane/Instance.h"
#include "hurricane/Plug.h"
#include "hurricane/Path.h"
#include "hurricane/Query.h"
#include "crlcore/AllianceFramework.h"
#include "kite/RoutingPlane.h"
#include "kite/TrackFixedSegment.h"
#include "kite/Track.h"
#include "kite/KiteEngine.h"
#include <map>
#include <list>
#include "hurricane/Error.h"
#include "hurricane/Warning.h"
#include "hurricane/DataBase.h"
#include "hurricane/Technology.h"
#include "hurricane/BasicLayer.h"
#include "hurricane/RegularLayer.h"
#include "hurricane/Horizontal.h"
#include "hurricane/Vertical.h"
#include "hurricane/NetExternalComponents.h"
#include "hurricane/Instance.h"
#include "hurricane/Plug.h"
#include "hurricane/Path.h"
#include "hurricane/Query.h"
#include "crlcore/AllianceFramework.h"
#include "kite/RoutingPlane.h"
#include "kite/TrackFixedSegment.h"
#include "kite/Track.h"
#include "kite/KiteEngine.h"
namespace {
@ -43,6 +41,8 @@ namespace {
using namespace std;
using Hurricane::tab;
using Hurricane::inltrace;
using Hurricane::ltracein;
using Hurricane::ltraceout;
using Hurricane::ForEachIterator;
using Hurricane::Warning;
using Hurricane::Error;
@ -72,7 +72,6 @@ namespace {
// -------------------------------------------------------------------
// Class : "::GlobalNetTable".
class GlobalNetTable {
public:
GlobalNetTable ( Cell* );
@ -208,7 +207,7 @@ namespace {
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 ( _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 {
private:
public:
class Rails;
class Plane;
class Rail {
public:
Rail ( Rails*, DbU::Unit axis, DbU::Unit width );
inline DbU::Unit getAxis () const;
inline DbU::Unit getWidth () const;
inline Rails* getRails () const;
inline RoutingPlane* getRoutingPlane () const;
inline Constant::Direction getDirection () const;
inline Net* getNet () const;
void merge ( DbU::Unit source, DbU::Unit target );
void doLayout ( const Layer* );
Rail ( Rails*, DbU::Unit axis, DbU::Unit width );
inline DbU::Unit getAxis () const;
inline DbU::Unit getWidth () const;
inline Rails* getRails () const;
inline RoutingPlane* getRoutingPlane () const;
inline unsigned int getDirection () const;
inline Net* getNet () const;
void merge ( DbU::Unit source, DbU::Unit target );
void doLayout ( const Layer* );
string _getString () const;
private:
Rails* _rails;
DbU::Unit _axis;
@ -297,41 +296,47 @@ namespace {
DbU::Unit _width;
};
private:
public:
class Rails {
public:
Rails ( Plane*, Constant::Direction, Net* );
~Rails ();
inline Plane* getPlane ();
inline RoutingPlane* getRoutingPlane ();
inline Constant::Direction getDirection () const;
inline Net* getNet () const;
void merge ( const Box& );
void doLayout ( const Layer* );
Rails ( Plane*, unsigned int direction, Net* );
~Rails ();
inline Plane* getPlane ();
inline RoutingPlane* getRoutingPlane ();
inline unsigned int getDirection () const;
inline Net* getNet () const;
void merge ( const Box& );
void doLayout ( const Layer* );
private:
Plane* _plane;
Constant::Direction _direction;
Net* _net;
vector<Rail*> _rails;
Plane* _plane;
unsigned int _direction;
Net* _net;
vector<Rail*> _rails;
};
private:
public:
class Plane {
public:
Plane ( const Layer*, RoutingPlane* );
~Plane ();
inline const Layer* getLayer () const;
inline RoutingPlane* getRoutingPlane ();
inline Constant::Direction getDirection () const;
void merge ( const Box&, Net* );
void doLayout ();
typedef map<Net*,Rails*,Net::CompareById> RailsMap;
public:
Plane ( const Layer*, RoutingPlane* );
~Plane ();
inline const Layer* getLayer () const;
inline RoutingPlane* getRoutingPlane ();
inline unsigned int getDirection () const;
inline unsigned int getPowerDirection () const;
void merge ( const Box&, Net* );
void doLayout ();
private:
const Layer* _layer;
RoutingPlane* _routingPlane;
map<Net*,Rails*> _horizontalRails;
map<Net*,Rails*> _verticalRails;
RailsMap _horizontalRails;
RailsMap _verticalRails;
unsigned int _powerDirection;
};
public:
typedef map<const BasicLayer*,Plane*,BasicLayer::CompareByMask> PlanesMap;
public:
PowerRailsPlanes ( KiteEngine* );
~PowerRailsPlanes ();
@ -342,73 +347,104 @@ namespace {
void merge ( const Box&, Net* );
void doLayout ();
private:
KiteEngine* _kite;
GlobalNetTable _globalNets;
map<const BasicLayer*,Plane*> _planes;
Plane* _activePlane;
KiteEngine* _kite;
GlobalNetTable _globalNets;
PlanesMap _planes;
Plane* _activePlane;
};
} // Anonymous namespace.
namespace {
PowerRailsPlanes::Rail::Rail ( Rails* rails, DbU::Unit axis, DbU::Unit width )
: _rails (rails)
, _axis (axis)
, _width (width)
, _chunks()
{
ltrace(300) << " new Rail " << (void*)this
ltrace(300) << " new Rail "
<< " @" << DbU::getValueString(axis)
<< " " << getRoutingPlane()->getLayer()->getName()
<< " " << getRails()->getNet()
<< " " << getString(getDirection()) << endl;
<< " " << ((getDirection()==KbHorizontal) ? "Horizontal" : "Vertical")<< endl;
}
inline DbU::Unit PowerRailsPlanes::Rail::getAxis () const { return _axis; }
inline DbU::Unit PowerRailsPlanes::Rail::getWidth () const { return _width; }
inline PowerRailsPlanes::Rails* PowerRailsPlanes::Rail::getRails () const { return _rails; }
inline RoutingPlane* PowerRailsPlanes::Rail::getRoutingPlane () const { return _rails->getRoutingPlane(); }
inline Constant::Direction PowerRailsPlanes::Rail::getDirection () const { return _rails->getDirection(); }
inline Net* PowerRailsPlanes::Rail::getNet () const { return _rails->getNet(); }
inline DbU::Unit PowerRailsPlanes::Rail::getAxis () const { return _axis; }
inline DbU::Unit PowerRailsPlanes::Rail::getWidth () const { return _width; }
inline PowerRailsPlanes::Rails* PowerRailsPlanes::Rail::getRails () const { return _rails; }
inline RoutingPlane* PowerRailsPlanes::Rail::getRoutingPlane () const { return _rails->getRoutingPlane(); }
inline unsigned int PowerRailsPlanes::Rail::getDirection () const { return _rails->getDirection(); }
inline Net* PowerRailsPlanes::Rail::getNet () const { return _rails->getNet(); }
void PowerRailsPlanes::Rail::merge ( DbU::Unit source, DbU::Unit target )
{
Interval chunkMerge ( source, target );
ltrace(300) << " Rail::merge() " << chunkMerge << endl;
Interval chunkToMerge ( source, target );
ltrace(300) << " Rail::merge() "
<< ((getDirection()==KbHorizontal) ? "Horizontal" : "Vertical")
<< " " << chunkToMerge << endl;
ltrace(300) << " | " << _getString() << endl;
list<Interval>::iterator imerge = _chunks.end();
list<Interval>::iterator ichunk = _chunks.begin();
while ( ichunk != _chunks.end() ) {
if ( chunkMerge.getVMax() < (*ichunk).getVMin() ) {
_chunks.insert ( ichunk, chunkMerge );
break;
if (imerge == _chunks.end()) {
if (chunkToMerge.getVMax() < (*ichunk).getVMin()) {
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 ( imerge == _chunks.end() ) {
imerge = ichunk;
(*imerge).merge ( chunkMerge );
} else {
(*imerge).merge ( *ichunk );
ichunk = _chunks.erase ( ichunk );
continue;
}
}
ichunk++;
// if (chunkToMerge.intersect(*ichunk)) {
// if (imerge == _chunks.end()) {
// ltrace(300) << " | Merge with " << *ichunk << endl;
// imerge = ichunk;
// (*imerge).merge( chunkToMerge );
// } else {
// (*imerge).merge( *ichunk );
// ltrace(300) << " | Absorb (erase) " << *ichunk << endl;
// ichunk = _chunks.erase( ichunk );
// continue;
// }
// }
++ichunk;
}
if ( imerge == _chunks.end() ) {
_chunks.insert ( ichunk, chunkMerge );
ltrace(300) << " | Add on " << DbU::getValueString(_axis) << " " << chunkMerge << endl;
if (imerge == _chunks.end()) {
_chunks.insert( ichunk, chunkToMerge );
ltrace(300) << " | Insert at end " << DbU::getValueString(_axis) << " " << chunkToMerge << endl;
ltrace(300) << " | " << _getString() << endl;
}
}
void PowerRailsPlanes::Rail::doLayout ( const Layer* layer )
{
ltrace(300) << "Doing layout of rail: " << (void*)this
ltrace(300) << "Doing layout of rail: "
<< " " << layer->getName()
<< " " << getString(getDirection()) << " @" << DbU::getValueString(_axis) << endl;
<< " " << ((getDirection()==KbHorizontal) ? "Horizontal" : "Vertical")
<< " @" << DbU::getValueString(_axis) << endl;
ltrace(300) << _getString() << endl;
Net* net = getNet();
RoutingPlane* plane = getRoutingPlane();
@ -418,18 +454,33 @@ namespace {
- DbU::lambda(0.1);
DbU::Unit extension = layer->getExtentionCap();
//DbU::Unit extension = Session::getExtentionCap();
unsigned int type = plane->getLayerGauge()->getType();
//unsigned int type = plane->getLayerGauge()->getType();
DbU::Unit axisMin = 0;
DbU::Unit axisMax = 0;
if ( type == Constant::PinOnly ) {
ltrace(300) << " Layer is PinOnly." << endl;
return;
}
// if ( type == Constant::PinOnly ) {
// ltrace(300) << " Layer is PinOnly." << endl;
// return;
// }
if ( getDirection() == Constant::Horizontal ) {
list<Interval>::iterator ichunk = _chunks.begin();
for ( ; ichunk != _chunks.end() ; ichunk++ ) {
if ( getDirection() == KbHorizontal ) {
list<Interval>::iterator ichunk = _chunks.begin();
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())
<< ":" << DbU::getValueString((*ichunk).getVMax()) << "]" << endl;
@ -447,7 +498,7 @@ namespace {
axisMax = _axis + _width/2 + delta;
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 );
ltrace(300) << " Insert in " << track << "+" << element << endl;
}
@ -472,15 +523,32 @@ namespace {
axisMax = _axis + _width/2 + delta;
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 );
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 )
{
if ( lhs->getAxis () < rhs->getAxis () ) return true;
@ -499,16 +567,16 @@ namespace {
{ return (rail->getAxis() == _axis) and (rail->getWidth() == _width); }
PowerRailsPlanes::Rails::Rails ( PowerRailsPlanes::Plane* plane, Constant::Direction direction, Net* net )
: _plane (plane)
, _direction(direction)
, _net (net)
, _rails ()
PowerRailsPlanes::Rails::Rails ( PowerRailsPlanes::Plane* plane , unsigned int direction , Net* net )
: _plane (plane)
, _direction (direction)
, _net (net)
, _rails ()
{
ltrace(300) << " new Rails @"
<< " " << getRoutingPlane()->getLayer()->getName()
<< " " << net
<< " " << getString(getDirection()) << endl;
<< " " << ((getDirection()==KbHorizontal) ? "Horizontal": "Vertical") << endl;
}
@ -521,10 +589,10 @@ namespace {
}
inline PowerRailsPlanes::Plane* PowerRailsPlanes::Rails::getPlane () { return _plane; }
inline RoutingPlane* PowerRailsPlanes::Rails::getRoutingPlane () { return getPlane()->getRoutingPlane(); }
inline Constant::Direction PowerRailsPlanes::Rails::getDirection () const { return _direction; }
inline Net* PowerRailsPlanes::Rails::getNet () const { return _net; }
inline PowerRailsPlanes::Plane* PowerRailsPlanes::Rails::getPlane () { return _plane; }
inline RoutingPlane* PowerRailsPlanes::Rails::getRoutingPlane () { return getPlane()->getRoutingPlane(); }
inline unsigned int PowerRailsPlanes::Rails::getDirection () const { return _direction; }
inline Net* PowerRailsPlanes::Rails::getNet () const { return _net; }
void PowerRailsPlanes::Rails::merge ( const Box& bb )
@ -534,7 +602,7 @@ namespace {
DbU::Unit sourceU;
DbU::Unit targetU;
if ( getDirection() == Constant::Horizontal ) {
if (getDirection() == KbHorizontal) {
axis = bb.getYCenter();
width = bb.getHeight();
sourceU = bb.getXMin();
@ -564,7 +632,7 @@ namespace {
void PowerRailsPlanes::Rails::doLayout ( const Layer* layer )
{
ltrace(300) << "Doing layout of rails: " << layer->getName()
<< " " << getString(_direction)
<< " " << ((_direction==KbHorizontal) ? "Horizontal" : "Vertical")
<< " " << _net->getName() << endl;
for ( size_t irail=0 ; irail<_rails.size() ; irail++ )
@ -577,14 +645,18 @@ namespace {
, _routingPlane (routingPlane)
, _horizontalRails ()
, _verticalRails ()
, _powerDirection (routingPlane->getDirection())
{
ltrace(300) << "New Plane " << _layer->getName() << " " << _routingPlane << endl;
// Hard-coded SxLib gauge.
if (_routingPlane->getDepth() == 0) _powerDirection = KbHorizontal;
}
PowerRailsPlanes::Plane::~Plane ()
{
map<Net*,Rails*>::iterator irail = _horizontalRails.begin();
RailsMap::iterator irail = _horizontalRails.begin();
for ( ; irail != _horizontalRails.end() ; ++irail ) {
delete (*irail).second;
}
@ -595,30 +667,35 @@ namespace {
}
inline const Layer* PowerRailsPlanes::Plane::getLayer () const { return _layer; }
inline RoutingPlane* PowerRailsPlanes::Plane::getRoutingPlane () { return _routingPlane; }
inline Constant::Direction PowerRailsPlanes::Plane::getDirection () const { return (Constant::Direction)_routingPlane->getDirection(); }
inline const Layer* PowerRailsPlanes::Plane::getLayer () const { return _layer; }
inline RoutingPlane* PowerRailsPlanes::Plane::getRoutingPlane () { return _routingPlane; }
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 )
{
Rails* rails = NULL;
ltrace(300) << " Plane::merge() " << net->getName() << " " << (void*)net << endl;
ltrace(300) << " Plane::merge() " << net->getName() << " " << bb << endl;
if ( getDirection() == Constant::Horizontal ) {
map<Net*,Rails*>::iterator irails = _horizontalRails.find(net);
unsigned int direction = getDirection();
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() ) {
rails = new Rails(this,Constant::Horizontal,net);
rails = new Rails(this,KbHorizontal,net);
_horizontalRails.insert ( make_pair(net,rails) );
} else
rails = (*irails).second;
rails->merge ( bb );
} else {
map<Net*,Rails*>::iterator irails = _verticalRails.find(net);
RailsMap::iterator irails = _verticalRails.find(net);
if ( irails == _verticalRails.end() ) {
rails = new Rails(this,Constant::Vertical,net);
rails = new Rails(this,KbVertical,net);
_verticalRails.insert ( make_pair(net,rails) );
} else
rails = (*irails).second;
@ -633,7 +710,7 @@ namespace {
{
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 ) {
(*irails).second->doLayout(_layer);
}
@ -650,7 +727,7 @@ namespace {
, _planes ()
, _activePlane(NULL)
{
_globalNets.setBlockage ( kite->getBlockageNet() );
_globalNets.setBlockage( kite->getBlockageNet() );
Technology* technology = DataBase::getDB()->getTechnology();
RoutingGauge* rg = _kite->getConfiguration()->getRoutingGauge();
@ -668,14 +745,12 @@ namespace {
RoutingPlane* rp = _kite->getRoutingPlaneByIndex(lg->getDepth());
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();
if ( not blockageLayer ) continue;
if (not blockageLayer) continue;
_planes.insert ( make_pair(blockageLayer,new Plane(blockageLayer,rp)) );
ltrace(300) << "OK" << endl;
_planes.insert( make_pair(blockageLayer,new Plane(blockageLayer,rp)) );
}
}
@ -699,7 +774,7 @@ namespace {
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;
_activePlane = iplane->second;
@ -727,7 +802,7 @@ namespace {
void PowerRailsPlanes::doLayout ()
{
map<const BasicLayer*,Plane*>::iterator iplane = _planes.begin();
PlanesMap::iterator iplane = _planes.begin();
for ( ; iplane != _planes.end() ; iplane++ )
iplane->second->doLayout ();
}
@ -737,7 +812,6 @@ namespace {
// -------------------------------------------------------------------
// Class : "::QueryPowerRails".
class QueryPowerRails : public Query {
public:
QueryPowerRails ( KiteEngine* );
@ -811,8 +885,16 @@ namespace {
void QueryPowerRails::doQuery ()
{
if ( not _powerRailsPlanes.getActivePlane() ) return;
Query::doQuery ();
PowerRailsPlanes::Plane* activePlane = _powerRailsPlanes.getActivePlane();
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 )
{
//ltrace(80) << "QueryPowerRails::goCallback() " << go->getId() << ":" << go
// << " " << getPath().getName() << endl;
addToPowerRail ( go, getBasicLayer(), getArea(), getTransformation() );
}
@ -961,10 +1045,10 @@ namespace Kite {
{
cmess1 << " o Building power rails." << endl;
if ( not _blockageNet ) {
if (not _blockageNet) {
_blockageNet = getCell()->getNet("blockagenet");
if ( not _blockageNet )
_blockageNet = Net::create ( getCell(), "blockagenet" );
if (not _blockageNet)
_blockageNet = Net::create( getCell(), "blockagenet" );
}
QueryPowerRails query ( this );
@ -974,21 +1058,18 @@ namespace Kite {
if ( (iLayer->getMaterial() != BasicLayer::Material::metal)
and (iLayer->getMaterial() != BasicLayer::Material::blockage) )
continue;
if ( _configuration->isGMetal(*iLayer) ) continue;
if (_configuration->isGMetal(*iLayer)) continue;
if (not query.hasBasicLayer(*iLayer)) continue;
cmess1 << " - PowerRails in " << iLayer->getName() << " ..." << endl;
if ( not query.hasBasicLayer(*iLayer) ) continue;
query.setBasicLayer ( *iLayer );
query.doQuery ();
query.setBasicLayer( *iLayer );
query.doQuery ();
}
query.ringAddToPowerRails ();
query.doLayout ();
query.ringAddToPowerRails();
query.doLayout();
cmess1 << " - " << query.getGoMatchCount() << " power rails elements found." << endl;
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} )
@ -8,7 +9,7 @@
${Boost_INCLUDE_DIRS}
${PYTHON_INCLUDE_PATH}
)
set ( includes kite/TrackSegmentCost.h
set ( includes kite/Constants.h
kite/TrackCost.h
kite/DataNegociate.h
kite/TrackElement.h kite/TrackElements.h
@ -19,12 +20,14 @@
kite/Tracks.h
kite/HorizontalTrack.h
kite/VerticalTrack.h
kite/RoutingPlane.h
kite/Session.h
kite/Manipulator.h
kite/SegmentFsm.h
kite/RoutingEvent.h
kite/RoutingEventQueue.h
kite/RoutingEventHistory.h
kite/RoutingEventLoop.h
kite/RoutingPlane.h
kite/NegociateWindow.h
kite/Configuration.h
kite/KiteEngine.h
@ -34,8 +37,7 @@
kite/PyGraphicKiteEngine.h
)
set ( mocIncludes kite/GraphicKiteEngine.h )
set ( cpps TrackSegmentCost.cpp
TrackCost.cpp
set ( cpps TrackCost.cpp
DataNegociate.cpp
TrackElement.cpp
TrackElements.cpp
@ -46,16 +48,18 @@
Tracks.cpp
HorizontalTrack.cpp
VerticalTrack.cpp
RoutingPlane.cpp
Session.cpp
Manipulator.cpp
SegmentFsm.cpp
RoutingEvent.cpp
RoutingEventQueue.cpp
RoutingEventHistory.cpp
RoutingEventLoop.cpp
RoutingPlane.cpp
NegociateWindow.cpp
BuildPowerRails.cpp
ProtectRoutingPads.cpp
PreProcess.cpp
NegociateWindow.cpp
Configuration.cpp
KiteEngine.cpp
GraphicKiteEngine.cpp
@ -68,42 +72,42 @@
qt4_wrap_cpp ( mocCpps ${mocIncludes} )
add_library ( kite ${cpps} ${mocCpps} ${pyCpps} )
set_target_properties ( kite PROPERTIES VERSION 1.0 SOVERSION 1 )
target_link_libraries ( kite ${KATABATIC_LIBRARIES}
${KNIK_LIBRARIES}
${NIMBUS_LIBRARIES}
${CORIOLIS_LIBRARIES}
${HURRICANE_PYTHON_LIBRARIES}
${HURRICANE_GRAPHICAL_LIBRARIES}
${HURRICANE_LIBRARIES}
${CONFIGURATION_LIBRARY}
${BOOKSHELF_LIBRARY}
${CIF_LIBRARY}
${AGDS_LIBRARY}
${LEFDEF_LIBRARIES}
${OA_LIBRARIES}
${QT_LIBRARIES}
${Boost_LIBRARIES}
${LIBXML2_LIBRARIES}
${PYTHON_LIBRARIES} -lutil
${LIBEXECINFO_LIBRARIES}
add_library ( kite ${cpps} ${mocCpps} ${pyCpps} )
set_target_properties ( kite PROPERTIES VERSION 1.0 SOVERSION 1 )
target_link_libraries ( kite ${KATABATIC_LIBRARIES}
${KNIK_LIBRARIES}
${NIMBUS_LIBRARIES}
${CORIOLIS_LIBRARIES}
${HURRICANE_PYTHON_LIBRARIES}
${HURRICANE_GRAPHICAL_LIBRARIES}
${HURRICANE_LIBRARIES}
${CONFIGURATION_LIBRARY}
${BOOKSHELF_LIBRARY}
${CIF_LIBRARY}
${AGDS_LIBRARY}
${LEFDEF_LIBRARIES}
${OA_LIBRARIES}
${QT_LIBRARIES}
${Boost_LIBRARIES}
${LIBXML2_LIBRARIES}
${PYTHON_LIBRARIES} -lutil
${LIBEXECINFO_LIBRARIES}
)
add_library ( pyKite MODULE ${pyCpps} )
set_target_properties ( pyKite PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -D__PYTHON_MODULE__=1"
add_library ( pyKite MODULE ${pyCpps} )
set_target_properties ( pyKite PROPERTIES COMPILE_FLAGS "${COMPILE_FLAGS} -D__PYTHON_MODULE__=1"
PREFIX ""
OUTPUT_NAME "Kite"
)
add_executable ( kite.bin ${kitecpps} )
target_link_libraries ( kite.bin kite )
target_link_libraries ( pyKite kite
# add_executable ( kite.bin ${kitecpps} )
#target_link_libraries ( kite.bin kite )
target_link_libraries ( pyKite kite
${CORIOLIS_PYTHON_LIBRARIES}
)
install ( TARGETS kite DESTINATION lib${LIB_SUFFIX} )
install ( TARGETS kite.bin DESTINATION bin )
install ( TARGETS pyKite DESTINATION ${PYTHON_SITE_PACKAGES} )
install ( TARGETS kite DESTINATION lib${LIB_SUFFIX} )
# install ( TARGETS kite.bin DESTINATION bin )
install ( TARGETS pyKite DESTINATION ${PYTHON_SITE_PACKAGES} )
install ( FILES ${includes}
${mocIncludes}

View File

@ -1,15 +1,9 @@
// -*- C++ -*-
// -*- mode: C++; explicit-buffer-name: "Configuration.cpp<kite>" -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./Configuration.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include <string>
#include "vlsisapd/configuration/Configuration.h"
#include "hurricane/Cell.h"
#include "crlcore/Utilities.h"
#include "kite/Configuration.h"
#include "kite/KiteEngine.h"
#include <string>
#include "vlsisapd/configuration/Configuration.h"
#include "hurricane/Cell.h"
#include "crlcore/Utilities.h"
#include "kite/Configuration.h"
#include "kite/KiteEngine.h"
namespace Kite {
using std::cout;
using std::cerr;
using std::endl;
@ -123,6 +111,10 @@ namespace Kite {
{ return _base->isGMetal(layer); }
bool Configuration::isGContact ( const Layer* layer ) const
{ return _base->isGContact(layer); }
size_t Configuration::getDepth () const
{ return _base->getDepth(); }
@ -281,4 +273,4 @@ namespace Kite {
} // End of Kite namespace.
} // Kite namespace.

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// 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 |
@ -15,14 +15,31 @@
// +-----------------------------------------------------------------+
#include <cstdlib>
#include <sstream>
#include "kite/DataNegociate.h"
#include <cstdlib>
#include <sstream>
#include "hurricane/Bug.h"
#include "hurricane/DebugSession.h"
#include "katabatic/AutoSegment.h"
#include "kite/DataNegociate.h"
#include "kite/RoutingEvent.h"
namespace Kite {
using std::cerr;
using std::endl;
using std::map;
using std::multimap;
using std::make_pair;
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 )
: _routingEvent(NULL)
, _trackSegment(trackSegment)
, _cost (trackSegment)
, _state (RipupPerpandiculars)
, _stateCount (1)
//, _z (RoutingGauge::getLayerDepth(trackSegment->getLayer()))
: _trackSegment (trackSegment)
, _childSegment (NULL)
, _routingEvent (NULL)
, _net (trackSegment->getNet())
, _state (RipupPerpandiculars)
, _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 ()
{ _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
{
return "<" + _getTypeName() + " "
+ getString(_trackSegment)
+ ">";
+ getString(_trackSegment) + " "
+ getString(_terminals)
+ " [" + DbU::getValueString(_leftMinExtend)
+ ":" + DbU::getValueString(_rightMinExtend)
+ "]>";
}
Record* DataNegociate::_getRecord () const
{
Record* record = new Record ( getString(this) );
record->add ( getSlot ( "_routingEvent", _routingEvent ) );
record->add ( getSlot ( "_trackSegment", _trackSegment ) );
record->add ( getSlot ( "_cost" , &_cost ) );
//record->add ( getSlot ( "_z" , _z ) );
record->add( getSlot ( "_routingEvent" , _routingEvent ) );
record->add( getSlot ( "_trackSegment" , _trackSegment ) );
record->add( getSlot ( "_childSegment" , _childSegment ) );
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;
}
@ -71,18 +234,17 @@ namespace Kite {
{
ostringstream s;
switch ( data->_state ) {
case RipupPerpandiculars: s << "RipupPerpandiculars"; break;
case Minimize: s << "Minimize"; break;
case DogLeg: s << "DogLeg"; break;
case Desalignate: s << "Desalignate"; break;
case Slacken: s << "Slacken"; break;
case ConflictSolve1: s << "ConflictSolve1"; break;
case ConflictSolve2: s << "ConflictSolve2"; break;
case LocalVsGlobal: s << "LocalVsGlobal"; break;
case MoveUp: s << "MoveUp"; break;
case MaximumSlack: s << "MaximumSlack"; break;
case Unimplemented: s << "Unimplemented"; break;
case Repair: s << "REPAIR"; break;
case RipupPerpandiculars: s << "RipupPerpandiculars"; break;
case Minimize: s << "Minimize"; break;
case Dogleg: s << "Dogleg"; break;
case Slacken: s << "Slacken"; break;
case ConflictSolveByHistory: s << "ConflictSolveByHistory1"; break;
case ConflictSolveByPlaceds: s << "ConflictSolveByPlaceds"; break;
case LocalVsGlobal: s << "LocalVsGlobal"; break;
case MoveUp: s << "MoveUp"; break;
case MaximumSlack: s << "MaximumSlack"; break;
case Unimplemented: s << "Unimplemented"; break;
case Repair: s << "REPAIR"; break;
default:
s << "Unknown(" << data->_state << ")"; break;
}
@ -91,4 +253,4 @@ namespace Kite {
}
} // End of Kite namespace.
} // Kite namespace.

View File

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

View File

@ -2,14 +2,9 @@
// -*- C++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./HorizontalTrack.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include "kite/HorizontalTrack.h"
#include "kite/HorizontalTrack.h"
namespace Kite {
@ -61,7 +53,7 @@ namespace Kite {
bool HorizontalTrack::isHorizontal () const { return true; }
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
@ -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++ -*-
//
// 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 |
@ -15,31 +14,31 @@
// +-----------------------------------------------------------------+
#include <memory>
#include <memory>
using namespace std;
#include <boost/program_options.hpp>
#include <boost/program_options.hpp>
namespace bopts = boost::program_options;
#include "vlsisapd/configuration/Configuration.h"
#include "hurricane/DebugSession.h"
#include "hurricane/DataBase.h"
#include "hurricane/Cell.h"
#include "hurricane/Warning.h"
#include "hurricane/UpdateSession.h"
#include "vlsisapd/configuration/Configuration.h"
#include "hurricane/DebugSession.h"
#include "hurricane/DataBase.h"
#include "hurricane/Cell.h"
#include "hurricane/Warning.h"
#include "hurricane/UpdateSession.h"
using namespace Hurricane;
#include "crlcore/Utilities.h"
#include "crlcore/Banner.h"
#include "crlcore/AllianceFramework.h"
#include "crlcore/Hierarchy.h"
#include "crlcore/ToolBox.h"
#include "crlcore/Utilities.h"
#include "crlcore/Banner.h"
#include "crlcore/AllianceFramework.h"
#include "crlcore/Hierarchy.h"
#include "crlcore/ToolBox.h"
using namespace CRL;
#include "knik/KnikEngine.h"
#include "knik/KnikEngine.h"
using namespace Knik;
#include "kite/KiteEngine.h"
#include "kite/KiteEngine.h"
using namespace Kite;
@ -145,8 +144,8 @@ int main ( int argc, char *argv[] )
}
KatabaticEngine::NetSet routingNets;
unsigned int globalFlags = (loadGlobal) ? Kite::LoadGlobalSolution
: Kite::BuildGlobalSolution;
unsigned int globalFlags = (loadGlobal) ? Kite::KtLoadGlobalRouting
: Kite::KtBuildGlobalRouting;
KiteEngine* kite = KiteEngine::create( cell );
if (showConf) kite->printConfiguration();
@ -154,9 +153,10 @@ int main ( int argc, char *argv[] )
kite->runGlobalRouter( globalFlags );
if (saveGlobal) kite->saveGlobalSolution ();
kite->loadGlobalRouting( Katabatic::LoadGrByNet, routingNets );
kite->layerAssign ( Katabatic::NoNetLayerAssign );
kite->runNegociate ();
kite->loadGlobalRouting ( Katabatic::EngineLoadGrByNet, routingNets );
kite->balanceGlobalDensity();
kite->layerAssign ( Katabatic::EngineNoNetLayerAssign );
kite->runNegociate ();
kiteSuccess = kite->getToolSuccess();
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++ -*-
//
// 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 |
@ -15,34 +15,32 @@
// +-----------------------------------------------------------------+
#include <vector>
#include <algorithm>
#include <iomanip>
#include "hurricane/Warning.h"
#include "hurricane/Bug.h"
#include "hurricane/RoutingPad.h"
#include "hurricane/Net.h"
#include "hurricane/Cell.h"
#include "crlcore/Utilities.h"
#include "crlcore/AllianceFramework.h"
#include "crlcore/Measures.h"
#include "crlcore/Histogram.h"
#include "katabatic/AutoContact.h"
#include "katabatic/GCellGrid.h"
#include "kite/DataNegociate.h"
#include "kite/TrackElement.h"
#include "kite/TrackMarker.h"
#include "kite/TrackCost.h"
#include "kite/Track.h"
#include "kite/TrackSegment.h"
#include "kite/RoutingPlane.h"
#include "kite/RoutingEventQueue.h"
#include "kite/RoutingEventHistory.h"
#include "kite/RoutingEventLoop.h"
#include "kite/NegociateWindow.h"
#include "kite/KiteEngine.h"
#include <vector>
#include <algorithm>
#include <iomanip>
#include "hurricane/Warning.h"
#include "hurricane/Bug.h"
#include "hurricane/RoutingPad.h"
#include "hurricane/Net.h"
#include "hurricane/Cell.h"
#include "crlcore/Utilities.h"
#include "crlcore/AllianceFramework.h"
#include "crlcore/Measures.h"
#include "crlcore/Histogram.h"
#include "katabatic/AutoContact.h"
#include "katabatic/GCellGrid.h"
#include "kite/DataNegociate.h"
#include "kite/TrackElement.h"
#include "kite/TrackMarker.h"
#include "kite/TrackCost.h"
#include "kite/Track.h"
#include "kite/TrackSegment.h"
#include "kite/RoutingPlane.h"
#include "kite/RoutingEventQueue.h"
#include "kite/RoutingEventHistory.h"
#include "kite/RoutingEventLoop.h"
#include "kite/NegociateWindow.h"
#include "kite/KiteEngine.h"
namespace {
@ -57,69 +55,56 @@ namespace {
{
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;
cost.setInfinite ();
cost.setOverlap ();
cost.setHardOverlap ();
cost.setBlockage ();
cost.setInfinite ();
cost.setOverlap ();
cost.setHardOverlap();
cost.setBlockage ();
return;
}
if ( cost.getInterval().getVMax() > intersect.getVMax() ) cost.setLeftOverlap();
if ( cost.getInterval().getVMin() < intersect.getVMin() ) cost.setRightOverlap();
if (cost.getInterval().getVMax() > intersect.getVMax()) cost.setLeftOverlap();
if (cost.getInterval().getVMin() < intersect.getVMin()) cost.setRightOverlap();
//cost.setLonguestOverlap ( intersect.getSize() );
//intersect.intersection ( cost.getInterval() );
if ( not intersect.contains(cost.getInterval()) )
intersect.intersection ( cost.getInterval() );
if (not intersect.contains(cost.getInterval()))
intersect.intersection( cost.getInterval() );
else {
cost.setLonguestOverlap ( intersect.getSize() );
cost.setGlobalEnclosed ();
cost.setLonguestOverlap( intersect.getSize() );
cost.setGlobalEnclosed();
}
DataNegociate* data = segment->getDataNegociate ();
if ( not data ) return;
DataNegociate* data = segment->getDataNegociate();
if (not data) return;
cost.mergeRipupCount ( data->getRipupCount() );
cost.mergeRipupCount( data->getRipupCount() );
if ( segment->isLocal() ) {
cost.mergeDataState ( data->getState() );
if ( data->getState() >= DataNegociate::LocalVsGlobal ) {
cost.mergeDataState( data->getState() );
if (data->getState() >= DataNegociate::LocalVsGlobal) {
ltrace(200) << "MaximumSlack/LocalVsGlobal for " << segment << endl;
}
}
if ( segment->isGlobal() ) {
//if ( data->getState() >= DataNegociate::ConflictSolve1 ) {
cost.setOverlapGlobal();
//}
if ( (cost.getFlags() & TrackCost::LocalAndTopDepth)
and (data->getState() >= DataNegociate::MoveUp) ) {
cost.setInfinite ();
cost.setOverlap ();
cost.setHardOverlap ();
return;
}
if (segment->isGlobal()) {
cost.setOverlapGlobal();
if ( (cost.getFlags() & TrackCost::LocalAndTopDepth)
and (data->getState() >= DataNegociate::MoveUp) ) {
cost.setInfinite ();
cost.setOverlap ();
cost.setHardOverlap();
return;
}
}
// if ( data->getRipupCount() > 3 ) {
// ltrace(200) << "Infinite cost from: " << segment << endl;
// cost.setFixed ();
// cost.setInfinite ();
// cost.setOverlap ();
// cost.setHardOverlap ();
// return;
// }
cost.setOverlap ();
if ( segment->isLocal() or (Session::getRoutingGauge()->getLayerDepth(segment->getLayer()) < 3) )
cost.incTerminals ( data->getCost().getTerminals()*100 );
cost.setOverlap();
if ( segment->isLocal()
or (cost.isForGlobal() and (Session::getRoutingGauge()->getLayerDepth(segment->getLayer()) < 3)) )
cost.incTerminals( data->getTerminals()*100 );
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();
forEach ( Net*, inet, nw->getCell()->getNets() ) {
if ( inet->getType() == Net::Type::POWER ) continue;
if ( inet->getType() == Net::Type::GROUND ) continue;
if ( inet->getType() == Net::Type::CLOCK ) continue;
if ( af->isBLOCKAGE(inet->getName()) ) continue;
if (inet->getType() == Net::Type::POWER ) continue;
if (inet->getType() == Net::Type::GROUND) continue;
if (inet->getType() == Net::Type::CLOCK ) continue;
if (af->isBLOCKAGE(inet->getName())) continue;
forEach ( RoutingPad*, irp, inet->getRoutingPads() ) {
size_t depth = rg->getLayerDepth(irp->getLayer());
if ( depth > 0 ) continue;
if ( depth == 0 ) {
TrackMarker::create ( *irp, 1 );
//TrackMarker::create ( *irp, 2 );
}
if (depth > 0) continue;
if (depth == 0)
TrackMarker::create( *irp, 1 );
}
}
}
} // End of local namespace.
} // Anonymous namespace.
namespace Kite {
@ -167,6 +150,8 @@ namespace Kite {
using CRL::Histogram;
using CRL::addMeasure;
using Katabatic::AutoContact;
using Katabatic::AutoSegmentLut;
using Katabatic::perpandicularTo;
// -------------------------------------------------------------------
@ -207,111 +192,115 @@ namespace Kite {
void NegociateWindow::setGCells ( const Katabatic::GCellVector& gcells )
{
_gcells = gcells;
//sort ( _gcells.begin(), _gcells.end(), Katabatic::GCell::CompareGCellById() );
loadRoutingPads ( this );
Session::revalidate ();
loadRoutingPads( this );
Session::revalidate();
TrackElement* segment;
TrackElementLut lut = Session::getKiteEngine()->_getTrackElementLut();
TrackElementLut::iterator it = lut.begin ();
TrackElement* segment;
AutoSegmentLut lut = Session::getKiteEngine()->_getAutoSegmentLut();
AutoSegmentLut::iterator it = lut.begin ();
for ( ; it != lut.end() ; it++ ) {
segment = it->second;
segment->getDataNegociate()->update();
segment = Session::lookup( it->second );
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();
if ( not data or not data->hasRoutingEvent() )
_eventQueue.add ( segment, level );
if (not data or not data->hasRoutingEvent())
_eventQueue.add( segment, level );
else
cerr << Bug("NegociateWidow::addInsertEvent(): Try to adds twice the same TrackElement event."
"\n %p:%s."
,(void*)segment->base()->base()
,getString(segment).c_str()
cerr << Bug( "NegociateWidow::addRoutingEvent(): Try to adds twice the same TrackElement event."
"\n %p:%s."
, (void*)segment->base()->base()
, getString(segment).c_str()
) << 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);
// Special case: fixed AutoSegments must not interfere with blockages.
// Ugly: uses of getExtensionCap().
if ( autoSegment->isFixed() ) {
if (autoSegment->isFixed()) {
RoutingPlane* plane = Session::getKiteEngine()->getRoutingPlaneByLayer(autoSegment->getLayer());
Track* track = plane->getTrackByPosition ( autoSegment->getAxis() );
Track* track = plane->getTrackByPosition( autoSegment->getAxis() );
size_t begin;
size_t end;
Interval fixedSpan;
Interval blockageSpan;
autoSegment->getCanonical ( fixedSpan );
fixedSpan.inflate ( Session::getExtensionCap()-1 );
autoSegment->getCanonical( fixedSpan );
fixedSpan.inflate( Session::getExtensionCap()-1 );
track->getOverlapBounds ( fixedSpan, begin, end );
track->getOverlapBounds( fixedSpan, begin, end );
for ( ; (begin < end) ; begin++ ) {
TrackElement* other = track->getSegment(begin);
ltrace(200) << "| overlap: " << other << endl;
if ( not other->isBlockage() ) continue;
if (not other->isBlockage()) continue;
other->getCanonical ( blockageSpan );
blockageSpan.inflate(Session::getExtensionCap());
other->getCanonical( blockageSpan );
blockageSpan.inflate( Session::getExtensionCap() );
ltrace(200) << " fixed:" << fixedSpan << " vs. blockage:" << blockageSpan << endl;
if ( not fixedSpan.intersect(blockageSpan) ) continue;
if (not fixedSpan.intersect(blockageSpan)) continue;
// Overlap between fixed & blockage.
ltrace(200) << "* Blockage overlap: " << autoSegment << endl;
Session::destroyRequest ( autoSegment );
cerr << Warning("Overlap between fixed %s and blockage at %s."
,getString(autoSegment).c_str(),getString(blockageSpan).c_str()) << endl;
Session::destroyRequest( autoSegment );
cerr << Warning( "Overlap between fixed %s and blockage at %s."
, getString(autoSegment).c_str()
, getString(blockageSpan).c_str() ) << endl;
ltraceout(159);
return NULL;
}
}
Interval span;
autoSegment = autoSegment->getCanonical ( span );
autoSegment = autoSegment->getCanonical( span );
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;
if ( created ) {
if (created) {
ltrace(159) << "* " << trackSegment << endl;
RoutingPlane* plane = Session::getKiteEngine()->getRoutingPlaneByLayer(autoSegment->getLayer());
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.getVMin() ) track = track->getNext();
if (track->getAxis() > uside.getVMax()) track = track->getPreviousTrack();
if (track->getAxis() < uside.getVMin()) track = track->getNextTrack();
trackSegment->setAxis ( track->getAxis(), Katabatic::Realignate|Katabatic::AxisSet );
trackSegment->invalidate ();
ltrace(159) << "* GCell U-side " << uside << endl;
ltrace(159) << "* " << plane << endl;
ltrace(159) << "* " << track << endl;
if ( trackSegment->isFixed() ) {
Session::addInsertEvent ( trackSegment, track );
trackSegment->setAxis( track->getAxis(), Katabatic::SegAxisSet );
trackSegment->invalidate();
if (trackSegment->isFixed()) {
Session::addInsertEvent( trackSegment, track );
} 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;
}
@ -331,19 +320,19 @@ namespace Kite {
Segment* segment;
TrackElement* trackSegment;
vector<AutoContact*>* contacts = _gcells[igcell]->getContacts();
for ( size_t i=0 ; i<contacts->size() ; i++ ) {
forEach ( Hook*, ihook, (*contacts)[i]->getBodyHook()->getSlaveHooks() ) {
const vector<AutoContact*>& contacts = _gcells[igcell]->getContacts();
for ( size_t i=0 ; i<contacts.size() ; i++ ) {
forEach ( Hook*, ihook, contacts[i]->getBodyHook()->getSlaveHooks() ) {
Hook* sourceHook = dynamic_cast<Segment::SourceHook*>(*ihook);
if ( not sourceHook ) continue;
if (not sourceHook) continue;
segment = dynamic_cast<Segment*>(sourceHook->getComponent());
trackSegment = Session::lookup ( segment );
if ( trackSegment ) {
if ( accounteds.find(trackSegment) != accounteds.end() ) continue;
trackSegment = Session::lookup( segment );
if (trackSegment) {
if (accounteds.find(trackSegment) != accounteds.end()) continue;
accounteds.insert ( trackSegment );
gcellWL += DbU::getLambda ( trackSegment->getLength() );
accounteds.insert( trackSegment );
gcellWL += DbU::getLambda( trackSegment->getLength() );
}
}
}
@ -365,14 +354,14 @@ namespace Kite {
AutoSegment* autoSegment;
ltrace(149) << "AutoSegments from AutoContacts" << endl;
vector<AutoContact*>* contacts = gcell->getContacts();
for ( size_t i=0 ; i<contacts->size() ; i++ ) {
forEach ( Component*, component, (*contacts)[i]->getSlaveComponents() ) {
const vector<AutoContact*>& contacts = gcell->getContacts();
for ( size_t i=0 ; i<contacts.size() ; i++ ) {
forEach ( Component*, component, contacts[i]->getSlaveComponents() ) {
segment = dynamic_cast<Segment*>(*component);
autoSegment = Session::base()->lookup ( segment );
autoSegment = Session::base()->lookup( segment );
ltrace(149) << autoSegment << endl;
if ( autoSegment and autoSegment->isCanonical() ) {
addTrackSegment ( autoSegment, true );
if (autoSegment and autoSegment->isCanonical()) {
createTrackSegment( autoSegment, KtLoadingStage );
}
}
}
@ -384,21 +373,21 @@ namespace Kite {
size_t NegociateWindow::_negociate ()
{
ltrace(500) << "Deter| NegociateWindow::_negociate()" << endl;
ltrace(150) << "NegociateWindow::_negociate() - " << _segments.size() << endl;
ltracein(149);
cmess1 << " o Negociation Stage." << endl;
unsigned long limit = _kite->getEventsLimit();
//unsigned long limit = 25586;
_eventHistory.clear();
_eventQueue.load ( _segments );
_eventQueue.load( _segments );
size_t count = 0;
RoutingEvent::setStage ( RoutingEvent::Negociate );
RoutingEvent::setStage( RoutingEvent::Negociate );
while ( not _eventQueue.empty() and not isInterrupted() ) {
RoutingEvent* event = _eventQueue.pop ();
RoutingEvent* event = _eventQueue.pop();
if (tty::enabled()) {
cmess2 << " <event:" << tty::bold << setw(7) << setfill('0')
@ -409,100 +398,67 @@ namespace Kite {
<< RoutingEvent::getProcesseds() << setfill(' ') << " "
<< event->getEventLevel() << ":" << event->getPriority() << "> "
<< event->getSegment()
//<< "> @" << DbU::getValueString(event->getSegment()->getAxis())
//<< " id:" << event->getSegment()->getId()
//<< " " << event->getSegment()->getNet()->getName()
<< endl;
cmess2.flush();
}
event->process ( _eventQueue, _eventHistory, _eventLoop );
event->process( _eventQueue, _eventHistory, _eventLoop );
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;
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++ ) {
RoutingEvent* event = _eventHistory.getNth(i);
if ( not event->isCloned() and event->isUnimplemented() ) {
event->reschedule ( _eventQueue, 0 );
if (not event->isCloned() and event->isUnimplemented()) {
event->reschedule( _eventQueue, 0 );
}
}
_eventQueue.commit ();
_eventQueue.commit();
count = 0;
//_eventQueue.prepareRepair();
while ( not _eventQueue.empty() and not isInterrupted() ) {
RoutingEvent* event = _eventQueue.pop ();
RoutingEvent* event = _eventQueue.pop();
if (tty::enabled()) {
cmess2 << " <repair.event:" << tty::bold << setw(7) << setfill('0')
<< RoutingEvent::getProcesseds() << setfill(' ') << tty::reset << ">" << tty::cr;
cmess2.flush ();
cmess2.flush();
} else {
cmess2 << " <repair.event:" << setw(7) << setfill('0')
<< RoutingEvent::getProcesseds() << setfill(' ') << " "
<< event->getEventLevel() << ":" << event->getPriority() << "> "
<< event->getSegment()
//<< "> @" << DbU::getValueString(event->getSegment()->getAxis())
//<< " id:" << event->getSegment()->getId()
//<< " " << event->getSegment()->getNet()->getName()
<< endl;
cmess2.flush();
}
event->process ( _eventQueue, _eventHistory, _eventLoop );
event->process( _eventQueue, _eventHistory, _eventLoop );
count++;
if ( RoutingEvent::getProcesseds() >= limit ) setInterrupt ( true );
if (RoutingEvent::getProcesseds() >= limit ) setInterrupt( true );
}
// {
// 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;
if (count and cmess2.enabled() and tty::enabled()) cmess1 << endl;
size_t eventsCount = _eventHistory.size();
_eventHistory.clear();
_eventQueue.clear();
if ( RoutingEvent::getAllocateds() > 0 ) {
cerr << Bug("%d events remains after clear.",RoutingEvent::getAllocateds()) << endl;
if (RoutingEvent::getAllocateds() > 0) {
cerr << Bug( "%d events remains after clear.", RoutingEvent::getAllocateds() ) << endl;
}
// if ( _slowMotion && getCellWidget() ) {
// Session::close ();
// getCellWidget()->refresh();
// Session::open ( _kiteEngine );
// }
_statistics.setEventsCount ( eventsCount );
_statistics.setEventsCount( eventsCount );
ltraceout(149);
return eventsCount;
@ -516,28 +472,30 @@ namespace Kite {
cmess1 << " o Running Negociate Algorithm" << endl;
TrackElement::setOverlapCostCB ( NegociateOverlapCost );
RoutingEvent::resetProcesseds ();
TrackElement::setOverlapCostCB( NegociateOverlapCost );
RoutingEvent::resetProcesseds();
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)
unsigned int overlaps = 0;
Session::getKiteEngine()->_check(overlaps,"after _createRouting(GCell*)");
Session::getKiteEngine()->_check( overlaps, "after _createRouting(GCell*)" );
#endif
_slowMotion = slowMotion;
_negociate ();
_negociate();
Session::get()->isEmpty();
# if defined(CHECK_DATABASE)
_kite->_check ( overlaps, "after negociation" );
_kite->_check( overlaps, "after negociation" );
# endif
ltraceout(149);
@ -551,6 +509,7 @@ namespace Kite {
cmess1 << Dots::asSizet(" - Unique Events Total"
,(RoutingEvent::getProcesseds() - RoutingEvent::getCloneds())) << endl;
cmess1 << Dots::asSizet(" - # of GCells",_statistics.getGCellsCount()) << endl;
_kite->printCompletion();
addMeasure<size_t>( getCell(), "Events" , RoutingEvent::getProcesseds(), 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 );
addMeasure<Histogram>( getCell(), "GCells Density Histogram", densityHistogram );
densityHistogram->setFileExtension ( ".density.histogram" );
densityHistogram->setMainTitle ( "GCell Densities" );
densityHistogram->setTitle ( "Avg. Density", 0 );
densityHistogram->setTitle ( "Peak Density", 1 );
densityHistogram->setColor ( "green", 0 );
densityHistogram->setColor ( "red" , 1 );
densityHistogram->setFileExtension( ".density.histogram" );
densityHistogram->setMainTitle ( "GCell Densities" );
densityHistogram->setTitle ( "Avg. Density", 0 );
densityHistogram->setTitle ( "Peak Density", 1 );
densityHistogram->setColor ( "green", 0 );
densityHistogram->setColor ( "red" , 1 );
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 ) {
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 ) {
densityHistogram->addSample ( (*gcells)[igcell]->getDensity(), 1 );
densityHistogram->addSample( (*gcells)[igcell]->getDensity(), 1 );
}
densityHistogram->normalize ( 0 );
densityHistogram->normalize ( 1 );
densityHistogram->normalize( 0 );
densityHistogram->normalize( 1 );
}
@ -587,7 +546,7 @@ namespace Kite {
ostringstream os;
os << "<" << _getTypeName() << ">";
return ( os.str() );
return os.str();
}
@ -595,9 +554,9 @@ namespace Kite {
{
Record* record = new Record ( _getString() );
record->add ( getSlot ( "_gcells", _gcells ) );
return ( record );
record->add( getSlot( "_gcells", _gcells ) );
return record;
}
} // End of Kite namespace.
} // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./PreProcess.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include <sstream>
#include "hurricane/Bug.h"
#include "hurricane/Warning.h"
#include "hurricane/Net.h"
#include "hurricane/Name.h"
#include "hurricane/RoutingPad.h"
#include "katabatic/AutoContact.h"
#include "kite/DataNegociate.h"
#include "kite/TrackElement.h"
#include "kite/Track.h"
#include "kite/RoutingPlane.h"
#include "kite/NegociateWindow.h"
#include "kite/Session.h"
#include "kite/KiteEngine.h"
#include <sstream>
#include "hurricane/DebugSession.h"
#include "hurricane/Bug.h"
#include "hurricane/Warning.h"
#include "hurricane/Net.h"
#include "hurricane/Name.h"
#include "hurricane/RoutingPad.h"
#include "hurricane/Horizontal.h"
#include "katabatic/AutoContactTerminal.h"
#include "kite/DataNegociate.h"
#include "kite/TrackElement.h"
#include "kite/Track.h"
#include "kite/RoutingPlane.h"
#include "kite/NegociateWindow.h"
#include "kite/Session.h"
#include "kite/KiteEngine.h"
namespace {
using namespace std;
using namespace Hurricane;
using namespace CRL;
using namespace Kite;
using Katabatic::perpandicularTo;
using Katabatic::AutoContactTerminal;
void getPerpandiculars ( TrackElement* segment
@ -58,9 +49,6 @@ namespace {
, vector<TrackElement*>& perpandiculars
)
{
//AutoContact* to = segment->base()->getAutoSource();
//to = (to != from) ? to : segment->base()->getAutoTarget();
TrackElement* perpandicular;
forEach ( Segment*, isegment, segment->base()->getAutoSource()->getSlaveComponents().getSubSet<Segment*>() ) {
perpandicular = Session::lookup ( *isegment );
@ -108,21 +96,22 @@ namespace {
void propagateCagedConstraints ( TrackElement* segment, set<TrackElement*>& faileds )
{
if ( not segment->isFixed() ) return;
if (not segment->isFixed()) return;
ltrace(200) << "Propagate caging: " << segment << endl;
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();
RoutingPad* rp = NULL;
Interval uside = source->getGCell()->getUSide(direction);
Interval uside = source->getGCell()->getSide(direction);
DbU::Unit minConstraint = DbU::Min;
DbU::Unit maxConstraint = DbU::Max;
vector<TrackElement*> perpandiculars;
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;
}
@ -130,30 +119,30 @@ namespace {
TrackElement* parallel;
size_t i = segment->getIndex();
while ( i > 0 ) {
parallel = track->getSegment(--i);
if ( not parallel ) continue;
if ( parallel->getTargetU() < uside.getVMin() ) break;
if ( parallel->getNet() == segment->getNet() ) continue;
if ( not parallel->isFixed() ) continue;
parallel = track->getSegment( --i );
if (not parallel) continue;
if (parallel->getTargetU() < uside.getVMin()) break;
if (parallel->getNet() == segment->getNet()) continue;
if (not parallel->isFixed()) continue;
ltrace(200) << "Min Constraint from: " << parallel << endl;
minConstraint = max ( minConstraint, parallel->getTargetU() );
minConstraint = max( minConstraint, parallel->getTargetU() );
}
i = segment->getIndex();
while ( i < track->getSize()-1 ) {
parallel = track->getSegment(++i);
if ( not parallel ) continue;
if ( parallel->getSourceU() > uside.getVMax() ) break;
if ( parallel->getNet() == segment->getNet() ) continue;
if ( not parallel->isFixed() ) continue;
parallel = track->getSegment( ++i );
if (not parallel) continue;
if (parallel->getSourceU() > uside.getVMax()) break;
if (parallel->getNet() == segment->getNet()) continue;
if (not parallel->isFixed()) continue;
ltrace(200) << "Max Constraint from: " << parallel << endl;
maxConstraint = min ( maxConstraint, parallel->getSourceU() );
maxConstraint = min( maxConstraint, parallel->getSourceU() );
}
if ( minConstraint > maxConstraint ) {
cerr << Bug("%s have too tight caging constraints.",getString(segment).c_str()) << endl;
if (minConstraint > maxConstraint) {
cerr << Bug( "%s have too tight caging constraints.", getString(segment).c_str() ) << endl;
return;
}
if ( (minConstraint <= uside.getVMin()) and (maxConstraint >= uside.getVMax()) ) {
@ -164,29 +153,29 @@ namespace {
}
// Finding perpandiculars, by way of the source & target RoutingPad.
if ( source->getAnchor() ) {
if (source->getAnchor()) {
rp = dynamic_cast<RoutingPad*>(source->getAnchor());
if ( rp ) {
if (rp) {
TrackElement* parallel;
forEach ( Segment*, isegment, rp->getSlaveComponents().getSubSet<Segment*>() ) {
parallel = Session::lookup ( *isegment );
parallel = Session::lookup( *isegment );
ltrace(200) << "* " << parallel << endl;
if ( parallel->isFixed () ) continue;
if ( parallel->isGlobal() ) continue;
getPerpandiculars ( parallel, source, direction, perpandiculars );
getPerpandiculars ( parallel, segment->base()->getAutoTarget(), direction, perpandiculars );
if (parallel->isFixed ()) continue;
if (parallel->isGlobal()) continue;
getPerpandiculars( parallel, source, direction, perpandiculars );
getPerpandiculars( parallel, segment->base()->getAutoTarget(), direction, perpandiculars );
}
} else {
cerr << Bug("%s is not anchored on a <RoutingPad>\n (%s)"
,getString(source).c_str()
,getString(source->getAnchor()).c_str()) << endl;
cerr << Bug( "%s is not anchored on a <RoutingPad>\n (%s)"
, getString(source).c_str()
, getString(source->getAnchor()).c_str() ) << endl;
}
}
// Apply caging constraints to perpandiculars.
ltracein(200);
if ( perpandiculars.size() == 0 ) {
if (perpandiculars.size() == 0) {
ltrace(200) << "No perpandiculars to " << segment << endl;
ltraceout(200);
return;
@ -195,10 +184,10 @@ namespace {
Interval constraints ( minConstraint, maxConstraint );
for ( size_t iperpand=0 ; iperpand<perpandiculars.size() ; iperpand++ ) {
ltrace(200) << "Caged: " << constraints << " " << perpandiculars[iperpand] << endl;
perpandiculars[iperpand]->base()->mergeUserConstraints ( constraints );
if ( perpandiculars[iperpand]->base()->getUserConstraints().isEmpty() ) {
perpandiculars[iperpand]->base()->mergeUserConstraints( constraints );
if (perpandiculars[iperpand]->base()->getUserConstraints().isEmpty()) {
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 )
{
Configuration* configuration = Session::getConfiguration ();
const Layer* metal2 = configuration->getRoutingLayer ( 1 );
const Layer* metal3 = configuration->getRoutingLayer ( 2 );
ltrace(150) << "protectCagedTerminals() " << track << endl;
ltracein(150);
for ( size_t i=0 ; i<track->getSize() ; i++ ) {
TrackElement* segment = track->getSegment ( i );
DbU::Unit lastMovedUp = track->getMin();
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() ) {
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;
if ( segment->getLayer() != metal2 ) continue;
if ( segment->getLength() >= DbU::lambda(5.0) ) continue;
if ( (segment->getLayer() != metal2)
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();
RoutingPad* rp = dynamic_cast<RoutingPad*>(support->getAnchor());
Katabatic::AutoContact* source
= Katabatic::AutoContact::fromRp ( support->getGCell()
, rp
, metal3
, rp->getSourcePosition()
, DbU::lambda(1.0), DbU::lambda(1.0)
, true
);
= Katabatic::AutoContactTerminal::create( support->getGCell()
, rp
, metal3
, rp->getSourcePosition()
, DbU::lambda(1.0), DbU::lambda(1.0)
);
source->setFlags( Katabatic::CntIgnoreAnchor );
Katabatic::AutoContact* target =
Katabatic::AutoContact::fromRp ( support->getGCell()
, rp
, metal3
, rp->getSourcePosition()
, DbU::lambda(1.0), DbU::lambda(1.0)
, true
);
AutoSegment* segment = AutoSegment::create ( source
, target
, Constant::Vertical
, 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
Katabatic::AutoContactTerminal::create( support->getGCell()
, rp
, metal3
, rp->getSourcePosition()
, DbU::lambda(1.0), DbU::lambda(1.0)
);
target->setFlags( Katabatic::CntIgnoreAnchor );
AutoSegment* fixedSegment = AutoSegment::create( source, target, Katabatic::KbVertical );
fixedSegment->setFlags( Katabatic::SegFixed );
Session::getNegociateWindow()->createTrackSegment( fixedSegment, KtLoadingStage );
}
neighborNet = segment->getNet();
}
}
ltraceout(150);
}
@ -293,17 +309,18 @@ namespace Kite {
using Hurricane::Bug;
using Hurricane::Net;
using Hurricane::Name;
using Katabatic::AutoSegmentLut;
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];
Track* track = plane->getTrackByIndex ( 0 );
Track* track = plane->getTrackByIndex( 0 );
while ( track ) {
protectCagedTerminals ( track );
track = track->getNext ();
protectCagedTerminals( track );
track = track->getNextTrack();
}
}
Session::revalidate ();
@ -314,32 +331,17 @@ namespace Kite {
{
set<TrackElement*> faileds;
TrackElementLut::iterator isegment = _trackSegmentLut.begin();
for ( ; isegment != _trackSegmentLut.end() ; isegment++ ) {
if ( not isegment->second->isFixed() ) continue;
propagateCagedConstraints ( isegment->second, faileds );
TrackElement* segment = NULL;
AutoSegmentLut::const_iterator isegment = _getAutoSegmentLut().begin();
for ( ; isegment != _getAutoSegmentLut().end() ; isegment++ ) {
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 )
{
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.
} // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./ProtectRoutingPads.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include <map>
#include <list>
#include "hurricane/DataBase.h"
#include "hurricane/Technology.h"
#include "hurricane/BasicLayer.h"
#include "hurricane/RegularLayer.h"
#include "hurricane/Horizontal.h"
#include "hurricane/Vertical.h"
#include "hurricane/RoutingPad.h"
#include "hurricane/Occurrence.h"
#include "hurricane/Cell.h"
#include "hurricane/NetExternalComponents.h"
#include "crlcore/Catalog.h"
#include "katabatic/AutoContact.h"
#include "katabatic/AutoSegment.h"
#include "katabatic/GCell.h"
#include "katabatic/GCellGrid.h"
#include "katabatic/KatabaticEngine.h"
#include "kite/RoutingPlane.h"
#include "kite/TrackSegment.h"
#include "kite/TrackFixedSegment.h"
#include "kite/Track.h"
#include "kite/KiteEngine.h"
#include <map>
#include <list>
#include "hurricane/DataBase.h"
#include "hurricane/Technology.h"
#include "hurricane/BasicLayer.h"
#include "hurricane/RegularLayer.h"
#include "hurricane/Horizontal.h"
#include "hurricane/Vertical.h"
#include "hurricane/RoutingPad.h"
#include "hurricane/Occurrence.h"
#include "hurricane/Cell.h"
#include "hurricane/NetExternalComponents.h"
#include "crlcore/Catalog.h"
#include "katabatic/AutoContact.h"
#include "katabatic/AutoSegment.h"
#include "katabatic/GCell.h"
#include "katabatic/GCellGrid.h"
#include "katabatic/KatabaticEngine.h"
#include "kite/RoutingPlane.h"
#include "kite/TrackSegment.h"
#include "kite/TrackFixedSegment.h"
#include "kite/Track.h"
#include "kite/KiteEngine.h"
namespace {
@ -114,12 +105,12 @@ namespace {
transformation.applyOn ( bb );
//cinfo << "bb: " << bb << endl;
if ( direction == Constant::Horizontal ) {
if ( direction == KbHorizontal ) {
DbU::Unit axisMin = bb.getYMin() - delta;
DbU::Unit axisMax = bb.getYMax() + delta;
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()
, segments[i]->getLayer()
, track->getAxis()
@ -134,7 +125,7 @@ namespace {
DbU::Unit axisMax = bb.getXMax() + delta;
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()
, segments[i]->getLayer()
, track->getAxis()
@ -167,9 +158,6 @@ namespace Kite {
cmess1 << " o Protect external components not useds as RoutingPads." << endl;
forEach ( Net*, inet, getCell()->getNets() ) {
// cerr << *inet << " isSupply():" << (*inet)->isSupply()
// << " " << (*inet)->getType()
// << endl;
if ( (*inet)->isSupply() ) continue;
vector<RoutingPad*> rps;
@ -185,4 +173,4 @@ namespace Kite {
}
} // End of Kite namespace.
} // Kite namespace.

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// 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 |

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// 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 |
@ -68,30 +68,30 @@ extern "C" {
DL_EXPORT(void) initKite () {
trace << "initKite()" << endl;
PyKiteEngine_LinkPyType ();
PyGraphicKiteEngine_LinkPyType ();
PyKiteEngine_LinkPyType();
PyGraphicKiteEngine_LinkPyType();
PYTYPE_READY_SUB ( KiteEngine , ToolEngine );
PYTYPE_READY_SUB ( GraphicKiteEngine, GraphicTool );
PYTYPE_READY_SUB( KiteEngine , ToolEngine );
PYTYPE_READY_SUB( GraphicKiteEngine, GraphicTool );
PyObject* module = Py_InitModule ( "Kite", PyKite_Methods );
if ( module == NULL ) {
PyObject* module = Py_InitModule( "Kite", PyKite_Methods );
if (module == NULL) {
cerr << "[ERROR]\n"
<< " Failed to initialize Kite module." << endl;
return;
}
Py_INCREF ( &PyTypeKiteEngine );
PyModule_AddObject ( module, "KiteEngine", (PyObject*)&PyTypeKiteEngine );
Py_INCREF ( &PyTypeGraphicKiteEngine );
PyModule_AddObject ( module, "GraphicKiteEngine", (PyObject*)&PyTypeGraphicKiteEngine );
Py_INCREF( &PyTypeKiteEngine );
PyModule_AddObject( module, "KiteEngine", (PyObject*)&PyTypeKiteEngine );
Py_INCREF( &PyTypeGraphicKiteEngine );
PyModule_AddObject( module, "GraphicKiteEngine", (PyObject*)&PyTypeGraphicKiteEngine );
PyObject* dictionnary = PyModule_GetDict(module);
PyObject* dictionnary = PyModule_GetDict( module );
PyObject* constant;
LoadObjectConstant(dictionnary,BuildGlobalSolution,"BuildGlobalSolution");
LoadObjectConstant(dictionnary,LoadGlobalSolution ,"LoadGlobalSolution" );
LoadObjectConstant( dictionnary, KtBuildGlobalRouting, "KtBuildGlobalRouting" );
LoadObjectConstant( dictionnary, KtLoadGlobalRouting , "KtLoadGlobalRouting" );
}

View File

@ -2,7 +2,7 @@
// -*- C++ -*-
//
// 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 |

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,9 @@
// -*- C++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./RoutingEventHistory.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include <iomanip>
#include "hurricane/Error.h"
#include "kite/RoutingEvent.h"
#include "kite/RoutingEventHistory.h"
#include <iomanip>
#include "hurricane/Error.h"
#include "kite/RoutingEvent.h"
#include "kite/RoutingEventHistory.h"
namespace Kite {
using std::cerr;
using std::setw;
using std::setfill;
@ -113,4 +102,4 @@ namespace Kite {
}
} // End of Kite namespace.
} // Kite namespace.

View File

@ -1,15 +1,9 @@
// -*- C++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./RoutingEventLoop.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include <iostream>
#include <algorithm>
#include "kite/RoutingEvent.h"
#include "kite/RoutingEventLoop.h"
#include <iostream>
#include <algorithm>
#include "kite/RoutingEvent.h"
#include "kite/RoutingEventLoop.h"
namespace Kite {
@ -91,4 +82,4 @@ namespace Kite {
}
} // End of Kite namespace.
} // Kite namespace.

View File

@ -1,43 +1,32 @@
// -*- C++ -*-
//
// 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 |
// | K i t e - D e t a i l e d R o u t e r |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== |
// | C++ Module : "./RoutingEvent.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// | C++ Module : "./RoutingEventQueue.cpp" |
// +-----------------------------------------------------------------+
#include <iostream>
#include <iomanip>
#include <functional>
#include <algorithm>
#include "hurricane/Bug.h"
#include "kite/DataNegociate.h"
#include "kite/TrackElement.h"
#include "kite/RoutingEventQueue.h"
#include "kite/Session.h"
#include <iostream>
#include <iomanip>
#include <functional>
#include <algorithm>
#include "hurricane/Bug.h"
#include "kite/DataNegociate.h"
#include "kite/TrackSegment.h"
#include "kite/RoutingEventQueue.h"
#include "kite/Session.h"
namespace Kite {
using std::cerr;
using std::endl;
using std::setw;
@ -72,39 +61,35 @@ namespace Kite {
void RoutingEventQueue::load ( const vector<TrackElement*>& segments )
{
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;
continue;
}
if ( segments[i]->getTrack() ) {
if (segments[i]->getTrack()) {
cinfo << "[INFO] Already in Track - " << segments[i] << endl;
continue;
}
RoutingEvent* event = RoutingEvent::create(segments[i]);
event->updateKey ();
_events.insert ( event );
event->updateKey();
_events.insert( event );
}
}
void RoutingEventQueue::add ( TrackElement* segment, unsigned int level )
{
if ( segment->getTrack() ) {
if (segment->getTrack()) {
cinfo << "[INFO] Already in Track " << (void*)segment->base()->base()
<< ":" << segment << endl;
return;
}
RoutingEvent* event = RoutingEvent::create(segment);
event->setEventLevel ( level );
push ( event );
event->setEventLevel( level );
push( event );
}
void RoutingEventQueue::push ( RoutingEvent* event )
{ _pushRequests.insert ( event ); }
void RoutingEventQueue::commit ()
{
ltrace(200) << "RoutingEventQueue::commit()" << endl;
@ -113,31 +98,25 @@ namespace Kite {
size_t addeds = _pushRequests.size();
size_t before = _events.size();
set<RoutingEvent*>::iterator ipushEvent = _pushRequests.begin();
RoutingEventSet::iterator ipushEvent = _pushRequests.begin();
for ( ; ipushEvent != _pushRequests.end() ; ipushEvent++ ) {
(*ipushEvent)->updateKey ();
(*ipushEvent)->updateKey();
_topEventLevel = max ( _topEventLevel, (*ipushEvent)->getEventLevel() );
_events.insert ( (*ipushEvent) );
_topEventLevel = max( _topEventLevel, (*ipushEvent)->getEventLevel() );
_events.insert( (*ipushEvent) );
ltrace(200) << "| " << (*ipushEvent) << endl;
}
_pushRequests.clear ();
_pushRequests.clear();
#if defined(CHECK_ROUTINGEVENT_QUEUE)
_keyCheck ();
_keyCheck();
#endif
size_t after = _events.size();
if ( after-before != addeds ) {
cerr << Bug("RoutingEventQueue::commit(): less than %d events pusheds (%d)."
,addeds,(after-before)) << endl;
if (after-before != addeds) {
cerr << Bug( "RoutingEventQueue::commit(): less than %d events pusheds (%d)."
, addeds,(after-before) ) << endl;
}
// if ( (RoutingEvent::getProcesseds() > 61246)
// and (RoutingEvent::getProcesseds() < 61256) ) {
// cerr << "RoutingEventQueue::commit()" << endl;
// dump ();
// }
ltraceout(200);
}
@ -151,33 +130,20 @@ namespace Kite {
_keyCheck ();
#endif
if ( !_events.empty() ) {
if (not _events.empty()) {
size_t beforeSize = _events.size();
ievent = _events.end();
ievent--;
event = (*ievent);
_events.erase ( ievent );
// if ( (RoutingEvent::getProcesseds() > 61246)
// and (RoutingEvent::getProcesseds() < 61256) ) {
// cerr << "Popped: " << event << endl;
// dump ();
// }
_events.erase( ievent );
size_t afterSize = _events.size();
if ( afterSize+1 != beforeSize ) {
cerr << Bug("RoutingEventQueue::pop(): more than one event popped: %d."
,(beforeSize-afterSize)) << endl;
if (afterSize+1 != beforeSize) {
cerr << Bug( "RoutingEventQueue::pop(): more than one event popped: %d."
, (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;
@ -192,65 +158,59 @@ namespace Kite {
multiset<RoutingEvent*,RoutingEvent::Compare>::iterator ievent = _events.find(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;
#if defined(CHECK_ROUTINGEVENT_QUEUE)
_keyCheck ();
#endif
}
if ( ievent != _events.end() ) {
// if ( (RoutingEvent::getProcesseds() > 61246)
// and (RoutingEvent::getProcesseds() < 61256) ) {
// cerr << "Erasing: " << *ievent << endl;
// }
_events.erase ( ievent );
if (ievent != _events.end()) {
_events.erase( ievent );
}
push ( event );
// if ( (RoutingEvent::getProcesseds() > 61246)
// and (RoutingEvent::getProcesseds() < 61256) ) {
// cerr << "After repush: " << event << endl;
// dump();
// }
}
void RoutingEventQueue::repushInvalidateds ()
{
const vector<AutoSegment*>& invalidateds0 = Session::getInvalidateds();
set<TrackElement*> invalidateds1;
TrackSegmentSet invalidateds1;
for ( size_t i=0 ; i<invalidateds0.size() ; i++ ) {
TrackElement* segment = Session::lookup ( invalidateds0[i] );
if ( segment )
invalidateds1.insert ( segment );
TrackSegment* segment = dynamic_cast<TrackSegment*>( Session::lookup(invalidateds0[i]) );
if (segment)
invalidateds1.insert( segment );
}
set<TrackElement*>::iterator isegment = invalidateds1.begin();
TrackSegmentSet::iterator isegment = invalidateds1.begin();
for ( ; isegment != invalidateds1.end() ; isegment++ ) {
RoutingEvent* event = (*isegment)->getDataNegociate()->getRoutingEvent();
if ( event
and not event->isUnimplemented()
and not event->isDisabled ()
and not event->isProcessed () ) {
repush ( event );
} else {
// if ( (RoutingEvent::getProcesseds() > 61246)
// and (RoutingEvent::getProcesseds() < 61256) ) {
// cerr << "NOT repushed: " << event << endl;
// }
repush( event );
}
}
}
void RoutingEventQueue::prepareRepair ()
{
multiset<RoutingEvent*,RoutingEvent::Compare>::const_iterator ievent = _events.begin ();
for ( ; ievent != _events.end(); ++ievent ) {
(*ievent)->getSegment()->base()->toOptimalAxis();
}
}
void RoutingEventQueue::clear ()
{
if ( not _events.empty() ) {
if (not _events.empty()) {
cerr << Bug("RoutingEvent queue is not empty, %d events remains."
,_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++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./RoutingPlane.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include "hurricane/Error.h"
#include "hurricane/Box.h"
#include "hurricane/Cell.h"
#include "crlcore/RoutingLayerGauge.h"
#include "kite/HorizontalTrack.h"
#include "kite/VerticalTrack.h"
#include "kite/RoutingPlane.h"
#include "kite/KiteEngine.h"
#include "hurricane/Error.h"
#include "hurricane/Box.h"
#include "hurricane/Cell.h"
#include "crlcore/RoutingLayerGauge.h"
#include "kite/HorizontalTrack.h"
#include "kite/VerticalTrack.h"
#include "kite/RoutingPlane.h"
#include "kite/KiteEngine.h"
namespace {
@ -48,7 +38,6 @@ namespace {
namespace Kite {
using std::cerr;
using std::endl;
using Hurricane::tab;
@ -68,8 +57,21 @@ namespace Kite {
: _kite (kite)
, _layerGauge(kite->getLayerGauge(depth))
, _depth (depth)
, _flags (0)
, _axisMin (0)
, _axisMax (0)
, _trackMin (0)
, _trackMax (0)
, _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 ()
@ -82,8 +84,8 @@ namespace Kite {
<< (void*)this << " " << this << endl;
ltracein(90);
for ( size_t index = 0 ; index < _tracks.size() ; index++ )
_tracks[index]->destroy ();
for ( size_t index=0 ; index<_tracks.size() ; ++index )
_tracks[index]->destroy();
delete this;
@ -95,40 +97,41 @@ namespace Kite {
{
RoutingPlane* plane = new RoutingPlane ( kite, depth );
if ( !plane->_layerGauge )
throw Error ( badLayerGauge, depth, getString(kite->getRoutingGauge()).c_str() );
if (not plane->_layerGauge)
throw Error( badLayerGauge, depth, getString(kite->getRoutingGauge()).c_str() );
size_t trackNumber;
Box abutmentBox = kite->getCell()->getAbutmentBox();
if ( plane->getLayerGauge()->getDirection() & Constant::Horizontal ) {
plane->_trackMin = abutmentBox.getXMin () - DbU::lambda (2.0);
plane->_trackMax = abutmentBox.getXMax () + DbU::lambda (2.0);
plane->_axisMin = abutmentBox.getYMin ();
plane->_axisMax = abutmentBox.getYMax ();
trackNumber = plane->computeTracksSize ();
// HARD CODED.
if (plane->getDirection() == KbHorizontal) {
plane->_trackMin = abutmentBox.getXMin() - DbU::lambda(2.0);
plane->_trackMax = abutmentBox.getXMax() + DbU::lambda(2.0);
plane->_axisMin = abutmentBox.getYMin();
plane->_axisMax = abutmentBox.getYMax();
trackNumber = plane->computeTracksSize();
} else {
plane->_trackMin = abutmentBox.getYMin () - DbU::lambda (2.0);
plane->_trackMax = abutmentBox.getYMax () + DbU::lambda (2.0);
plane->_axisMin = abutmentBox.getXMin ();
plane->_axisMax = abutmentBox.getXMax ();
trackNumber = plane->computeTracksSize ();
plane->_trackMin = abutmentBox.getYMin() - DbU::lambda(2.0);
plane->_trackMax = abutmentBox.getYMax() + DbU::lambda(2.0);
plane->_axisMin = abutmentBox.getXMin();
plane->_axisMax = abutmentBox.getXMax();
trackNumber = plane->computeTracksSize();
}
plane->_tracks.reserve ( trackNumber );
for ( size_t index = 0 ; index < trackNumber ; index++ ) {
if ( plane->getLayerGauge()->getDirection() & Constant::Horizontal ) {
plane->_tracks.push_back ( HorizontalTrack::create ( plane, index ) );
plane->_tracks.reserve( trackNumber );
for ( size_t index=0 ; index<trackNumber ; ++index ) {
if (plane->getDirection() == KbHorizontal) {
plane->_tracks.push_back( HorizontalTrack::create( plane, index ) );
// Ugly: Direct uses of CellGauge (middle tracks 4 & 5 for local use).
if ( depth == 1 ) {
switch ( index % 10 ) {
if (depth == 1) {
switch ( index%10 ) {
case 4:
case 5:
plane->_tracks.back()->setLocalAssigned ( true );
plane->_tracks.back()->setLocalAssigned( true );
break;
}
}
} 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
{ return getKiteEngine()->getRoutingPlaneByIndex ( getDepth()+1 ); }
{ return getKiteEngine()->getRoutingPlaneByIndex( getDepth()+1 ); }
RoutingPlane* RoutingPlane::getBottom () const
{
if ( !getDepth() ) return NULL;
return getKiteEngine()->getRoutingPlaneByIndex ( getDepth()-1 );
if (not getDepth()) return NULL;
return getKiteEngine()->getRoutingPlaneByIndex( getDepth()-1 );
}
Track* RoutingPlane::getTrackByIndex ( size_t index ) const
{
if ( index >= getTracksSize() ) return NULL;
if (index >= getTracksSize()) return NULL;
return _tracks[index];
}
Track* RoutingPlane::getTrackByPosition ( DbU::Unit axis, unsigned int mode ) const
{
return getTrackByIndex ( getLayerGauge()->getTrackIndex ( getAxisMin()
, getAxisMax()
, axis
, mode
) );
return getTrackByIndex( getLayerGauge()->getTrackIndex( getAxisMin()
, getAxisMax()
, axis
, mode
) );
}
@ -168,8 +171,8 @@ namespace Kite {
{
bool coherency = true;
for ( size_t i=0 ; i<_tracks.size() ; i++ ) {
coherency = _tracks[i]->_check(overlaps) and coherency;
for ( size_t i=0 ; i<_tracks.size() ; ++i ) {
coherency = _tracks[i]->check(overlaps) and coherency;
}
return coherency;
@ -179,7 +182,9 @@ namespace Kite {
string RoutingPlane::_getString () const
{
return "<" + _getTypeName() + " @"
+ getString(_depth) + " ["
+ getString(_depth) + " "
+ getString(getLayer()) + " [ "
+ ((getDirection() == KbHorizontal) ? " horizontal [" : " vertical [")
+ getString(_tracks.size()) + "/"
+ getString(_tracks.capacity())
+ "]>";
@ -189,17 +194,17 @@ namespace Kite {
Record* RoutingPlane::_getRecord () const
{
Record* record = new Record ( getString(this) );
record->add ( getSlot ( "_kite" , _kite ) );
record->add ( getSlot ( "_layerGauge" , _layerGauge ) );
record->add ( getSlot ( "_depth" , &_depth ) );
record->add ( DbU::getValueSlot ( "_axisMin" , &_axisMin ) );
record->add ( DbU::getValueSlot ( "_axisMax" , &_axisMax ) );
record->add ( DbU::getValueSlot ( "_trackMin" , &_trackMin ) );
record->add ( DbU::getValueSlot ( "_trackMax" , &_trackMax ) );
record->add ( getSlot ( "_tracks" , &_tracks ) );
record->add( getSlot ( "_kite" , _kite ) );
record->add( getSlot ( "_layerGauge" , _layerGauge ) );
record->add( getSlot ( "_depth" , &_depth ) );
record->add( DbU::getValueSlot( "_axisMin" , &_axisMin ) );
record->add( DbU::getValueSlot( "_axisMax" , &_axisMax ) );
record->add( DbU::getValueSlot( "_trackMin" , &_trackMin ) );
record->add( DbU::getValueSlot( "_trackMax" , &_trackMax ) );
record->add( getSlot ( "_tracks" , &_tracks ) );
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 @@
// -*- C++ -*-
// -*- mode: C++; explicit-buffer-name: "Session.cpp<kite>" -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./Session.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include "hurricane/Bug.h"
#include "hurricane/Point.h"
#include "hurricane/Error.h"
#include "katabatic/GCellGrid.h"
#include "kite/Session.h"
@ -34,7 +26,6 @@
namespace {
using namespace Kite;
@ -43,12 +34,11 @@ namespace {
" Session already open for %s (internal error).";
} // End of local namespace.
} // Anonymous namespace.
namespace Kite {
using std::cerr;
using std::endl;
using Hurricane::tab;
@ -57,39 +47,32 @@ namespace Kite {
using Hurricane::ltraceout;
using Hurricane::Error;
using Hurricane::Bug;
using Hurricane::Point;
// -------------------------------------------------------------------
// Class : "Session".
Session::Session ( KiteEngine* kite )
: Katabatic::Session(kite)
, _insertEvents()
, _removeEvents()
, _sortEvents ()
{
//_addCanonizeCb ( _computeCagedConstraints );
}
{ }
void Session::_postCreate ()
{
Katabatic::Session::_postCreate ();
}
{ Katabatic::Session::_postCreate(); }
Session::~Session ()
{ }
size_t Session::_preDestroy ()
void Session::_preDestroy ()
{
_isEmpty ();
size_t count = Katabatic::Session::_preDestroy ();
return count;
_isEmpty();
Katabatic::Session::_preDestroy();
}
@ -97,16 +80,16 @@ namespace Kite {
{
ltrace(110) << "Kite::Session::open()" << endl;
Session* session = Session::get ();
if ( session ) {
if ( session->_getKiteEngine() != kite )
throw Error ( reopenSession, getString(session->getKiteEngine()).c_str() );
Session* session = Session::get();
if (session) {
if (session->_getKiteEngine() != kite)
throw Error( reopenSession, getString(session->getKiteEngine()).c_str() );
return session;
}
session = new Session ( kite );
session->_postCreate ();
session->_postCreate();
return session;
}
@ -120,14 +103,6 @@ namespace Kite {
{ 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 )
{ return Session::get("Session::lookup(Segment*)")->_getKiteEngine()->_lookup(segment); }
@ -136,10 +111,6 @@ namespace Kite {
{ 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 )
{ Session::get("setInterrupt()")->_getKiteEngine()->setInterrupt(state); }
@ -166,115 +137,102 @@ namespace Kite {
size_t Session::_revalidate ()
{
ltrace(90) << "Kite::Session::_revalidate()" << endl;
ltracein(90);
set<Track*> packTracks;
for ( size_t i=0 ; i < _removeEvents.size() ; i++ ) {
if ( !_removeEvents[i]._segment->getTrack() ) continue;
for ( size_t i=0 ; i<_removeEvents.size() ; ++i ) {
if (not _removeEvents[i]._segment->getTrack()) continue;
packTracks.insert ( _removeEvents[i]._segment->getTrack() );
_removeEvents[i]._segment->detach ();
packTracks.insert( _removeEvents[i]._segment->getTrack() );
_removeEvents[i]._segment->detach();
}
_removeEvents.clear ();
_removeEvents.clear();
for ( set<Track*>::iterator it=packTracks.begin() ; it != packTracks.end() ; it++ )
(*it)->pack ();
for ( set<Track*>::iterator it=packTracks.begin() ; it != packTracks.end() ; ++it )
(*it)->doRemoval();
for ( size_t i=0 ; i < _insertEvents.size() ; i++ ) {
if ( _insertEvents[i]._segment ) {
_insertEvents[i]._track->insert ( _insertEvents[i]._segment );
for ( size_t i=0 ; i<_insertEvents.size() ; ++i ) {
if (_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.
const set<AutoSegment*>& destroyeds = getDestroyeds();
set<AutoSegment*>::const_iterator idestroyed = destroyeds.begin();
for ( ; idestroyed != destroyeds.end() ; idestroyed++ ) {
if ( lookup(*idestroyed) ) {
throw Error("Destroyed AutoSegment is associated with a TrackSegment\n"
" (%s)"
,getString(*idestroyed).c_str());
for ( ; idestroyed != destroyeds.end() ; ++idestroyed ) {
if (lookup(*idestroyed)) {
ltraceout(90);
throw Error( "Destroyed AutoSegment is associated with a TrackSegment\n"
" (%s)"
, getString(*idestroyed).c_str());
}
}
size_t count = Katabatic::Session::_revalidate ();
size_t count = Katabatic::Session::_revalidate();
Interval span;
vector<TrackElement*> processeds;
const vector<AutoSegment*>& revalidateds = getRevalidateds ();
const set<Net*>& netsModificateds = getNetsModificateds ();
const vector<AutoSegment*>& revalidateds = getRevalidateds();
//const set<Net*>& netsModificateds = getNetsModificateds();
for ( size_t i=0 ; i<revalidateds.size() ; i++ ) {
Net* currentNet = NULL;
bool invalidEvent = false;
TrackElement* trackSegment = lookup ( revalidateds[i]->base() );
for ( size_t i=0 ; i<revalidateds.size() ; ++i ) {
if (not revalidateds[i]->isCanonical()) continue;
//Net* currentNet = NULL;
TrackElement* trackSegment = lookup( revalidateds[i] );
if ( trackSegment && !trackSegment->isRevalidated() ) {
if ( trackSegment->getNet() != currentNet ) {
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 );
}
if (trackSegment and trackSegment->isInvalidated()) {
trackSegment->revalidate();
}
}
for ( size_t i=0 ; i<processeds.size() ; i++ )
processeds[i]->setRevalidated ( false );
_doglegReset();
# if defined(CHECK_DATABASE)
unsigned int overlaps = 0;
# endif
for ( set<Track*>::iterator it=_sortEvents.begin()
; it != _sortEvents.end()
; it++
) {
(*it)->sort ();
for ( set<Track*>::iterator it=_sortEvents.begin() ; it!=_sortEvents.end() ; ++it ) {
(*it)->doReorder();
# if defined(CHECK_DATABASE)
(*it)->_check ( overlaps, "Session::_revalidate() - track sorting." );
(*it)->check( overlaps, "Session::_revalidate() - track sorting." );
# endif
}
set<TrackElement*> faileds;
for ( set<Net*>::iterator inet=netsModificateds.begin() ; inet != netsModificateds.end() ; inet++ ) {
_getKiteEngine()->_computeCagedConstraints ( *inet, faileds );
}
# if defined(CHECK_DATABASE)
for ( set<Track*>::iterator it=packTracks.begin() ; it != packTracks.end() ; it++ )
(*it)->_check ( overlaps, "Session::_revalidate() - on packed track." );
for ( set<Track*>::iterator it=packTracks.begin() ; it != packTracks.end() ; ++it )
(*it)->check( overlaps, "Session::_revalidate() - on packed track." );
//_getKiteEngine()->_showOverlap ();
# endif
_sortEvents.clear ();
_sortEvents.clear();
if ( not faileds.empty() ) {
#if THIS_IS_DISABLED
if (not faileds.empty()) {
set<TrackElement*>::iterator ifailed = faileds.begin();
Katabatic::GCellVector gcells;
for ( ; ifailed != faileds.end() ; ++ifailed ) {
(*ifailed)->getGCells ( gcells );
(*ifailed)->makeDogLeg ( gcells[0] );
(*ifailed)->makeDogLeg( gcells[0] );
}
count += _revalidate ();
count += _revalidate();
}
#endif
ltraceout(90);
return count;
}
bool Session::_isEmpty () const
{
if ( !_insertEvents.empty() || !_removeEvents.empty() || !_sortEvents.empty() ) {
cerr << Bug(" Session::checkEmpty() failed :\n"
" %u inserts, %u removes and %u sort events remains."
if ( not _insertEvents.empty() or not _removeEvents.empty() or not _sortEvents.empty() ) {
cerr << Bug( " Session::checkEmpty() failed :\n"
" %u inserts, %u removes and %u sort events remains."
, _insertEvents.size()
, _removeEvents.size()
, _sortEvents .size() ) << endl;
@ -287,17 +245,13 @@ namespace Kite {
void Session::_addInsertEvent ( TrackMarker* marker, Track* track )
{
_insertEvents.push_back ( Event(marker,track) );
_addSortEvent ( track, true );
_insertEvents.push_back( Event(marker,track) );
_addSortEvent( track, true );
}
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
<< "\n @" << track << endl;
@ -311,46 +265,46 @@ namespace Kite {
return;
}
_insertEvents.push_back ( Event(segment,track) );
_addSortEvent ( track, true );
_insertEvents.push_back( Event(segment,track) );
_addSortEvent( track, true );
}
void Session::_addRemoveEvent ( TrackElement* segment )
{
if ( not segment->getTrack() ) {
cerr << Bug(" Kite::Session::addRemoveEvent() : %s is not in any Track."
,getString(segment).c_str()) << endl;
if (not segment->getTrack()) {
cerr << Bug( " Kite::Session::addRemoveEvent() : %s is not in any Track."
, getString(segment).c_str() ) << endl;
return;
}
ltrace(200) << "Ripup: @" << DbU::getValueString(segment->getAxis()) << " " << segment << endl;
_removeEvents.push_back ( Event(segment,segment->getTrack()) );
_addSortEvent ( segment->getTrack(), true );
_removeEvents.push_back( Event(segment,segment->getTrack()) );
_addSortEvent( segment->getTrack(), true );
}
void Session::_addMoveEvent ( TrackElement* segment, Track* track )
{
if ( !segment->getTrack() ) {
cerr << Bug(" Kite::Session::addMoveEvent() : %s has no target Track."
,getString(segment).c_str()) << endl;
if (not segment->getTrack()) {
cerr << Bug( " Kite::Session::addMoveEvent() : %s has no target Track."
, getString(segment).c_str() ) << endl;
return;
}
_addRemoveEvent ( segment );
_addInsertEvent ( segment, track );
_addRemoveEvent( segment );
_addInsertEvent( segment, track );
}
void Session::_addSortEvent ( Track* track, bool forced )
{
if ( !track ) {
cerr << Bug(" Kite::Session::addSortEvent() : no Track to sort.") << endl;
if (not track ) {
cerr << Bug( " Kite::Session::addSortEvent() : no Track to sort." ) << endl;
return;
}
if ( forced ) track->forceSort ();
_sortEvents.insert ( track );
if (forced) track->invalidate();
_sortEvents.insert( track );
}
@ -361,10 +315,10 @@ namespace Kite {
Record* Session::_getRecord () const
{
Record* record = Session::_getRecord ();
record->add ( getSlot ( "_sortEvents" , &_sortEvents ) );
record->add( getSlot( "_sortEvents" , &_sortEvents ) );
return record;
}
} // End of Kite namespace.
} // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./Track.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include <cstdlib>
#include <sstream>
#include <memory>
#include <algorithm>
#include "hurricane/Warning.h"
#include "hurricane/Bug.h"
#include "hurricane/Layer.h"
#include "hurricane/Net.h"
#include "kite/RoutingPlane.h"
#include "kite/Track.h"
#include "kite/TrackMarker.h"
#include "kite/DataNegociate.h"
#include <cstdlib>
#include <sstream>
#include <memory>
#include <algorithm>
#include "hurricane/Warning.h"
#include "hurricane/Bug.h"
#include "hurricane/Layer.h"
#include "hurricane/Net.h"
#include "kite/RoutingPlane.h"
#include "kite/Track.h"
#include "kite/TrackMarker.h"
#include "kite/DataNegociate.h"
namespace {
using namespace std;
using namespace CRL;
using namespace Kite;
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(); }
} // End of local namespace.
} // Anonymous namespace.
namespace Kite {
using std::lower_bound;
using std::remove_if;
using std::sort;
@ -81,7 +68,7 @@ namespace Kite {
// 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 )
@ -103,9 +90,7 @@ namespace Kite {
Track::~Track ()
{
ltrace(90) << "Track::~Track() - " << (void*)this << endl;
}
{ ltrace(90) << "Track::~Track() - " << (void*)this << endl; }
void Track::_preDestroy ()
@ -114,10 +99,10 @@ namespace Kite {
ltracein(90);
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++ )
if ( _markers[i] ) _markers[i]->destroy();
if (_markers[i]) _markers[i]->destroy();
ltraceout(90);
}
@ -127,7 +112,7 @@ namespace Kite {
{
ltrace(90) << "Track::destroy() - " << (void*)this << " " << this << endl;
Track::_preDestroy ();
Track::_preDestroy();
delete this;
}
@ -148,9 +133,20 @@ namespace Kite {
{ 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
{
if ( (index == NPOS) || (index >= getSize()) ) return NULL;
if ( (index == npos) or (index >= getSize()) ) return NULL;
return _segments[index];
}
@ -159,12 +155,9 @@ namespace Kite {
{
unsigned int state;
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);
}
@ -172,10 +165,10 @@ namespace Kite {
TrackElement* Track::getNext ( size_t& index, Net* net ) const
{
for ( index++ ; index < _segments.size() ; index++ ) {
if ( _segments[index]->getNet() == net ) continue;
if (_segments[index]->getNet() == net) continue;
return _segments[index];
}
index = NPOS;
index = npos;
return NULL;
}
@ -183,15 +176,15 @@ namespace Kite {
TrackElement* Track::getPrevious ( size_t& index, Net* net ) const
{
for ( index-- ; index != NPOS ; index-- ) {
if ( inltrace(148) ) {
for ( index-- ; index != npos ; index-- ) {
if (inltrace(148)) {
cerr << tab << index << ":"; cerr.flush();
cerr << _segments[index] << endl;
}
if ( _segments[index]->getNet() == net ) continue;
if (_segments[index]->getNet() == net) continue;
return _segments[index];
}
index = NPOS;
index = npos;
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;
begin = end = 0;
begin = 0;
return;
}
if ( position < _min ) {
cerr << Warning ( " Position %s inferior to the lower bound of %s. Returning NPOS."
, DbU::getValueString(position).c_str()
, getString(this).c_str() ) << endl;
state = BeforeFirst;
begin = end = 0;
if (position < _min) {
cerr << Warning( " Position %s inferior to the lower bound of %s. Returning npos."
, DbU::getValueString(position).c_str()
, getString(this).c_str() ) << endl;
state = BeforeFirstElement;
begin = 0;
return;
}
if ( position > _max ) {
cerr << Warning ( " Position %s superior to the upper bound of %s. Returning NPOS."
, DbU::getValueString(position).c_str()
, getString(this).c_str() ) << endl;
state = AfterLast;
begin = end = _segments.size() - 1;
if (position > _max) {
cerr << Warning( " Position %s superior to the upper bound of %s. Returning npos."
, DbU::getValueString(position).c_str()
, getString(this).c_str() ) << endl;
state = AfterLastElement;
begin = _segments.size()-1;
return;
}
vector<TrackElement*>::const_iterator lowerBound
= lower_bound ( _segments.begin(), _segments.end(), position, SourceCompare() );
begin = end = lowerBound - _segments.begin();
= lower_bound( _segments.begin(), _segments.end(), position, SourceCompare() );
begin = lowerBound - _segments.begin();
if ( begin < _segments.size() )
for ( ; (begin > 0) && (_segments[begin-1]->getNet() == _segments[begin]->getNet()) ; --begin );
// This is suspicious.
// 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;
if ( (begin == 0) && (position < _segments[0]->getSourceU()) ) {
state = BeforeFirst;
if ( (begin == 0) and (position < _segments[0]->getSourceU()) ) {
state = BeforeFirstElement;
} else {
if ( begin ) end = begin -= 1;
if (begin) begin -= 1;
size_t usedBegin = begin;
size_t usedEnd = begin;
Interval usedInterval = expandUsedInterval ( usedBegin, usedEnd );
Interval usedInterval = getOccupiedInterval( usedBegin );
if ( position < usedInterval.getVMax() )
state = Inside;
if (position < usedInterval.getVMax())
state = InsideElement;
else
if ( begin+1 == _segments.size() )
state = AfterLast;
if (begin+1 == _segments.size())
state = AfterLastElement;
else
state = Outside;
state = OutsideElement;
}
}
@ -265,22 +261,20 @@ namespace Kite {
void Track::getOverlapBounds ( Interval interval, size_t& begin, size_t& end ) const
{
unsigned int iState;
size_t iBegin;
size_t iEnd;
if ( _segments.empty()
|| (interval.getVMax() <= _min)
|| (interval.getVMin() >= _max)) {
begin = end = NPOS;
if ( _segments.empty()
or (interval.getVMax() <= _min)
or (interval.getVMin() >= _max)) {
begin = end = npos;
return;
}
getIBounds ( interval.getVMin(), begin, iEnd, iState );
expandUsedInterval ( begin, iEnd );
getBeginIndex ( interval.getVMin(), begin, iState );
getOccupiedInterval( begin );
getIBounds ( interval.getVMax(), iBegin, end, iState );
getBeginIndex( interval.getVMax(), end, iState );
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);
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();
for ( ; (mbegin < _markers.size())
&& (_markers[mbegin]->getSourceU() <= interval.getVMax()) ; mbegin++ ) {
for ( ; (mbegin < _markers.size())
and (_markers[mbegin]->getSourceU() <= interval.getVMax()) ; mbegin++ ) {
ltrace(148) << "| @" << DbU::getValueString(_axis) << _markers[mbegin] << endl;
if ( _markers[mbegin]->getNet() != net ) {
ltrace(148) << "* Mark: @" << DbU::getValueString(_axis) << " " << _markers[mbegin] << endl;
cost.incTerminals ( _markers[mbegin]->getWeight(this) );
cost.incTerminals( _markers[mbegin]->getWeight(this) );
}
}
if ( begin == NPOS ) {
ltrace(148) << " begin == NPOS (after last TrackElement)." << endl;
if (begin == npos) {
ltrace(148) << " begin == npos (after last TrackElement)." << endl;
ltraceout(148);
return cost;
}
for ( ; begin < end ; begin++ ) {
Interval overlap = interval.getIntersection ( _segments[begin]->getCanonicalInterval() );
//if ( not overlap.isEmpty() ) {
if ( _segments[begin]->getNet() == net ) {
cost.incDeltaShared ( overlap.getSize() );
}
ltrace(190) << "| overlap: " << _segments[begin] << endl;
_segments[begin]->incOverlapCost ( net, cost );
if ( cost.isInfinite() ) break;
//}
Interval overlap = interval.getIntersection( _segments[begin]->getCanonicalInterval() );
if ( _segments[begin]->getNet() == net ) {
cost.incDeltaShared ( overlap.getSize() );
}
ltrace(190) << "| overlap: " << _segments[begin] << endl;
_segments[begin]->incOverlapCost( net, cost );
if (cost.isInfinite()) break;
}
ltraceout(148);
@ -343,16 +335,14 @@ namespace Kite {
size_t begin;
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
{
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
@ -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
{
if ( !_segments.size() ) return NPOS;
if (_segments.empty()) return npos;
vector<TrackElement*>::const_iterator lowerBound
= lower_bound ( _segments.begin()
, _segments.end()
, segment
, SegmentCompare()
);
= lower_bound( _segments.begin()
, _segments.end()
, segment
, SegmentCompare()
);
if ( lowerBound != _segments.end() ) {
if (lowerBound != _segments.end()) {
while ( segment->getSourceU() == (*lowerBound)->getSourceU() ) {
if ( *lowerBound == segment ) return (size_t)(lowerBound-_segments.begin());
if (*lowerBound == segment) return (size_t)(lowerBound-_segments.begin());
lowerBound++;
}
}
return NPOS;
return npos;
}
@ -423,13 +399,14 @@ namespace Kite {
size_t begin;
size_t end;
if ( !_segments.size() ) return Interval(_min,_max);
if (_segments.empty()) return Interval(_min,_max);
getIBounds ( position, begin, end, state );
if ( (state == Inside) && (_segments[begin]->getNet() != net) )
getBeginIndex( position, begin, state );
if ( (state == InsideElement) and (_segments[begin]->getNet() != net) )
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;
if ( !(state & MinTrackMin) ) {
if ( _segments[begin]->getNet() == net )
getPrevious ( begin, net );
if (not (state & BeginIsTrackMin) ) {
if (_segments[begin]->getNet() == net)
getPrevious( begin, net );
if ( begin != NPOS ) {
size_t usedEnd;
minFree = expandUsedInterval ( begin, usedEnd ).getVMax();
if (begin != npos) {
minFree = getOccupiedInterval(begin).getVMax();
}
}
if ( !(state & MaxTrackMax) ) {
if ( _segments[end]->getNet() == net ) {
getNext ( end, net );
if (not (state & EndIsTrackMax) ) {
if (_segments[end]->getNet() == net) {
getNext( end, net );
if ( end == NPOS ) {
if (end == npos) {
end = _segments.size() - 1;
setMaximalFlags ( state, MaxTrackMax );
setMaximalFlags( state, EndIsTrackMax );
} else {
setMaximalFlags ( state, MaxSegmentMin );
setMaximalFlags( state, EndIsSegmentMin );
}
}
}
return Interval ( minFree, getMaximalPosition(end,state) );
return Interval( minFree, getMaximalPosition(end,state) );
}
void Track::forceSort ()
{
_segmentsValid = false;
}
void Track::invalidate ()
{ _segmentsValid = false; }
void Track::insert ( TrackMarker* marker )
@ -499,54 +473,53 @@ namespace Kite {
void Track::setSegment ( TrackElement* segment, size_t index )
{
if ( index >= _segments.size() ) return;
_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 holes = false;
if ( message ) cerr << " o Checking Track - " << message << endl;
ltrace(90) << "[CHECK] " << (void*)this << ":" << this << endl;
if (message) cerr << " o Checking Track - " << message << endl;
ltrace(90) << (void*)this << ":" << this << endl;
for ( size_t i=0 ; i<_segments.size() ; i++ ) {
if ( _segments[i] ) {
if ( i ) {
if ( _segments[i-1] == _segments[i] ) {
if (_segments[i]) {
if (i) {
if (_segments[i-1] == _segments[i]) {
cerr << "[CHECK] incoherency at " << i << " "
<< _segments[i] << " is duplicated. " << endl;
coherency = false;
}
}
if ( !_segments[i]->getTrack() ) {
if (not _segments[i]->getTrack()) {
cerr << "[CHECK] incoherency at " << i << " "
<< _segments[i] << " is detached." << endl;
coherency = false;
} else {
if ( _segments[i]->getTrack() != this ) {
if (_segments[i]->getTrack() != this) {
cerr << "[CHECK] incoherency at " << i << " "
<< _segments[i] << " is in track "
<< _segments[i]->getTrack() << endl;
coherency = false;
}
if ( _segments[i]->getIndex() != i ) {
if (_segments[i]->getIndex() != i) {
cerr << "[CHECK] incoherency at " << i << " "
<< _segments[i] << " has bad index "
<< _segments[i]->getIndex() << endl;
coherency = false;
}
}
if ( _segments[i]->getAxis() != getAxis() ) {
if (_segments[i]->getAxis() != getAxis()) {
cerr << "[CHECK] incoherency at " << i << " "
<< _segments[i] << " is not on Track axis "
<< DbU::getValueString(getAxis()) << "." << endl;
coherency = false;
}
coherency = _segments[i]->_check () and coherency;
coherency = _segments[i]->_check() and coherency;
} else {
cerr << "[CHECK] Hole at position " << i << "." << endl;
holes = true;
@ -554,7 +527,7 @@ namespace Kite {
}
}
if ( !holes )
if (not holes)
coherency = (checkOverlap(overlaps) == 0) and coherency;
return coherency;
@ -563,7 +536,7 @@ namespace Kite {
DbU::Unit Track::getSourcePosition ( size_t i ) const
{
if ( i == NPOS) return 0;
if ( i == npos) return 0;
return _segments[i]->getSourceU();
}
@ -581,14 +554,14 @@ namespace Kite {
{
Interval canonical;
switch ( state & MinMask ) {
case MinTrackMin: return _min;
case MinSegmentMin: return _segments[index]->getSourceU ();
case MinSegmentMax: return _segments[index]->getTargetU ();
switch ( state & BeginMask ) {
case BeginIsTrackMin: return _min;
case BeginIsSegmentMin: return _segments[index]->getSourceU ();
case BeginIsSegmentMax: return _segments[index]->getTargetU ();
}
cerr << Bug ( " Track::getMinimalPosition(size_t,unsigned int) :"
" invalid state value %ud.", state ) << endl;
cerr << Bug( " Track::getMinimalPosition(size_t,unsigned int) :"
" invalid state value %ud.", state ) << endl;
return _min;
}
@ -598,104 +571,79 @@ namespace Kite {
{
Interval canonical;
switch ( state & MaxMask ) {
case MaxTrackMax: return _max;
case MaxSegmentMin: return _segments[index ]->getSourceU ();
case MaxNextSegmentMin: if ( index+1 >= getSize() ) return _max;
return _segments[index+1]->getSourceU ();
case MaxSegmentMax: return _segments[index ]->getTargetU ();
switch ( state & EndMask ) {
case EndIsTrackMax: return _max;
case EndIsSegmentMin: return _segments[index ]->getSourceU ();
case EndIsNextSegmentMin: if (index+1 >= getSize()) return _max;
return _segments[index+1]->getSourceU ();
case EndIsSegmentMax: return _segments[index ]->getTargetU ();
}
cerr << Bug ( " Track::getMaximalPosition(size_t,unsigned int) :"
" invalid state value %ud.", state ) << endl;
cerr << Bug( " Track::getMaximalPosition(size_t,unsigned int) :"
" invalid state value %ud.", state ) << endl;
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;
Net* owner = _segments[seed]->getNet();
Interval expandInterval;
Interval ownerInterval;
_segments[seed]->getCanonical ( ownerInterval );
Interval segmentInterval;
Interval mergedInterval;
_segments[seed]->getCanonical( mergedInterval );
size_t i = seed;
while ( --i != NPOS ) {
if ( _segments[i]->getNet() != owner ) break;
while ( --i != npos ) {
if (_segments[i]->getNet() != owner) break;
_segments[i]->getCanonical ( expandInterval );
if ( expandInterval.getVMax() >= ownerInterval.getVMin() ) {
ownerInterval.merge ( expandInterval );
_segments[i]->getCanonical ( segmentInterval );
if (segmentInterval.getVMax() >= mergedInterval.getVMin()) {
mergedInterval.merge( segmentInterval );
begin = i;
}
}
end = i = seed;
i = seed;
while ( ++i < _segments.size() ) {
if ( _segments[i]->getNet() != owner ) break;
if (_segments[i]->getNet() != owner) break;
_segments[i]->getCanonical ( expandInterval );
if ( expandInterval.getVMin() > ownerInterval.getVMax() ) break;
if ( expandInterval.getVMax() > ownerInterval.getVMax() ) end = i;
_segments[i]->getCanonical( segmentInterval );
if (segmentInterval.getVMin() > mergedInterval.getVMax()) break;
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);
size_t size = _segments.size();
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
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;
ltrace(148) << "After doRemoval " << this << endl;
ltraceout(148);
return size - _segments.size();
}
void Track::sort ()
void Track::doReorder ()
{
if ( !_segmentsValid ) {
if (not _segmentsValid ) {
std::sort ( _segments.begin(), _segments.end(), SegmentCompare() );
for ( size_t i=0 ; i < _segments.size() ; i++ ) {
_segments[i]->setIndex ( i );
@ -703,7 +651,7 @@ namespace Kite {
_segmentsValid = true;
}
if ( !_markersValid ) {
if (not _markersValid ) {
std::sort ( _markers.begin(), _markers.end(), TrackMarker::Compare() );
_markersValid = true;
}
@ -719,10 +667,10 @@ namespace Kite {
if ( _segments[i]->getNet() == _segments[i+1]->getNet() ) {
if ( _segments[i]->getSourceU() == _segments[i+1]->getSourceU() ) {
if ( _segments[i]->getTargetU() < _segments[i+1]->getTargetU() ) {
cerr << Warning(" Invalid sorting length order in %s:\n%s \n%s "
,getString(this).c_str()
,getString(_segments[i ]).c_str()
,getString(_segments[i+1]).c_str()) << endl;
cerr << Error(" Invalid sorting length order in %s:\n%s \n%s "
,getString(this).c_str()
,getString(_segments[i ]).c_str()
,getString(_segments[i+1]).c_str()) << endl;
}
}
for ( j=i+1 ; (j<_segments.size()) && (_segments[i]->getNet() == _segments[j]->getNet()) ; j++ );
@ -732,10 +680,10 @@ namespace Kite {
if ( (j<_segments.size())
&& (_segments[i]->getTargetU() > _segments[j]->getSourceU()) ) {
cerr << Warning("Overlap in %s between:\n %s\n %s"
,getString(this).c_str()
,getString(_segments[i]).c_str()
,getString(_segments[j]).c_str()) << endl;
cerr << Error("Overlap in %s between:\n %s\n %s"
,getString(this).c_str()
,getString(_segments[i]).c_str()
,getString(_segments[j]).c_str()) << endl;
overlaps++;
}
}
@ -760,13 +708,13 @@ namespace Kite {
Record* Track::_getRecord () const
{
Record* record = new Record ( _getString() );
record->add ( getSlot ( "_routingPlane", _routingPlane ) );
record->add ( getSlot ( "_index" , &_index ) );
record->add ( getSlot ( "_routingPlane", _routingPlane ) );
record->add ( getSlot ( "_index" , &_index ) );
record->add ( DbU::getValueSlot ( "_axis" , &_axis ) );
record->add ( getSlot ( "_segments" , &_segments ) );
record->add ( getSlot ( "_segments" , &_segments ) );
return record;
}
} // End of Kite namespace.
} // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | 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 {
using std::cerr;
using std::endl;
@ -46,7 +32,6 @@ namespace Kite {
// -------------------------------------------------------------------
// Class : "TrackCost".
TrackCost::TrackCost ( Track* track
, const Interval& interval
, size_t begin
@ -79,7 +64,7 @@ namespace Kite {
, _ripupCount (0)
{
TrackElement* neighbor;
if ( _begin != Track::NPOS ) {
if ( _begin != Track::npos ) {
neighbor = _track->getSegment(_begin);
if ( neighbor and (neighbor->getNet() != net) ) {
DbU::Unit distance = interval.getVMin() - neighbor->getTargetU();
@ -91,7 +76,7 @@ namespace Kite {
// _distanceToFixed += interval.getVMin() - neighbor->getTargetU();
// }
}
if ( _end != Track::NPOS ) {
if ( _end != Track::npos ) {
neighbor = _track->getSegment(_end);
if ( neighbor and (neighbor->getNet() != net) ) {
DbU::Unit distance = neighbor->getSourceU() - interval.getVMax();
@ -190,6 +175,7 @@ namespace Kite {
s += "+" + getString(_ripupCount);
s += ":" + getString((_dataState<<2)+_ripupCount);
s += " " + string ( (_blockage )?"b":"-" );
s += string ( (_blockage )?"f":"-" );
s += string ( (_hardOverlap )?"h":"-" );
s += string ( (_overlap )?"o":"-" );
s += string ( (_overlapGlobal )?"g":"-" );
@ -210,17 +196,22 @@ namespace Kite {
Record* TrackCost::_getRecord () const
{
Record* record = new Record ( _getString() );
record->add ( getSlot ( "_track" , _track ) );
record->add ( getSlot ( "_begin" , &_begin ) );
record->add ( getSlot ( "_end" , &_end ) );
record->add ( getSlot ( "_interval" , &_interval ) );
record->add ( getSlot ( "_infinite" , _infinite ) );
record->add ( getSlot ( "_overlap" , _overlap ) );
record->add ( getSlot ( "_terminals", _terminals ) );
record->add ( getSlot ( "_delta" , &_delta ) );
record->add( getSlot ( "_track" , _track ) );
record->add( getSlot ( "_begin" , &_begin ) );
record->add( getSlot ( "_end" , &_end ) );
record->add( getSlot ( "_interval" , &_interval ) );
record->add( getSlot ( "_infinite" , _infinite ) );
record->add( getSlot ( "_overlap" , _overlap ) );
record->add( getSlot ( "_terminals" , _terminals ) );
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;
}
} // End of Kite namespace.
} // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./TrackElement.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include <limits>
#include <sstream>
#include "hurricane/Bug.h"
#include "hurricane/Warning.h"
#include "hurricane/Net.h"
#include "hurricane/Name.h"
#include "katabatic/AutoContact.h"
#include "katabatic/GCell.h"
#include "crlcore/RoutingGauge.h"
#include "kite/DataNegociate.h"
#include "kite/TrackElement.h"
#include "kite/TrackCost.h"
#include "kite/Track.h"
#include "kite/Session.h"
#include "kite/RoutingEvent.h"
#include "kite/NegociateWindow.h"
#include <limits>
#include <sstream>
#include "hurricane/Bug.h"
#include "hurricane/Warning.h"
#include "hurricane/Net.h"
#include "hurricane/Name.h"
#include "katabatic/AutoContact.h"
#include "katabatic/GCell.h"
#include "crlcore/RoutingGauge.h"
#include "kite/DataNegociate.h"
#include "kite/TrackElement.h"
#include "kite/TrackCost.h"
#include "kite/Track.h"
#include "kite/Session.h"
#include "kite/RoutingEvent.h"
#include "kite/NegociateWindow.h"
namespace {
using namespace std;
using namespace Hurricane;
using namespace CRL;
using namespace Kite;
// ---------------------------------------------------------------
// Function : "DummyOverlapCost ()".
void DummyOverlapCost ( const TrackElement* segment, TrackCost& cost )
void dummyOverlapCost ( const TrackElement* segment, TrackCost& cost )
{
cerr << Warning("No overlapCost callback has been set (%s)."
,getString(segment).c_str()) << endl;
}
} // End of local namespace.
} // Anonymous namespace.
namespace Kite {
using Hurricane::inltrace;
using Hurricane::ltracein;
using Hurricane::ltraceout;
using Hurricane::tab;
using Hurricane::Bug;
using Hurricane::Net;
using Hurricane::Name;
@ -78,144 +64,141 @@ namespace Kite {
// -------------------------------------------------------------------
// Class : "TrackElement::Compare".
bool TrackElement::Compare::operator() ( TrackElement* lhs, TrackElement* rhs )
{
return lhs->getArea() > rhs->getArea();
}
// -------------------------------------------------------------------
// Class : "TrackElement::CompareByPosition".
// Comparison Classes.
//
// 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() )
return lhs->isBlockage();
if (lhs->isBlockage() xor rhs->isBlockage()) return lhs->isBlockage();
if ( lhs->getLength() < rhs->getLength() ) return true;
if ( lhs->getLength() > rhs->getLength() ) return false;
if (lhs->getLength() < rhs->getLength()) return true;
if (lhs->getLength() > rhs->getLength()) return false;
if ( lhs->isHorizontal() xor rhs->isHorizontal() )
return rhs->isHorizontal();
if (lhs->isHorizontal() xor rhs->isHorizontal()) return rhs->isHorizontal();
if ( lhs->getAxis() > rhs->getAxis() ) return true;
if ( lhs->getAxis() < rhs->getAxis() ) return false;
if (lhs->getAxis() > rhs->getAxis()) return true;
if (lhs->getAxis() < rhs->getAxis()) return false;
if ( lhs->getSourceU() > rhs->getSourceU() ) return true;
if ( lhs->getSourceU() < rhs->getSourceU() ) return false;
if (lhs->getSourceU() > rhs->getSourceU()) return true;
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();
}
// -------------------------------------------------------------------
// 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".
SegmentOverlapCostCB* TrackElement::_overlapCostCallback = DummyOverlapCost;
SegmentOverlapCostCB* TrackElement::_overlapCostCallback = dummyOverlapCost;
SegmentOverlapCostCB* TrackElement::setOverlapCostCB ( SegmentOverlapCostCB* cb )
{
SegmentOverlapCostCB* oldCb = _overlapCostCallback;
_overlapCostCallback = cb;
return oldCb;
}
// Former inline functions.
AutoSegment* TrackElement::base () const { return NULL; }
bool TrackElement::isBipoint () const { return false; }
bool TrackElement::isCreated () const { return false; }
bool TrackElement::isFixed () const { return false; }
bool TrackElement::isBlockage () const { return false; }
bool TrackElement::isStrap () const { return false; }
bool TrackElement::isSlackenStrap () const { return false; }
bool TrackElement::isLocal () const { return true; }
bool TrackElement::isGlobal () const { return not isLocal(); }
bool TrackElement::isLocked () const { return false; }
bool TrackElement::isTerminal () const { return false; }
bool TrackElement::isDogleg () const { return false; }
bool TrackElement::isRevalidated () const { return false; }
bool TrackElement::isRouted () const { return true; }
bool TrackElement::isSlackened () const { return false; }
bool TrackElement::isSlackenDogLeg () const { return false; }
bool TrackElement::hasSourceDogLeg () const { return false; }
bool TrackElement::hasTargetDogLeg () const { return false; }
bool TrackElement::allowOutsideGCell () const { return false; }
bool TrackElement::canGoOutsideGCell () const { return false; }
bool TrackElement::canRipple () const { return false; }
unsigned long TrackElement::getId () const { return 0; }
unsigned long TrackElement::getArea () const { return 0; }
unsigned int TrackElement::getDogLegLevel () const { return 0; }
unsigned int TrackElement::getDogLegOrder () const { return 0; }
Interval TrackElement::getSourceConstraints () const { return Interval(); }
Interval TrackElement::getTargetConstraints () const { return Interval(); }
DataNegociate* TrackElement::getDataNegociate ( unsigned int ) const { return NULL; }
TrackElements TrackElement::getCollapsedPerpandiculars () { return new TrackElements_CollapsedPerpandicular(NULL); }
void TrackElement::setAllowOutsideGCell ( bool ) { }
void TrackElement::setLock ( bool ) { }
void TrackElement::setRevalidated ( bool ) { }
void TrackElement::invalidate () { }
void TrackElement::setCanRipple ( bool ) { }
void TrackElement::setSourceDogLeg ( bool ) { }
void TrackElement::setTargetDogLeg ( bool ) { }
TrackElement* TrackElement::getCanonical ( Interval& i ) { i=Interval(getSourceU(),getTargetU()); return this; }
bool TrackElement::canSlacken () const { return false; }
bool TrackElement::canDesalignate () const { return false; }
bool TrackElement::canPivotUp ( float ) const { return false; };
bool TrackElement::canPivotDown ( float ) const { return false; };
bool TrackElement::canMoveUp ( float, unsigned int ) const { return false; };
float TrackElement::getMaxUnderDensity ( unsigned int ) const { return 0.0; };
bool TrackElement::canDogLeg () { return false; };
bool TrackElement::canDogLeg ( Interval ) { return false; };
bool TrackElement::canDogLegAt ( Katabatic::GCell*, unsigned int ) { return false; };
TrackElement* TrackElement::getSourceDogLeg () { return NULL; }
TrackElement* TrackElement::getTargetDogLeg () { return NULL; }
TrackElement* TrackElement::getParent () const { return NULL; }
void TrackElement::dataInvalidate () { }
void TrackElement::eventInvalidate () { }
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; }
// Wrapped AutoSegment Functions.
AutoSegment* TrackElement::base () const { return NULL; }
bool TrackElement::isFixed () const { return false; }
bool TrackElement::isLocal () const { return true; }
bool TrackElement::isGlobal () const { return not isLocal(); }
bool TrackElement::isBipoint () const { return false; }
bool TrackElement::isTerminal () const { return false; }
bool TrackElement::isStrongTerminal ( unsigned int ) const { return false; }
bool TrackElement::isStrap () const { return false; }
bool TrackElement::isSlackened () const { return false; }
bool TrackElement::isDogleg () const { return false; }
// Predicates.
bool TrackElement::canSlacken () const { return false; }
bool TrackElement::canPivotUp ( float ) const { return false; };
bool TrackElement::canPivotDown ( float ) const { return false; };
bool TrackElement::canMoveUp ( float, unsigned int ) const { return false; };
bool TrackElement::canDogleg () { return false; };
bool TrackElement::canDogleg ( Interval ) { return false; };
bool TrackElement::canDogleg ( Katabatic::GCell*, unsigned int ) { return false; };
// Accessors.
unsigned long TrackElement::getId () const { return 0; }
unsigned long TrackElement::getFreedomDegree () const { return 0; }
float TrackElement::getMaxUnderDensity ( unsigned int ) const { return 0.0; };
unsigned int TrackElement::getDoglegLevel () const { return 0; }
TrackElement* TrackElement::getParent () const { return NULL; }
Interval TrackElement::getSourceConstraints () const { return Interval(); }
Interval TrackElement::getTargetConstraints () const { return Interval(); }
DataNegociate* TrackElement::getDataNegociate ( unsigned int ) const { return NULL; }
TrackElements TrackElement::getPerpandiculars () { return new TrackElements_Perpandiculars(NULL); }
void TrackElement::invalidate () { }
TrackElement* TrackElement::getCanonical ( Interval& i ) { i=Interval(getSourceU(),getTargetU()); return this; }
TrackElement* TrackElement::getSourceDogleg () { return NULL; }
TrackElement* TrackElement::getTargetDogleg () { return NULL; }
// Mutators.
void TrackElement::setTrack ( Track* track ) { _track = track; }
void TrackElement::updateFreedomDegree () { }
void TrackElement::setDoglegLevel ( unsigned int ) { }
void TrackElement::swapTrack ( TrackElement* ) { }
void TrackElement::reschedule ( unsigned int ) { }
void TrackElement::detach () { }
void TrackElement::revalidate () { }
void TrackElement::setAxis ( DbU::Unit, unsigned int flags ) { }
TrackElement* TrackElement::makeDogleg () { return NULL; }
TrackElement* TrackElement::makeDogleg ( Interval, unsigned int& ) { return NULL; }
TrackElement* TrackElement::makeDogleg ( Katabatic::GCell*, TrackElement*&, TrackElement*& ) { return NULL; }
void TrackElement::_postDoglegs ( TrackElement*&, TrackElement*& ) { }
bool TrackElement::moveAside ( unsigned int ) { return false; }
bool TrackElement::slacken ( unsigned int ) { return false; }
bool TrackElement::moveUp ( unsigned int ) { return false; }
bool TrackElement::moveDown ( unsigned int ) { return false; }
#if THIS_IS_DISABLED
void TrackElement::desalignate () { }
#endif
bool TrackElement::_check () const { return true; }
TrackElement::TrackElement ( Track* track )
: _track(track)
, _index((size_t)-1)
: _flags (0)
, _track (track)
, _index ((size_t)-1)
, _sourceU (0)
, _targetU (0)
, _observer(this)
{ }
@ -241,50 +224,38 @@ namespace Kite {
TrackElement* TrackElement::getNext () const
{
size_t dummy = _index;
return _track->getNext ( dummy, getNet() );
return _track->getNext( dummy, getNet() );
}
TrackElement* TrackElement::getPrevious () const
{
size_t dummy = _index;
return _track->getPrevious ( dummy, getNet() );
return _track->getPrevious( dummy, getNet() );
}
Interval TrackElement::getFreeInterval () const
{
if ( !_track ) return Interval(false);
if (not _track) return Interval(false);
size_t begin = _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();
}
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
{
if ( not _track or (getNet() == net) ) return;
_overlapCostCallback ( this, cost );
if (not _track or (getNet() == net)) return;
_overlapCostCallback( this, cost );
}
@ -293,17 +264,20 @@ namespace Kite {
string TrackElement::_getString () const
{ return "<" + _getTypeName() + ">"; }
{ return "<"+_getTypeName()+">"; }
Record* TrackElement::_getRecord () const
{
Record* record = new Record ( _getString() );
record->add ( getSlot ( "_track", _track ) );
record->add ( getSlot ( "_index", _index ) );
Record* record = new Record( _getString() );
record->add( getSlot( "_flags", _track ) );
record->add( getSlot( "_track", _track ) );
record->add( getSlot( "_index", _index ) );
record->add( DbU::getValueSlot( "_sourceU", &_sourceU ) );
record->add( DbU::getValueSlot( "_targetU", &_targetU ) );
return record;
}
} // End of Kite namespace.
} // Kite namespace.

View File

@ -2,14 +2,9 @@
// -*- C++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./TrackElements.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include "hurricane/Bug.h"
@ -31,7 +23,6 @@
namespace Kite {
using namespace std;
using Hurricane::tab;
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 ()
, _locator (segment->base())
, _element (NULL)
{
ltrace(80) << "TrackElements_CollapsedPerpandicular::Locator::Locator()" << endl;
ltrace(80) << "TrackElements_Perpandiculars::Locator::Locator()" << endl;
ltrace(80) << " " << segment << endl;
Interval bounds;
if ( _locator.isValid() ) {
_element = Session::lookup ( _locator.getElement()->getCanonical(bounds)->base() );
_element = Session::lookup( _locator.getElement()->getCanonical(bounds)->base() );
if ( !_element ) {
cerr << Bug("Canonical segment without TrackElement.") << endl;
progress ();
@ -65,20 +56,20 @@ namespace Kite {
}
TrackElement* TrackElements_CollapsedPerpandicular::Locator::getElement () const
TrackElement* TrackElements_Perpandiculars::Locator::getElement () const
{ 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;
while ( _locator.isValid() ) {
_locator.progress ();
if ( _locator.isValid() ) {
_element = Session::lookup ( _locator.getElement()->getCanonical(bounds)->base() );
_element = Session::lookup( _locator.getElement()->getCanonical(bounds)->base() );
if ( !_element ) {
cerr << Bug("Canonical segment whithout TrackElement.") << endl;
continue;
@ -90,32 +81,32 @@ namespace Kite {
}
TrackElementHL* TrackElements_CollapsedPerpandicular::Locator::getClone () const
TrackElementHL* TrackElements_Perpandiculars::Locator::getClone () const
{ return new Locator(*this); }
bool TrackElements_CollapsedPerpandicular::Locator::isValid () const
bool TrackElements_Perpandiculars::Locator::isValid () const
{ return _locator.isValid(); }
TrackElementHC* TrackElements_CollapsedPerpandicular::getClone () const
{ return new TrackElements_CollapsedPerpandicular(*this); }
TrackElementHC* TrackElements_Perpandiculars::getClone () const
{ return new TrackElements_Perpandiculars(*this); }
TrackElementHL* TrackElements_CollapsedPerpandicular::getLocator () const
TrackElementHL* TrackElements_Perpandiculars::getLocator () const
{ 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;
}
string TrackElements_CollapsedPerpandicular::_getString () const
string TrackElements_Perpandiculars::_getString () const
{
string s = "<TrackElements_CollapsedPerpandicular "
string s = "<TrackElements_Perpandiculars "
+ getString(_segment)
+ ">";
return s;
@ -132,8 +123,8 @@ namespace Kite {
bool TrackElements_UniqCanonical::accept ( TrackElement* segment ) const
{
if ( _canonicals.find(segment) == _canonicals.end() ) {
_canonicals.insert ( segment );
if (_canonicals.find(segment) == _canonicals.end()) {
_canonicals.insert( segment );
return true;
}
@ -145,4 +136,4 @@ namespace Kite {
{ return "<TrackElements_UniqCanonical>"; }
} // End of Kite namespace.
} // Kite namespace.

View File

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

View File

@ -2,14 +2,9 @@
// -*- C++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./TrackMarker.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include <iomanip>
#include <sstream>
#include "hurricane/Bug.h"
#include "hurricane/Warning.h"
#include "hurricane/RoutingPad.h"
#include "hurricane/Net.h"
#include "hurricane/Name.h"
#include "crlcore/RoutingGauge.h"
#include "katabatic/GCell.h"
#include "kite/TrackMarker.h"
#include "kite/Track.h"
#include "kite/RoutingPlane.h"
#include "kite/Session.h"
#include "kite/RoutingEvent.h"
#include "kite/KiteEngine.h"
#include <iomanip>
#include <sstream>
#include "hurricane/Bug.h"
#include "hurricane/Warning.h"
#include "hurricane/RoutingPad.h"
#include "hurricane/Net.h"
#include "hurricane/Name.h"
#include "crlcore/RoutingGauge.h"
#include "katabatic/GCell.h"
#include "kite/TrackMarker.h"
#include "kite/Track.h"
#include "kite/RoutingPlane.h"
#include "kite/Session.h"
#include "kite/RoutingEvent.h"
#include "kite/KiteEngine.h"
namespace Kite {
using std::cerr;
using std::endl;
using std::ostringstream;
@ -101,7 +89,7 @@ namespace Kite {
Track* track = rp->getTrackByPosition ( trackSpan.getVMin() );
while ( track && (track->getAxis() <= trackSpan.getVMax()) ) {
Session::addInsertEvent ( this, track );
track = track->getNext ();
track = track->getNextTrack();
_refcount++;
}
}
@ -139,7 +127,6 @@ namespace Kite {
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++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./TrackSegmentCost.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include <cstdlib>

View File

@ -2,14 +2,9 @@
// -*- C++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./Tracks.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include <iostream>
#include "kite/Track.h"
#include "kite/Tracks.h"
#include "kite/RoutingPlane.h"
#include <iostream>
#include "kite/Track.h"
#include "kite/Tracks.h"
#include "kite/RoutingPlane.h"
namespace Kite {
using std::cerr;
using std::endl;
using Hurricane::tab;
@ -56,8 +46,8 @@ namespace Kite {
_track = routingPlane->getTrackByPosition ( _constraints.getVMin() );
if ( _track && (_track->getAxis() < _constraints.getVMin()) ) _track = _track->getNext();
if ( _track && (_track->getAxis() > _constraints.getVMax()) ) _track = NULL;
if ( _track and (_track->getAxis() < _constraints.getVMin()) ) _track = _track->getNextTrack();
if ( _track and (_track->getAxis() > _constraints.getVMax()) ) _track = NULL;
ltrace(147) << "_track: " << _track << endl;;
}
@ -87,8 +77,8 @@ namespace Kite {
{
if ( !_track ) return;
_track = _track->getNext ();
if ( _track && (_track->getAxis() > _constraints.getVMax()) ) _track = NULL;
_track = _track->getNextTrack();
if ( _track and (_track->getAxis() > _constraints.getVMax()) ) _track = NULL;
}
@ -170,12 +160,12 @@ namespace Kite {
if ( _maxTrack->getAxis() > _constraints.getVMax() ) _maxTrack = NULL;
if ( _minTrack && !_maxTrack ) {
_minTrack = _minTrack->getPrevious ();
if ( _minTrack->getAxis() < _constraints.getVMin() ) _minTrack = NULL;
_minTrack = _minTrack->getPreviousTrack();
if (_minTrack->getAxis() < _constraints.getVMin()) _minTrack = NULL;
}
if ( _maxTrack && !_minTrack ) {
_maxTrack = _maxTrack->getNext ();
_maxTrack = _maxTrack->getNextTrack();
if ( _maxTrack->getAxis() > _constraints.getVMax() ) _maxTrack = NULL;
}
@ -237,7 +227,7 @@ namespace Kite {
if ( _onMin ) {
_onMin = (_maxTrack == NULL);
if ( _minTrack ) {
_minTrack = _minTrack->getPrevious();
_minTrack = _minTrack->getPreviousTrack();
if ( _minTrack ) {
if ( _minTrack->getAxis() < _optimal.getVMin() ) _inMinOptimal = false;
@ -248,7 +238,7 @@ namespace Kite {
} else {
_onMin = (_minTrack != NULL);
if ( _maxTrack ) {
_maxTrack = _maxTrack->getNext();
_maxTrack = _maxTrack->getNextTrack();
if ( _maxTrack ) {
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++ -*-
//
// 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 |
// | 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 |
// | =============================================================== |
// | C++ Module : "./VerticalTrack.cpp" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// +-----------------------------------------------------------------+
#include "kite/VerticalTrack.h"
#include "kite/VerticalTrack.h"
namespace Kite {
@ -62,7 +54,7 @@ namespace Kite {
bool VerticalTrack::isHorizontal () const { return false; }
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
@ -80,4 +72,4 @@ namespace Kite {
}
} // End of Kite namespace.
} // Kite namespace.

View File

@ -1,34 +1,24 @@
// -*- C++ -*-
// -*- mode: C++; explicit-buffer-name: "Configuration.h<kite>" -*-
//
// 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 |
// | K i t e - D e t a i l e d R o u t e r |
// | |
// | Author : Jean-Paul CHAPUT |
// | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
// | =============================================================== |
// | C++ Header : "./Configuration.h" |
// | *************************************************************** |
// | U p d a t e s |
// | |
// x-----------------------------------------------------------------x
// | C++ Header : "./kite/Configuration.h" |
// +-----------------------------------------------------------------+
#ifndef __KITE_CONFIGURATION__
#define __KITE_CONFIGURATION__
#ifndef KITE_CONFIGURATION_H
#define KITE_CONFIGURATION_H
#include <boost/function.hpp>
#include "katabatic/Configuration.h"
#include <boost/function.hpp>
#include "katabatic/Configuration.h"
namespace Kite {
@ -47,7 +37,6 @@ namespace Kite {
// -------------------------------------------------------------------
// Class : "Kite::Configuration".
class Configuration : public Katabatic::Configuration {
public:
typedef boost::function< void(void) > PostEventCb_t;
@ -68,6 +57,7 @@ namespace Kite {
~Configuration ();
// Decorateds.
virtual bool isGMetal ( const Layer* ) const;
virtual bool isGContact ( const Layer* ) const;
virtual size_t getDepth () const;
virtual size_t getAllowedDepth () 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);
#endif // __KITE_CONFIGURATION__
#endif // KITE_CONFIGURATION_H

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