diff --git a/katabatic/CMakeLists.txt b/katabatic/CMakeLists.txt new file mode 100644 index 00000000..d51483b8 --- /dev/null +++ b/katabatic/CMakeLists.txt @@ -0,0 +1,48 @@ +PROJECT(KATABATIC) + +OPTION(BUILD_DOC "Build the documentation (doxygen)" OFF) +OPTION(CHECK_DATABASE "Run database in full check mode (very slow)" OFF) + +CMAKE_MINIMUM_REQUIRED(VERSION 2.4.0) + +SET(CMAKE_C_FLAGS_DEBUG "-g -Wall" CACHE STRING "Debug options." FORCE) +SET(CMAKE_CXX_FLAGS_DEBUG "-g -Wall" CACHE STRING "Debug options." FORCE) +#SET(CMAKE_LINKER_FLAGS_DEBUG "-pg" CACHE STRING "Debug options." FORCE) +#SET(CMAKE_SHARED_LINKER_FLAGS_DEBUG "-pg" CACHE STRING "Debug options." FORCE) +#SET(CMAKE_MODULE_LINKER_FLAGS_DEBUG "-pg" CACHE STRING "Debug options." FORCE) +#SET(CMAKE_EXE_LINKER_FLAGS_DEBUG "-pg" CACHE STRING "Debug options." FORCE) +SET(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG -Wall" CACHE STRING "Release options." FORCE) +SET(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG -Wall" CACHE STRING "Release options." FORCE) + +IF(COMMAND CMAKE_POLICY) + CMAKE_POLICY(SET CMP0003 NEW) +ENDIF(COMMAND CMAKE_POLICY) + +SET(CMAKE_MODULE_PATH "$ENV{HURRICANE_TOP}/share/cmake_modules/") + +SET(QT_USE_QTXML "true") + +IF(BUILD_DOC) + FIND_PACKAGE(Doxygen) +ENDIF(BUILD_DOC) +FIND_PACKAGE(Qt4 REQUIRED) # find and setup Qt4 for this project +FIND_PACKAGE(HURRICANE REQUIRED) +FIND_PACKAGE(CORIOLIS REQUIRED) +FIND_PACKAGE(KNIK REQUIRED) + +SET_LIB_LINK_MODE() + +ADD_SUBDIRECTORY(src) +ADD_SUBDIRECTORY(cmake_modules) +IF(BUILD_DOC AND DOXYGEN_FOUND) + ADD_SUBDIRECTORY(doc) +ENDIF(BUILD_DOC AND DOXYGEN_FOUND) + +IF(CHECK_DATABASE) + ADD_DEFINITIONS(-DCHECK_DATABASE) + MESSAGE(STATUS "Checking database enabled (very slow).") +ENDIF(CHECK_DATABASE) +IF(CHECK_DETERMINISM) + ADD_DEFINITIONS(-DCHECK_DETERMINISM) + MESSAGE(STATUS "Checking determinism enabled.") +ENDIF(CHECK_DETERMINISM) diff --git a/katabatic/cmake_modules/CMakeLists.txt b/katabatic/cmake_modules/CMakeLists.txt new file mode 100644 index 00000000..774ac201 --- /dev/null +++ b/katabatic/cmake_modules/CMakeLists.txt @@ -0,0 +1 @@ +install ( FILES FindKATABATIC.cmake DESTINATION /share/cmake_modules ) diff --git a/katabatic/cmake_modules/FindKATABATIC.cmake b/katabatic/cmake_modules/FindKATABATIC.cmake new file mode 100644 index 00000000..987c7a5e --- /dev/null +++ b/katabatic/cmake_modules/FindKATABATIC.cmake @@ -0,0 +1,47 @@ +# - Find the Katabatic includes and libraries. +# The following variables are set if Coriolis is found. If KATABATIC is not +# found, KATABATIC_FOUND is set to false. +# KATABATIC_FOUND - True when the Coriolis include directory is found. +# KATABATIC_INCLUDE_DIR - the path to where the Coriolis include files are. +# KATABATIC_LIBRARIES - The path to where the Coriolis library files are. + + +SET(KATABATIC_INCLUDE_PATH_DESCRIPTION "directory containing the Katabatic include files. E.g /usr/local/include/coriolis or /asim/coriolis/include/coriolis") + +SET(KATABATIC_DIR_MESSAGE "Set the KATABATIC_INCLUDE_DIR cmake cache entry to the ${KATABATIC_INCLUDE_PATH_DESCRIPTION}") + +# don't even bother under WIN32 +IF(UNIX) + + SET(KATABATIC_DIR_SEARCH $ENV{CORIOLIS_TOP} $ENV{HURRICANE_TOP}) + # + # Look for an installation. + # + FIND_PATH(KATABATIC_INCLUDE_PATH NAMES katabatic/KatabaticEngine.h PATHS + # Look in other places. + ${KATABATIC_DIR_SEARCH} + PATH_SUFFIXES include/coriolis + # Help the user find it if we cannot. + DOC "The ${KATABATIC_INCLUDE_PATH_DESCRIPTION}" + ) + + FIND_LIBRARY(KATABATIC_LIBRARY_PATH + NAMES katabatic + PATHS ${KATABATIC_DIR_SEARCH} + PATH_SUFFIXES lib + # Help the user find it if we cannot. + DOC "The ${KATABATIC_INCLUDE_PATH_DESCRIPTION}" + ) + + FIND_LIBRARY(KATABATIC_STATIC_LIBRARY_PATH + NAMES katabatic-static + PATHS ${KATABATIC_DIR_SEARCH} + PATH_SUFFIXES lib + # Help the user find it if we cannot. + DOC "The ${KATABATIC_INCLUDE_PATH_DESCRIPTION}" + ) + + SET_LIBRARIES_PATH(KATABATIC KATABATIC) + HURRICANE_CHECK_LIBRARIES(KATABATIC) + +ENDIF(UNIX) diff --git a/katabatic/doc/ASIM-bigfonts.css b/katabatic/doc/ASIM-bigfonts.css new file mode 100644 index 00000000..f8ec6823 --- /dev/null +++ b/katabatic/doc/ASIM-bigfonts.css @@ -0,0 +1,353 @@ + + +/* + * 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; + } + diff --git a/katabatic/doc/ASIM.css b/katabatic/doc/ASIM.css new file mode 100644 index 00000000..6d92a0c5 --- /dev/null +++ b/katabatic/doc/ASIM.css @@ -0,0 +1,485 @@ + + +/* + * 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; + } + diff --git a/katabatic/doc/AutoContact.dox b/katabatic/doc/AutoContact.dox new file mode 100644 index 00000000..71c49147 --- /dev/null +++ b/katabatic/doc/AutoContact.dox @@ -0,0 +1,364 @@ + + // -*- C++ -*- + + + namespace Katabatic { + + /*! \class AutoContact + * \brief Self-sizing Contact (\b API). + * + * \see \ref buildRules. + * + * \section secAutoContactSplitting AutoContact splitting mechanism + * + * An AutoContact splitting occurs when more than two layers connects + * to a single AutoContact. + * + * General Case + * + *
    + *
  1. Create a \b secondary contact, so that both the original + * and the secondary abide by the two layers rule. + *
  2. Create new AutoSegments to connect original to secondary. + * There could be one or two segments created according to + * the layers distance. + *
  3. Re-attach the AutoSegments to the right AutoContact. + * The rule being that an AutoSegment is attached to the + * lowest AutoContact containing it's Layer. + *
  4. The orignal & secondary contact are passed trough + * the connexity restauration procedure. + *
+ * + * Importants Points + * + * + * + * Special Cases + * + * + * \image html AutoContact-12.png + * \image html AutoContact-13.png + * \image html AutoContact-14.png + * \image html AutoContact-15.png + * \image latex AutoContact-12.pdf + * \image latex AutoContact-13.pdf + * \image latex AutoContact-14.pdf + * \image latex AutoContact-15.pdf + */ + + /* \var GCell* AutoContact::_gcell + * \brief The GCell into which the AutoContact is located. + */ + + /*! \function AutoContact* AutoContact::fromRp ( GCell* gcell, RoutingPad* routingPad, const Layer* layer, Point point, DbU::Unit width, DbU::Unit height, bool fixed=false ); + * \param gcell The GCell in which to create the AutoContact. + * \param routingPad The RoutingPad on which to anchor the AutoContact. + * \param layer The AutoContact's layer. + * \param point The absolute position of the AutoContact. + * \param width AutoContact's width. + * \param height AutoContact's height. + * \param fixed The AutoContact cannot be moved. + * \return Newly created AutoContact. + * + * create an AutoContact anchored on a \c RoutingPad. The AutoContact can + * be moved along the \c RoutingPad but not outside it. + * + * A remark on the \c point parameter : it must be absolute coordinates, but + * as we uses the \c RoutingPad as an anchor they are translated into an + * offset from the \c RoutingPad (see how \c Hurricane handles coordinates + * through anchoring). It is also assumed that the AutoContact is to be + * electrically connected to the \c RoutingPad (no disconnection). + * So, we will faces three cases, depending on the \c RoutingPad + * underlying \c Entity : + * + */ + + /*! \function AutoContact* AutoContact::create ( GCell* gcell, Net* net, const Layer* layer, bool hAlignate=false, bool vAlignate=false ) + * \param gcell The GCell into which the AutoContact will be put. + * \param net The AutoContact's owner Net. + * \param layer The AutoContact's layer. + * \param hAlignate Keeps alignate (all) horizontal segments. + * \param vAlignate Keeps alignate (all) vertical segments. + * \return A new AutoContact. + * + * As AutoContact are Contacts restricted to, at best, two adjacent + * routing layers, the layer argument is either a single routing + * contact or a two metals only VIA. + */ + + /*! \function AutoContact* AutoContact::create ( GCell* gcell, RoutingPad* rp, const Layer* layer, const DbU::Unit dx, const DbU::Unit dy, const DbU::Unit width, const DbU::Unit height, bool hAlignate=false, bool vAlignate=false, bool fixed=false ); + * \param gcell The GCell into which the AutoContact will be put. + * \param rp The RoutingPad anchor. + * \param layer The AutoContact's layer. + * \param dx Horizontal offset to the component. + * \param dy Vertical offset to the component. + * \param width Width of the AutoContact. + * \param height Height of the AutoContact. + * \param hAlignate Keeps alignate (all) horizontal segments. + * \param vAlignate Keeps alignate (all) vertical segments. + * \param fixed The AutoContact cannot be moved. + * \return A new AutoContact. + * + * create an AutoContact anchored on a component : the component must + * be a \RoutingPad, sets the isTerminal() flag. + * + * As AutoContact are Contacts restricted to, at best, two adjacent + * routing layers, the layer argument is either a single routing + * contact or a two metals only VIA. + */ + + /*! \function GCell* AutoContact::getGCell() const + * \brief Returns the GCell into which the AutoContact is located. + */ + + /*! \function void AutoContact::updateGeometry() + * \brief Perform the segment resizing. + * + * As it will resizes Hurricane components, this function call must + * be enclosed into an updateSession. + */ + + /*! \function AutoContacts AutoContact::getCollapseds ( unsigned int direction ); + * \param direction restrict the search to that direction. + * \return The \c Collection of AutoContact that are collapsed on this one, + * that is, linked through collapsed AutoSegment of type + * \c direction. + */ + + /*! \function bool AutoContact::isTerminal () const; + * \return \true if the AutoContact is anchored on a terminal. + */ + + /*! \function bool AutoContact::isHAlignate () const; + * \return \true if the horizontal AutoSegment anchored on the AutoContact + * must be kept aligned. + * \see \ref collapseCanonical + */ + + /*! \function bool AutoContact::isVAlignate () const; + * \return \true if the vertical AutoSegment anchored on the AutoContact + * must be kept aligned. + * \see \ref collapseCanonical + */ + + /*! \function void AutoContact::getLengths ( DbU::Unit* lengths, set& segments ); + * \return Increment the table of lengths for the lengths of segments of + * this AutoContact and inside it's owning GCell. + */ + + /*! \function void AutoContact::setTerminal ( bool isTerminal ); + * \param isTerminal set the terminal flag. + */ + + /*! \function bool AutoContact::isHExtended (); + * \return \true if the \b privileged direction of the AutoContact is horizontal. + * + * To be privileged in horizontal direction means that the \c Y coordinates + * of all horizontals of the AutoContact are the same and imposed in either + * of the following ways: + * + * \note An AutoContact can be neither horizontally extended nor vertically + * extended. In which case it is punctual. + * + * \image html AutoContact-10.png + * \image latex AutoContact-10.pdf + */ + + /*! \function bool AutoContact::isVExtended (); + * \return \true if the \b privileged direction of the AutoContact is vertical. + * + * To be privileged in vertical direction means that the \c X coordinates + * of all verticals of the AutoContact are the same and imposed in either + * the following way: + * + * \note An AutoContact can be neither horizontally extended nor vertically + * extended. In which case it is punctual. + * + * \image html AutoContact-11.png + * \image latex AutoContact-11.pdf + */ + + /*! \function void AutoContact::setHAlignate ( bool hAlignate ); + * \param hAlignate The new horizontal alignement mode. + * + * When horizontal aligment mode is active, all horizontals of the + * AutoContact are kept aligned (on the same \b Y coordinate). + * \see \ref collapseCanonical + */ + + /*! \function void AutoContact::setVAlignate ( bool vAlignate ); + * \param vAlignate The new vertical alignement mode. + * + * When vertical aligment mode is active, all verticals of the + * AutoContact are kept aligned (on the same \b X coordinate). + * \see \ref collapseCanonical + */ + + /*! \function void AutoContact::restoreHConnexity ( DbU::Unit y, bool split=false ); + * \param y When splitting, the coordinate of the vertical strap segments. + * \param split Wether to separate the various horizontals or not. + * + * Ensure that there is no gap between horizontals of this AutoContact. + * + * In case of splitting, all the verticals are kept on the original AutoContact. + */ + + /*! \function void AutoContact::restoreVConnexity ( DbU::Unit x, bool split=false ); + * \param x When splitting, the coordinate of the horizontal strap segments. + * \param split Wether to separate the various verticals or not. + * + * Ensure that there is no gap between verticals of this AutoContact. + * + * In case of splitting, all the horizontals are kept on the original AutoContact. + */ + + /*! \function void AutoContact::invalidate (); + * Put this AutoContact into the invalidated set (see \ref katabaticSession). + */ + + + //! \addtogroup katabaticSession + //! \{ + + /*! \function bool AutoContact::isInvalidated () const; + * \return \True if the AutoContact is invalidated, i.e. in the + * Katabatic Session, one or more of it's anchored AutoSegment + * being moved. + * + * \see autoInvalidate(). + */ + + /*! \function bool AutoContact::setInvalidated ( bool state ); + * \param state set the state of the AutoContact regarding the + * Katabatic Session. + * + * \see autoInvalidate(). + */ + + /*! \function Box AutoContact::getNativeConstraintBox () const; + * Return the native constraint box, that is, the \Box of the + * owning GCell or the bounding box of the terminal it's anchored + * upon. + */ + + /*! \function DbU::Unit AutoContact::getCBXMin () const; + * \return The X coordinate of the lower left corner. + */ + + /*! \function DbU::Unit AutoContact::getCBYMin () const; + * \return The Y coordinate of the lower left corner. + */ + + /*! \function DbU::Unit AutoContact::getCBXMax () const; + * \return The X coordinate of the upper right corner. + */ + + /*! \function DbU::Unit AutoContact::getCBYMax () const; + * \return The Y coordinate of the upper right corner. + */ + + /*! \function Box AutoContact::getConstraintBox () const; + * \return The current constraint box. + */ + + /*! \function Box& AutoContact::intersectConstraintBox ( Box& box ) const; + * \param box The box to intersect width. + * \return A reference on the the box given as argument. + * + * Do the intersection of the constraint box and the one given + * as argument. Store the result in place. + */ + + /*! \function void AutoContact::restoreNativeConstraintBox (); + * reset the constraint box to the native constraint box. + */ + + /*! \function void AutoContact::setConstraintBox ( const Box& box ); + * \param box The new constraint box. + * + * sets the constraint box. + */ + + /*! \function void AutoContact::restrictConstraintBox ( DbU::Unit constraintMin, DbU::Unit constraintMax, unsigned int direction ); + * \param constraintMin The constraint lower bound. + * \param constraintMax The constraint upper bound. + * \param direction The direction into which apply the constraint. + * + * restrict the constraint box in one direction. + */ + + /*! \function void AutoContact::setCBXMin ( DbU::Unit xMin ); + * \param xMin The X cooordinate of the lower left corner. + * + * sets the X coordinate of the lower left corner. + */ + + /*! \function void AutoContact::setCBYMin ( DbU::Unit yMin ); + * \param yMin The Y cooordinate of the lower left corner. + * + * sets the Y coordinate of the lower left corner. + */ + + /*! \function void AutoContact::setCBXMax ( DbU::Unit xMax ); + * \param xMax The X cooordinate of the upper right corner. + * + * sets the X coordinate of the upper right corner. + */ + + /*! \function void AutoContact::setCBYMax ( DbU::Unit yMax ); + * \param yMax The Y cooordinate of the upper right corner. + * + * sets the Y coordinate of the upper right corner. + */ + + //! \} + + } + + + namespace { + + } diff --git a/katabatic/doc/AutoSegment.dox b/katabatic/doc/AutoSegment.dox new file mode 100644 index 00000000..ae35d17c --- /dev/null +++ b/katabatic/doc/AutoSegment.dox @@ -0,0 +1,677 @@ + + // -*- C++ -*- + + + namespace Katabatic { + + /*! \class AutoSegment + * \brief Self-sizing segment (\b API). + * + * AutoSegment provide an uniform way of accessing AutoHorizontal + * and AutoVertical self-sizing segments. AutoSegments mainly contains + * a pointer to the associated Horizontal/Vertical Hurricane segment. + * This is the Hurricane segment which is part of the ring of the + * AutoContact. Thus we can directly access the Hurricane segment + * from the AutoSegment, but for the othey around we uses a lookup + * table in the Katabatic \c ToolEngine (see the + * Katabatic::_Lookup() member function). + * + * In order to inform the router of an AutoSegment state change, + * a callback function SegmentRevalidateCB can be positionned. + * + * \c Segment associated to AutoSegment are automatically oriented + * in such a way that the source \c Hook is always \e lower than + * the target \c hook. For an Horizontal segment it means that + * the abcissa of the source is inferior to the abcsissa of the + * target. It goes the same way for Vertical segment with the + * ordinate. + * + * KatabaticSession mechanism : this is fairly similar to the + * \c Hurricane updateSession one. When a segment is either moved + * by the router or resized by it's AutoContact it is invalidated + * with autoInvalidate() and put into the set of invalidated + * segments. When the KatabaticSession is closed the onRevalidate() + * member function is called on each segment, which in turn calls + * the router's callback. See Session::open(), Session::revalidate(), + * Session::close() and \ref katabaticSession. + * + * \remark As this object uses the decorator Design Pattern, almost all + * functions are pure virtuals. Implementation take place in a + * derived class \c AutoSegmentConcrete which is not documented, + * (same specifications as AutoSegment). + * + * \see AutoSegmentDecorator class. + */ + + /*! \typedef AutoSegment::RevalidateCb_t ( AutoSegment* ) + * Function type for the router callback. See AutoSegment::setRevalidateCb(). + */ + + /* \function static AutoSegment::RevalidateCb_t* AutoSegment::setRevalidateCb ( RevalidateCb_t* cb ); + * \param cb The new router callback to install. + * \return The previous router callback. + * + * Install the callback to call when an AutoSegment is revalidated, + * The callback is called by onRevalidate() on closing the Katabatic + * update session. + */ + + /*! \function bool AutoSegment::isHorizontal () const; + * \return \true if the AutoSegment is horizontal. + */ + + /*! \function bool AutoSegment::isVertical () const; + * \return \true if the AutoSegment is vertical. + */ + + /*! \function bool AutoSegment::isGlobal () const; + * \return \true if the AutoSegment is global : source and target + * AutoContact are not in the same GCell. + */ + + /*! \function bool AutoSegment::isLocal () const; + * \return \true if the AutoSegment is local : source and target + * belongs to the same GCell. + */ + + /*! \function bool AutoSegment::isTerminal () const; + * \return \true if the AutoSegment is terminal : the only way + * to access a terminal AutoContact (may not be directly + * achored on that terminal). + */ + + /*! \function bool AutoSegment::isCollapsed () const; + * \return \true if the AutoSegment is collapsed : kept to zero-length. + */ + + /*! \function bool AutoSegment::isCanonical () const; + * \return \true if the AutoSegment is canonical that is, the leftmost + * (for horizontal) or lowest (for vertical) segment of a set + * of collapsed segments. The canonical segment must be used + * as the unique representant for the collapsed set. + */ + + /*! \function bool AutoSegment::isFixed () const; + * \return \true if the AutoSegment cannot be moved (through setAxis()). + */ + + /*! \function bool AutoSegment::isAccountable () const; + * \return \true if the AutoSegment is canonical and not collapsed. + * Normally those flags are mutually exclusives, but better safe + * than sorry. + * + */ + + /*! \function virtual GCell* AutoSegment::getGCell () const; + * \return The GCell owning the source AutoContact. + */ + + /*! \function Net* AutoSegment::getNet () const; + * \return The net this AutoSegment is part of. + */ + + /*! \function Layer* AutoSegment::getLayer () const; + * \return The layer of the AutoSegment. + */ + + /*! \function virtual Segment* AutoSegment::getSegment (); + * \return The associated \c Hurricane segment. + */ + + /*! \function virtual Segment* AutoSegment::getSegment () const; + * \return The associated \c Hurricane segment. + * + * This function is for use in const members. + */ + + /*! \function virtual Segment* AutoSegment::getHorizontal (); + * \return If the the associated segment is horizontal, returns it. + * Otherwise (vertical) returns \c NULL. + */ + + /*! \function virtual Segment* AutoSegment::getVertical (); + * \return If the the associated segment is vertical, returns it. + * Otherwise (horizontal) returns \c NULL. + */ + + /*! \function DbU::Unit AutoSegment::getAxis () const; + * \return The segment axis : Y for horizontals and X for verticals. + */ + + /*! \function AutoContact* AutoSegment::getSource () const; + * \return The source AutoContact. + */ + + /*! \function AutoContact* AutoSegment::getTarget () const; + * \return The target AutoContact. + */ + + /*! \function DbU::Unit AutoSegment::getSourcePosition () const; + * \return The lower bound of the segment into the routing track, equal + * the source coordinate minus the half pitch. + */ + + /*! \function DbU::Unit AutoSegment::getTargetPosition () const; + * \return The upper bound of the segment into the routing track, equal + * the target coordinate plus the half pitch. + */ + + /*! \function virtual void AutoSegment::setAxis ( DbU::Unit axis, bool realignate=false, set* processeds=NULL ); + * \param axis New coordinate of the axis. For an horizontal segment + * it will change the Y coordinate and for a vertical, + * the X coordinate. + * \param realignate It set to true, the new axis position will be propagated + * to all collapsed segments, even if the current AutoSegment + * don't need to be moved. + * \param processeds The set of already processeds aligneds AutoSegments. + * + * setAxis is the API frontend to the alignate function. It actually + * only checks if the segment has to be moved and if the move is to + * be propagated to the aligned AutoSegments. + */ + + /*! \function virtual void AutoSegment::orient (); + * sets the source and target \c Hook of the Hurricane segment so + * the source is always lower than the target. + */ + + /*! \function virtual void AutoSegment::invalidate (); + * adds the AutoSegment to the invalidate session. This will happens + * whenever a segment is moved by the router through setAxis() or + * resized by it's AutoContact. + */ + + /* \function virtual void AutoSegment::onRevalidate (); + * This function is called at the time the AutoUpdate session is closed + * and calls the router's callback. + */ + + /*! \function virtual void AutoSegment::getConstraints ( DbU::Unit& constraintMin, DbU::Unit& constraintMax ) const; + * \param constraintMin Where to store the constraint lower bound. + * \param constraintMax Where to store the constraint upper bound. + * \return Always \true (don't remember why...). + * + * Constraints are deduced from the constraint box of the source + * AutoContact. + * + * \see \ref NetConstraints + */ + + /*! \function virtual void AutoSegment::getConstraints ( Interval& i ) const; + * \param i The constraint interval. + * \return Always \true (don't remember why...). + * + * \see getConstraints(), \ref NetConstraints + */ + + /*! \function DbU::Unit AutoSegment::getSlack () const; + * \return The length of the constraint interval. + * + * \see \ref NetOptimals + */ + + /*! \function DbU::Unit AutoSegment::getOptimalMin () const; + * \return The lower bound of the optimal interval. + * + * \see \ref NetOptimals + */ + + /*! \function DbU::Unit AutoSegment::getOptimalMax () const; + * \return The upper bound of the optimal interval. + * + * \see \ref NetOptimals + */ + + /*! \function Interval& AutoSegment::getOptimal ( Interval& i ) const; + * \param i The optimal interval. + * \return The interval given as argument. + * + * \see \ref NetOptimals + */ + + /*! \function DbU::Unit AutoSegment::getCost ( DbU::Unit axis ) const; + * \param axis An axis coordinate. + * \return The distance from the nearest optimal interval bound. + * + * \see \ref NetOptimals + */ + + /*! \function AutoSegment* AutoSegment::getCanonical ( DbU::Unit& sourcePosition, DbU::Unit& targetPosition ); + * \param sourcePosition Lower bound of the super-AutoSegment. + * \param targetPosition Upper bound of the super-AutoSegment. + * \return The canonical AutoSegment of the super-AutoSegment. + * + * A super-AutoSegment is the set of all AutoSegment which have been + * bound together through (perpandicular) collapsed AutoSegment. + * They behave like one big AutoSegment. For algorithmic purpose we + * needs a canonical representant : it will be the lower AutoSegment + * (the one with the lower source coordinates). + * We also needs to know the real extend of the super-AutoSegment : it's + * returned through \c sourcePosition and \c targetPosition parameters. + */ + + /*! \function AutoSegment* AutoSegment::getCanonical ( Interval& i ); + * \param i interval of the super-AutoSegment. + * \return The canonical AutoSegment of the super-AutoSegment. + * + * \see AutoSegment::getCanonical(). + */ + + /*! \function AutoSegments AutoSegment::getCollapseds ( bool withPerpand=false ); + * \return The \Collection of AutoSegment that are collapsed to this one + * (i.e. linked through perpandicual collapsed ones). Together + * they forms one big virtual AutoSegment. + */ + + /*! \function AutoSegments AutoSegment::getCollapsedPerpandiculars (); + * \return The \Collection of AutoSegment that are perpandicular to this + * one and it's collapsed fellows. + * + * Note that this \Collection contains only \b GLOBAL perpandicular + * AutoSegment and \b Terminal perpandicular AutoSegment. + */ + + /*! \function void AutoSegment::setCanonical ( bool state ); + * \param state sets the isCanonical() flag to this value. + */ + + /*! \function void AutoSegment::setTerminal ( bool state ); + * \param state sets the isTerminal() flag to this value. + */ + + /*! \function void AutoSegment::setLayer ( const Layer* layer ); + * \param layer Changes the \Hurricane segment layer. + */ + + /*! \function void AutoSegment::setPositions (); + * compute the positions of the AutoSegment into the routing track, + * from the \Hurricane segment extentions and the half-pitch. + * + * \see getSourcePosition() & getTargetPosition(). + */ + + /*! \function void AutoSegment::collapse (); + * sets the AutoSegment into collapsed state (zero-length). + */ + + /*! \function void AutoSegment::expand (); + * Uncollapse the AutoSegment, re-compute the constraints on + * the splitted sets. + */ + + /*! \function bool AutoSegment::toConstraintAxis ( set* processeds=NULL ); + * \return \True if the AutoSegment axis has been moved. + * + * If the segment axis is outside the constraint interval, set it + * the nearest constraint interval bound. + */ + + /*! \function bool AutoSegment::toOptimalAxis ( set* processeds=NULL ); + * \return \True if the AutoSegment axis has been moved. + * + * If the segment axis is outside the optimal interval, set it + * the nearest optimal interval bound. + */ + + /*! \function void AutoSegment::alignate ( DbU::Unit axis ); + * \param axis New axis's coordinate. + * + * Move the segment axis to a new position. Adjust positions + * of the supporting Contact whenever they are anchored on terminals + * (i.e. RoutingPad). + * This function is atomic and should not be called directly + * but rather through setAxis(). It's implemented in the + * derived classes AutoHorizontal & AutoVertical. + */ + + /*! \function void AutoSegment::setOptimalMin ( DbU::Unit oMin ); + * \param oMin sets the lower bound of the optimal interval. + * + * \see getOptimalMin(), getOptimalMax(), getCost(). + */ + + /*! \function void AutoSegment::setOptimalMax ( DbU::Unit oMin ); + * \param oMin sets the upper bound of the optimal interval. + * + * \see getOptimalMin(), getOptimalMax(), getCost(). + */ + + /*! \function void AutoSegment::checkPositions () const; + * check the coherency between the locally shadowed values + * of source \& target position and the real ones. If a discrepancy + * is found issue an error (but do not stop the program). + * + * Note that discrepancies are legal while the AutoSegment is + * invalidated (see \ref katabaticSession). + */ + + /*! \function void AutoSegment::checkInvalidated () const; + * issue an error if the AutoSegment is invalidated. Mainly used + * to debug the Katabatic Session mechanism (\ref katabaticSession). + */ + + + //! \addtogroup NetOptimals + //! \{ + + /*! \function virtual void AutoSegment::computeOptimal ( set* processeds=NULL ); + * compute the AutoSegment optimal position interval. + */ + + /*! \function virtual DbU::Unit AutoSegment::getOrigin () const; + * \return The lower bound of the GCell in which the AutoSegment is + * (\c YMin for horizontals, \c XMin for verticals). + */ + + /*! \function virtual DbU::Unit AutoSegment::getExtremity () const; + * \return The upper bound of the GCell in which the AutoSegment is + * (\c YMax for horizontals, \c XMax for verticals). + */ + + //! \} + + + //! \addtogroup katabaticSession + //! \{ + + /*! \function bool AutoSegment::isInvalidated () const; + * \return \True if the AutoSegment is invalidated, i.e. in the + * Katabatic Session, it's axis having being moved by the + * router. + * + * \see autoInvalidate(). + */ + + /*! \function bool AutoSegment::setInvalidated ( bool state ); + * \param state set the state of the AutoSegment regarding the + * Katabatic Session. + * + * \see autoInvalidate(). + */ + + //! \} + + + /*! \class AutoHorizontal + * \brief Horizontal AutoSegment (\b API). + */ + + /*! \function static AutoHorizontal* AutoHorizontal::create ( Horizontal* horizontal, int type, bool terminal=false, bool collapsed=false ); + * \param horizontal The associated \c Hurricane segment. + * \param type Global, local or guessed kind. + * \param terminal Whether the segment is tightly linked to a terminal. + * \param collapsed Whether the segment must be kept of null length. + * \return The newly created AutoSegment. + */ + + /*! \function static AutoHorizontal* AutoHorizontal::create ( AutoContact* source, AutoContact* target, const Layer* layer, DbU::Unit y, DbU::Unit width, int type, bool terminal=false, bool collapsed=false ); + * \param source The source \c Component. + * \param target The target \c Component. + * \param layer The segment's layer. + * \param y The segment's Y coordinate. + * \param width The segment's width. + * \param type Global, local or guessed kind. + * \param terminal Whether the segment is tightly linked to a terminal. + * \param collapsed Whether the segment must be kept of null length. + * \return The newly created AutoSegment. + * + * Allocate both \c Hurricane segment and Katabatic AutoSegment. + */ + + + /*! \class AutoVertical + * \brief Vertical AutoSegment (\b API). + */ + + /*! \function static AutoVertical* AutoVertical::create ( Vertical* vertical, int type, bool terminal=false, bool collapsed=false ); + * \param vertical The associated \c Hurricane segment. + * \param type Global, local or guessed kind. + * \param terminal Whether the segment is tightly linked to a terminal. + * \param collapsed Whether the segment must be kept of null length. + * \return The newly created AutoSegment. + */ + + /*! \function static AutoVertical* AutoVertical::create ( AutoContact* source, AutoContact* target, const Layer* layer, DbU::Unit x, DbU::Unit width, int type, bool terminal=false, bool collapsed=false ); + * \param source The source \c Component. + * \param target The target \c Component. + * \param layer The segment's layer. + * \param x The segment's X coordinate. + * \param width The segment's width. + * \param type Global, local or guessed kind. + * \param terminal Whether the segment is tightly linked to a terminal. + * \param collapsed Whether the segment must be kept of null length. + * \return The newly created AutoSegment. + * + * Allocate both \c Hurricane segment and Katabatic AutoSegment. + */ + + + /*! \function AutoSegment* AutoSegment::create ( AutoContact* source, AutoContact* target, unsigned int dir, int type, bool terminal=false, bool collapsed=false ); + * \param source The source AutoContact. + * \param target The target AutoContact. + * \param dir The AutoSegment direction (\b H / \b V). + * \param type Whether the AutoSegment is \b LOCAL, \b GLOBAL or must be guessed. + * \param terminal The AutoSegment is used to connect a terminal. + * \param collapsed The AutoSegment is collapsed. + * \return A new AutoSegment. + * + * create the AutoSegment between \c source and \c target, update the GCell + * density if needed. + * + * If the \c dir parameter do not contains the \b HORIZONTAL or \b VERTICAL + * boolean flags an error will be thrown. + */ + + + /*! \enum AutoSegment::Type + * This enumeration is used to hints AutoSegment constructor about + * the kind of segment we are about to create. Once created, the + * kind of AutoSegment is stored in a single boolean telling + * wether it's \b GLOBAL or \b LOCAL (see AutoSegment::isGlobal()). + * + * It is always best to avoid using AutoSegment::Guess as it implies findind + * and checking source and target anchors (through ring access). + * And in most cases we already known the kind of segment because + * we created the source and target AutoContact just before... + * See GCellConfiguration related functions. + */ + + /*! \var AutoSegment::Global + * The AutosSegment crosses at least one GCell boundary (i.e. + * source and target AutoContact do not belong to the same GCell). + */ + + /*! \var AutoSegment::Local + * The AutoSegment is fully included in one GCell. + */ + + /*! \var AutoSegment::Guess + * The AutoSegment constructor will guess the kind of AutoSegment + * by examining source and target anchors. + */ + + /*! \defgroup collapseCanonical 3. AutoSegment collapse & Canonical (internal) + * + * \section AlignedAS Collapsing AutoSegment + * + * A set of AutoSegment can be aligned together. The set will + * behave like one big AutoSegment, especially, moving one + * AutoSegment through setAxis() will move the whole set. + * + * For each set of aligned AutoSegment, we provide a canonical + * AutoSegment : the leftmost (for horizontal) or lowermost for + * verticals. + * + * There are two ways AutoSegments could be aligned : + *
    + *
  • Through a collapsed perpandicular AutoSegment. + *
  • Through a locked AutoContact. + *
+ * + * \subsection AlignedByCollapsed Aligned through collapsed AutoSegment + * + * When an AutoSegment is collapsed, all perpandicular AutoSegment + * to it's source and target AutoContact are aligneds. Collapsing + * an AutoSegment means that it should be kept to zero length and + * thus not managed by the overlying router. + * + * \image html AutoSegmentCollapse-5.png "collapse by AutoSegment" + * \image latex AutoSegmentCollapse-5.pdf "collapse by AutoSegment" width=0.4\textwidth + * + * \subsection AlignedByAutoContact Aligned through collapsed AutoContact + * + * With the setHAlignate() and setVAlignate() the alignment of + * horizontal (resp. vertical) AutoSegment of an AutoContact can be + * forced. + * + * \image html AutoSegmentCollapse-6.png "collapse by AutoContact" + * \image latex AutoSegmentCollapse-6.pdf "collapse by AutoContact" width=0.4\textwidth + * + * \subsection collapsedExample An example of collapse/alignment + * + * \image html AutoSegmentCollapse-1.png "collapse - Step 1" + * \image latex AutoSegmentCollapse-1.pdf "collapse - Step 1" width=0.4\textwidth + * + * \image html AutoSegmentCollapse-2.png "collapse - Step 2" + * \image latex AutoSegmentCollapse-2.pdf "collapse - Step 2" width=0.4\textwidth + * + * \image html AutoSegmentCollapse-3.png "collapse - Step 3" + * \image latex AutoSegmentCollapse-3.pdf "collapse - Step 3" width=0.4\textwidth + * + * \image html AutoSegmentCollapse-4.png "collapse - Step 4" + * \image latex AutoSegmentCollapse-4.pdf "collapse - Step 4" width=0.4\textwidth + */ + + + //! \addtogroup collapseCanonical + //! \{ + + /*! \enum AutoSegment::PerpandicularState + * set of flags used to build the state of two AutoSegment. + * \see getPerpandicularState(). + */ + + /*! \var AutoSegment::PerpandicularAny + * The \e current AutoSegment is perpandicular to the \e master. + * May it be or not through collapsed perpandiculars. + */ + + /*! \var AutoSegment::PerpandicularIndirect + * The \e current AutoSegment is perpandicular to the \e master + * through at least one collapsed perpandicular. + */ + + /*! \var AutoSegment::ParallelOrExpanded + * The \e current AutoSegment is not part of the aligned set, + * it's either parallel but not aligned (no constraint on the + * AutoContact) or perpandicular and not collapsed. + */ + + /*! \var AutoSegment::ParallelAndLayerChange + * The \e current AutoSegment is parallel to the master but not on + * the same layer as the \e source (the \e master by transitivity). + */ + + /*! \function unsigned int AutoSegment::getPerpandicularState ( AutoContact* contact, AutoSegment* source, AutoSegment* current, bool isHorizontalMaster, const Layer* masterLayer=NULL ) + * \param contact The AutoContact shared by source \& current. + * \param source The AutoSegment from where we came. + * \param current The AutoSegment we are exploring. + * \param isHorizontalMaster The direction of the reference AutoSegment. + * \param masterLayer The \Layer of the reference AutoSegment. + * \return A composite value telling the position of current relative to + * source and reference. + * + * Locators of \Collections like AutoSegment::getCollapseds() or + * AutoSegment::getCollapsedPerpandiculars() are built on this + * function. Any \Collection manipulating aligned sets must uses + * this function which is the keystone of the aligned set walk-through. + * + * The return value is a combination of binary flags from the + * AutoSegment::PerpandicularState enumeration. The function + * compute the following boolean values : + *
    + *
  • \e sourcePerpandicular : \True if the \e source is perpandicular + * to the \e master AutoSegment. + *
  • \e currentPerpandicular : \True if the \e current is perpandicular + * to the \e master AutoSegment. + *
  • \e contactAlignate : \True if the alignment constraint on the + * AutoContact (if any) applies to \e source \& \e current. For instance + * it will be \True if both source and current are horizontal + * \b and AutoContact::isHAlignate() is \True. + *
+ * Then the return value is computed as follow : + *
    + *
  1. If \e current is parallel to \e master \b but not on the same + * layer. + * + * sets the AutoSegment::AutoSegment::ParallelAndLayerChange flag. + *
  2. If \e current is perpandicular to \e master \b and not + * collapsed, it is perpandicular to the aligned set of the + * \e master. + * + * sets the AutoSegment::AutoSegment::PerpandicularAny flag. + *
  3. \e source is perpandicular to \e master. There is an implicit + * context : the only way a perpandicular segment gets took into + * account, is to be collapsed. Then if the \e current AutoSegment + * is also perpandicular \b and \b not collapsed, it means + * that it's a perpandicular to the aligned set of the \e master, + * The difference with the previous case, is that it's through at + * least one collapsed perpandicular. + * + * sets the AutoSegment::AutoSegment::PerpandicularIndirect flag. + *
  4. \e source is parallel to \e master. Then we check for + * disconnection in the aligned set. Disconnection arises + * if the \e contactAlignate flag is \false (either no + * alignment constraint on the AutoContact or different + * directions), \b and the \e current segment is not a + * collapsed perpandicular. + * + * sets the AutoSegment::AutoSegment::ParallelOrExpanded flag. + *
+ * The \b zero return value means that the \e current AutoSegment + * belong to the same aligned set as the \e master \b or is a + * perpandicular collapsed AutoSegment. + * + * The figures below demonstrate all thoses case : + * + * \image html PerpandicularState-1.png "Simple Perpandicular (case 2)" + * \image latex PerpandicularState-1.pdf "Simple Perpandicular (case 2)" width=0.8\textwidth + * + * \image html PerpandicularState-2.png "Indirect Perpandicular (case 3)" + * \image latex PerpandicularState-2.pdf "Indirect Perpandicular (case 3)" width=0.8\textwidth + * + * \image html PerpandicularState-3.png "Parallel (case 4.1)" + * \image latex PerpandicularState-3.pdf "Parallel (case 4.1)" width=0.8\textwidth + * + * \image html PerpandicularState-4.png "Aligned through AutoContact (case 4.2)" + * \image latex PerpandicularState-4.pdf "Aligned through AutoContact (case 4.2)" width=0.8\textwidth + */ + + /*! \function unsigned int AutoSegment::getPerpandicularState ( AutoContact* contact, AutoSegment* source, AutoSegment* current, AutoSegment* master ) + * \param contact The AutoContact shared by source \& current. + * \param source The AutoSegment from where we came. + * \param current The AutoSegment we are exploring. + * \param master The reference AutoSegment. + * \return A composite value telling the position of current relative to + * source and reference. + */ + + /*! \function bool AutoSegment::arePerpandiculars ( AutoSegment* a, AutoSegment* b ); + * \param a First AutoSegment. + * \param b Second AutoSegment. + * \return true if a \& b have perpandicular directions. + */ + + /*! \function bool AutoSegment::areAligneds ( AutoSegment* a, AutoSegment* b ); + * \param a First AutoSegment. + * \param b Second AutoSegment. + * \return true if a \& b have same directions. + */ + + /*! \function bool AutoSegment::arePerpandiculars ( bool isHorizontalA, AutoSegment* b ); + * \param isHorizontalA is the A AutoSegment horizontal. + * \param b Second AutoSegment. + * \return true if a \& have perpandicular directions. + */ + + } diff --git a/katabatic/doc/CMakeLists.txt b/katabatic/doc/CMakeLists.txt new file mode 100644 index 00000000..75bc8217 --- /dev/null +++ b/katabatic/doc/CMakeLists.txt @@ -0,0 +1,12 @@ + + set ( htmlInstallDir /share/doc/en/html/katabatic ) + set ( latexInstallDir /share/doc/en/latex/katabatic ) + + add_custom_target ( doc ALL cd ${KATABATIC_SOURCE_DIR}/doc && ${DOXYGEN_EXECUTABLE} doxyfile ) + + install ( DIRECTORY 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} ) diff --git a/katabatic/doc/GCell.dox b/katabatic/doc/GCell.dox new file mode 100644 index 00000000..64d9433a --- /dev/null +++ b/katabatic/doc/GCell.dox @@ -0,0 +1,179 @@ + + // -*- C++ -*- + + + namespace Katabatic { + + /*! \class GCell + * \brief Global Routing cell (\b API). + * + * \attention This class can only be allocated through a GCellGrid thus + * Constructors/Destructors are protecteds. + * + * \remark As this object uses the decorator Design Pattern, almost all + * functions are pure virtuals. Implementation take place in a + * derived class \c GCellConcrete which is not documented, + * (same specifications as GCell). + * + * \see GCellDecorator class. + */ + + /*! \function GCellGrid* GCell::getGCellGrid () const; + * \return The GCellGrid to which the GCell belongs. + */ + + /*! \function unsigned int GCell::getIndex () const; + * \return The linear index of this GCell inside the GCellGrid GCell table. + */ + + /*! \function unsigned int GCell::getRow () const; + * \return The GCell's row inside the GCellGrid (this is a Y coordinate). + */ + + /*! \function unsigned int GCell::getColumn () const; + * \return The GCell's row inside the GCellGrid (this is a X coordinate). + */ + + /*! \function Point GCell::getCenter () const; + * \return The center of the GCell. + */ + + /*! \function DbU::Unit GCell::getX () const; + * \return The X coordinate of the GCell's lower left corner (\b XMin). + */ + + /*! \function DbU::Unit GCell::getY () const; + * \return The Y coordinate of the GCell's lower left corner (\b YMin). + */ + + /*! \function DbU::Unit GCell::getXMax () const; + * \return The X coordinate of the GCell's upper right corner. + */ + + /*! \function DbU::Unit GCell::getYMax () const; + * \return The Y coordinate of the GCell's lower upper right corner. + */ + + /*! \function Box GCell::getBoundingBox () const; + * \return The GCell bounding box. + */ + + /*! \function GCell* GCell::getLeft () const; + * \return The CCell's left neighbour (may be \c NULL if first of the row). + */ + + /*! \function GCell* GCell::getRight () const; + * \return The CCell's right neighbour (may be \c NULL if last of the row). + */ + + /*! \function GCell* GCell::getUp () const; + * \return The CCell's up neighbour (may be \c NULL if top of the column). + */ + + /*! \function GCell* GCell::getDown () const; + * \return The CCell's down neighbour (may be \c NULL if bottom of the column). + */ + + /*! \function unsigned int GCell::getDensity ( unsigned int depth ) const; + * \return The density of vertical wires going through this GCell. + * \see updateDensity() + */ + + /*! \function unsigned int GCell::getCDensity () const; + * \return The AutoContact density. + * \see updateDensity() + */ + + /*! \function unsigned int GCell::getDensity () const; + * \return The average of horizontal and vertical density. + * \see updateDensity() + */ + + /*! \function vector* GCell::getVSegments (); + * \return All vertical AutoSegment, starting, ending or crossing this GCell. + */ + + /*! \function vector* GCell::getHSegments (); + * \return All horizontal AutoSegment, starting, ending or crossing this GCell. + */ + + /*! \function vector* GCell::getContacts (); + * \return All AutoContact belonging to this GCell. + */ + + /*! \function AutoSegments GCell::getVStartSegments (); + * \return All vertical AutoSegment starting from this GCell. + */ + + /*! \function AutoSegments GCell::getHStartSegments (); + * \return All horizontal AutoSegment starting from this GCell. + */ + + /*! \function AutoSegments GCell::getVStopSegments (); + * \return All vertical AutoSegment ending in this GCell. + */ + + /*! \function AutoSegments GCell::getHStopSegments (); + * \return All horizontal AutoSegment ending in this GCell. + */ + + /*! \function AutoSegments GCell::getStartSegments ( unsigned int direction ); + * \param direction The selected direction. + * \return All AutoSegment starting from this GCell in \b direction. + */ + + /*! \function AutoSegments GCell::getStopSegments ( unsigned int direction ); + * \param direction The selected direction. + * \return All AutoSegment ending in this GCell in \b direction. + */ + + /*! \function void GCell::addVSegment ( AutoSegment* segment ); + * \param segment A vertical AutoSegment. + * + * Indicate that the vertical \c segment is going straigh through this + * GCell (no AutoContact). + */ + + /*! \function void GCell::addHSegment ( AutoSegment* segment ); + * \param segment An horizontal AutoSegment. + * + * Indicate that the horizontal \c segment is going straigh through this + * GCell (no AutoContact). + */ + + /*! \function void GCell::addContact ( AutoContact* contact ); + * \param contact An AutoContact. + * + * Indicate that the \c contact is owned by this GCell. This means that + * either it's a branching point or there are terminals in the GCell. + * The AutoContact is geometrically bound by the GCell bounding box. + */ + + /*! \function void GCell::updateContacts (); + * Force the geometrical recalculation of all AutoContact owned by + * this GCell. + */ + + /*! \function void GCell::updateDensity (); + * Recompute the horizontal, vertical, global and contact of + * this GCell. + * + * The horizontal density is computed as follow : the sum of the length + * of all horizontal wires divided by the the total length of horizontal + * wires (the width of the GCell times the number of horizontal tracks). + * A density equal to one means a totally saturated GCell, and greater + * than one an overloaded GCell (unroutable). + * + * The vertical density is computed in a similar way to the horizontal + * one. + * + * The global density is the average of horizontal and vertical + * density. + * + * AutoContact density is the ratio of number of contact with length of + * the diagonal of the GCell multiplied by two. This is a rough approximate. + * + * \see GCellGrid::updateDensity(). + */ + + } diff --git a/katabatic/doc/GCellGrid.dox b/katabatic/doc/GCellGrid.dox new file mode 100644 index 00000000..d8fa9960 --- /dev/null +++ b/katabatic/doc/GCellGrid.dox @@ -0,0 +1,21 @@ + + // -*- C++ -*- + + + namespace Katabatic { + + /*! \class GCellGrid + * \brief Routing Grid (\b API). + * + * \attention This class is can only be allocated through a Katabatic + * \c ToolEngine thus Constructors/Destructors are protecteds. + * + * \section GCellGridImplementation GCellGrid Implementation Details + */ + + /*! \function void GCellGrid::updateDensity (); + * \return Recompute the density of each GCell in the grid. + * \see GCell::updateDensity(). + */ + + } diff --git a/katabatic/doc/Grid.dox b/katabatic/doc/Grid.dox new file mode 100644 index 00000000..49da96dd --- /dev/null +++ b/katabatic/doc/Grid.dox @@ -0,0 +1,114 @@ + + // -*- C++ -*- + + + namespace Katabatic { + + /*! \class BaseGrid + * \brief Grid Common Skeleton (\b API). + * + * \attention Provide a non-template common skeleton for the Grid class + * template. Specifically manage the axis graduation, the geometric + * search functions and the indexes computation (assuming a linear + * storage of the grid elements). + * + * + * \section BaseGridImplementation Grid Implementation Details + * + * The matrix of GCell is stored in a linear vector of GCell's pointer, + * row by row. The Grid class provide convenient functions to + * convert a linear index into row / column and the other way around. + */ + + /*! \function unsigned int BaseGrid::getColumns () const; + * \return The number of columns of the GCell matrix. + */ + + /*! \function unsigned int BaseGrid::getRows () const; + * \return The number of rows of the GCell matrix. + */ + + /*! \function unsigned int BaseGrid::getRawSize () const; + * \return The size of the vector holding the GCell matrix. + */ + + /*! \function unsigned int BaseGrid::getIndex ( unsigned int column, unsigned int row ) const; + * \param column The GCell's column. + * \param row The GCell's row. + * \return The linear index of the GCell at (column,row). + */ + + /*! \function unsigned int BaseGrid::getRow ( unsigned int index ) const; + * \param index A linear index. + * \return extract the row number from the linear index. + */ + + /*! \function unsigned int BaseGrid::getColumn ( unsigned int index ) const; + * \param index A linear index. + * \return extract the column number from the linear index. + */ + + /*! \class Grid + * \brief Routing Grid (\b API). + * + * \attention This class is can only be allocated through a Katabatic + * \c ToolEngine thus Constructors/Destructors are protecteds. + * + * \section GridImplementation Grid Implementation Details + * + * The matrix of GCell is stored in a linear vector of GCell's pointer, + * row by row. The Grid class provide convenient functions to + * convert a linear index into row / column and the other way around. + */ + + + /*! \function GCell* Grid::getGCell ( const Point p1, const Point p2 ) const; + * \param p1 First point. + * \param p2 Second point. + * \return Returns the GCell enclosing both points. + * + * When we build a Net's routing wires, and the Net span more than one + * GCell, we can always find the appropriate GCell through the + * \c Hook, \c GCell and GCell association. + * + * Problem arises for a Net fully contained inside one GCell, in this + * case there is no SplitterContact telling us where we are. We have + * to guess the GCell by only using RoutingPad's positions. And unfortunatly + * \c RoutingPad can be on the edge of one GCell so we cannot tell if + * it belongs to the left or the right. To solve this problem we guess + * the GCell from two (different) \c RoutingPad positions. + * + * Note that if there is only one \c RoutingPad, there is no problem at + * all : we are dealing with a one \c Plug \c Net... + * + * If points do not belongs to one GCell (too far appart), strange + * results may occurs. + */ + + /*! \function GCell* Grid::getGCell ( unsigned int index ) const; + * \param index A linear index. + * \return The GCell at the given index. + * + * Be aware that no check is performed if the index is out of bound, + * this may leads to catastrophic results. + */ + + /*! \function vector Grid::getGCellVector (); + * \return The \vector holding all GCells. + */ + + /*! \function GCells Grid::getGCellsColumn ( unsigned int column, unsigned int rowStart, unsigned int rowStop ); + * \param column The column index. + * \param rowStart The start row index inside the column. + * \param rowStop The stop row index inside the column. + * \return The \c Collection of a partial row. + */ + + /*! \function GCells Grid::getGCellsRow ( unsigned int row, unsigned int columnStart, unsigned int columnStop ); + * \param row The row index. + * \param columnStart The start column index inside the row. + * \param columnStop The stop column index inside the row. + * \return The \c Collection of a partial column. + */ + + } diff --git a/katabatic/doc/KatabaticEngine.dox b/katabatic/doc/KatabaticEngine.dox new file mode 100644 index 00000000..7e09fa3e --- /dev/null +++ b/katabatic/doc/KatabaticEngine.dox @@ -0,0 +1,202 @@ + + // -*- C++ -*- + + + namespace Katabatic { + + /*! \mainpage Routing Toolbox Documentation + * + * This documentation adresses two level of explanations : + * + *
    + *
  • The \b API description which explains how to use Katabatic, + * thoses parts as flagged as \b API. + *
  • The internal description which details how Katabatic do + * things. It's mostly intended for myself to help me not to + * forget how I've done things when debug time will come... + * It may also be valuable to people who may want to use + * or patch Katabatic for their own purpose (my secret hope). + *
+ */ + + + /*! \namespace Katabatic + * \brief The namespace dedicated to Katabatic. + */ + /*! \enum LoadGRMethod + * Lists all avalaible global routing loading methods for + * loadGlobalRouting(). + */ + /*! \var LoadGRMethod LoadGrByNet + * The global routing will be loaded net by net. + */ + /*! \var LoadGRMethod LoadGrByGCell + * The global routing will be loaded GCell by GCell. + */ + + + /*! \class KatabaticEngine + * \brief The Katabatic ToolEngine, routing toolbox (\b API). + */ + + /*! \function KatabaticEngine* KatabaticEngine::create ( const RoutingGauge* gauge, Cell* cell, vector& nets ); + * \param gauge The RoutingGauge to use. + * \param cell The \Cell to be routed. + * \param nets The subset of \Nets to be routeds. Note that the vector is + * copied inside the KatabaticEngine object, so there's no need to keep + * the parameter. + * + * creates a new KatabaticEngine object. Should never be used, as Katabatic + * must be used as the base class for any router, and therefore + * created through it. Still avalaible for debugging purposes. + */ + + /* \function void KatabaticEngine::destroy (); + * Cleanly destruct the data-base, saves the routing wires in + * the \Hurricane data-base (really a call to _preDestroy()). + * + * \see _saveNet(). + */ + + /*! \function GCellGrid* KatabaticEngine::getGCellGrid () const; + * \return The associated GCellGrid. + */ + + /*! \function const vector& KatabaticEngine::getRoutingNets () const; + * \return The subset of \Nets that are to be routed. + */ + + /*! \function void KatabaticEngine::loadGlobalRouting ( unsigned int method ) + * \param method to specify the algorithm used to perform the loading. + * + * translates a global routing created by Tornado (GCell/GCell data-base) + * into an initial detailed routing. Two algorithms are currently + * avalaibles : + *
    + *
  • LoadGrByNet : load global routing net by net. + *
  • LoadGrByGCell : load global routing GCell by GCell. + *
+ * + * This method is essentially a switch which calls the appropriate sub-method + * _loadGrByNet() or _LoadGRbyGCell(). It relies on the presence of a Nimbus + * ToolEngine, if not found, throws an error. + */ + + /*! \function void KatabaticEngine::setGlobalThreshold ( DbU::Unit threshold ); + * \param threshold The global routing threshold. + * + * The length (in DbU::Unit) from which an AutoSegment will be considered to be + * global. + * + * \see layerAssign(), getGlobalThresold(). + */ + + /*! \function DbU::Unit KatabaticEngine::getGlobalThreshold () const; + * \return The value of the global routing thresold. + * + * \see setGlobalThresold(). + */ + + /*! \function void KatabaticEngine::_computeNetConstraints ( Net* ); + * computes the \c AutoSegment constraints (see \ref NetConstraints). + */ + + /*! \function void KatabaticEngine::_computeNetOptimals ( Net* ); + * computes the \c AutoSegment optimal positions (see \ref NetOptimals). + */ + + /*! \function AutoSegment* KatabaticEngine::_lookup ( Segment* segment ) const; + * \param segment The \c Hurricane segment. + * + * Finds the Katabatic AutoSegment associated to \c segment. + * For this function to work, a Katabatic update session must be open. + * If not, an exception will be thrown. + */ + + /*! \function void KatabaticEngine::_link ( AutoSegment* autoSegment ); + * adds \b autoSegment to the AutoSegment internal lookup table. + * This function does nothing if DoLinkAutoSegment() is \false : + * in destruction mode. + * \see _Lookup(). + */ + + /*! \function void KatabaticEngine::_unlink ( AutoSegment* autoSegment ); + * removes \b autoSegment AutoSegment internal lookup table. + * This function does nothing if DoLinkAutoSegment() is \false : + * in destruction mode. + * \see _Lookup(). + */ + + /*! \function void KatabaticEngine::_destroyAutoSegments (); + * clear the internal AutoSegment lookup table. Should be called + * only from inside the Katabatic destructor. + */ + + /*! \function void KatabaticEngine::_saveNet ( Net* net ); + * \param net The \Net to process. + * + * Revert (partially destruct) the AutoSegment/AutoContact + * structure of the \Net to the \Hurricane data-base. + * To be used only in the Katabatic destructor... + * + * \see destroy(). + */ + + + /*! \function KatabaticEngine* KatabaticEngine::get ( const Cell* cell ) + * \brief Returns the Katabatic ToolEngine attached to the Cell, if any. + */ + + /*! \function void KatabaticEngine::refresh ( bool openSession=true ); + * Force the update of all AutoContact. By default opens a new + * update Session. If one is already open, set openSession to + * \False. + */ + + /*! \function void KatabaticEngine::startMeasures (); + * Start memory consumption and timer measurment (reset any + * previous one). + * + * \see stopMeasures(), printMeasures(). + */ + + /*! \function void KatabaticEngine::stopMeasures (); + * compute memory consumption \& time elapsed since the last + * call to startMeasures(). + * + * \see startMeasures(), printMeasures(). + */ + + /*! \function void KatabaticEngine::printMeasures () const; + * Display memory consumption \& time elapsed. + * + * \see startMeasures(), stopMeasures(). + */ + + /*! \function void KatabaticEngine::_check ( const char* message=NULL ) const; + * \param message The message to print. + * + * Perform a coherency complete coherency check of the + * data-base. Currently : + *
    + *
  • No AutoSegment remains invalidated (\ref katabaticSession). + *
  • AutoSegment extentions are coherent. + *
+ */ + + + //! \addtogroup collapseCanonical + //! \{ + + /*! \function void KatabaticEngine::_canonize ( Net* net ); + * \param net The \Net to canonize. + * + * Find canonical AutoSegments and non-canonicals ones, + * sets up the flags accordingly. + * + * \see AutoSegment::isCanonical(). + */ + + //! \} + + } diff --git a/katabatic/doc/LayerAssign.dox b/katabatic/doc/LayerAssign.dox new file mode 100644 index 00000000..ce8526d8 --- /dev/null +++ b/katabatic/doc/LayerAssign.dox @@ -0,0 +1,143 @@ + + // -*- C++ -*- + + + namespace Katabatic { + + /*! \defgroup layerAssign 4. Layer Assignment (internal) + * + * This modules documents how layer assignment is performed. It is intented + * for developpers only. + * + * Layer Assignment functions works in two steps : + *
    + *
  1. For a given net, go through the \c AutoSegment and migrate them + * to upper (global) layers if needed. + *
  2. For each \c AutoContact of which at least one \c AutoSegment has been + * migrated, split the \c AutoContact (with SplitAutoContact()). + *
+ * + * SplitAutoContact() relies on the hypothesis that the split occurs + * between two sets of \b HV layers. For example between \b M2/M3 and + * \b M4/M5 but not between \b M2/M3 and \b M6/M7. + * + * The following figures shows all possible configurations, except for + * the most obvious : when all \c AutoSegment are migrated from \b M2/M3 to + * \b M4/M5 we just change the layer of the \c AutoContact from \b C23 to \b C34. + * SplitAutoContact() compute the layer span of the AutoContact, + * that is, the distance between the lowest layer and the higher one (it + * cannot exceed 3 as from \b M2 to \b M5). Then it detach the higher + * \c AutoSegment and re-attach them to a newly created \c AutoContact. + * In turn this new \c AutoContact is connected to the previous one. + *
    + *
  • The span is 3 (\b M2 to \b M5) : creates 2 \c AutoContact and + * 2 \c AutoSegment. + *
  • The span is 2 (\b M2 to \b M4 or \b M3 to \b M5) : creates one + * \c AutoContact and one \c AutoSegment. + *
  • The span is 1 (\b M3 to \b M4) : just change the layer of the + * \c AutoContact to \b C34. + *
+ * Simpler rules could be formulated : if \b M2 is present creates the + * \b M3 additionnal \c AutoSegment. If \b M5 is present, created the + * \b M4 additionnal \c AutoSegment. + * + * In M2+M3+M4+M5, M3+M4+M5 and M2+M3+M4 configurations + * two separates \b M4 \c AutoSegment (resp. \b M3 \c AutoSegment) are needed + * to avoid the incomplete AutoContact wiring problem + * (see \ref ssecFaultyTopologies). + * + * \image html SplitAutoContact-1.png "Full Configuration" + * \image latex SplitAutoContact-1.pdf "Full Configuration" width=0.4\textwidth + * \image html SplitAutoContact-2.png "No M3 Configuration" + * \image latex SplitAutoContact-2.pdf "No M3 Configuration" width=0.4\textwidth + * \image html SplitAutoContact-3.png "No M3,M4 Configuration" + * \image latex SplitAutoContact-3.pdf "No M3,M4 Configuration" width=0.4\textwidth + * \image html SplitAutoContact-4.png "No M2 Configuration (degenerate)" + * \image latex SplitAutoContact-4.pdf "No M2 Configuration (degenerate)" width=0.4\textwidth + * \image html SplitAutoContact-5.png "No M5 Configuration (degenerate)" + * \image latex SplitAutoContact-5.pdf "No M5 Configuration (degenerate)" width=0.4\textwidth + * \image html SplitAutoContact-6.png "No M2,M5 Configuration (degenerate)" + * \image latex SplitAutoContact-6.pdf "No M2,M5 Configuration (degenerate)" width=0.4\textwidth + */ + + + /*! \enum LayerAssignMethod + * List all avalaible global layer assignment algorithm avalaible for + * layerAssign(). + */ + + /*! \var LayerAssign LayerAssignByLength + * See layerAssign(). + */ + + /*! \var LayerAssign LayerAssignByTrunk + * See layerAssign(). + */ + + + /*! \function void KatabaticEngine::layerAssign ( unsigned int method ) + * \param method specify the algorithm used to perform the layer assignement. + * + * The loadGlobalRouting() method build a topology for each net using only the + * two first routing layers avalaibles (usually \e metal2 and \e metal3). + * To use upper routing layer we needs to go through a layer assignment + * step. The layerAssign() method provides two simples approaches to do so : + *
    + *
  • layerAssignByLength : every global AutoSegment which + * length is superior to the global threshold is moved to the upper layer. + *
  • layerAssignByTrunk : if any AutoSegment of a net + * exceed the global threshold, then all the global wiring of this + * net is put into the upper layers. + *
+ * + * This method is a switch to _layerAssignByLength() or _layerAssignByTrunk(). + * + * The global threshold is to be sets using the setGlobalThreshold() + * method. + */ + + + //! \addtogroup layerAssign + //! \{ + + + /*! \function void KatabaticEngine::_layerAssignByLength ( unsigned long& total, unsigned long& global, set& globalNets ); + * + * Perform the layer assignment on all nets, using the + * layerAssignByLength algorithm. See layerAssign(). + */ + + /*! \function void KatabaticEngine::_layerAssignByLength ( Net* net, unsigned long& total, unsigned long& global, set& globalNets ); + * \param net The net to process. + * \param total The total number of AutoSegment. + * \param global The number of AutoSegment that have been sets global. + * \param globalNets Set of global Nets. + * + * Perform the layer assignment on one net, using the + * layerAssignByLength algorithm. See layerAssign(). + */ + + /*! \function void KatabaticEngine::_layerAssignByTrunk ( unsigned long& total, unsigned long& global, set& globalNets ); + * + * Perform the layer assignment on all nets, using the + * layerAssignByTrunk algorithm. See layerAssign(). + */ + + /*! \function void KatabaticEngine::_layerAssignByTrunk ( Net* net, unsigned long& total, unsigned long& global, set& globalNets ); + * \param net The net to process. + * \param total The total number of AutoSegment. + * \param global The number of AutoSegment that have been sets global. + * \param globalNets Set of global Nets. + * + * Perform the layer assignment on one net, using the + * layerAssignByTrunk algorithm. See layerAssign(). + */ + + //! \} + +} + + + namespace { + + } diff --git a/katabatic/doc/LoadGrByNet.dox b/katabatic/doc/LoadGrByNet.dox new file mode 100644 index 00000000..786d9c62 --- /dev/null +++ b/katabatic/doc/LoadGrByNet.dox @@ -0,0 +1,27 @@ + + // -*- C++ -*- + + + namespace Katabatic { + + /*! \function void KatabaticEngine::_loadGrByNet () + * Load the global routing from the Nimbus structure (built by the Tornado + * global router) into the Katabatic ToolEngine. + */ + + /*! \function void KatabaticEngine::_loadNetGlobalRouting ( Net* net ) + * \param net The net for which to build the final routing. + * + * Load the global routing from the Nimbus structure. Do a recursive + * walk through the GCells. Recursivity is handled with the + * ForkStack stack. + */ + + } + + + + + namespace { + + } diff --git a/katabatic/doc/NetConstraints.dox b/katabatic/doc/NetConstraints.dox new file mode 100644 index 00000000..534f7555 --- /dev/null +++ b/katabatic/doc/NetConstraints.dox @@ -0,0 +1,128 @@ + + // -*- C++ -*- + + + namespace Katabatic { + + /*! \defgroup NetConstraints 5. Constraints Computations (internal) + * + * This module documents how constraints computation are performed. + * It is intented for developpers only. + * + * Constraints gives the absolute minimal and maximal position an + * \c AutoSegment axis can be set. They materialize the bounds over + * which we may have an electrical disconnection. + * + * Practically, due to the magic of \c AutoContact, disconnections + * can only occurs on \c AutoContact anchored on \c RoutingPad : + * if they go outside the \c RoutingPad area, we are in trouble. + * Those \c AutoContact can be spotted either by the fact they have + * an anchor or the AutoContact::isTerminal() flag is set. + * + * + * \section secConstraintsOrgan Organisation + * + * Due to algorithmic consideration, instead of storing constraint + * interval (one axis) in \c AutoSegment, we store constraint \c Box + * (both axis) in \c AutoContact. They are easier to propagate during the + * computation stage and should takes less memory as \c AutoContact + * are often shared by more than two \c AutoSegment. + * + * To spare memory, each coordinate of the constraint \c Box is expressed + * as a strictly positive offset in \e lambdas from the lower left corner + * of the \c FCell owning the \c AutoContact. Offsets are 8 bits unsigned int, + * thus a \c Box takes one word (32 bits). This leads to two restrictions : + *
    + *
  • A \c FCell side cannot be greater than 256 \e lambdas. + *
  • The constraint \c Box minimal precision is the \e lambda. + *
+ * In all cases I can foresee, none of them should be a problem. + * + * Constraint interval on \c AutoSegment can be deduced from any of + * the source or target \c AutoContact. For an horizontal \c AutoSegment + * we take the constraint \c Box vertical interval and for a vertical, + * the horizontal interval. + * + * + * \section secNativeConstraints Native Constraints + * + * Before the contraints computation starts, we needs to initialize + * each \c AutoContact \c Box to a reasonable default : the + * Native Constraint Box. Wich is : + *
    + *
  • For an anchored/passive \c AutoContact : the bounding box + * of the underlying terminal. + *
  • For any other \c AutoContact : the bounding box of the + * \c FCell owner. + *
+ * + * + * \section secConstraintsPropagation Constraints Propagation + * + * The only source of constraints being the anchored \c AutoContact + * we do a full propagation from each of them. Propagation is done + * through \c AutoSegment as follow : + *
    + *
  • Horizontal \c AutoSegment propagate the vertical (\b DY) + * constraint part. + *
  • Vertical \c AutoSegment propagate the horizontal (\b DX) + * constraint part. + *
+ * Obviously, any constraint diseapear after we have gone through + * exactly one horizontal and one vertical, thus the propagation is + * somewhat limited. + * + * Case of collapsed \c AutoSegment : those are to be kept at + * zero-length, thus they act as a bypass between two \c AutoContact. + * Their source and target can be considered as stacked + * and propagate both vertical and horizontal constraint (that is : + * the whole constraint \c Box). + * + * + * \section secCollapseUncollapse Collapsing & Uncollapsing + * + * Only local \c AutoSegment can be collapsed, as a global + * \c AutoSegment crosses the boundary of at least one \c FCell + * it can't have a null length. + * + * When collapsing a new \c AutoSegment, we can do an incremental + * constraint computation as it will result in a further increase + * of constraint (if any). + * + * When uncollapsing an \c AutoSegment we may have to slacken the + * constraint, but we do not know to which extend. So to make it + * simple we fully recompute constraints from scratch. + * + * Note that collapsing/uncollapsing are exceptionnal operations, + * so we can afford losing a little time there. + * + * + * \section secCollapseExample progressive Collapsing Example + * + * In this set of example we show how constraints propagate along the + * \c AutoSegment, depending on the collapsed ones. We starts we no + * collapse and ends with all \e local \c AutoSegment collapseds. + * + * \image html NetConstraints-1.png "Fully expanded" + * \image latex NetConstraints-1.pdf "Fully expanded" width=0.4\textwidth + * \image html NetConstraints-2.png "After One Vertical collapse" + * \image latex NetConstraints-2.pdf "After One Vertical collapse" width=0.4\textwidth + * \image html NetConstraints-3.png "After Horizontal collapse" + * \image latex NetConstraints-3.pdf "After Horizontal collapse" width=0.4\textwidth + * \image html NetConstraints-4.png "Fully collapsed" + * \image latex NetConstraints-4.pdf "Fully collapsed" width=0.4\textwidth + */ + + + //! \addtogroup NetConstraints + //! \{ + + /*! \function void KatabaticEngine::_computeNetConstraints ( Net* net ); + * \param net The net for which to compute constraints. + * + * compute constraints on a net. + */ + + //! \} + + } diff --git a/katabatic/doc/NetOptimals.dox b/katabatic/doc/NetOptimals.dox new file mode 100644 index 00000000..25109761 --- /dev/null +++ b/katabatic/doc/NetOptimals.dox @@ -0,0 +1,59 @@ + + // -*- C++ -*- + + + namespace Katabatic { + + /*! \defgroup NetOptimals 6. AutoSegment Optimal Placement (internal) + * + * This modules documents how \c AutoSegment optimal placement are computed. + * It is intented for developpers only. + * + * The principle is quite simple : for any given \c AutoSegment, for example + * a vertical one (\b A), we want to find the optimal position so the wire + * length of \c AutoSegment perpandicular to \b A would be minimal. This + * optimal position is an interval of X positions, possibly reduced to a + * point. + * + * Given an \c AutoSegment, we will take into account : + *
    + *
  • Perpandicular global \c AutoSegment. + *
  • Terminals linked to the \c AutoSegment through any number of + * local \c AutoSegment (collapsed or not). + *
+ * + * How to find the optimal interval : + * + * First we build an histogram in the direction perpandicular to the + * \c AutoSegment. For \b A : in horizontal direction. We populate the + * histogram with the axis coordinate of global \c AutoSegment and + * terminals linked to \b A. Note that for global \c AutoSegment the + * "axis" coordinate is the position of the side of the \c FCell. + * For terminal depending on their orientation relative to \b A we + * add either their axis or their two extremities. + * + * The optimal interval is then the median interval of the histogram. + * + * The set of examples below shows some representative cases. + * + * \image html NetOptimals-1.png "Multiple Verticals Terminals" + * \image latex NetOptimals-1.pdf "Multiple Verticals Terminals" width=0.6\textwidth + * \image html NetOptimals-2.png "Globals Only" + * \image latex NetOptimals-2.pdf "Globals Only" width=0.6\textwidth + * \image html NetOptimals-3.png "One Horizontal Terminal" + * \image latex NetOptimals-3.pdf "One Horizontal Terminal" width=0.6\textwidth + */ + + + //! \addtogroup NetOptimals + //! \{ + + /*! \function void KatabaticEngine::_computeNetOptimals ( Net* net ); + * \param net The net for which to compute optimal placement. + * + * compute optimal placement of all net's AutoSegment. + */ + + //! \} + + } diff --git a/katabatic/doc/Session.dox b/katabatic/doc/Session.dox new file mode 100644 index 00000000..8fd7e15f --- /dev/null +++ b/katabatic/doc/Session.dox @@ -0,0 +1,153 @@ + + // -*- C++ -*- + + + namespace Katabatic { + + /*! \defgroup katabaticSession 7. Katabatic update Session Mechanism (internal) + * + * This module documents the Katabatic update Session Mechanism. + * It is intented for developpers only. + * + * + * \section secSessionGoal Goal of The Katabatic::Session + * + * Due to obvious performance issue, we do not recompute the + * geometry of source and target of a Katabatic::AutoSegment + * each time it's moved by the router. Instead we uses a simple + * queuing mechanism : the Katabatic::Session. + * + * Note that, most of the time, the router only moves segments, + * that is, never modifies directly Katabatic::AutoContact. + * The only exceptions being during the initial building stage + * or when the router decide to change the topology of a net. + * + * The router knows which Katabatic::AutoSegment it has moved, + * but during the update of a Katabatic::AutoContact geometry + * more segments will be modified. The modification being a + * change in their soure and/or target extention. And of thoses + * the router will not know about. To solve this problem, + * the router has to set a callback Katabatic::SegmentRevalidateCB + * which will be called for each modificated Katabatic::AutoSegment. + * + * Note that, in order to uniformize the procedure, this callback + * will also be run on Katabatic::AutoSegment modificated by + * the router. + * + * + * \section secSectionLookup The lookup function. + * + * To find a Katabatic::AutoSegment from it's associated \Hurricane + * segment, we build a simple \STL map in the Katabatic \c ToolEngine. + * This lookup table, can be accessed through the Session lookup() + * function, once the session is open. + * + * + * \section secSessionRevalidate The Revalidate procedure + * + * The sequence of calls is as follow : + *
    + *
  1. The Router modifies some Katabatic::AutoSegment by moving + * their axis. For example, horizontal segments in an horizontal + * routing channel. + *
  2. The Katabatic::AutoSegment is then invalidated : put in the + * invalidated segment set. It's Katabatic::AutoContact anchors + * are also invalidated and put in the set of invalidated contacts. + *
  3. At some point, a global revalidation is performed : + * Katabatic::Session::revalidate(). Says, when the channel + * is successfully routed. + *
  4. Katabatic::updateGeometry() is called and update the + * geometry of all invalided Katabatic::AutoContact. Doing so + * almost surely leads to the invalidation of more Katabatic::AutoSegment + * which are added to the invalidated set. In this example, as + * we moved horizontal segments, the new invalidated segments + * will be vertical ones incident to the formers. + *
  5. Finally we call Katabatic::AutoSegment::onRevalidate() + * fonction for each Katabatic::AutoSegment. + * This function encapsulate the callback from the router, so it + * can take into account the segment extension change. + *
+ * + * \image html AutoInvalidate-1.png "Revalidate Procedure" + * \image latex AutoInvalidate-1.pdf "Revalidate Procedure" width=0.9\textwidth + * + * + * \section secStaticAccess The Static Member choice + * + * Almost all Session function members are \c static, this is + * because they refers to the currently opened Session which is + * kept entirely internal to the \c KatabaticSession module. + * This avoid carrying a global variable for the Session object. + */ + + + /*! \class Session + * \brief Katabatic update Session (\b API). + * + * The Katabatic Session is mandatory before any AutoSegment / + * AutoContact to be modified (supposedly by a router). + * + * Unlike \Hurricane \c update \c Session only one session + * can be opened at a time (no stacking mechanism). Opening a + * Katabatic update Session also opens an \Hurricane \c update + * \c Session. + * + * For details on how Katabatic Sessions works, have a look to + * \ref katabaticSession. + */ + + /*! \function static Session* Session::get (); + * \return The currently opened session, \c NULL if no session has + * been opened. + */ + + /*! \function static Katabatic* Session::getKatabatic (); + * \return The Katabatic ToolEngine associated to the current update + * session. + */ + + /*! \function static AutoSegment* Session::lookup ( Segment* segment ); + * \param segment An \Hurricane segment. + * \return The associated Katabatic AutoSegment. + * + * For this function to work, a Katabatic Session must be opened + * as it's a simple bypass to the Katabatic::_Lookup() member. + */ + + /*! \function static Session* Session::open ( KatabaticEngine* ktbt ); + * \param ktbt A Katabatic ToolEngine on which to work. + * + * Open a new Katabatic update Session on the \c ktbt \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 static size_t Session::close (); + * \return The number of AutoContact / AutoSegment that have been revalidateds. + * + * Ends an update Session. This functions made a call to Revalidate to + * ensure that no AutoContact / AutoSegment remains invalidated. + */ + + /*! \function static size_t Session::revalidate (); + * \return The number of AutoContact / AutoSegment that have been revalidateds. + * + * Revalidate all AutoContact / AutoSegment currently in the queue : + * that is, update the AutoContact geometry and AutoSegment extentions. + */ + + /*! \function void Session::invalidate ( AutoSegment* segment ); + * \param segment An AutoSegment that has been moved. + * + * The invalidated AutoSegment are stored into a \STL set, + * so it can be added multiples times without problems. + */ + + /*! \function void Session::invalidate ( AutoContact* contact ); + * \param contact An AutoContact of which a AutoSegment has been moved. + * + * The invalidated AutoContact are stored into a \STL set, + * so it can be added multiples times without problems. + */ + + } diff --git a/katabatic/doc/asimbook.cls b/katabatic/doc/asimbook.cls new file mode 100644 index 00000000..54270780 --- /dev/null +++ b/katabatic/doc/asimbook.cls @@ -0,0 +1,798 @@ +%% +%% This is file `book.cls', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% classes.dtx (with options: `book') +%% +%% This is a generated file. +%% +%% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 +%% The LaTeX3 Project and any individual authors listed elsewhere +%% in this file. +%% +%% This file was generated from file(s) of the LaTeX base system. +%% -------------------------------------------------------------- +%% +%% It may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either version 1.2 +%% of this license or (at your option) any later version. +%% The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.2 or later is part of all distributions of LaTeX +%% version 1999/12/01 or later. +%% +%% This file may only be distributed together with a copy of the LaTeX +%% base system. You may however distribute the LaTeX base system without +%% such generated files. +%% +%% The list of all files belonging to the LaTeX base distribution is +%% given in the file `manifest.txt'. See also `legal.txt' for additional +%% information. +%% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{asimbook} + [2005/11/21 v1.0 + ASIM LaTeX document class] +\newcommand\@ptsize{} +\newif\if@restonecol +\newif\if@titlepage +\@titlepagetrue +\newif\if@openright +\newif\if@mainmatter \@mainmattertrue +\if@compatibility\else +\DeclareOption{a4paper} + {\setlength\paperheight {297mm}% + \setlength\paperwidth {210mm}} +\DeclareOption{a5paper} + {\setlength\paperheight {210mm}% + \setlength\paperwidth {148mm}} +\DeclareOption{b5paper} + {\setlength\paperheight {250mm}% + \setlength\paperwidth {176mm}} +\DeclareOption{letterpaper} + {\setlength\paperheight {11in}% + \setlength\paperwidth {8.5in}} +\DeclareOption{legalpaper} + {\setlength\paperheight {14in}% + \setlength\paperwidth {8.5in}} +\DeclareOption{executivepaper} + {\setlength\paperheight {10.5in}% + \setlength\paperwidth {7.25in}} +\DeclareOption{landscape} + {\setlength\@tempdima {\paperheight}% + \setlength\paperheight {\paperwidth}% + \setlength\paperwidth {\@tempdima}} +\fi +\if@compatibility + \renewcommand\@ptsize{0} +\else +\DeclareOption{10pt}{\renewcommand\@ptsize{0}} +\fi +\DeclareOption{11pt}{\renewcommand\@ptsize{1}} +\DeclareOption{12pt}{\renewcommand\@ptsize{2}} +\if@compatibility\else +\DeclareOption{oneside}{\@twosidefalse \@mparswitchfalse} +\fi +\DeclareOption{twoside}{\@twosidetrue \@mparswitchtrue} +\DeclareOption{draft}{\setlength\overfullrule{5pt}} +\if@compatibility\else +\DeclareOption{final}{\setlength\overfullrule{0pt}} +\fi +\DeclareOption{titlepage}{\@titlepagetrue} +\if@compatibility\else +\DeclareOption{notitlepage}{\@titlepagefalse} +\fi +\if@compatibility +\@openrighttrue +\else +\DeclareOption{openright}{\@openrighttrue} +\DeclareOption{openany}{\@openrightfalse} +\fi +\if@compatibility\else +\DeclareOption{onecolumn}{\@twocolumnfalse} +\fi +\DeclareOption{twocolumn}{\@twocolumntrue} +\DeclareOption{leqno}{\input{leqno.clo}} +\DeclareOption{fleqn}{\input{fleqn.clo}} +\DeclareOption{openbib}{% + \AtEndOfPackage{% + \renewcommand\@openbib@code{% + \advance\leftmargin\bibindent + \itemindent -\bibindent + \listparindent \itemindent + \parsep \z@ + }% + \renewcommand\newblock{\par}}% +} +\ExecuteOptions{letterpaper,10pt,twoside,onecolumn,final,openright} +\ProcessOptions +\input{bk1\@ptsize.clo} +\setlength\lineskip{1\p@} +\setlength\normallineskip{1\p@} +\renewcommand\baselinestretch{} +\setlength\parskip{0\p@ \@plus \p@} +\@lowpenalty 51 +\@medpenalty 151 +\@highpenalty 301 +\setcounter{topnumber}{2} +\renewcommand\topfraction{.7} +\setcounter{bottomnumber}{1} +\renewcommand\bottomfraction{.3} +\setcounter{totalnumber}{3} +\renewcommand\textfraction{.2} +\renewcommand\floatpagefraction{.5} +\setcounter{dbltopnumber}{2} +\renewcommand\dbltopfraction{.7} +\renewcommand\dblfloatpagefraction{.5} +%%%% Select Chapter font. +\newcommand \textchapter [1] {\textsf{\textbf{#1}}} +\newcommand \fontchapter {\sffamily \bfseries} +\if@twoside + \def\ps@headings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\thepage\hfil\slshape\leftmark}% + \def\@oddhead{{\slshape\rightmark}\hfil\thepage}% + \let\@mkboth\markboth + \def\chaptermark##1{% + \markboth {\MakeUppercase{% + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \@chapapp\ \thechapter. \ % + \fi + \fi + ##1}}{}}% + \def\sectionmark##1{% + \markright {\MakeUppercase{% + \ifnum \c@secnumdepth >\z@ + \thesection. \ % + \fi + ##1}}}} +\else + \def\ps@headings{% + \let\@oddfoot\@empty + \def\@oddhead{{\slshape\rightmark}\hfil\thepage}% + \let\@mkboth\markboth + \def\chaptermark##1{% + \markright {\MakeUppercase{% + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \@chapapp\ \thechapter. \ % + \fi + \fi + ##1}}}} +\fi +\def\ps@myheadings{% + \let\@oddfoot\@empty\let\@evenfoot\@empty + \def\@evenhead{\thepage\hfil\slshape\leftmark}% + \def\@oddhead{{\slshape\rightmark}\hfil\thepage}% + \let\@mkboth\@gobbletwo + \let\chaptermark\@gobble + \let\sectionmark\@gobble + } + \if@titlepage + \newcommand\maketitle{\begin{titlepage}% + \let\footnotesize\small + \let\footnoterule\relax + \let \footnote \thanks + \null\vfil + \vskip 60\p@ + \begin{center}% + {\LARGE \@title \par}% + \vskip 3em% + {\large + \lineskip .75em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1.5em% + {\large \@date \par}% % Set date in \large size. + \end{center}\par + \@thanks + \vfil\null + \end{titlepage}% + \setcounter{footnote}{0}% + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax +} +\else +\newcommand\maketitle{\par + \begingroup + \renewcommand\thefootnote{\@fnsymbol\c@footnote}% + \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}% + \long\def\@makefntext##1{\parindent 1em\noindent + \hb@xt@1.8em{% + \hss\@textsuperscript{\normalfont\@thefnmark}}##1}% + \if@twocolumn + \ifnum \col@number=\@ne + \@maketitle + \else + \twocolumn[\@maketitle]% + \fi + \else + \newpage + \global\@topnum\z@ % Prevents figures from going at top of page. + \@maketitle + \fi + \thispagestyle{plain}\@thanks + \endgroup + \setcounter{footnote}{0}% + \global\let\thanks\relax + \global\let\maketitle\relax + \global\let\@maketitle\relax + \global\let\@thanks\@empty + \global\let\@author\@empty + \global\let\@date\@empty + \global\let\@title\@empty + \global\let\title\relax + \global\let\author\relax + \global\let\date\relax + \global\let\and\relax +} +\def\@maketitle{% + \newpage + \null + \vskip 2em% + \begin{center}% + \let \footnote \thanks + {\LARGE \@title \par}% + \vskip 1.5em% + {\large + \lineskip .5em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1em% + {\large \@date}% + \end{center}% + \par + \vskip 1.5em} +\fi +\newcommand*\chaptermark[1]{} +\setcounter{secnumdepth}{2} +\newcounter {part} +\newcounter {chapter} +\newcounter {section}[chapter] +\newcounter {subsection}[section] +\newcounter {subsubsection}[subsection] +\newcounter {paragraph}[subsubsection] +\newcounter {subparagraph}[paragraph] +\renewcommand \thepart {\@Roman\c@part} +\renewcommand \thechapter {\@arabic\c@chapter} +\renewcommand \thesection {\thechapter.\@arabic\c@section} +\renewcommand\thesubsection {\thesection.\@arabic\c@subsection} +\renewcommand\thesubsubsection{\thesubsection .\@arabic\c@subsubsection} +\renewcommand\theparagraph {\thesubsubsection.\@arabic\c@paragraph} +\renewcommand\thesubparagraph {\theparagraph.\@arabic\c@subparagraph} +\newcommand\@chapapp{\chaptername} +\newcommand\frontmatter{% + \cleardoublepage + \@mainmatterfalse + \pagenumbering{roman}} +\newcommand\mainmatter{% + \cleardoublepage + \@mainmattertrue + \pagenumbering{arabic}} +\newcommand\backmatter{% + \if@openright + \cleardoublepage + \else + \clearpage + \fi + \@mainmatterfalse} +\newcommand\part{% + \if@openright + \cleardoublepage + \else + \clearpage + \fi + \thispagestyle{plain}% + \if@twocolumn + \onecolumn + \@tempswatrue + \else + \@tempswafalse + \fi + \null\vfil + \secdef\@part\@spart} + +\def\@part[#1]#2{% + \ifnum \c@secnumdepth >-2\relax + \refstepcounter{part}% + \addcontentsline{toc}{part}{\thepart\hspace{1em}#1}% + \else + \addcontentsline{toc}{part}{#1}% + \fi + \markboth{}{}% + {\centering + \interlinepenalty \@M + \normalfont + \ifnum \c@secnumdepth >-2\relax + \huge\bfseries \partname\nobreakspace\thepart + \par + \vskip 20\p@ + \fi + \Huge \bfseries #2\par}% + \@endpart} +\def\@spart#1{% + {\centering + \interlinepenalty \@M + \normalfont + \Huge \bfseries #1\par}% + \@endpart} +\def\@endpart{\vfil\newpage + \if@twoside + \if@openright + \null + \thispagestyle{empty}% + \newpage + \fi + \fi + \if@tempswa + \twocolumn + \fi} +\newcommand\chapter{\if@openright\cleardoublepage\else\clearpage\fi + \thispagestyle{plain}% + \global\@topnum\z@ + \@afterindentfalse + \secdef\@chapter\@schapter} +\def\@chapter[#1]#2{\ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \refstepcounter{chapter}% + \typeout{\@chapapp\space\thechapter.}% + \addcontentsline{toc}{chapter}% + {\protect\numberline{\thechapter}#1}% + \else + \addcontentsline{toc}{chapter}{#1}% + \fi + \else + \addcontentsline{toc}{chapter}{#1}% + \fi + \chaptermark{#1}% + \addtocontents{lof}{\protect\addvspace{10\p@}}% + \addtocontents{lot}{\protect\addvspace{10\p@}}% + \if@twocolumn + \@topnewpage[\@makechapterhead{#2}]% + \else + \@makechapterhead{#2}% + \@afterheading + \fi} +%%%%\def\@makechapterhead#1{% +%%%% \vspace*{50\p@}% +%%%% {\parindent \z@ \raggedright \normalfont +%%%% \ifnum \c@secnumdepth >\m@ne +%%%% \if@mainmatter +%%%% \huge\bfseries \@chapapp\space \thechapter +%%%% \par\nobreak +%%%% \vskip 20\p@ +%%%% \fi +%%%% \fi +%%%% \interlinepenalty\@M +%%%% \Huge \bfseries #1\par\nobreak +%%%% \vskip 40\p@ +%%%% }} + \newlength \titlewidth + \setlength \titlewidth {\textwidth} + \addtolength \titlewidth {\marginparwidth} + \addtolength \titlewidth {\marginparsep} + \def\@makechapterhead#1{% + \vspace*{50\p@}% + {\parindent \z@ \raggedleft \fontchapter + \ifnum \c@secnumdepth >\m@ne + \if@mainmatter + \huge \@chapapp\space \thechapter + \par\nobreak + \vskip 20\p@ + \fi + \fi + \interlinepenalty\@M + \hsize=\titlewidth + \Huge #1 \par\nobreak + \hsize=\textwidth + \vskip 40\p@ + }} +\def\@schapter#1{\if@twocolumn + \@topnewpage[\@makeschapterhead{#1}]% + \else + \@makeschapterhead{#1}% + \@afterheading + \fi} +%%%%\def\@makeschapterhead#1{% +%%%% \vspace*{50\p@}% +%%%% {\parindent \z@ \raggedright +%%%% \normalfont +%%%% \interlinepenalty\@M +%%%% \Huge \bfseries #1\par\nobreak +%%%% \vskip 40\p@ +%%%% }} + \def\@makeschapterhead#1{% + \vspace*{50\p@}% + {\parindent \z@ \raggedright + \normalfont + \interlinepenalty\@M + \hsize=\titlewidth + \flushright + \Huge \bfseries #1\par\nobreak + \hsize=\textwidth + \vskip 40\p@ + }} +\newcommand\section{\@startsection {section}{1}{\z@}% + {-3.5ex \@plus -1ex \@minus -.2ex}% + {2.3ex \@plus.2ex}% + {\normalfont\Large\bfseries}} +\newcommand\subsection{\@startsection{subsection}{2}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\normalfont\large\bfseries}} +\newcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}% + {-3.25ex\@plus -1ex \@minus -.2ex}% + {1.5ex \@plus .2ex}% + {\normalfont\normalsize\bfseries}} +\newcommand\paragraph{\@startsection{paragraph}{4}{\z@}% + {3.25ex \@plus1ex \@minus.2ex}% + {-1em}% + {\normalfont\normalsize\bfseries}} +\newcommand\subparagraph{\@startsection{subparagraph}{5}{\parindent}% + {3.25ex \@plus1ex \@minus .2ex}% + {-1em}% + {\normalfont\normalsize\bfseries}} +\if@twocolumn + \setlength\leftmargini {2em} +\else + \setlength\leftmargini {2.5em} +\fi +\leftmargin \leftmargini +\setlength\leftmarginii {2.2em} +\setlength\leftmarginiii {1.87em} +\setlength\leftmarginiv {1.7em} +\if@twocolumn + \setlength\leftmarginv {.5em} + \setlength\leftmarginvi {.5em} +\else + \setlength\leftmarginv {1em} + \setlength\leftmarginvi {1em} +\fi +\setlength \labelsep {.5em} +\setlength \labelwidth{\leftmargini} +\addtolength\labelwidth{-\labelsep} +\@beginparpenalty -\@lowpenalty +\@endparpenalty -\@lowpenalty +\@itempenalty -\@lowpenalty +\renewcommand\theenumi{\@arabic\c@enumi} +\renewcommand\theenumii{\@alph\c@enumii} +\renewcommand\theenumiii{\@roman\c@enumiii} +\renewcommand\theenumiv{\@Alph\c@enumiv} +\newcommand\labelenumi{\theenumi.} +\newcommand\labelenumii{(\theenumii)} +\newcommand\labelenumiii{\theenumiii.} +\newcommand\labelenumiv{\theenumiv.} +\renewcommand\p@enumii{\theenumi} +\renewcommand\p@enumiii{\theenumi(\theenumii)} +\renewcommand\p@enumiv{\p@enumiii\theenumiii} +\newcommand\labelitemi{\textbullet} +\newcommand\labelitemii{\normalfont\bfseries \textendash} +\newcommand\labelitemiii{\textasteriskcentered} +\newcommand\labelitemiv{\textperiodcentered} +\newenvironment{description} + {\list{}{\labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + {\endlist} +\newcommand*\descriptionlabel[1]{\hspace\labelsep + \normalfont\bfseries #1} +\newenvironment{verse} + {\let\\\@centercr + \list{}{\itemsep \z@ + \itemindent -1.5em% + \listparindent\itemindent + \rightmargin \leftmargin + \advance\leftmargin 1.5em}% + \item\relax} + {\endlist} +\newenvironment{quotation} + {\list{}{\listparindent 1.5em% + \itemindent \listparindent + \rightmargin \leftmargin + \parsep \z@ \@plus\p@}% + \item\relax} + {\endlist} +\newenvironment{quote} + {\list{}{\rightmargin\leftmargin}% + \item\relax} + {\endlist} +\if@compatibility +\newenvironment{titlepage} + {% + \cleardoublepage + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse\newpage + \fi + \thispagestyle{empty}% + \setcounter{page}\z@ + }% + {\if@restonecol\twocolumn \else \newpage \fi + } +\else +\newenvironment{titlepage} + {% + \cleardoublepage + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse\newpage + \fi + \thispagestyle{empty}% + \setcounter{page}\@ne + }% + {\if@restonecol\twocolumn \else \newpage \fi + \if@twoside\else + \setcounter{page}\@ne + \fi + } +\fi +\newcommand\appendix{\par + \setcounter{chapter}{0}% + \setcounter{section}{0}% + \gdef\@chapapp{\appendixname}% + \gdef\thechapter{\@Alph\c@chapter}} +\setlength\arraycolsep{5\p@} +\setlength\tabcolsep{6\p@} +\setlength\arrayrulewidth{.4\p@} +\setlength\doublerulesep{2\p@} +\setlength\tabbingsep{\labelsep} +\skip\@mpfootins = \skip\footins +\setlength\fboxsep{3\p@} +\setlength\fboxrule{.4\p@} +\@addtoreset {equation}{chapter} +\renewcommand\theequation + {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@equation} +\newcounter{figure}[chapter] +\renewcommand \thefigure + {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@figure} +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{\figurename\nobreakspace\thefigure} +\newenvironment{figure} + {\@float{figure}} + {\end@float} +\newenvironment{figure*} + {\@dblfloat{figure}} + {\end@dblfloat} +\newcounter{table}[chapter] +\renewcommand \thetable + {\ifnum \c@chapter>\z@ \thechapter.\fi \@arabic\c@table} +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{\tablename\nobreakspace\thetable} +\newenvironment{table} + {\@float{table}} + {\end@float} +\newenvironment{table*} + {\@dblfloat{table}} + {\end@dblfloat} +\newlength\abovecaptionskip +\newlength\belowcaptionskip +\setlength\abovecaptionskip{10\p@} +\setlength\belowcaptionskip{0\p@} +\long\def\@makecaption#1#2{% + \vskip\abovecaptionskip + \sbox\@tempboxa{#1: #2}% + \ifdim \wd\@tempboxa >\hsize + #1: #2\par + \else + \global \@minipagefalse + \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \vskip\belowcaptionskip} +\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*\cal{\@fontswitch\relax\mathcal} +\DeclareRobustCommand*\mit{\@fontswitch\relax\mathnormal} +\newcommand\@pnumwidth{1.55em} +\newcommand\@tocrmarg{2.55em} +\newcommand\@dotsep{4.5} +\setcounter{tocdepth}{2} +\newcommand\tableofcontents{% + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse + \fi + \chapter*{\contentsname + \@mkboth{% + \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}% + \@starttoc{toc}% + \if@restonecol\twocolumn\fi + } +\newcommand*\l@part[2]{% + \ifnum \c@tocdepth >-2\relax + \addpenalty{-\@highpenalty}% + \addvspace{2.25em \@plus\p@}% + \setlength\@tempdima{3em}% + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + {\leavevmode + \large \bfseries #1\hfil \hb@xt@\@pnumwidth{\hss #2}}\par + \nobreak + \global\@nobreaktrue + \everypar{\global\@nobreakfalse\everypar{}}% + \endgroup + \fi} +%%%%\newcommand*\l@chapter[2]{% +%%%% \ifnum \c@tocdepth >\m@ne +%%%% \addpenalty{-\@highpenalty}% +%%%% \vskip 1.0em \@plus\p@ +%%%% \setlength\@tempdima{1.5em}% +%%%% \begingroup +%%%% \parindent \z@ \rightskip \@pnumwidth +%%%% \parfillskip -\@pnumwidth +%%%% \leavevmode \bfseries +%%%% \advance\leftskip\@tempdima +%%%% \hskip -\leftskip +%%%% #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par +%%%% \penalty\@highpenalty +%%%% \endgroup +%%%% \fi} +\newcommand\l@chapter[2]{% + \ifnum \c@tocdepth >\m@ne + \addpenalty{-\@highpenalty}% + \vskip 1.0em \@plus\p@ + \setlength\@tempdima{1.5em}% + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + \leavevmode \fontchapter + \advance\leftskip\@tempdima + \hskip -\leftskip + #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par + \penalty\@highpenalty + \endgroup + \fi} +\newcommand*\l@section{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand*\l@subsection{\@dottedtocline{2}{3.8em}{3.2em}} +\newcommand*\l@subsubsection{\@dottedtocline{3}{7.0em}{4.1em}} +\newcommand*\l@paragraph{\@dottedtocline{4}{10em}{5em}} +\newcommand*\l@subparagraph{\@dottedtocline{5}{12em}{6em}} +\newcommand\listoffigures{% + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse + \fi + \chapter*{\listfigurename}% + \@mkboth{\MakeUppercase\listfigurename}% + {\MakeUppercase\listfigurename}% + \@starttoc{lof}% + \if@restonecol\twocolumn\fi + } +\newcommand*\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} +\newcommand\listoftables{% + \if@twocolumn + \@restonecoltrue\onecolumn + \else + \@restonecolfalse + \fi + \chapter*{\listtablename}% + \@mkboth{% + \MakeUppercase\listtablename}% + {\MakeUppercase\listtablename}% + \@starttoc{lot}% + \if@restonecol\twocolumn\fi + } +\let\l@table\l@figure +\newdimen\bibindent +\setlength\bibindent{1.5em} +\newenvironment{thebibliography}[1] + {\chapter*{\bibname}% + \@mkboth{\MakeUppercase\bibname}{\MakeUppercase\bibname}% + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy + \clubpenalty4000 + \@clubpenalty \clubpenalty + \widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +\newcommand\newblock{\hskip .11em\@plus.33em\@minus.07em} +\let\@openbib@code\@empty +\newenvironment{theindex} + {\if@twocolumn + \@restonecolfalse + \else + \@restonecoltrue + \fi + \columnseprule \z@ + \columnsep 35\p@ + \twocolumn[\@makeschapterhead{\indexname}]% + \@mkboth{\MakeUppercase\indexname}% + {\MakeUppercase\indexname}% + \thispagestyle{plain}\parindent\z@ + \parskip\z@ \@plus .3\p@\relax + \let\item\@idxitem} + {\if@restonecol\onecolumn\else\clearpage\fi} +\newcommand\@idxitem{\par\hangindent 40\p@} +\newcommand\subitem{\@idxitem \hspace*{20\p@}} +\newcommand\subsubitem{\@idxitem \hspace*{30\p@}} +\newcommand\indexspace{\par \vskip 10\p@ \@plus5\p@ \@minus3\p@\relax} +\renewcommand\footnoterule{% + \kern-3\p@ + \hrule\@width.4\columnwidth + \kern2.6\p@} +\@addtoreset{footnote}{chapter} +\newcommand\@makefntext[1]{% + \parindent 1em% + \noindent + \hb@xt@1.8em{\hss\@makefnmark}#1} +\newcommand\contentsname{Contents} +\newcommand\listfigurename{List of Figures} +\newcommand\listtablename{List of Tables} +\newcommand\bibname{Bibliography} +\newcommand\indexname{Index} +\newcommand\figurename{Figure} +\newcommand\tablename{Table} +\newcommand\partname{Part} +\newcommand\chaptername{Chapter} +\newcommand\appendixname{Appendix} +\def\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} +\setlength\columnsep{10\p@} +\setlength\columnseprule{0\p@} +\pagestyle{headings} +\pagenumbering{arabic} +\if@twoside +\else + \raggedbottom +\fi +\if@twocolumn + \twocolumn + \sloppy + \flushbottom +\else + \onecolumn +\fi +\endinput +%% +%% End of file `book.cls'. diff --git a/katabatic/doc/customHierarchy.html b/katabatic/doc/customHierarchy.html new file mode 100644 index 00000000..2b27d725 --- /dev/null +++ b/katabatic/doc/customHierarchy.html @@ -0,0 +1,110 @@ + + + + + + Katabatic Documentation + + +

Katabatic Documentation

+
+ + + + + + + + + +
SummaryNamespacesClass HierarchyClassesMember Index
+
+
+
+ +

Katabatic Synthetic Class Hierarchy

+
+ +

The complete class hierarchy could be accessed here.

+

All the classes below are in the Katabatic namespace.

+

The inheritance tree has been splitted/simplificated.

+ Legend :
+
+      
+        
+        
+      
ClassA  ClassA is abstract
ClassB  ClassB is instanciable
+
+
+ +

Katabatic Engine

+ + + + +
Katabatic
Session
DataAlgorithm
+ +

Contacts

+ + +
AutoContact
+ +

Segments

+ + +
AutoSegment
+ + + +
AutoSegmentDecorator
AutoSegmentConcrete
+ + + +
AutoHorizontal
AutoVertical
+ +

FCells

+ + +
FCell
+ + + +
FCellDecorator
FCellConcrete
+ + +
FCellGrid
+ + + +
FCellGridConcrete
+ + + +
FCellConfiguration
FCellConfiguration::UState
+ +

Miscellaneous Utilities

+ + + + + +
DebugSession
RPSortX
RPSortY
SplitterForkList
+ + +
+ + + + + +
Customized Class HierarchyReturn to top of page
+ + + + + +
Katabatic DocumentationCopyright © 2000-2007 Bull S.A. All rights reserved
+ + diff --git a/katabatic/doc/customSummary.html b/katabatic/doc/customSummary.html new file mode 100644 index 00000000..377b97ad --- /dev/null +++ b/katabatic/doc/customSummary.html @@ -0,0 +1,77 @@ + + + + + + Katabatic Documentation + + +

Katabatic Documentation

+
+ + + + + + + + + +
SummaryNamespacesClass HierarchyClassesMember Index
+
+
+
+ + + +

Katabatic Documentation Summary

+
+

The classical Doxygen module documentation could be accessed here.

+

Katabatic Concepts (internal)

+
    +
  1. Rules for building wires. +
    Rules for building AutoContacts. Global/Locals AutoSegments. +
  2. Global Routing Loading. +
    How the Knik global routing is loaded into Katabatic data-base. + Details the wiring topologies used to complete the routing to the + terminals. +
  3. AutoSegment Collapse & Canonical. +
    How to force alignment of AutoSegments. +
  4. Layer Assignment. +
    Simple strategy to put long wires on higher routing metals. +
  5. Constraints Computations. +
    Compute the legal range of variation of each wire (note that the + constraints are stored on AutoContacts). +
  6. AutoSegment Optimal Placement. +
    Compute the optimal range of variation of each wire. +
  7. Katabatic Update Session Mechanism. +
    The Session mechanism for modifying the Katabatic data-base. +
+

API documentations

+ +
+ + +
+ + + + + +
Customized Concepts (a.k.a. modules)Return to top of page
+ + + + + +
Katabatic DocumentationCopyright © 2005-2007 LIP6. All rights reserved
+ + diff --git a/katabatic/doc/doxyfile b/katabatic/doc/doxyfile new file mode 100644 index 00000000..bf987084 --- /dev/null +++ b/katabatic/doc/doxyfile @@ -0,0 +1,275 @@ +# Doxyfile 1.3.4 + +# -------------------------------------------------------------------- +# Project related configuration options + +PROJECT_NAME = "Katabatic - Routing Toolbox" +PROJECT_NUMBER = 1.0 +OUTPUT_DIRECTORY = . +OUTPUT_LANGUAGE = English +#USE_WINDOWS_ENCODING = NO +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = NO +FULL_PATH_NAMES = NO +STRIP_FROM_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +#DETAILS_AT_TOP = YES +INHERIT_DOCS = YES +DISTRIBUTE_GROUP_DOC = NO +TAB_SIZE = 2 +ALIASES = "function=\fn"\ + "important=\par Important:\n"\ + "remark=\par Remark:\n"\ + "True=\b True"\ + "true=\b true"\ + "False=\b False"\ + "false=\b false"\ + "VERTICAL=\b VERTICAL"\ + "HORIZONTAL=\b HORIZONTAL"\ + "NULL=\c NULL"\ + "vector=\c vector"\ + "Collection=\c Collection"\ + "Collections=\c Collections"\ + "Box=\c Box"\ + "box=\c box"\ + "Layer=\c Layer"\ + "Layers=\c Layers"\ + "Net=\c Net"\ + "Nets=\c Nets"\ + "Pin=\c Pin"\ + "Pins=\c Pins"\ + "Plug=\c Plug"\ + "Plugs=\c Plugs"\ + "RoutingPad=\c RoutingPad"\ + "RoutingPads=\c RoutingPads"\ + "Cell=\c Cell"\ + "Cells=\c Cells"\ + "ToolEngine=\c ToolEngine"\ + "ToolEngines=\c ToolEngines"\ + "GCell=\c GCell"\ + "GCells=\c GCells"\ + "Splitter=\c Splitter"\ + "Splitters=\c Splitters"\ + "SplitterContact=\c SplitterContact"\ + "SplitterContacts=\c SplitterContacts"\ + "Hurricane=Hurricane"\ + "STL=STL" +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = YES +SUBGROUPING = YES + +# -------------------------------------------------------------------- +# Build related configuration options + +EXTRACT_ALL = NO +EXTRACT_PRIVATE = YES +EXTRACT_STATIC = YES +EXTRACT_LOCAL_CLASSES = YES +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = YES +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +SHOW_INCLUDE_FILES = YES +INLINE_INFO = YES +SORT_MEMBER_DOCS = NO +GENERATE_TODOLIST = YES +GENERATE_TESTLIST = YES +GENERATE_BUGLIST = YES +GENERATE_DEPRECATEDLIST= YES +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 1 +SHOW_USED_FILES = YES + +# -------------------------------------------------------------------- +# Configuration options related to warning and progress messages + +QUIET = YES +WARNINGS = YES +WARN_IF_UNDOCUMENTED = NO +WARN_IF_DOC_ERROR = YES +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = + +# -------------------------------------------------------------------- +# Configuration options related to the input files + +INPUT = \ + ../src/katabatic/KatabaticEngine.h ../src/KatabaticEngine.cpp KatabaticEngine.dox \ + ../src/LoadGrByNet.cpp LoadGrByNet.dox \ + ../src/LayerAssign.cpp LayerAssign.dox \ + ../src/NetConstraints.cpp NetConstraints.dox \ + ../src/NetOptimals.cpp NetOptimals.dox \ + ../src/katabatic/AutoContact.h ../src/AutoContact.cpp AutoContact.dox \ + ../src/katabatic/AutoSegment.h ../src/AutoSegment.cpp AutoSegment.dox \ + ../src/katabatic/AutoHorizontal.h ../src/AutoHorizontal.cpp \ + ../src/katabatic/AutoVertical.h ../src/AutoVertical.cpp \ + ../src/katabatic/Grid.h ../src/Grid.cpp Grid.dox \ + ../src/katabatic/GCell.h ../src/GCell.cpp GCell.dox \ + ../src/katabatic/GCellGrid.h ../src/GCellGrid.cpp GCellGrid.dox \ + ../src/katabatic/Session.h ../src/Session.cpp Session.dox + +FILE_PATTERNS = *.h \ + *.cpp \ + *.dox + +RECURSIVE = YES + +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = images +INPUT_FILTER = +FILTER_SOURCE_FILES = YES + +# -------------------------------------------------------------------- +# Configuration options related to source browsing + +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = YES +REFERENCES_RELATION = YES +VERBATIM_HEADERS = YES + +# -------------------------------------------------------------------- +# Configuration options related to the alphabetical class index + +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 2 +IGNORE_PREFIX = + +# -------------------------------------------------------------------- +# Configuration options related to the HTML output + +GENERATE_HTML = YES +HTML_OUTPUT = html +HTML_FILE_EXTENSION = .html +HTML_HEADER = header.html +HTML_FOOTER = footer.html +HTML_STYLESHEET = ASIM.css +HTML_ALIGN_MEMBERS = YES +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +BINARY_TOC = NO +TOC_EXPAND = NO +DISABLE_INDEX = YES +ENUM_VALUES_PER_LINE = 1 +GENERATE_TREEVIEW = NO +TREEVIEW_WIDTH = 250 + +# -------------------------------------------------------------------- +# Configuration options related to the LaTeX output + +GENERATE_LATEX = YES +LATEX_OUTPUT = latex +LATEX_CMD_NAME = latex +MAKEINDEX_CMD_NAME = makeindex +COMPACT_LATEX = NO +PAPER_TYPE = a4wide +EXTRA_PACKAGES = +LATEX_HEADER = header.tex +PDF_HYPERLINKS = YES +USE_PDFLATEX = YES +LATEX_BATCHMODE = NO +LATEX_HIDE_INDICES = NO + +# -------------------------------------------------------------------- +# Configuration options related to the RTF output + +GENERATE_RTF = YES +RTF_OUTPUT = rtf +COMPACT_RTF = NO +RTF_HYPERLINKS = NO +RTF_STYLESHEET_FILE = +RTF_EXTENSIONS_FILE = + +# -------------------------------------------------------------------- +# Configuration options related to the man page output + +GENERATE_MAN = YES +MAN_OUTPUT = man +MAN_EXTENSION = .3 +MAN_LINKS = NO + +# -------------------------------------------------------------------- +# Configuration options related to the XML output + +GENERATE_XML = NO +XML_OUTPUT = xml +XML_SCHEMA = +XML_DTD = + +# -------------------------------------------------------------------- +# Configuration options for the AutoGen Definitions output + +GENERATE_AUTOGEN_DEF = NO + +# -------------------------------------------------------------------- +# Configuration options related to the Perl module output + +GENERATE_PERLMOD = NO +PERLMOD_LATEX = NO +PERLMOD_PRETTY = YES +PERLMOD_MAKEVAR_PREFIX = + +# -------------------------------------------------------------------- +# Configuration options related to the preprocessor + +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = NO +EXPAND_ONLY_PREDEF = NO +SEARCH_INCLUDES = YES +INCLUDE_PATH = +INCLUDE_FILE_PATTERNS = +PREDEFINED = __DOXYGEN__ +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES + +# -------------------------------------------------------------------- +# Configuration::addtions related to external references + +TAGFILES = ../../../../hurricane/doc/hurricane/html/hurricane.tag=../hurricane +GENERATE_TAGFILE = html/katabatic.tag +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +PERL_PATH = /usr/bin/perl + +# -------------------------------------------------------------------- +# Configuration options related to the dot tool + +CLASS_DIAGRAMS = NO +HIDE_UNDOC_RELATIONS = YES +HAVE_DOT = YES +CLASS_GRAPH = YES +COLLABORATION_GRAPH = NO +UML_LOOK = NO +TEMPLATE_RELATIONS = NO +INCLUDE_GRAPH = YES +INCLUDED_BY_GRAPH = YES +CALL_GRAPH = NO +GRAPHICAL_HIERARCHY = NO +DOT_IMAGE_FORMAT = png +DOT_PATH = +DOTFILE_DIRS = +#MAX_DOT_GRAPH_WIDTH = 512 +#MAX_DOT_GRAPH_HEIGHT = 1024 +#MAX_DOT_GRAPH_DEPTH = 0 +GENERATE_LEGEND = YES +DOT_CLEANUP = YES + +# -------------------------------------------------------------------- +# Configuration::addtions related to the search engine + +SEARCHENGINE = NO diff --git a/katabatic/doc/footer.html b/katabatic/doc/footer.html new file mode 100644 index 00000000..3bbb05ce --- /dev/null +++ b/katabatic/doc/footer.html @@ -0,0 +1,16 @@ +
+
+ + + + + +
Generated by doxygen $doxygenversion on $dateReturn to top of page
+ + + + + +
Katabatic - Routing ToolboxCopyright © 2008-2009 LIP6. All rights reserved
+ + diff --git a/katabatic/doc/header.html b/katabatic/doc/header.html new file mode 100644 index 00000000..3d287482 --- /dev/null +++ b/katabatic/doc/header.html @@ -0,0 +1,22 @@ + + + + Katabatic - Routing Toolbox: Routing Toolbox Documentation + + +

Katabatic - Routing Toolbox

+
+ + + + + + + + + +
SummaryNamespacesClass HierarchyClassesMember Index
+
+
+
+ diff --git a/katabatic/doc/header.tex b/katabatic/doc/header.tex new file mode 100644 index 00000000..ec779312 --- /dev/null +++ b/katabatic/doc/header.tex @@ -0,0 +1,47 @@ + + + \documentclass[a4paper]{asimbook} + + \usepackage{a4wide} + \usepackage{makeidx} + \usepackage{fancyhdr} + \usepackage{graphicx} + \usepackage{multicol} + \usepackage{float} + \usepackage{textcomp} + \usepackage{alltt} + \usepackage{times} + \ifx\pdfoutput\undefined + \usepackage[ps2pdf,pagebackref=true,colorlinks=true,linkcolor=blue]{hyperref} + \usepackage{pspicture} + \else + \usepackage[pdftex,pagebackref=true,colorlinks=true,linkcolor=blue]{hyperref} + \fi + \usepackage{doxygen} + + \makeindex + \setcounter{tocdepth}{1} + \renewcommand{\footrulewidth}{0.4pt} + \raggedbottom + + + \begin{document} + + \begin{titlepage} + \vspace*{7cm} + \begin{center} + {\Large $projectname Reference Manual\\[1ex]\large $projectnumber }\\ + \vspace*{1cm} + {\large Generated by Doxygen $doxygenversion}\\ + \vspace*{0.5cm} + {\small $datetime}\\ + \end{center} + \end{titlepage} + + \clearemptydoublepage + \pagenumbering{roman} + + \tableofcontents + \clearemptydoublepage + + \pagenumbering{arabic} diff --git a/katabatic/doc/html.entry b/katabatic/doc/html.entry new file mode 100644 index 00000000..08e4fdf5 --- /dev/null +++ b/katabatic/doc/html.entry @@ -0,0 +1 @@ +
  • Katabatic
    Routing Database

    diff --git a/katabatic/doc/images/AutoContact-1.fig b/katabatic/doc/images/AutoContact-1.fig new file mode 100644 index 00000000..47adcccb --- /dev/null +++ b/katabatic/doc/images/AutoContact-1.fig @@ -0,0 +1,107 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +6 11025 2325 13275 2925 +2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 11100 2400 13200 2400 13200 2850 11100 2850 11100 2400 +4 1 0 50 -1 18 16 0.0000 4 240 1635 12150 2700 AutoSegment\001 +-6 +6 11025 5925 13275 6525 +2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 11100 6000 13200 6000 13200 6450 11100 6450 11100 6000 +4 1 0 50 -1 18 16 0.0000 4 180 1500 12150 6300 AutoContact\001 +-6 +6 11025 7425 13275 8025 +2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 11100 7500 13200 7500 13200 7950 11100 7950 11100 7500 +4 1 0 50 -1 18 16 0.0000 4 240 1635 12150 7800 AutoSegment\001 +-6 +2 1 0 2 0 7 50 -1 15 0.000 0 0 -1 0 0 4 + 5700 0 5700 3300 6000 3300 6000 0 +2 1 0 2 0 7 50 -1 15 0.000 0 0 -1 0 0 4 + 12300 3900 9000 3900 9000 4200 12300 4200 +2 2 3 2 0 7 60 -1 -1 15.000 0 0 -1 0 0 5 + 2100 2100 10200 2100 10200 9600 2100 9600 2100 2100 +2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 + 8100 7200 8400 7200 8400 9000 8100 9000 8100 7200 +2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7950 7950 8550 7950 8550 8550 7950 8550 7950 7950 +2 2 0 2 0 7 45 -1 15 6.000 0 0 -1 0 0 5 + 6900 8100 8400 8100 8400 8400 6900 8400 6900 8100 +2 2 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7350 6150 7950 6150 7950 6750 7350 6750 7350 6150 +2 1 0 4 20 7 50 -1 -1 10.000 0 0 -1 0 0 3 + 5850 3450 5850 8250 6750 8250 +2 1 0 4 20 7 50 -1 -1 10.000 0 0 -1 0 0 2 + 3450 6450 5850 6450 +2 1 0 4 20 7 50 -1 -1 10.000 0 0 -1 0 0 2 + 8850 4050 5850 4050 +2 2 0 4 20 7 50 -1 -1 10.000 0 0 -1 0 0 5 + 5700 6300 6000 6300 6000 6600 5700 6600 5700 6300 +2 2 0 4 20 7 50 -1 -1 10.000 0 0 -1 0 0 5 + 5700 3900 6000 3900 6000 4200 5700 4200 5700 3900 +2 1 0 4 4 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 7500 6450 7800 6450 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5850 2850 5850 3150 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 9150 4050 9450 4050 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 7050 8250 7350 8250 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2850 6450 3150 6450 +2 1 0 2 0 7 50 -1 15 0.000 0 0 -1 0 0 4 + 0 6300 3300 6300 3300 6600 0 6600 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 1 0 4 + 1 1 2.00 120.00 240.00 + 11400 2850 11400 3300 9450 3300 9450 3975 +2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 240.00 + 12600 2850 12600 6000 +2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 3 + 1 1 2.00 120.00 240.00 + 12900 2850 12900 3300 13725 3300 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 1 0 3 + 1 1 2.00 120.00 240.00 + 11100 7725 7350 7725 7350 8250 +2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 240.00 + 12600 7500 12600 6450 +2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 3 + 1 1 2.00 120.00 240.00 + 12900 7950 12900 8400 13800 8400 +2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 240.00 + 11100 6300 7950 6300 +3 0 0 2 4 7 40 -1 -1 6.000 0 1 0 4 + 3 0 2.00 120.00 240.00 + 7650 6450 7650 6900 7200 7500 7200 8250 + 0.000 1.000 1.000 0.000 +3 0 0 2 4 7 40 -1 -1 6.000 0 1 0 6 + 3 0 2.00 120.00 240.00 + 7200 8325 7200 8700 6900 9000 4800 9000 3000 7200 3000 6450 + 0.000 1.000 1.000 1.000 1.000 0.000 +3 0 0 2 4 7 40 -1 -1 6.000 0 1 0 4 + 3 0 2.00 120.00 240.00 + 3000 6450 3000 5100 5100 3000 5850 3000 + 0.000 1.000 1.000 0.000 +3 0 0 2 4 7 40 -1 -1 6.000 0 1 0 4 + 3 0 2.00 120.00 240.00 + 5850 3000 8700 3000 9300 3600 9300 4050 + 0.000 1.000 1.000 0.000 +3 0 0 2 4 7 40 -1 -1 0.000 0 1 0 4 + 3 1 2.00 120.00 240.00 + 9300 4050 9300 4800 7650 5700 7650 6450 + 0.000 1.000 1.000 0.000 +4 1 0 50 -1 18 16 1.5708 4 180 360 12525 5100 AC\001 +4 1 0 50 -1 18 16 1.5708 4 180 360 12525 7050 AC\001 +4 1 0 50 -1 18 16 0.0000 4 180 165 11550 3300 S\001 +4 1 0 50 -1 18 16 0.0000 4 180 150 13050 3150 T\001 +4 1 0 50 -1 18 16 0.0000 4 180 165 10950 8025 S\001 +4 1 0 50 -1 18 16 0.0000 4 180 150 13050 8250 T\001 diff --git a/katabatic/doc/images/AutoContact-1.pdf b/katabatic/doc/images/AutoContact-1.pdf new file mode 100644 index 00000000..f6942d4a Binary files /dev/null and b/katabatic/doc/images/AutoContact-1.pdf differ diff --git a/katabatic/doc/images/AutoContact-1.png b/katabatic/doc/images/AutoContact-1.png new file mode 100644 index 00000000..8afe5fe9 Binary files /dev/null and b/katabatic/doc/images/AutoContact-1.png differ diff --git a/katabatic/doc/images/AutoContact-10.fig b/katabatic/doc/images/AutoContact-10.fig new file mode 100644 index 00000000..5c4f4236 --- /dev/null +++ b/katabatic/doc/images/AutoContact-10.fig @@ -0,0 +1,72 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +70.00 +Single +-2 +1200 2 +6 825 1125 6000 6300 +6 825 1125 3075 1575 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 900 1200 3000 1200 3000 1500 900 1500 900 1200 +4 0 0 50 -1 14 12 0.0000 4 135 1890 975 1425 HExtended - case 1\001 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 1875 2550 1875 2550 2100 1800 2100 1800 1875 +2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2625 3450 4725 3450 4725 3750 2625 3750 2625 3450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 2100 5400 2100 5400 5400 1800 5400 1800 2100 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 900 1200 6000 1200 6000 6300 900 6300 900 1200 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2625 3600 1575 3600 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2700 2700 2700 3450 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 3300 3750 3300 5700 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 4500 3750 4500 4500 +4 1 0 50 -1 14 12 0.0000 4 135 525 2175 2025 GCell\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 2850 2925 L\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 1650 3900 G\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 4650 4500 L\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 3450 5625 G\001 +-6 +1 2 0 2 4 7 50 -1 -1 0.000 1 0.0000 9450 3600 150 300 9300 3300 9600 3900 +1 4 0 2 4 7 50 -1 -1 0.000 1 0.0000 8550 3600 150 150 8400 3600 8700 3600 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 8100 1875 8850 1875 8850 2100 8100 2100 8100 1875 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 8100 2100 11700 2100 11700 5400 8100 5400 8100 2100 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7200 1200 12300 1200 12300 6300 7200 6300 7200 1200 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 8850 3600 7800 3600 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 9000 2700 9000 3450 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7200 1200 9300 1200 9300 1500 7200 1500 7200 1200 +2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 8850 3450 9150 3450 9150 3750 8850 3750 8850 3450 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9150 3525 9900 3525 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9150 3675 12000 3675 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 8925 3600 9075 3600 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 2.00 120.00 240.00 + 8550 3750 8700 4500 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 2.00 120.00 240.00 + 9450 3900 9300 4500 +4 1 0 50 -1 14 12 0.0000 4 135 525 8475 2025 GCell\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 9150 2925 L\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 7950 3900 G\001 +4 0 0 50 -1 14 12 0.0000 4 135 1890 7275 1425 HExtended - case 2\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 11925 3975 G\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 9750 3450 L\001 +4 1 4 50 -1 18 12 0.0000 4 180 1170 9000 4650 kept aligneds\001 diff --git a/katabatic/doc/images/AutoContact-10.pdf b/katabatic/doc/images/AutoContact-10.pdf new file mode 100644 index 00000000..c61281fe Binary files /dev/null and b/katabatic/doc/images/AutoContact-10.pdf differ diff --git a/katabatic/doc/images/AutoContact-10.png b/katabatic/doc/images/AutoContact-10.png new file mode 100644 index 00000000..a5ddfa35 Binary files /dev/null and b/katabatic/doc/images/AutoContact-10.png differ diff --git a/katabatic/doc/images/AutoContact-11.fig b/katabatic/doc/images/AutoContact-11.fig new file mode 100644 index 00000000..7baf87c6 --- /dev/null +++ b/katabatic/doc/images/AutoContact-11.fig @@ -0,0 +1,68 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +70.00 +Single +-2 +1200 2 +1 2 0 2 4 7 50 -1 -1 0.000 1 0.0000 10200 3150 300 150 9900 3000 10500 3300 +1 4 0 2 4 7 50 -1 -1 0.000 1 0.0000 10200 4050 150 150 10050 4050 10350 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 8100 1875 8850 1875 8850 2100 8100 2100 8100 1875 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 8100 2100 11700 2100 11700 5400 8100 5400 8100 2100 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7200 1200 12300 1200 12300 6300 7200 6300 7200 1200 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7200 1200 9300 1200 9300 1500 7200 1500 7200 1200 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 1875 2550 1875 2550 2100 1800 2100 1800 1875 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 2100 5400 2100 5400 5400 1800 5400 1800 2100 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 900 1200 6000 1200 6000 6300 900 6300 900 1200 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 900 1200 3000 1200 3000 1500 900 1500 900 1200 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 3750 3600 1500 3600 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 3900 4650 3900 5700 +2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 3750 2850 4050 2850 4050 4650 3750 4650 3750 2850 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 3750 3000 3000 3000 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 4800 4500 4050 4500 +2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 10050 3450 10350 3450 10350 3750 10050 3750 10050 3450 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 10200 5700 10200 3750 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 10275 1800 10275 3450 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 10125 3450 10125 2700 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 10350 3600 11100 3600 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 10200 3675 10200 3525 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 2.00 120.00 240.00 + 9900 3150 8850 3375 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 2.00 120.00 240.00 + 10050 4050 8850 3750 +4 1 0 50 -1 14 12 0.0000 4 135 525 8475 2025 GCell\001 +4 0 0 50 -1 14 12 0.0000 4 135 1890 7275 1425 VExtended - case 2\001 +4 1 0 50 -1 14 12 0.0000 4 135 525 2175 2025 GCell\001 +4 0 0 50 -1 14 12 0.0000 4 135 1890 975 1425 VExtended - case 1\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 4050 5625 G\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 4725 4425 L\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 3075 2925 L\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 1650 3900 G\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 11025 3900 L\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 9975 2925 L\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 10425 2025 G\001 +4 1 4 50 -1 18 12 0.0000 4 180 1170 8775 3600 kept aligneds\001 +4 1 0 50 -1 14 18 0.0000 4 165 165 10350 5700 G\001 diff --git a/katabatic/doc/images/AutoContact-11.pdf b/katabatic/doc/images/AutoContact-11.pdf new file mode 100644 index 00000000..f09c9dc6 Binary files /dev/null and b/katabatic/doc/images/AutoContact-11.pdf differ diff --git a/katabatic/doc/images/AutoContact-11.png b/katabatic/doc/images/AutoContact-11.png new file mode 100644 index 00000000..e9459463 Binary files /dev/null and b/katabatic/doc/images/AutoContact-11.png differ diff --git a/katabatic/doc/images/AutoContact-12.fig b/katabatic/doc/images/AutoContact-12.fig new file mode 100644 index 00000000..dffaf863 --- /dev/null +++ b/katabatic/doc/images/AutoContact-12.fig @@ -0,0 +1,91 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +70.00 +Single +-2 +1200 2 +6 6600 1875 10200 5400 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6600 1875 7350 1875 7350 2100 6600 2100 6600 1875 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6600 2100 10200 2100 10200 5400 6600 5400 6600 2100 +4 1 0 50 -1 14 12 0.0000 4 135 525 6975 2025 GCell\001 +-6 +1 4 0 2 4 7 45 -1 -1 0.000 1 0.0000 3300 4200 150 150 3150 4200 3450 4200 +1 4 0 2 4 7 45 -1 -1 0.000 1 0.0000 4500 4050 150 150 4350 4050 4650 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 1875 2550 1875 2550 2100 1800 2100 1800 1875 +2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2625 3450 4725 3450 4725 3750 2625 3750 2625 3450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 2100 5400 2100 5400 5400 1800 5400 1800 2100 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2625 3600 1500 3600 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2700 2700 2700 3450 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 4500 3750 4500 4500 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 900 1200 11100 1200 11100 6225 900 6225 900 1200 +2 1 0 2 4 7 45 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 2.00 120.00 240.00 + 3375 4350 3900 4800 +2 1 0 2 4 7 45 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 2.00 120.00 240.00 + 4425 4125 3975 4800 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 7350 3600 6300 3600 +2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7350 3450 8250 3450 8250 3750 7350 3750 7350 3450 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 3300 3750 3300 5700 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 7500 2700 7500 3450 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 900 1200 3900 1200 3900 1500 900 1500 900 1200 +2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 + 7950 4050 8250 4050 8250 4350 7950 4350 7950 4050 +2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 + 8100 3750 8100 4050 +2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 + 8250 4200 8550 4200 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 8700 4350 8700 5700 +2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 + 8550 4050 8850 4050 8850 4350 8550 4350 8550 4050 +2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 + 9750 4050 10050 4050 10050 4350 9750 4350 9750 4050 +2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 + 8850 4200 9750 4200 +2 4 0 1 4 7 45 -1 -1 0.000 0 0 7 0 0 5 + 10125 4425 10125 3975 8475 3975 8475 4425 10125 4425 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 9900 3300 9900 4050 +2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 + 8625 4200 8775 4200 +3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 + 3 0 1.00 60.00 120.00 + 3 0 1.00 60.00 120.00 + 6900 3600 6900 3450 7200 3150 8100 3150 8400 3450 8400 4200 + 0.000 1.000 1.000 1.000 1.000 0.000 +3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 + 3 0 1.00 60.00 120.00 + 3 0 1.00 60.00 120.00 + 8100 3900 7800 3900 7500 4200 7500 4500 7800 4800 8700 4800 + 0.000 1.000 1.000 1.000 1.000 0.000 +4 1 0 50 -1 14 12 0.0000 4 135 525 2175 2025 GCell\001 +4 0 0 50 -1 14 12 0.0000 4 180 2520 975 1425 Split HExtended - case 1\001 +4 1 4 45 -1 18 12 0.0000 4 135 840 3900 4950 M3 -> M5\001 +4 0 0 50 -1 14 14 0.0000 4 150 540 1500 3825 G.M2\001 +4 0 0 50 -1 14 14 0.0000 4 150 540 2775 2850 L.M3\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 4575 4500 L.M3\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 3375 5700 G.M3\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 6300 3825 G.M2\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 6975 2850 L.M3\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 8775 5700 G.M5\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 9975 3450 L.M5\001 +4 1 4 45 -1 18 12 0.0000 4 135 120 7425 4425 Y\001 +4 1 4 45 -1 18 12 0.0000 4 135 120 7800 3150 X\001 diff --git a/katabatic/doc/images/AutoContact-12.pdf b/katabatic/doc/images/AutoContact-12.pdf new file mode 100644 index 00000000..c17a6e86 Binary files /dev/null and b/katabatic/doc/images/AutoContact-12.pdf differ diff --git a/katabatic/doc/images/AutoContact-12.png b/katabatic/doc/images/AutoContact-12.png new file mode 100644 index 00000000..48ee39e0 Binary files /dev/null and b/katabatic/doc/images/AutoContact-12.png differ diff --git a/katabatic/doc/images/AutoContact-13.fig b/katabatic/doc/images/AutoContact-13.fig new file mode 100644 index 00000000..1696be33 --- /dev/null +++ b/katabatic/doc/images/AutoContact-13.fig @@ -0,0 +1,104 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +70.00 +Single +-2 +1200 2 +6 6600 1875 10200 5400 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6600 1875 7350 1875 7350 2100 6600 2100 6600 1875 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6600 2100 10200 2100 10200 5400 6600 5400 6600 2100 +4 1 0 50 -1 14 12 0.0000 4 135 525 6975 2025 GCell\001 +-6 +1 4 0 2 4 7 45 -1 -1 0.000 1 0.0000 2250 3600 150 150 2100 3600 2400 3600 +1 4 0 2 4 7 45 -1 -1 0.000 1 0.0000 3600 3150 150 150 3750 3150 3450 3150 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 1875 2550 1875 2550 2100 1800 2100 1800 1875 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 2100 5400 2100 5400 5400 1800 5400 1800 2100 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2625 3600 1575 3600 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 900 1200 11100 1200 11100 6225 900 6225 900 1200 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 7350 3600 6300 3600 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 3300 3750 3300 5700 +2 1 0 2 4 7 45 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 2.00 120.00 240.00 + 2250 3750 2250 4200 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2700 3750 2700 4500 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 900 1200 3900 1200 3900 1500 900 1500 900 1200 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 3600 2700 3600 3450 +2 1 0 2 4 7 45 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 2.00 120.00 240.00 + 3450 3075 2925 2475 +2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2625 3450 3750 3450 3750 3750 2625 3750 2625 3450 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 8400 2700 8400 3450 +2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 + 7350 3450 8550 3450 8550 3750 7350 3750 7350 3450 +2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 + 8850 3450 9150 3450 9150 3750 8850 3750 8850 3450 +2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 + 9000 3750 9000 4050 +2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 + 8550 3600 8850 3600 +2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 + 8550 4200 8850 4200 +2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 8850 4050 9150 4050 9150 4350 8850 4350 8850 4050 +2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 + 8250 4050 8550 4050 8550 4350 8250 4350 8250 4050 +2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 + 7425 3600 8475 3600 +2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 + 7650 4050 7950 4050 7950 4350 7650 4350 7650 4050 +2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 + 7950 4200 8250 4200 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 7800 4350 7800 5100 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 8400 4350 8400 5700 +2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 + 8325 4200 8475 4200 +2 4 0 1 4 7 45 -1 -1 0.000 0 0 7 0 0 5 + 9225 4425 9225 3975 7575 3975 7575 4425 9225 4425 +3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 + 3 0 1.00 60.00 120.00 + 3 0 1.00 60.00 120.00 + 6900 3600 6900 3300 7200 3000 8550 3000 8700 3300 8700 3600 + 0.000 1.000 1.000 1.000 1.000 0.000 +3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 + 3 0 1.00 60.00 120.00 + 3 0 1.00 60.00 120.00 + 8400 4800 9300 4800 9600 4500 9600 4050 9300 3900 9000 3900 + 0.000 1.000 1.000 1.000 1.000 0.000 +3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 + 3 0 1.00 60.00 120.00 + 3 0 1.00 60.00 120.00 + 6900 3600 6900 4500 7200 4800 7950 4800 8100 4500 8100 4200 + 0.000 1.000 1.000 1.000 1.000 0.000 +4 1 0 50 -1 14 12 0.0000 4 135 525 2175 2025 GCell\001 +4 1 4 45 -1 18 12 0.0000 4 135 840 2250 4350 M2 -> M4\001 +4 0 0 50 -1 14 12 0.0000 4 180 2520 975 1425 Split HExtended - case 2\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 1575 3825 G.M2\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 2775 4500 L.M3\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 3375 5700 G.M3\001 +4 1 4 45 -1 18 12 0.0000 4 135 840 2925 2475 M3 -> M5\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 3675 2850 L.M3\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 6300 3825 G.M4\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 8475 2850 L.M5\001 +4 1 4 45 -1 18 12 0.0000 4 135 120 7800 2925 Y\001 +4 1 4 45 -1 18 12 0.0000 4 135 120 9675 4350 X\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 8475 5700 G.M3\001 +4 2 0 45 -1 14 14 0.0000 4 150 540 7725 5100 L.M3\001 +4 1 4 45 -1 18 12 0.0000 4 135 120 7125 4500 Y\001 diff --git a/katabatic/doc/images/AutoContact-13.pdf b/katabatic/doc/images/AutoContact-13.pdf new file mode 100644 index 00000000..97d787a8 Binary files /dev/null and b/katabatic/doc/images/AutoContact-13.pdf differ diff --git a/katabatic/doc/images/AutoContact-13.png b/katabatic/doc/images/AutoContact-13.png new file mode 100644 index 00000000..32588bcf Binary files /dev/null and b/katabatic/doc/images/AutoContact-13.png differ diff --git a/katabatic/doc/images/AutoContact-14.fig b/katabatic/doc/images/AutoContact-14.fig new file mode 100644 index 00000000..2d69f744 --- /dev/null +++ b/katabatic/doc/images/AutoContact-14.fig @@ -0,0 +1,79 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +70.00 +Single +-2 +1200 2 +6 6600 1875 10200 5400 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6600 1875 7350 1875 7350 2100 6600 2100 6600 1875 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6600 2100 10200 2100 10200 5400 6600 5400 6600 2100 +4 1 0 50 -1 14 12 0.0000 4 135 525 6975 2025 GCell\001 +-6 +1 4 0 2 4 7 45 -1 -1 0.000 1 0.0000 4500 4050 150 150 4350 4050 4650 4050 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 1875 2550 1875 2550 2100 1800 2100 1800 1875 +2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2625 3450 4725 3450 4725 3750 2625 3750 2625 3450 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 2100 5400 2100 5400 5400 1800 5400 1800 2100 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2625 3600 1500 3600 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2700 2700 2700 3450 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 4500 3750 4500 4500 +2 1 0 2 4 7 45 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 2.00 120.00 240.00 + 4425 4125 3900 4800 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 7350 3600 6300 3600 +2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7350 3450 8250 3450 8250 3750 7350 3750 7350 3450 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 8100 3750 8100 5700 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 3300 3750 3300 5700 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 7500 2700 7500 3450 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 900 1200 3900 1200 3900 1500 900 1500 900 1200 +2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 + 7950 2850 8250 2850 8250 3150 7950 3150 7950 2850 +2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 + 8100 3150 8100 3450 +2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 + 8250 3000 9150 3000 +2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 + 9150 2850 9450 2850 9450 3150 9150 3150 9150 2850 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 9300 3150 9300 4200 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 900 1200 11100 1200 11100 6300 900 6300 900 1200 +3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 + 3 0 1.00 60.00 120.00 + 3 0 1.00 60.00 120.00 + 7800 3450 7800 2700 8100 2400 8400 2400 8700 2700 8700 3000 + 0.000 1.000 1.000 1.000 1.000 0.000 +3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 2 + 3 0 1.00 60.00 120.00 + 3 0 1.00 60.00 120.00 + 8100 3300 9300 3300 + 0.000 0.000 +4 1 0 50 -1 14 12 0.0000 4 135 525 2175 2025 GCell\001 +4 0 0 50 -1 14 12 0.0000 4 180 2520 975 1425 Split HExtended - case 3\001 +4 1 4 45 -1 18 12 0.0000 4 135 840 3900 4950 M3 -> M5\001 +4 1 4 45 -1 18 12 0.0000 4 135 120 8250 2325 Y\001 +4 1 4 45 -1 18 12 0.0000 4 135 120 8700 3525 X\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 2775 2850 L.M3\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 1500 3825 G.M2\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 4575 4500 L.M3\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 3375 5700 G.M3\001 +4 2 0 45 -1 14 14 0.0000 4 150 540 7425 2850 L.M3\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 6300 3825 G.M2\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 9375 4200 L.M5\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 8175 5700 G.M3\001 diff --git a/katabatic/doc/images/AutoContact-14.pdf b/katabatic/doc/images/AutoContact-14.pdf new file mode 100644 index 00000000..f5432713 Binary files /dev/null and b/katabatic/doc/images/AutoContact-14.pdf differ diff --git a/katabatic/doc/images/AutoContact-14.png b/katabatic/doc/images/AutoContact-14.png new file mode 100644 index 00000000..2380936c Binary files /dev/null and b/katabatic/doc/images/AutoContact-14.png differ diff --git a/katabatic/doc/images/AutoContact-15.fig b/katabatic/doc/images/AutoContact-15.fig new file mode 100644 index 00000000..ea1af2ec --- /dev/null +++ b/katabatic/doc/images/AutoContact-15.fig @@ -0,0 +1,73 @@ +#FIG 3.2 +Landscape +Center +Inches +Letter +70.00 +Single +-2 +1200 2 +6 6600 1875 10200 5400 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6600 1875 7350 1875 7350 2100 6600 2100 6600 1875 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6600 2100 10200 2100 10200 5400 6600 5400 6600 2100 +4 1 0 50 -1 14 12 0.0000 4 135 525 6975 2025 GCell\001 +-6 +1 4 0 2 4 7 45 -1 -1 0.000 1 0.0000 4050 3675 150 150 3900 3675 4200 3675 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 1875 2550 1875 2550 2100 1800 2100 1800 1875 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1800 2100 5400 2100 5400 5400 1800 5400 1800 2100 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2550 3600 1500 3600 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2700 2700 2700 3450 +2 1 0 2 4 7 45 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 2.00 120.00 240.00 + 4050 3825 4050 4200 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 7350 3600 6300 3600 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 7500 2700 7500 3450 +2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 900 1200 3900 1200 3900 1500 900 1500 900 1200 +2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 2550 3450 2850 3450 2850 3750 2550 3750 2550 3450 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2850 3675 5700 3675 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2850 3525 3600 3525 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2625 3600 2775 3600 +2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 7350 3450 7650 3450 7650 3750 7350 3750 7350 3450 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 7650 3525 8400 3525 +2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 + 7500 3750 7500 4050 +2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 + 7350 4050 7650 4050 7650 4350 7350 4350 7350 4050 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 7650 4200 10500 4200 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 7425 3600 7575 3600 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 900 1200 11100 1200 11100 6300 900 6300 900 1200 +3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 + 3 0 1.00 60.00 120.00 + 3 0 1.00 60.00 120.00 + 7500 3150 7200 3150 6900 3450 6900 3750 7200 3900 7500 3900 + 0.000 1.000 1.000 1.000 1.000 0.000 +4 1 0 50 -1 14 12 0.0000 4 135 525 2175 2025 GCell\001 +4 0 0 50 -1 14 12 0.0000 4 180 2520 975 1425 Split HExtended - case 4\001 +4 1 4 45 -1 18 12 0.0000 4 135 840 4050 4350 M2 -> M4\001 +4 1 4 45 -1 18 12 0.0000 4 135 120 6900 3450 X\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 2775 2850 L.M3\001 +4 2 0 45 -1 14 14 0.0000 4 150 540 3600 3450 L.M2\001 +4 2 0 45 -1 14 14 0.0000 4 150 540 5700 3900 G.M2\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 6300 3825 G.M2\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 1500 3825 G.M2\001 +4 2 0 45 -1 14 14 0.0000 4 150 540 8400 3450 L.M2\001 +4 0 0 45 -1 14 14 0.0000 4 150 540 7575 2850 L.M3\001 +4 2 0 45 -1 14 14 0.0000 4 150 540 10500 4425 G.M4\001 diff --git a/katabatic/doc/images/AutoContact-15.pdf b/katabatic/doc/images/AutoContact-15.pdf new file mode 100644 index 00000000..6a2c03dc Binary files /dev/null and b/katabatic/doc/images/AutoContact-15.pdf differ diff --git a/katabatic/doc/images/AutoContact-15.png b/katabatic/doc/images/AutoContact-15.png new file mode 100644 index 00000000..95e3a160 Binary files /dev/null and b/katabatic/doc/images/AutoContact-15.png differ diff --git a/katabatic/doc/images/AutoContact-2.fig b/katabatic/doc/images/AutoContact-2.fig new file mode 100644 index 00000000..f345f9fd --- /dev/null +++ b/katabatic/doc/images/AutoContact-2.fig @@ -0,0 +1,43 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 0 0 5625 2475 +2 2 0 1 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 765 945 4635 945 4635 1260 765 1260 765 945 +2 1 0 4 0 7 45 -1 45 0.000 0 0 -1 0 0 2 + 900 990 900 1215 +2 1 0 4 0 7 45 -1 45 0.000 0 0 -1 0 0 2 + 4500 990 4500 1215 +2 1 3 1 0 7 45 -1 45 8.000 0 0 -1 0 0 2 + 900 1350 900 2070 +2 1 3 1 0 7 45 -1 45 8.000 0 0 -1 0 0 2 + 4500 1350 4500 2070 +2 1 3 1 0 7 45 -1 45 8.000 0 0 -1 0 0 2 + 4725 1125 5220 1125 +2 1 0 1 0 7 45 -1 45 4.000 0 0 -1 1 1 2 + 3 0 1.00 60.00 120.00 + 3 0 1.00 60.00 120.00 + 450 2025 1350 2025 +2 1 0 1 0 7 45 -1 45 4.000 0 0 -1 1 1 2 + 3 0 1.00 60.00 120.00 + 3 0 1.00 60.00 120.00 + 4050 2025 4950 2025 +2 1 0 1 0 7 45 -1 45 4.000 0 0 -1 1 1 2 + 3 0 1.00 60.00 120.00 + 3 0 1.00 60.00 120.00 + 5175 675 5175 1575 +2 2 0 1 0 7 55 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5625 0 5625 2475 0 2475 0 0 +2 1 0 1 0 7 55 -1 -1 0.000 0 0 -1 0 0 3 + 0 315 2025 315 2025 0 +4 1 0 45 -1 14 12 0.0000 4 120 1155 4500 2250 AutoContact\001 +4 1 0 45 -1 14 12 0.0000 4 120 1155 900 2250 AutoContact\001 +4 1 0 45 -1 14 12 1.5708 4 120 630 5400 1125 Router\001 +4 0 0 55 -1 18 12 0.0000 4 180 1740 90 225 Horizontal Segment\001 +-6 diff --git a/katabatic/doc/images/AutoContact-2.pdf b/katabatic/doc/images/AutoContact-2.pdf new file mode 100644 index 00000000..3c212c75 Binary files /dev/null and b/katabatic/doc/images/AutoContact-2.pdf differ diff --git a/katabatic/doc/images/AutoContact-2.png b/katabatic/doc/images/AutoContact-2.png new file mode 100644 index 00000000..834443dc Binary files /dev/null and b/katabatic/doc/images/AutoContact-2.png differ diff --git a/katabatic/doc/images/AutoContact-3.fig b/katabatic/doc/images/AutoContact-3.fig new file mode 100644 index 00000000..7af9a7a1 --- /dev/null +++ b/katabatic/doc/images/AutoContact-3.fig @@ -0,0 +1,54 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 0 0 5400 3150 +6 765 1620 4635 1980 +2 2 0 1 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 765 1620 4635 1620 4635 1980 765 1980 765 1620 +2 1 0 4 0 7 45 -1 45 0.000 0 0 -1 0 0 2 + 900 1671 900 1929 +2 1 0 4 0 7 45 -1 45 0.000 0 0 -1 0 0 2 + 4500 1671 4500 1929 +-6 +6 4320 1665 4680 2835 +2 2 0 1 12 7 60 -1 45 0.000 0 0 -1 0 0 5 + 4320 2835 4680 2835 4680 1665 4320 1665 4320 2835 +2 1 0 4 12 7 45 -1 45 0.000 0 0 -1 0 0 2 + 4371 1800 4629 1800 +2 1 0 4 12 7 45 -1 45 0.000 0 0 -1 0 0 2 + 4371 2700 4629 2700 +-6 +6 3420 765 3780 1935 +2 2 0 1 12 7 60 -1 45 0.000 0 0 -1 0 0 5 + 3420 1935 3780 1935 3780 765 3420 765 3420 1935 +2 1 0 4 12 7 45 -1 45 0.000 0 0 -1 0 0 2 + 3471 900 3729 900 +2 1 0 4 12 7 45 -1 45 0.000 0 0 -1 0 0 2 + 3471 1800 3729 1800 +-6 +2 1 3 1 12 7 45 -1 -1 8.000 0 0 -1 0 0 2 + 3690 1800 5085 1800 +2 1 0 4 12 7 45 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 4.00 120.00 240.00 + 3600 1845 3600 2475 +2 1 0 4 12 7 45 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 4.00 120.00 240.00 + 4950 1800 4950 2475 +2 1 0 4 0 7 45 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 4.00 120.00 240.00 + 450 1800 450 2475 +2 1 3 1 0 7 45 -1 -1 8.000 0 0 -1 0 0 2 + 225 1800 900 1800 +2 2 0 1 0 7 45 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5400 0 5400 3150 0 3150 0 0 +2 1 0 1 0 7 45 -1 -1 0.000 0 0 -1 0 0 3 + 0 540 2115 540 2115 0 +4 0 0 45 -1 18 12 0.0000 4 180 1545 90 225 Moved by Router\001 +4 0 12 45 -1 18 12 0.0000 4 180 2025 90 495 Moved by Autocontact\001 +-6 diff --git a/katabatic/doc/images/AutoContact-3.pdf b/katabatic/doc/images/AutoContact-3.pdf new file mode 100644 index 00000000..03d06900 Binary files /dev/null and b/katabatic/doc/images/AutoContact-3.pdf differ diff --git a/katabatic/doc/images/AutoContact-3.png b/katabatic/doc/images/AutoContact-3.png new file mode 100644 index 00000000..74f8f549 Binary files /dev/null and b/katabatic/doc/images/AutoContact-3.png differ diff --git a/katabatic/doc/images/AutoContactG1-1.fig b/katabatic/doc/images/AutoContactG1-1.fig new file mode 100644 index 00000000..e8826d8f --- /dev/null +++ b/katabatic/doc/images/AutoContactG1-1.fig @@ -0,0 +1,33 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 585 -225 765 3375 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 765 -225 765 450 585 450 585 -225 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 675 450 675 3375 +-6 +6 540 2115 810 2385 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 675 2160 675 2340 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 585 2250 765 2250 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 3150 0 3150 3150 0 3150 0 0 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 +2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 + 1125 2160 1575 2160 1575 2340 1125 2340 1125 2160 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 450 2250 1125 2250 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 810 2385 540 2385 540 2115 810 2115 810 2385 +4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 +4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G1.1\001 diff --git a/katabatic/doc/images/AutoContactG1-1.pdf b/katabatic/doc/images/AutoContactG1-1.pdf new file mode 100644 index 00000000..4afad3dd --- /dev/null +++ b/katabatic/doc/images/AutoContactG1-1.pdf @@ -0,0 +1,78 @@ +%PDF-1.3 +%Çì¢ +5 0 obj +<> +stream +xœR»nÜ0ìù[:²á>(.[‰ëøÔ©äW ]a§Èïgy¤(nDr4šYÎîD$ˆõéër_ï3<ÿ U-Á¿@ð'´÷wAI‘¦hŠy‚ód ’3æd5$­Œ”|s8“áÄ°„ )ÑX«Æ†¨¢D‚M³¸ÛdÍ•Æy šcÖ¬AÍå#$¹Sšã|q­²U¶V{ÓÜoÛ\÷».á%œŠ¦^Á‰ U^šP©æÖ€¢‚QÈ­NœóBK)˜Y*É +Z¦T–û°r÷„шŠÛWù¾¾?:Ñ’—1 d¿Š6AM¤„Y§Õ÷þÞµ}_–3ÜÎ> ®I(b óS£{ŠIæs¸ùñíq]?ͯÎ/G¾‡ÅÓú±ÈóC¸¹#¤Êý>‡Ÿ®X÷ïq0ùštχ a´:VOŸÃ/ ëTjÆK}H·ão¯îá +)ïïk{Ô™&œ$¢vÃkh¢&ì/¿ÍÖÉ­"A1/²·çr›^oo2'oXæCÛ·ßׂ¤ÿU Åõ¡ïöÍ÷ +ÖÉ[óÄ Ð2endstream +endobj +6 0 obj +437 +endobj +4 0 obj +<> +/Contents 5 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +4 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +7 0 obj +<>endobj +10 0 obj +<> +endobj +11 0 obj +<> +endobj +8 0 obj +<> +endobj +9 0 obj +<> +endobj +2 0 obj +<>endobj +xref +0 12 +0000000000 65535 f +0000000751 00000 n +0000001044 00000 n +0000000692 00000 n +0000000541 00000 n +0000000015 00000 n +0000000522 00000 n +0000000799 00000 n +0000000909 00000 n +0000000978 00000 n +0000000840 00000 n +0000000870 00000 n +trailer +<< /Size 12 /Root 1 0 R /Info 2 0 R +/ID [(ŒG³vv²=æÓtIy-Ó)(ŒG³vv²=æÓtIy-Ó)] +>> +startxref +1155 +%%EOF diff --git a/katabatic/doc/images/AutoContactG1-1.png b/katabatic/doc/images/AutoContactG1-1.png new file mode 100644 index 00000000..70676792 Binary files /dev/null and b/katabatic/doc/images/AutoContactG1-1.png differ diff --git a/katabatic/doc/images/AutoContactG2-1.fig b/katabatic/doc/images/AutoContactG2-1.fig new file mode 100644 index 00000000..cbf4162a --- /dev/null +++ b/katabatic/doc/images/AutoContactG2-1.fig @@ -0,0 +1,75 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 585 -225 765 3375 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 765 -225 765 450 585 450 585 -225 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 675 450 675 3375 +-6 +6 -225 810 3375 990 +6 -225 810 450 990 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + -225 810 450 810 450 990 -225 990 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 450 900 3375 900 +-6 +6 5535 -180 5715 3420 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 5715 -180 5715 495 5535 495 5535 -180 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5625 495 5625 3420 +-6 +6 4725 2385 8325 2565 +6 4725 2385 5400 2565 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 4725 2385 5400 2385 5400 2565 4725 2565 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5400 2475 8325 2475 +-6 +6 5490 765 5760 1035 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 5625 810 5625 990 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 5535 900 5715 900 +-6 +6 540 2115 810 2385 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 675 2160 675 2340 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 585 2250 765 2250 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4950 0 8100 0 8100 3150 4950 3150 4950 0 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6300 3600 6750 3600 6750 3825 6300 3825 6300 3600 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 3150 0 3150 3150 0 3150 0 0 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 5760 2610 5490 2610 5490 2340 5760 2340 5760 2610 +2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 + 1125 2160 1575 2160 1575 2340 1125 2340 1125 2160 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 450 2250 1125 2250 +2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 + 6075 810 6525 810 6525 990 6075 990 6075 810 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5400 900 6075 900 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 765 990 585 990 585 810 765 810 765 990 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 810 2385 540 2385 540 765 810 765 810 2385 +4 0 0 50 -1 18 12 0.0000 4 135 465 4950 -45 FCell\001 +4 1 0 50 -1 0 12 0.0000 4 135 360 6525 3780 G2.2\001 +4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 +4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G2.1\001 diff --git a/katabatic/doc/images/AutoContactG2-1.pdf b/katabatic/doc/images/AutoContactG2-1.pdf new file mode 100644 index 00000000..eb1d8b25 Binary files /dev/null and b/katabatic/doc/images/AutoContactG2-1.pdf differ diff --git a/katabatic/doc/images/AutoContactG2-1.png b/katabatic/doc/images/AutoContactG2-1.png new file mode 100644 index 00000000..adf19fa8 Binary files /dev/null and b/katabatic/doc/images/AutoContactG2-1.png differ diff --git a/katabatic/doc/images/AutoContactG3-1.fig b/katabatic/doc/images/AutoContactG3-1.fig new file mode 100644 index 00000000..3e72139c --- /dev/null +++ b/katabatic/doc/images/AutoContactG3-1.fig @@ -0,0 +1,89 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 585 -225 765 3375 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 765 -225 765 450 585 450 585 -225 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 675 450 675 3375 +-6 +6 2385 -225 2565 3375 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 2475 2700 2475 -225 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 2385 3375 2385 2700 2565 2700 2565 3375 +-6 +6 450 2160 2700 2340 +2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 + 1125 2160 1575 2160 1575 2340 1125 2340 1125 2160 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 450 2250 2700 2250 +-6 +6 2340 2115 2610 2385 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2475 2160 2475 2340 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2385 2250 2565 2250 +-6 +6 -225 810 3375 990 +6 -225 810 450 990 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + -225 810 450 810 450 990 -225 990 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 450 900 3375 900 +-6 +6 5535 -180 5715 3420 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 5715 -180 5715 495 5535 495 5535 -180 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5625 495 5625 3420 +-6 +6 7335 -225 7515 3375 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 7425 2700 7425 -225 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 7335 3375 7335 2700 7515 2700 7515 3375 +-6 +6 4725 2385 8325 2565 +6 4725 2385 5400 2565 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 4725 2385 5400 2385 5400 2565 4725 2565 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5400 2475 8325 2475 +-6 +6 5400 810 7650 990 +2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 + 6075 810 6525 810 6525 990 6075 990 6075 810 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5400 900 7650 900 +-6 +6 5490 765 5760 1035 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 5625 810 5625 990 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 5535 900 5715 900 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4950 0 8100 0 8100 3150 4950 3150 4950 0 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6300 3600 6750 3600 6750 3825 6300 3825 6300 3600 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 3150 0 3150 3150 0 3150 0 0 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 2610 1035 540 1035 540 765 2610 765 2610 1035 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 7560 2610 5490 2610 5490 2340 7560 2340 7560 2610 +4 0 0 50 -1 18 12 0.0000 4 135 465 4950 -45 FCell\001 +4 1 0 50 -1 0 12 0.0000 4 135 360 6525 3780 G3.2\001 +4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 +4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G3.1\001 diff --git a/katabatic/doc/images/AutoContactG3-1.pdf b/katabatic/doc/images/AutoContactG3-1.pdf new file mode 100644 index 00000000..d4190b42 Binary files /dev/null and b/katabatic/doc/images/AutoContactG3-1.pdf differ diff --git a/katabatic/doc/images/AutoContactG3-1.png b/katabatic/doc/images/AutoContactG3-1.png new file mode 100644 index 00000000..5f40b436 Binary files /dev/null and b/katabatic/doc/images/AutoContactG3-1.png differ diff --git a/katabatic/doc/images/AutoContactG3-2.fig b/katabatic/doc/images/AutoContactG3-2.fig new file mode 100644 index 00000000..01cff739 --- /dev/null +++ b/katabatic/doc/images/AutoContactG3-2.fig @@ -0,0 +1,91 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 585 -225 765 3375 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 765 -225 765 450 585 450 585 -225 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 675 450 675 3375 +-6 +6 -225 810 3375 990 +6 -225 810 450 990 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + -225 810 450 810 450 990 -225 990 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 450 900 3375 900 +-6 +6 5535 -180 5715 3420 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 5715 -180 5715 495 5535 495 5535 -180 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5625 495 5625 3420 +-6 +6 5400 1485 7650 1665 +2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 + 6075 1485 6525 1485 6525 1665 6075 1665 6075 1485 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5400 1575 7650 1575 +-6 +6 5490 1440 5760 1710 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 5625 1485 5625 1665 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 5535 1575 5715 1575 +-6 +6 4725 810 8325 990 +6 4725 810 5400 990 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 4725 810 5400 810 5400 990 4725 990 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5400 900 8325 900 +-6 +6 4725 2385 8325 2565 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 7650 2475 4725 2475 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 8325 2565 7650 2565 7650 2385 8325 2385 +-6 +6 450 2385 2700 2565 +2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 + 1125 2385 1575 2385 1575 2565 1125 2565 1125 2385 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 450 2475 2700 2475 +-6 +6 540 2340 810 2610 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 675 2385 675 2565 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 585 2475 765 2475 +-6 +6 -225 1485 3375 1665 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 2700 1575 -225 1575 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 3375 1665 2700 1665 2700 1485 3375 1485 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4950 0 8100 0 8100 3150 4950 3150 4950 0 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6300 3600 6750 3600 6750 3825 6300 3825 6300 3600 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 3150 0 3150 3150 0 3150 0 0 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 5760 2565 5490 2565 5490 765 5760 765 5760 2565 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 765 1665 585 1665 585 810 765 810 765 1665 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 810 2610 540 2610 540 765 810 765 810 2610 +4 0 0 50 -1 18 12 0.0000 4 135 465 4950 -45 FCell\001 +4 1 0 50 -1 0 12 0.0000 4 135 360 6525 3780 G3.2\001 +4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 +4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G3.1\001 diff --git a/katabatic/doc/images/AutoContactG3-2.pdf b/katabatic/doc/images/AutoContactG3-2.pdf new file mode 100644 index 00000000..b1da56a6 Binary files /dev/null and b/katabatic/doc/images/AutoContactG3-2.pdf differ diff --git a/katabatic/doc/images/AutoContactG3-2.png b/katabatic/doc/images/AutoContactG3-2.png new file mode 100644 index 00000000..a7469838 Binary files /dev/null and b/katabatic/doc/images/AutoContactG3-2.png differ diff --git a/katabatic/doc/images/AutoContactG3-3.fig b/katabatic/doc/images/AutoContactG3-3.fig new file mode 100644 index 00000000..8e10a1da --- /dev/null +++ b/katabatic/doc/images/AutoContactG3-3.fig @@ -0,0 +1,124 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5625 3645 5625 4050 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6750 2565 6750 4050 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 1125 0 8325 0 8325 8550 1125 8550 1125 0 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 6300 1935 6300 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 4950 4275 4950 4275 7650 1575 7650 1575 4950 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 4950 7875 4950 7875 7650 5175 7650 5175 4950 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3915 7290 3915 5265 1935 5265 1935 7290 3915 7290 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 6255 7425 6255 7425 6345 4950 6345 4950 6255 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 6210 5715 6210 5715 6390 5535 6390 5535 6210 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 6210 7515 6210 7515 6390 7335 6390 7335 6210 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6300 5760 6300 4275 +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 + 2925 4005 5625 4005 +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 + 2925 4320 6300 4320 +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 + 6975 4005 6750 4005 +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 + 7650 4320 7425 4320 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5625 4005 6750 4005 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6300 4320 7425 4320 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 675 4275 675 4275 3375 1575 3375 1575 675 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 675 7875 675 7875 3375 5175 3375 5175 675 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 2025 1935 2025 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3915 3015 3915 990 1935 990 1935 3015 3915 3015 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 1980 7425 1980 7425 2070 4950 2070 4950 1980 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 1935 5715 1935 5715 2115 5535 2115 5535 1935 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 1935 7515 1935 7515 2115 7335 2115 7335 1935 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 3015 2025 3600 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1935 2475 2700 2475 +2 2 0 2 0 7 40 -1 45 0.000 0 0 -1 0 0 5 + 2700 2430 3150 2430 3150 2520 2700 2520 2700 2430 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 2925 2385 2925 1620 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 7290 2025 7875 +2 2 0 2 0 7 40 -1 45 0.000 0 0 -1 0 0 5 + 2700 5805 3150 5805 3150 5895 2700 5895 2700 5805 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 5850 3915 5850 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 4725 3825 5265 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 450 3825 990 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 2025 5670 2025 5670 3600 5580 3600 5580 2025 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5625 2430 6750 2430 6750 2520 5625 2520 5625 2430 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 2385 5715 2385 5715 2565 5535 2565 5535 2385 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7470 2025 7380 2025 7380 450 7470 450 7470 2025 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 6300 5670 6300 5670 7875 5580 7875 5580 6300 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 6300 5805 7425 5805 7425 5895 6300 5895 6300 5805 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 5760 7515 5760 7515 5940 7335 5940 7335 5760 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7470 6300 7380 6300 7380 4725 7470 4725 7470 6300 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7425 4635 7425 4275 +3 0 0 1 18 7 50 -1 -1 0.000 0 1 0 6 + 3 0 1.00 60.00 120.00 + 2250 5895 2250 6120 2475 6570 3375 6570 3600 6120 3600 5895 + 0.000 1.000 1.000 1.000 1.000 0.000 +4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 225 Physical Mapping\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1440 6255 G2\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 3015 5220 AC1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 6210 G2\001 +4 0 0 50 -1 19 12 0.0000 4 180 2055 3105 3960 L1 before displacement\001 +4 0 0 50 -1 19 12 0.0000 4 180 1905 3105 4500 L1 after displacement\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1440 1980 G2\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 3015 945 AC1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 1935 G2\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 3600 G1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 210 2925 2700 L1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 7875 G1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 210 2925 5760 L1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 4005 4860 G3\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 4005 585 G3\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 3600 G1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 210 6525 2385 L1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 7650 585 G3\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 7875 G1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 7650 4860 G3\001 +4 1 -1 40 -1 18 12 0.0000 4 135 210 6570 5760 L1\001 diff --git a/katabatic/doc/images/AutoContactG3-3.pdf b/katabatic/doc/images/AutoContactG3-3.pdf new file mode 100644 index 00000000..480477f0 Binary files /dev/null and b/katabatic/doc/images/AutoContactG3-3.pdf differ diff --git a/katabatic/doc/images/AutoContactG3-3.png b/katabatic/doc/images/AutoContactG3-3.png new file mode 100644 index 00000000..8aef666c Binary files /dev/null and b/katabatic/doc/images/AutoContactG3-3.png differ diff --git a/katabatic/doc/images/AutoContactG3-4.fig b/katabatic/doc/images/AutoContactG3-4.fig new file mode 100644 index 00000000..da66a163 --- /dev/null +++ b/katabatic/doc/images/AutoContactG3-4.fig @@ -0,0 +1,146 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5625 3645 5625 4050 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6750 2565 6750 4050 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 1125 0 8325 0 8325 8550 1125 8550 1125 0 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 6300 1935 6300 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 4950 4275 4950 4275 7650 1575 7650 1575 4950 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 4950 7875 4950 7875 7650 5175 7650 5175 4950 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 6255 7425 6255 7425 6345 4950 6345 4950 6255 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 6210 5715 6210 5715 6390 5535 6390 5535 6210 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 6210 7515 6210 7515 6390 7335 6390 7335 6210 +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 + 2925 4005 5625 4005 +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 + 2925 4320 5625 4320 +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 + 6975 4005 6750 4005 +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 + 6975 4320 6750 4320 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5625 4005 6750 4005 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5580 4320 6750 4320 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 675 4275 675 4275 3375 1575 3375 1575 675 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 675 7875 675 7875 3375 5175 3375 5175 675 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 2025 1935 2025 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 1980 7425 1980 7425 2070 4950 2070 4950 1980 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 1935 5715 1935 5715 2115 5535 2115 5535 1935 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 1935 7515 1935 7515 2115 7335 2115 7335 1935 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 3015 2025 3600 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2115 2475 2700 2475 +2 2 0 2 0 7 40 -1 45 0.000 0 0 -1 0 0 5 + 2700 2430 3150 2430 3150 2520 2700 2520 2700 2430 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 2925 2385 2925 1620 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 7290 2025 7875 +2 2 0 2 0 7 40 -1 45 0.000 0 0 -1 0 0 5 + 2700 5805 3150 5805 3150 5895 2700 5895 2700 5805 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 4725 3825 6255 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 450 3825 1935 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 2025 5670 2025 5670 3600 5580 3600 5580 2025 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5625 2430 6750 2430 6750 2520 5625 2520 5625 2430 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 2385 5715 2385 5715 2565 5535 2565 5535 2385 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7470 2025 7380 2025 7380 450 7470 450 7470 2025 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7470 6300 7380 6300 7380 4725 7470 4725 7470 6300 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2115 3015 2115 1935 1935 1935 1935 3015 2115 3015 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3915 2115 3915 1935 3735 1935 3735 2115 3915 2115 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2115 2025 3735 2025 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5085 2475 5535 2115 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5085 2475 5535 2475 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2115 7290 2115 5760 1935 5760 1935 7290 2115 7290 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2115 5850 2700 5850 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3915 6390 3915 6210 3735 6210 3735 6390 3915 6390 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2115 6300 3735 6300 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5625 5805 6750 5805 6750 5895 5625 5895 5625 5805 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 5760 5715 5760 5715 5940 5535 5940 5535 5760 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5625 5760 5625 4275 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6750 5760 6750 4275 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5130 5850 5535 5850 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5130 5850 5535 6210 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 5850 5670 5850 5670 7875 5580 7875 5580 5850 +4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 225 Physical Mapping\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1440 6255 G2\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 6210 G2\001 +4 0 0 50 -1 19 12 0.0000 4 180 2055 3105 3960 L1 before displacement\001 +4 0 0 50 -1 19 12 0.0000 4 180 1905 3105 4500 L1 after displacement\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1440 1980 G2\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 1935 G2\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 3600 G1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 210 2925 2700 L1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 7875 G1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 210 2925 5760 L1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 4005 4860 G3\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 4005 585 G3\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 3600 G1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 210 6525 2385 L1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 7650 585 G3\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 7875 G1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 7650 4860 G3\001 +4 1 -1 40 -1 18 12 0.0000 4 135 210 6570 5760 L1\001 +4 1 18 40 -1 18 12 0.0000 4 135 600 2025 1845 AC-SW\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 3825 2295 AC-NE\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 7425 2340 AC-NE\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 7425 6615 AC-NE\001 +4 2 18 40 -1 18 12 0.0000 4 135 600 5040 2565 AC-SW\001 +4 2 18 40 -1 18 12 0.0000 4 135 600 5085 5895 AC-SW\001 +4 1 18 40 -1 18 12 0.0000 4 135 600 2025 5670 AC-SW\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 3825 6570 AC-NE\001 diff --git a/katabatic/doc/images/AutoContactG3-4.pdf b/katabatic/doc/images/AutoContactG3-4.pdf new file mode 100644 index 00000000..3cc6dd7d Binary files /dev/null and b/katabatic/doc/images/AutoContactG3-4.pdf differ diff --git a/katabatic/doc/images/AutoContactG3-4.png b/katabatic/doc/images/AutoContactG3-4.png new file mode 100644 index 00000000..f5bce88f Binary files /dev/null and b/katabatic/doc/images/AutoContactG3-4.png differ diff --git a/katabatic/doc/images/AutoContactG4-1.fig b/katabatic/doc/images/AutoContactG4-1.fig new file mode 100644 index 00000000..164eb255 --- /dev/null +++ b/katabatic/doc/images/AutoContactG4-1.fig @@ -0,0 +1,111 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 -225 -225 3375 3825 +6 -225 1260 3375 1440 +6 -225 1260 450 1440 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + -225 1260 450 1260 450 1440 -225 1440 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 450 1350 3375 1350 +-6 +6 -225 810 3375 990 +6 2700 810 3375 990 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 3375 990 2700 990 2700 810 3375 810 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 2700 900 -225 900 +-6 +6 585 -225 765 3375 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 765 -225 765 450 585 450 585 -225 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 675 450 675 3375 +-6 +6 2385 -225 2565 3375 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 2475 2700 2475 -225 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 2385 3375 2385 2700 2565 2700 2565 3375 +-6 +6 450 2160 2700 2340 +2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 + 1125 2160 1575 2160 1575 2340 1125 2340 1125 2160 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 450 2250 2700 2250 +-6 +6 2340 2115 2610 2385 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2475 2160 2475 2340 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2385 2250 2565 2250 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 3150 0 3150 3150 0 3150 0 0 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 +2 4 0 2 4 7 55 -1 20 0.000 0 0 7 0 0 5 + 2610 1440 540 1440 540 765 2610 765 2610 1440 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 4 + 675 1350 675 900 2475 900 2475 1350 +4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 +4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G4.1\001 +-6 +6 5400 2160 7650 2340 +2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 + 6075 2160 6525 2160 6525 2340 6075 2340 6075 2160 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5400 2250 7650 2250 +-6 +6 5490 2115 5760 2385 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 5625 2160 5625 2340 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 5535 2250 5715 2250 +-6 +6 5535 -225 5715 3375 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5625 2700 5625 -225 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 5535 3375 5535 2700 5715 2700 5715 3375 +-6 +6 7335 -225 7515 3375 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 7515 -225 7515 450 7335 450 7335 -225 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 7425 450 7425 3375 +-6 +6 4725 1260 8325 1440 +6 7650 1260 8325 1440 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 8325 1440 7650 1440 7650 1260 8325 1260 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 7650 1350 4725 1350 +-6 +6 4725 810 8325 990 +6 4725 810 5400 990 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 4725 810 5400 810 5400 990 4725 990 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5400 900 8325 900 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4950 0 8100 0 8100 3150 4950 3150 4950 0 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6300 3600 6750 3600 6750 3825 6300 3825 6300 3600 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 7560 1440 5490 1440 5490 765 7560 765 7560 1440 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 4 + 5625 900 5625 1350 7425 1350 7425 900 +4 0 0 50 -1 18 12 0.0000 4 135 465 4950 -45 FCell\001 +4 1 0 50 -1 0 12 0.0000 4 135 360 6525 3780 G5.1\001 diff --git a/katabatic/doc/images/AutoContactG4-1.pdf b/katabatic/doc/images/AutoContactG4-1.pdf new file mode 100644 index 00000000..6b9911f4 Binary files /dev/null and b/katabatic/doc/images/AutoContactG4-1.pdf differ diff --git a/katabatic/doc/images/AutoContactG4-1.png b/katabatic/doc/images/AutoContactG4-1.png new file mode 100644 index 00000000..d7c954a9 Binary files /dev/null and b/katabatic/doc/images/AutoContactG4-1.png differ diff --git a/katabatic/doc/images/AutoContactG4-2.fig b/katabatic/doc/images/AutoContactG4-2.fig new file mode 100644 index 00000000..6f9fbaba --- /dev/null +++ b/katabatic/doc/images/AutoContactG4-2.fig @@ -0,0 +1,109 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 5535 -225 5715 3375 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5625 2700 5625 -225 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 5535 3375 5535 2700 5715 2700 5715 3375 +-6 +6 7335 -225 7515 3375 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 7515 -225 7515 450 7335 450 7335 -225 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 7425 450 7425 3375 +-6 +6 4725 810 8325 990 +6 4725 810 5400 990 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 4725 810 5400 810 5400 990 4725 990 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5400 900 8325 900 +-6 +6 -225 810 3375 990 +6 2700 810 3375 990 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 3375 990 2700 990 2700 810 3375 810 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 2700 900 -225 900 +-6 +6 2385 -225 2565 3375 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 2475 2700 2475 -225 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 2385 3375 2385 2700 2565 2700 2565 3375 +-6 +6 585 -225 765 3375 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 765 -225 765 450 585 450 585 -225 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 675 450 675 3375 +-6 +6 540 1215 810 1485 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 675 1260 675 1440 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 585 1350 765 1350 +-6 +6 450 1260 2700 1440 +2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 + 1125 1260 1575 1260 1575 1440 1125 1440 1125 1260 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 450 1350 2700 1350 +-6 +6 5490 1215 5760 1485 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 5625 1260 5625 1440 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 5535 1350 5715 1350 +-6 +6 5400 1260 7650 1440 +2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 + 6075 1260 6525 1260 6525 1440 6075 1440 6075 1260 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5400 1350 7650 1350 +-6 +6 -225 1935 3375 2115 +6 -225 1935 450 2115 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + -225 1935 450 1935 450 2115 -225 2115 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 450 2025 3375 2025 +-6 +6 4725 1935 8325 2115 +6 7650 1935 8325 2115 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 8325 2115 7650 2115 7650 1935 8325 1935 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 7650 2025 4725 2025 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4950 0 8100 0 8100 3150 4950 3150 4950 0 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6300 3600 6750 3600 6750 3825 6300 3825 6300 3600 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 4 + 5625 900 5625 2025 7425 2025 7425 900 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 3150 0 3150 3150 0 3150 0 0 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 4 + 675 2025 675 900 2475 900 2475 2025 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 7560 2160 5490 2160 5490 765 7560 765 7560 2160 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 2565 2160 540 2160 540 765 2565 765 2565 2160 +4 0 0 50 -1 18 12 0.0000 4 135 465 4950 -45 FCell\001 +4 1 0 50 -1 0 12 0.0000 4 135 360 6525 3780 G4.4\001 +4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 +4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G4.3\001 diff --git a/katabatic/doc/images/AutoContactG4-2.pdf b/katabatic/doc/images/AutoContactG4-2.pdf new file mode 100644 index 00000000..e4e8e8cc Binary files /dev/null and b/katabatic/doc/images/AutoContactG4-2.pdf differ diff --git a/katabatic/doc/images/AutoContactG4-2.png b/katabatic/doc/images/AutoContactG4-2.png new file mode 100644 index 00000000..472c46fa Binary files /dev/null and b/katabatic/doc/images/AutoContactG4-2.png differ diff --git a/katabatic/doc/images/AutoContactG4-3.fig b/katabatic/doc/images/AutoContactG4-3.fig new file mode 100644 index 00000000..e4b2fcbc --- /dev/null +++ b/katabatic/doc/images/AutoContactG4-3.fig @@ -0,0 +1,109 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 5400 2160 7650 2340 +2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 + 6075 2160 6525 2160 6525 2340 6075 2340 6075 2160 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5400 2250 7650 2250 +-6 +6 5490 2115 5760 2385 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 5625 2160 5625 2340 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 5535 2250 5715 2250 +-6 +6 5535 -225 5715 3375 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5625 2700 5625 -225 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 5535 3375 5535 2700 5715 2700 5715 3375 +-6 +6 7335 -225 7515 3375 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 7515 -225 7515 450 7335 450 7335 -225 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 7425 450 7425 3375 +-6 +6 585 -225 765 3375 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 765 -225 765 450 585 450 585 -225 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 675 450 675 3375 +-6 +6 2385 -225 2565 3375 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 2475 2700 2475 -225 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 2385 3375 2385 2700 2565 2700 2565 3375 +-6 +6 450 2160 2700 2340 +2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 + 1125 2160 1575 2160 1575 2340 1125 2340 1125 2160 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 450 2250 2700 2250 +-6 +6 2340 2115 2610 2385 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2475 2160 2475 2340 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 + 2385 2250 2565 2250 +-6 +6 -225 1260 3375 1440 +6 2700 1260 3375 1440 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 3375 1440 2700 1440 2700 1260 3375 1260 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 2700 1350 -225 1350 +-6 +6 -225 810 3375 990 +6 -225 810 450 990 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + -225 810 450 810 450 990 -225 990 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 450 900 3375 900 +-6 +6 4725 585 8325 765 +6 7650 585 8325 765 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 8325 765 7650 765 7650 585 8325 585 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 7650 675 4725 675 +-6 +6 4725 1035 8325 1215 +6 4725 1035 5400 1215 +2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 + 4725 1035 5400 1035 5400 1215 4725 1215 +-6 +2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 + 5400 1125 8325 1125 +-6 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4950 0 8100 0 8100 3150 4950 3150 4950 0 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 6300 3600 6750 3600 6750 3825 6300 3825 6300 3600 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 3150 0 3150 3150 0 3150 0 0 +2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 675 900 2475 900 2475 1350 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 5625 1125 5625 675 7425 675 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 2610 1440 540 1440 540 765 2610 765 2610 1440 +2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 + 7560 1215 5490 1215 5490 540 7560 540 7560 1215 +4 0 0 50 -1 18 12 0.0000 4 135 465 4950 -45 FCell\001 +4 1 0 50 -1 0 12 0.0000 4 135 360 6525 3780 G4.6\001 +4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 +4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G4.5\001 diff --git a/katabatic/doc/images/AutoContactG4-3.pdf b/katabatic/doc/images/AutoContactG4-3.pdf new file mode 100644 index 00000000..2c4d0f44 Binary files /dev/null and b/katabatic/doc/images/AutoContactG4-3.pdf differ diff --git a/katabatic/doc/images/AutoContactG4-3.png b/katabatic/doc/images/AutoContactG4-3.png new file mode 100644 index 00000000..0cf54ca9 Binary files /dev/null and b/katabatic/doc/images/AutoContactG4-3.png differ diff --git a/katabatic/doc/images/AutoContactG4-4.fig b/katabatic/doc/images/AutoContactG4-4.fig new file mode 100644 index 00000000..967c82cb --- /dev/null +++ b/katabatic/doc/images/AutoContactG4-4.fig @@ -0,0 +1,108 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 4500 4275 4500 4275 7200 1575 7200 1575 4500 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 4500 7875 4500 7875 7200 5175 7200 5175 4500 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 4950 1935 4950 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3915 5850 4500 5850 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 5940 2025 7425 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 4860 5715 4860 5715 5040 5535 5040 5535 4860 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 4950 5670 4950 5670 7425 5580 7425 5580 4950 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 4275 3825 4860 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3915 5940 3915 4860 1935 4860 1935 5940 3915 5940 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 2025 4950 2025 5850 3825 5850 3825 4950 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 4905 5625 4905 5625 4995 4950 4995 4950 4905 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 2520 900 3780 900 +2 1 0 4 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6075 4905 6075 4995 +2 1 0 4 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 7155 4950 7245 4950 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 1125 0 8325 0 8325 7875 1125 7875 1125 0 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 675 4275 675 4275 3375 1575 3375 1575 675 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 675 7875 675 7875 3375 5175 3375 5175 675 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 1125 1935 1125 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2565 2025 4500 2025 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 2115 2025 3600 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2565 2115 2565 1035 1935 1035 1935 2115 2565 2115 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2475 450 2475 1035 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 1035 5715 1035 5715 1215 5535 1215 5535 1035 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 1125 5670 1125 5670 3600 5580 3600 5580 1125 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 2475 1125 2025 1125 2025 2025 2475 2025 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 6165 1125 6075 1125 6075 450 6165 450 6165 1125 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6030 1035 6210 1035 6210 1215 6030 1215 6030 1035 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5625 1980 8100 1980 8100 2070 5625 2070 5625 1980 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 1935 5715 1935 5715 2115 5535 2115 5535 1935 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 1080 6120 1080 6120 1170 4950 1170 4950 1080 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5625 5805 8100 5805 8100 5895 5625 5895 5625 5805 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 5760 5715 5760 5715 5940 5535 5940 5535 5760 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 5760 7515 5760 7515 5940 7335 5940 7335 5760 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7470 5850 7380 5850 7380 4275 7470 4275 7470 5850 +3 0 0 1 18 7 50 -1 -1 0.000 0 1 0 2 + 3 0 1.00 60.00 120.00 + 6075 4950 5715 4950 + 0.000 0.000 +3 0 0 1 18 7 50 -1 -1 0.000 0 1 0 2 + 3 0 1.00 60.00 120.00 + 7200 4950 7200 5760 + 0.000 0.000 +4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 7425 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1395 4905 G2\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 4410 6030 G4\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 7425 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 4860 G2\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 2250 5490 AC1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 4005 4410 G3\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 7650 4410 G3\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 6525 5265 AC1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 3600 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1395 1080 G2\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 4410 2205 G4\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 3600 G1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 2655 585 G3\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 6525 585 G3\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 1035 G2\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 5985 1530 AC1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 2250 1665 AC1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 8010 2250 G4\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 8010 6075 G4\001 diff --git a/katabatic/doc/images/AutoContactG4-4.pdf b/katabatic/doc/images/AutoContactG4-4.pdf new file mode 100644 index 00000000..eed39a53 Binary files /dev/null and b/katabatic/doc/images/AutoContactG4-4.pdf differ diff --git a/katabatic/doc/images/AutoContactG4-4.png b/katabatic/doc/images/AutoContactG4-4.png new file mode 100644 index 00000000..5f9f3200 Binary files /dev/null and b/katabatic/doc/images/AutoContactG4-4.png differ diff --git a/katabatic/doc/images/AutoContactG4-5.fig b/katabatic/doc/images/AutoContactG4-5.fig new file mode 100644 index 00000000..77143572 --- /dev/null +++ b/katabatic/doc/images/AutoContactG4-5.fig @@ -0,0 +1,151 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 1260 405 8145 3645 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 2520 900 3780 900 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 675 7875 675 7875 3375 5175 3375 5175 675 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 1125 1935 1125 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2565 2025 4500 2025 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 2115 2025 3600 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2475 450 2475 1035 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 1035 5715 1035 5715 1215 5535 1215 5535 1035 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 1125 5670 1125 5670 3600 5580 3600 5580 1125 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2115 2115 2115 1035 1935 1035 1935 2115 2115 2115 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2565 2115 2565 1035 2385 1035 2385 2115 2565 2115 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2115 1575 2385 1575 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 1080 5625 1080 5625 1170 4950 1170 4950 1080 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 1485 5715 1485 5715 1665 5535 1665 5535 1485 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 6165 2025 6075 2025 6075 450 6165 450 6165 2025 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6030 1485 6210 1485 6210 1665 6030 1665 6030 1485 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6030 1935 6210 1935 6210 2115 6030 2115 6030 1935 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5625 1530 6120 1530 6120 1620 5625 1620 5625 1530 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 6120 1980 8100 1980 8100 2070 6120 2070 6120 1980 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5085 1575 5535 1575 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5085 1575 5535 1215 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 675 4275 675 4275 3375 1575 3375 1575 675 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6750 1575 6210 1575 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6750 1575 6210 1935 +4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 3600 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1395 1080 G2\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 4410 2205 G4\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 3600 G1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 2655 585 G3\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 1035 G2\001 +4 1 -1 40 -1 18 12 0.0000 4 135 210 2250 1755 L1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 8010 2250 G4\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 6345 585 G3\001 +4 0 18 40 -1 18 12 0.0000 4 135 570 2655 1665 AC-NE\001 +4 2 18 40 -1 18 12 0.0000 4 135 600 5040 1620 AC-SW\001 +4 0 18 40 -1 18 12 0.0000 4 135 570 6795 1620 AC-NE\001 +-6 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 1125 0 8325 0 8325 7875 1125 7875 1125 0 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 4500 7875 4500 7875 7200 5175 7200 5175 4500 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 4950 1935 4950 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3915 5850 4500 5850 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 5940 2025 7425 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 4860 5715 4860 5715 5040 5535 5040 5535 4860 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 4950 5670 4950 5670 7425 5580 7425 5580 4950 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2115 5940 2115 4860 1935 4860 1935 5940 2115 5940 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2115 5400 3735 5400 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 4905 5625 4905 5625 4995 4950 4995 4950 4905 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 5310 5715 5310 5715 5490 5535 5490 5535 5310 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5085 5400 5535 5400 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5085 5400 5535 5040 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 4500 4275 4500 4275 7200 1575 7200 1575 4500 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 4275 3825 4860 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3915 5940 3915 4860 3735 4860 3735 5940 3915 5940 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7425 5850 7335 5850 7335 4275 7425 4275 7425 5850 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7290 5310 7470 5310 7470 5490 7290 5490 7290 5310 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7290 5760 7470 5760 7470 5940 7290 5940 7290 5760 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7380 5805 8100 5805 8100 5895 7380 5895 7380 5805 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5625 5355 7380 5355 7380 5445 5625 5445 5625 5355 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6975 6255 7290 5490 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6975 6255 7290 5940 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6075 5175 7290 5175 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6075 5850 7290 5850 +2 1 0 4 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6075 5805 6075 5895 +2 1 0 4 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6075 5130 6075 5220 +4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 +4 2 18 40 -1 18 12 0.0000 4 135 600 1845 1665 AC-SW\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 7425 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1395 4905 G2\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 4410 6030 G4\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 7425 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 4860 G2\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 8010 6075 G4\001 +4 2 18 40 -1 18 12 0.0000 4 135 600 5040 5445 AC-SW\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 4005 4410 G3\001 +4 2 18 40 -1 18 12 0.0000 4 135 570 3645 5850 AC-NE\001 +4 2 18 40 -1 18 12 0.0000 4 135 600 1845 5490 AC-SW\001 +4 1 -1 40 -1 18 12 0.0000 4 135 255 7605 4410 G3\001 +4 2 18 40 -1 18 12 0.0000 4 135 570 6930 6345 AC-NE\001 +4 1 -1 40 -1 18 12 0.0000 4 135 210 2925 5580 L1\001 +4 1 -1 40 -1 18 12 0.0000 4 135 210 6525 5625 L1\001 diff --git a/katabatic/doc/images/AutoContactG4-5.pdf b/katabatic/doc/images/AutoContactG4-5.pdf new file mode 100644 index 00000000..663a4f2f Binary files /dev/null and b/katabatic/doc/images/AutoContactG4-5.pdf differ diff --git a/katabatic/doc/images/AutoContactG4-5.png b/katabatic/doc/images/AutoContactG4-5.png new file mode 100644 index 00000000..cc00a7cc Binary files /dev/null and b/katabatic/doc/images/AutoContactG4-5.png differ diff --git a/katabatic/doc/images/AutoInvalidate-1.fig b/katabatic/doc/images/AutoInvalidate-1.fig new file mode 100644 index 00000000..373d2de4 --- /dev/null +++ b/katabatic/doc/images/AutoInvalidate-1.fig @@ -0,0 +1,66 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +0 32 #000000 +0 33 #ddcccc +0 34 #611616 +0 35 #ccccdd +6 4050 3195 7200 3690 +2 2 0 0 0 35 60 -1 20 0.000 0 0 -1 0 0 5 + 4050 3195 7200 3195 7200 3690 4050 3690 4050 3195 +4 0 0 50 -1 18 12 0.0000 4 180 1455 4950 3375 AutoInvalidate()\001 +4 0 0 50 -1 18 12 0.0000 4 180 2235 4950 3600 anchor->AutoInvalidate()\001 +-6 +6 4050 2700 7200 3195 +2 2 0 0 -1 33 60 -1 20 0.000 0 0 -1 0 0 5 + 4050 2700 7200 2700 7200 3195 4050 3195 4050 2700 +4 0 34 50 -1 18 12 0.0000 4 135 600 4275 2925 Router\001 +4 0 34 50 -1 18 12 0.0000 4 180 2535 4275 3150 autoSegment->SetAxis( ... )\001 +-6 +6 8325 4275 12825 7515 +6 8325 4275 12825 4545 +6 8325 4275 12825 4545 +2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 + 8325 4275 12825 4275 12825 4545 8325 4545 8325 4275 +4 0 0 50 -1 18 12 0.0000 4 180 2490 8550 4455 _autoContacts (invalidated)\001 +-6 +-6 +2 2 0 0 0 35 60 -1 20 0.000 0 0 -1 0 0 5 + 8325 4725 12825 4725 12825 5490 8325 5490 8325 4725 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 2.00 120.00 240.00 + 11205 5445 11205 6300 +2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 + 8325 6300 12825 6300 12825 6615 8325 6615 8325 6300 +2 2 0 0 0 35 60 -1 20 0.000 0 0 -1 0 0 5 + 8325 6750 12825 6750 12825 7515 8325 7515 8325 6750 +4 0 0 50 -1 19 12 0.0000 4 135 750 8550 4950 For each\001 +4 0 0 50 -1 18 12 0.0000 4 180 2970 9225 5175 autoContact->UpdateGeometry()\001 +4 0 0 50 -1 18 12 0.0000 4 180 2820 9900 5400 autoSegment->AutoInvalidate()\001 +4 0 0 50 -1 18 12 0.0000 4 135 1080 9360 4950 autoContact\001 +4 0 0 50 -1 19 12 0.0000 4 135 750 8505 6975 For each\001 +4 0 0 50 -1 18 12 0.0000 4 180 2745 9225 7200 autoSegment->OnRevalidate()\001 +4 0 0 50 -1 18 12 0.0000 4 180 3300 9225 7425 _revalidateCallBack ( autoSegment )\001 +4 0 0 50 -1 18 12 0.0000 4 180 1185 9360 6975 autoSegment\001 +4 0 0 50 -1 18 12 0.0000 4 180 2595 8550 6525 _autoSegments (invalidated)\001 +-6 +6 4050 4725 7200 5040 +2 2 0 0 -1 33 55 -1 20 0.000 0 0 -1 0 0 5 + 4050 4725 7200 4725 7200 5040 4050 5040 4050 4725 +4 0 34 50 -1 18 12 0.0000 4 180 1950 4275 4950 Session::Revalidate()\001 +-6 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 1 0 4 + 3 0 2.00 120.00 240.00 + 5670 3645 5670 5850 9225 5850 9225 6300 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 1 0 3 + 3 0 2.00 120.00 240.00 + 7200 3555 10530 3555 10530 4275 +2 1 0 4 33 35 50 -1 -1 0.000 0 0 -1 1 0 2 + 1 1 2.00 120.00 240.00 + 7200 4905 8325 4905 diff --git a/katabatic/doc/images/AutoInvalidate-1.pdf b/katabatic/doc/images/AutoInvalidate-1.pdf new file mode 100644 index 00000000..87657942 Binary files /dev/null and b/katabatic/doc/images/AutoInvalidate-1.pdf differ diff --git a/katabatic/doc/images/AutoInvalidate-1.png b/katabatic/doc/images/AutoInvalidate-1.png new file mode 100644 index 00000000..119c4da3 Binary files /dev/null and b/katabatic/doc/images/AutoInvalidate-1.png differ diff --git a/katabatic/doc/images/AutoSegmentCollapse-1.fig b/katabatic/doc/images/AutoSegmentCollapse-1.fig new file mode 100644 index 00000000..7e71742d --- /dev/null +++ b/katabatic/doc/images/AutoSegmentCollapse-1.fig @@ -0,0 +1,87 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 3420 3195 5265 4500 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3960 3465 5040 3465 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4050 3465 4050 3690 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4365 3465 4365 3915 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4950 3465 4950 4320 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4635 3465 4635 4095 +4 1 0 40 -1 14 14 0.0000 4 195 945 4500 3375 C c g t\001 +4 2 0 40 -1 18 12 0.0000 4 135 840 4275 3825 Canonical\001 +4 2 0 40 -1 18 12 0.0000 4 180 840 4545 4050 Collapsed\001 +4 2 0 40 -1 18 12 0.0000 4 135 555 4860 4275 Global\001 +4 2 0 40 -1 18 12 0.0000 4 135 765 5265 4500 Terminal\001 +-6 +6 3555 4680 4995 4860 +2 1 0 1 12 7 40 -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 + 3555 4770 4005 4770 +4 0 0 40 -1 18 12 0.0000 4 180 735 4230 4815 Collapse\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 2700 90 90 360 2700 540 2700 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 2700 90 90 2610 2700 2790 2700 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 3825 90 90 1485 3825 1665 3825 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 1575 90 90 2610 1575 2790 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 1575 90 90 3735 1575 3915 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 450 90 90 3735 450 3915 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4950 450 90 90 4860 450 5040 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 2700 90 90 1485 2700 1665 2700 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5400 0 5400 4950 0 4950 0 0 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 540 2700 1485 2700 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1665 2700 2610 2700 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1575 2790 1575 3735 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 1665 2700 2610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2790 1575 3735 1575 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 540 3825 1485 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3915 450 4860 450 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 5400 3150 3150 3150 3150 4950 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 4545 5400 4545 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 720 2385 1260 2385 1260 2655 720 2655 720 2385 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1845 2385 2385 2385 2385 2655 1845 2655 1845 2385 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1620 3150 2160 3150 2160 3420 1620 3420 1620 3150 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2745 2025 3285 2025 3285 2295 2745 2295 2745 2025 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2970 1260 3510 1260 3510 1530 2970 1530 2970 1260 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3870 900 4410 900 4410 1170 3870 1170 3870 900 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4095 135 4635 135 4635 405 4095 405 4095 135 +3 2 0 1 12 7 40 -1 -1 0.000 0 1 1 4 + 3 1 1.00 60.00 120.00 + 3 1 1.00 60.00 120.00 + 3735 495 3600 765 3600 1215 3780 1530 + 0.000 -1.000 -1.000 0.000 +4 1 0 40 -1 14 12 0.0000 4 165 420 990 2565 C-g-\001 +4 1 0 40 -1 14 12 0.0000 4 120 420 2115 2565 C---\001 +4 1 0 40 -1 14 12 0.0000 4 165 420 1890 3330 C-g-\001 +4 1 0 40 -1 14 12 0.0000 4 120 420 3015 2205 C---\001 +4 1 0 40 -1 14 12 0.0000 4 165 420 3240 1440 C-g-\001 +4 1 0 40 -1 14 12 0.0000 4 120 420 4140 1080 C---\001 +4 1 0 40 -1 14 12 0.0000 4 165 420 4365 315 C-g-\001 diff --git a/katabatic/doc/images/AutoSegmentCollapse-1.pdf b/katabatic/doc/images/AutoSegmentCollapse-1.pdf new file mode 100644 index 00000000..6c82fc7b Binary files /dev/null and b/katabatic/doc/images/AutoSegmentCollapse-1.pdf differ diff --git a/katabatic/doc/images/AutoSegmentCollapse-1.png b/katabatic/doc/images/AutoSegmentCollapse-1.png new file mode 100644 index 00000000..3d203724 Binary files /dev/null and b/katabatic/doc/images/AutoSegmentCollapse-1.png differ diff --git a/katabatic/doc/images/AutoSegmentCollapse-2.fig b/katabatic/doc/images/AutoSegmentCollapse-2.fig new file mode 100644 index 00000000..4362414c --- /dev/null +++ b/katabatic/doc/images/AutoSegmentCollapse-2.fig @@ -0,0 +1,87 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 3420 2295 5265 3600 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3960 2565 5040 2565 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4050 2565 4050 2790 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4365 2565 4365 3015 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4950 2565 4950 3420 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4635 2565 4635 3195 +4 1 0 40 -1 14 14 0.0000 4 195 945 4500 2475 C c g t\001 +4 2 0 40 -1 18 12 0.0000 4 135 840 4275 2925 Canonical\001 +4 2 0 40 -1 18 12 0.0000 4 180 840 4545 3150 Collapsed\001 +4 2 0 40 -1 18 12 0.0000 4 135 555 4860 3375 Global\001 +4 2 0 40 -1 18 12 0.0000 4 135 765 5265 3600 Terminal\001 +-6 +6 3555 3780 4995 3960 +2 1 0 1 12 7 40 -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 + 3555 3870 4005 3870 +4 0 0 40 -1 18 12 0.0000 4 180 735 4230 3915 Collapse\001 +-6 +6 4140 360 4680 630 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4140 360 4680 360 4680 630 4140 630 4140 360 +4 1 0 40 -1 14 12 0.0000 4 135 420 4410 540 --g-\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 1800 90 90 360 1800 540 1800 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 1800 90 90 2610 1800 2790 1800 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 2925 90 90 1485 2925 1665 2925 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 675 90 90 2610 675 2790 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 675 90 90 3735 675 3915 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1800 90 90 1485 1800 1665 1800 +1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 3825 675 135 135 3690 675 3960 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4950 675 90 90 4860 675 5040 675 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 540 1800 1485 1800 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1665 1800 2610 1800 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1575 1890 1575 2835 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 765 2700 1710 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 5400 2250 3150 2250 3150 4050 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 3645 5400 3645 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 720 1485 1260 1485 1260 1755 720 1755 720 1485 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1845 1485 2385 1485 2385 1755 1845 1755 1845 1485 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1620 2250 2160 2250 2160 2520 1620 2520 1620 2250 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2745 1125 3285 1125 3285 1395 2745 1395 2745 1125 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2970 360 3510 360 3510 630 2970 630 2970 360 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2790 675 3690 675 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5400 0 5400 4050 0 4050 0 0 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3915 675 4860 675 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3555 855 4095 855 4095 1125 3555 1125 3555 855 +3 2 0 1 12 7 40 -1 -1 0.000 0 1 1 4 + 3 1 1.00 60.00 120.00 + 3 1 1.00 60.00 120.00 + 1620 1710 1890 1350 2430 1350 2655 1710 + 0.000 -1.000 -1.000 0.000 +4 1 0 40 -1 14 12 0.0000 4 165 420 990 1665 C-g-\001 +4 1 0 40 -1 14 12 0.0000 4 120 420 2115 1665 C---\001 +4 1 0 40 -1 14 12 0.0000 4 165 420 1890 2430 C-g-\001 +4 1 0 40 -1 14 12 0.0000 4 120 420 3015 1305 C---\001 +4 1 0 40 -1 14 12 0.0000 4 165 420 3240 540 C-g-\001 +4 1 0 40 -1 14 12 0.0000 4 90 420 3825 1035 -c--\001 diff --git a/katabatic/doc/images/AutoSegmentCollapse-2.pdf b/katabatic/doc/images/AutoSegmentCollapse-2.pdf new file mode 100644 index 00000000..5c2fd342 Binary files /dev/null and b/katabatic/doc/images/AutoSegmentCollapse-2.pdf differ diff --git a/katabatic/doc/images/AutoSegmentCollapse-2.png b/katabatic/doc/images/AutoSegmentCollapse-2.png new file mode 100644 index 00000000..cf7fa331 Binary files /dev/null and b/katabatic/doc/images/AutoSegmentCollapse-2.png differ diff --git a/katabatic/doc/images/AutoSegmentCollapse-3.fig b/katabatic/doc/images/AutoSegmentCollapse-3.fig new file mode 100644 index 00000000..a7d777ba --- /dev/null +++ b/katabatic/doc/images/AutoSegmentCollapse-3.fig @@ -0,0 +1,85 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 3420 2295 5265 3600 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3960 2565 5040 2565 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4050 2565 4050 2790 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4365 2565 4365 3015 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4950 2565 4950 3420 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4635 2565 4635 3195 +4 1 0 40 -1 14 14 0.0000 4 195 945 4500 2475 C c g t\001 +4 2 0 40 -1 18 12 0.0000 4 135 840 4275 2925 Canonical\001 +4 2 0 40 -1 18 12 0.0000 4 180 840 4545 3150 Collapsed\001 +4 2 0 40 -1 18 12 0.0000 4 135 555 4860 3375 Global\001 +4 2 0 40 -1 18 12 0.0000 4 135 765 5265 3600 Terminal\001 +-6 +6 3555 3780 4995 3960 +2 1 0 1 12 7 40 -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 + 3555 3870 4005 3870 +4 0 0 40 -1 18 12 0.0000 4 180 735 4230 3915 Collapse\001 +-6 +6 3015 360 3555 630 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3015 360 3555 360 3555 630 3015 630 3015 360 +4 1 0 40 -1 14 12 0.0000 4 135 420 3285 540 --g-\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 1800 90 90 360 1800 540 1800 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 2925 90 90 1485 2925 1665 2925 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1800 90 90 1485 1800 1665 1800 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1800 135 135 1440 1800 1710 1800 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 675 90 90 2610 675 2790 675 +1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 2700 675 135 135 2565 675 2835 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 675 90 90 3735 675 3915 675 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 540 1800 1440 1800 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1575 1935 1575 2835 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 5400 2250 3150 2250 3150 4050 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 3645 5400 3645 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 720 1485 1260 1485 1260 1755 720 1755 720 1485 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1620 2250 2160 2250 2160 2520 1620 2520 1620 2250 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5400 0 5400 4050 0 4050 0 0 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1575 765 1575 1665 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1845 360 2385 360 2385 630 1845 630 1845 360 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1665 675 2565 675 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2790 675 3735 675 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2430 855 2970 855 2970 1125 2430 1125 2430 855 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1620 1125 2160 1125 2160 1395 1620 1395 1620 1125 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1845 1665 2385 1665 2385 1935 1845 1935 1845 1665 +3 2 0 1 12 7 40 -1 -1 0.000 0 1 1 4 + 3 1 1.00 60.00 120.00 + 3 1 1.00 60.00 120.00 + 1485 720 1215 945 1215 1395 1485 1710 + 0.000 -1.000 -1.000 0.000 +4 1 0 40 -1 14 12 0.0000 4 165 420 990 1665 C-g-\001 +4 1 0 40 -1 14 12 0.0000 4 165 420 1890 2430 C-g-\001 +4 1 0 40 -1 14 12 0.0000 4 165 420 2115 540 C-g-\001 +4 1 0 40 -1 14 12 0.0000 4 120 420 1890 1305 C---\001 +4 1 0 40 -1 14 12 0.0000 4 90 420 2700 1035 -c--\001 +4 1 0 40 -1 14 12 0.0000 4 90 420 2115 1845 -c--\001 diff --git a/katabatic/doc/images/AutoSegmentCollapse-3.pdf b/katabatic/doc/images/AutoSegmentCollapse-3.pdf new file mode 100644 index 00000000..1377bff9 Binary files /dev/null and b/katabatic/doc/images/AutoSegmentCollapse-3.pdf differ diff --git a/katabatic/doc/images/AutoSegmentCollapse-3.png b/katabatic/doc/images/AutoSegmentCollapse-3.png new file mode 100644 index 00000000..fcd7e83f Binary files /dev/null and b/katabatic/doc/images/AutoSegmentCollapse-3.png differ diff --git a/katabatic/doc/images/AutoSegmentCollapse-4.fig b/katabatic/doc/images/AutoSegmentCollapse-4.fig new file mode 100644 index 00000000..d9e860d9 --- /dev/null +++ b/katabatic/doc/images/AutoSegmentCollapse-4.fig @@ -0,0 +1,90 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 3420 2295 5265 3600 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3960 2565 5040 2565 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4050 2565 4050 2790 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4365 2565 4365 3015 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4950 2565 4950 3420 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4635 2565 4635 3195 +4 1 0 40 -1 14 14 0.0000 4 195 945 4500 2475 C c g t\001 +4 2 0 40 -1 18 12 0.0000 4 135 840 4275 2925 Canonical\001 +4 2 0 40 -1 18 12 0.0000 4 180 840 4545 3150 Collapsed\001 +4 2 0 40 -1 18 12 0.0000 4 135 555 4860 3375 Global\001 +4 2 0 40 -1 18 12 0.0000 4 135 765 5265 3600 Terminal\001 +-6 +6 3555 3780 4995 3960 +2 1 0 1 12 7 40 -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 + 3555 3870 4005 3870 +4 0 0 40 -1 18 12 0.0000 4 180 735 4230 3915 Collapse\001 +-6 +6 3015 360 3555 630 +6 3015 360 3555 630 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3015 360 3555 360 3555 630 3015 630 3015 360 +4 1 0 40 -1 14 12 0.0000 4 135 420 3285 540 --g-\001 +-6 +-6 +6 1845 360 2385 630 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1845 360 2385 360 2385 630 1845 630 1845 360 +4 1 0 40 -1 14 12 0.0000 4 135 420 2115 540 --g-\001 +-6 +6 2430 225 2970 495 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2430 225 2970 225 2970 495 2430 495 2430 225 +4 1 0 40 -1 14 12 0.0000 4 90 420 2700 405 -c--\001 +-6 +6 1620 1305 2160 1575 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1620 1305 2160 1305 2160 1575 1620 1575 1620 1305 +4 1 0 40 -1 14 12 0.0000 4 165 420 1890 1485 C-g-\001 +-6 +6 1755 855 2295 1125 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1755 855 2295 855 2295 1125 1755 1125 1755 855 +4 1 0 40 -1 14 12 0.0000 4 90 420 2025 1035 -c--\001 +-6 +6 2340 855 2880 1125 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2340 855 2880 855 2880 1125 2340 1125 2340 855 +4 1 0 40 -1 14 12 0.0000 4 90 420 2610 1035 -c--\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 675 90 90 2610 675 2790 675 +1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 2700 675 135 135 2565 675 2835 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 675 90 90 3735 675 3915 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 675 90 90 360 675 540 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1800 90 90 1485 1800 1665 1800 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 135 135 1440 675 1710 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 180 180 1395 675 1755 675 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 5400 2250 3150 2250 3150 4050 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 3645 5400 3645 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5400 0 5400 4050 0 4050 0 0 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1755 675 2565 675 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2790 675 3735 675 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 720 360 1260 360 1260 630 720 630 720 360 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 540 675 1395 675 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1575 855 1575 1710 +4 1 0 40 -1 14 12 0.0000 4 165 420 990 540 C-g-\001 diff --git a/katabatic/doc/images/AutoSegmentCollapse-4.pdf b/katabatic/doc/images/AutoSegmentCollapse-4.pdf new file mode 100644 index 00000000..dcd2c886 Binary files /dev/null and b/katabatic/doc/images/AutoSegmentCollapse-4.pdf differ diff --git a/katabatic/doc/images/AutoSegmentCollapse-4.png b/katabatic/doc/images/AutoSegmentCollapse-4.png new file mode 100644 index 00000000..911a2bf3 Binary files /dev/null and b/katabatic/doc/images/AutoSegmentCollapse-4.png differ diff --git a/katabatic/doc/images/AutoSegmentCollapse-5.fig b/katabatic/doc/images/AutoSegmentCollapse-5.fig new file mode 100644 index 00000000..cd67a788 --- /dev/null +++ b/katabatic/doc/images/AutoSegmentCollapse-5.fig @@ -0,0 +1,81 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 4230 1710 4770 1980 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4230 1710 4770 1710 4770 1980 4230 1980 4230 1710 +4 1 0 40 -1 14 12 0.0000 4 165 420 4500 1890 C-g-\001 +-6 +6 4905 1530 5445 1800 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4905 1530 5445 1530 5445 1800 4905 1800 4905 1530 +4 1 0 40 -1 14 12 0.0000 4 90 420 5175 1710 -c--\001 +-6 +6 5670 1710 6210 1980 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5670 1710 6210 1710 6210 1980 5670 1980 5670 1710 +4 1 0 40 -1 14 12 0.0000 4 135 420 5940 1890 --g-\001 +-6 +6 4950 2655 6795 3960 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5490 2925 6570 2925 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5580 2925 5580 3150 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5895 2925 5895 3375 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 6480 2925 6480 3780 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 6165 2925 6165 3555 +4 1 0 40 -1 14 14 0.0000 4 195 945 6030 2835 C c g t\001 +4 2 0 40 -1 18 12 0.0000 4 135 840 5805 3285 Canonical\001 +4 2 0 40 -1 18 12 0.0000 4 180 840 6075 3510 Collapsed\001 +4 2 0 40 -1 18 12 0.0000 4 135 555 6390 3735 Global\001 +4 2 0 40 -1 18 12 0.0000 4 135 765 6795 3960 Terminal\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3870 2025 90 90 3780 2025 3960 2025 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 2025 135 135 5040 2025 5310 2025 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 2025 90 90 5085 2025 5265 2025 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 6525 2025 90 90 6435 2025 6615 2025 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 2025 90 90 360 2025 540 2025 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 2025 90 90 1710 2025 1890 2025 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 675 90 90 1710 675 1890 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3150 675 90 90 3060 675 3240 675 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3960 2025 5040 2025 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5310 2025 6435 2025 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 540 2025 1710 2025 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1800 765 1800 1935 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1890 675 3060 675 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 810 1710 1350 1710 1350 1980 810 1980 810 1710 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1845 1215 2385 1215 2385 1485 1845 1485 1845 1215 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2160 360 2700 360 2700 630 2160 630 2160 360 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 6975 2475 4725 2475 4725 4050 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 6975 0 6975 4050 0 4050 0 0 +4 1 0 40 -1 14 12 0.0000 4 165 420 1080 1890 C-g-\001 +4 1 0 40 -1 14 12 0.0000 4 120 420 2115 1395 C---\001 +4 1 0 40 -1 14 12 0.0000 4 165 420 2430 540 C-g-\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1125 2205 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 1665 1440 L1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 2430 855 G2\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 4500 2205 G1\001 +4 1 18 40 -1 18 12 0.0000 4 135 255 5940 2205 G2\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 5175 2340 L1\001 +4 1 0 40 -1 18 12 0.0000 4 135 345 1800 540 AC2\001 +4 1 0 40 -1 18 12 0.0000 4 135 345 1800 2340 AC1\001 +4 1 0 40 -1 18 12 0.0000 4 135 945 5175 1485 AC1 & AC2\001 diff --git a/katabatic/doc/images/AutoSegmentCollapse-5.pdf b/katabatic/doc/images/AutoSegmentCollapse-5.pdf new file mode 100644 index 00000000..226eb66e Binary files /dev/null and b/katabatic/doc/images/AutoSegmentCollapse-5.pdf differ diff --git a/katabatic/doc/images/AutoSegmentCollapse-5.png b/katabatic/doc/images/AutoSegmentCollapse-5.png new file mode 100644 index 00000000..03815194 Binary files /dev/null and b/katabatic/doc/images/AutoSegmentCollapse-5.png differ diff --git a/katabatic/doc/images/AutoSegmentCollapse-6.fig b/katabatic/doc/images/AutoSegmentCollapse-6.fig new file mode 100644 index 00000000..710d28a4 --- /dev/null +++ b/katabatic/doc/images/AutoSegmentCollapse-6.fig @@ -0,0 +1,82 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 4950 2655 6795 3960 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5490 2925 6570 2925 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5580 2925 5580 3150 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5895 2925 5895 3375 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 6480 2925 6480 3780 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 6165 2925 6165 3555 +4 1 0 40 -1 14 14 0.0000 4 195 945 6030 2835 C c g t\001 +4 2 0 40 -1 18 12 0.0000 4 135 840 5805 3285 Canonical\001 +4 2 0 40 -1 18 12 0.0000 4 180 840 6075 3510 Collapsed\001 +4 2 0 40 -1 18 12 0.0000 4 135 555 6390 3735 Global\001 +4 2 0 40 -1 18 12 0.0000 4 135 765 6795 3960 Terminal\001 +-6 +6 810 360 1350 630 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 810 360 1350 360 1350 630 810 630 810 360 +4 1 0 40 -1 14 12 0.0000 4 165 420 1080 540 C-g-\001 +-6 +6 4185 360 4725 630 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 360 4725 360 4725 630 4185 630 4185 360 +4 1 0 40 -1 14 12 0.0000 4 165 420 4455 540 C-g-\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 2025 90 90 1710 2025 1890 2025 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 675 90 90 1710 675 1890 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3150 675 90 90 3060 675 3240 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 675 90 90 360 675 540 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 2025 90 90 5085 2025 5265 2025 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 675 90 90 5085 675 5265 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 6525 675 90 90 6435 675 6615 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 675 90 90 3735 675 3915 675 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 6975 2475 4725 2475 4725 4050 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 6975 0 6975 4050 0 4050 0 0 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1800 765 1800 1935 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1890 675 3060 675 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1845 1215 2385 1215 2385 1485 1845 1485 1845 1215 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2160 360 2700 360 2700 630 2160 630 2160 360 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 540 675 1710 675 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5175 765 5175 1935 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5265 675 6435 675 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5220 1215 5760 1215 5760 1485 5220 1485 5220 1215 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 360 6075 360 6075 630 5535 630 5535 360 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3915 675 5085 675 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5085 675 5310 675 +4 1 0 40 -1 14 12 0.0000 4 120 420 2115 1395 C---\001 +4 1 0 40 -1 14 12 0.0000 4 165 420 2430 540 C-g-\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 1665 1440 L1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 2430 855 G2\001 +4 1 0 40 -1 18 12 0.0000 4 135 345 1800 540 AC1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1080 855 G1\001 +4 1 0 40 -1 14 12 0.0000 4 120 420 5490 1395 C---\001 +4 1 0 40 -1 14 12 0.0000 4 135 420 5805 540 --g-\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 5040 1440 L1\001 +4 1 18 40 -1 18 12 0.0000 4 135 255 5805 855 G2\001 +4 1 0 40 -1 18 12 0.0000 4 135 345 5175 540 AC1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 4455 855 G1\001 diff --git a/katabatic/doc/images/AutoSegmentCollapse-6.pdf b/katabatic/doc/images/AutoSegmentCollapse-6.pdf new file mode 100644 index 00000000..328732cf Binary files /dev/null and b/katabatic/doc/images/AutoSegmentCollapse-6.pdf differ diff --git a/katabatic/doc/images/AutoSegmentCollapse-6.png b/katabatic/doc/images/AutoSegmentCollapse-6.png new file mode 100644 index 00000000..37d4324b Binary files /dev/null and b/katabatic/doc/images/AutoSegmentCollapse-6.png differ diff --git a/katabatic/doc/images/GCellConfiguration-1.fig b/katabatic/doc/images/GCellConfiguration-1.fig new file mode 100644 index 00000000..2ba8ad76 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-1.fig @@ -0,0 +1,65 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 1350 90 90 2610 1350 2790 1350 +1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 2700 2025 90 90 2610 2025 2790 2025 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1125 2025 90 90 1035 2025 1215 2025 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3600 2025 90 90 3510 2025 3690 2025 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 890 2965 90 90 800 2965 980 2965 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2025 900 2115 900 2115 1800 2025 1800 2025 900 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1980 1260 2160 1260 2160 1440 1980 1440 1980 1260 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2160 1350 2610 1350 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 1440 2700 1935 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1215 2025 2610 2025 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2790 2025 3510 2025 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5130 900 5220 900 5220 1800 5130 1800 5130 900 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 5175 1305 5850 1305 5850 1395 5175 1395 5175 1305 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 5805 1350 5895 1350 5895 2250 5805 2250 5805 1350 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 4500 2205 5850 2205 5850 2295 4500 2295 4500 2205 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 5850 630 6750 630 6750 720 5850 720 5850 630 +2 1 0 2 18 7 40 -1 45 0.000 0 0 -1 0 0 2 + 5850 765 5850 1260 +2 1 0 1 18 7 30 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6525 1125 5850 990 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 675 2745 3375 2745 3375 3375 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 450 3150 450 3150 2475 1575 2475 1575 450 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 4725 450 6300 450 6300 2475 4725 2475 4725 450 +2 4 0 1 18 7 30 -1 -1 0.000 0 0 7 0 0 5 + 6030 2430 6030 495 5670 495 5670 2430 6030 2430 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 675 0 7200 0 7200 3375 675 3375 675 0 +4 1 12 40 -1 18 12 0.0000 4 135 210 2385 1305 L1\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 6030 1845 L2\001 +4 0 18 30 -1 14 12 0.0000 4 135 315 6615 1170 gap\001 +4 0 0 30 -1 18 12 0.0000 4 180 930 2250 3285 G: "global"\001 +4 0 0 30 -1 18 12 0.0000 4 135 1095 1125 3015 AutoContact\001 +4 0 0 30 -1 18 12 0.0000 4 135 780 1125 3285 L: "local"\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 6660 585 G2\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 4590 2475 G1\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 5445 1260 L1\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 1350 2205 G1\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 3375 2205 G2\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 2835 1755 L2\001 +4 1 0 30 -1 14 12 0.0000 4 120 2205 2340 270 AutoContact Structure\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 5490 225 Physical Mapping\001 diff --git a/katabatic/doc/images/GCellConfiguration-1.pdf b/katabatic/doc/images/GCellConfiguration-1.pdf new file mode 100644 index 00000000..5eb69be9 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-1.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-1.png b/katabatic/doc/images/GCellConfiguration-1.png new file mode 100644 index 00000000..139c2a51 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-1.png differ diff --git a/katabatic/doc/images/GCellConfiguration-10.fig b/katabatic/doc/images/GCellConfiguration-10.fig new file mode 100644 index 00000000..f799106a --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-10.fig @@ -0,0 +1,20 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 900 900 90 90 810 900 990 900 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 225 2925 225 2925 1575 0 1575 0 225 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2430 450 2520 450 2520 1350 2430 1350 2430 450 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 810 2565 810 2565 990 2385 990 2385 810 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2385 900 990 900 +4 1 0 40 -1 18 12 0.0000 4 180 1335 900 1170 _targetContact\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 1575 855 Lt\001 diff --git a/katabatic/doc/images/GCellConfiguration-10.pdf b/katabatic/doc/images/GCellConfiguration-10.pdf new file mode 100644 index 00000000..bb17b733 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-10.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-10.png b/katabatic/doc/images/GCellConfiguration-10.png new file mode 100644 index 00000000..dd658a5e Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-10.png differ diff --git a/katabatic/doc/images/GCellConfiguration-11.fig b/katabatic/doc/images/GCellConfiguration-11.fig new file mode 100644 index 00000000..7344480f --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-11.fig @@ -0,0 +1,24 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 900 1575 90 90 810 1575 990 1575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 890 670 90 90 800 670 980 670 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 225 2925 225 2925 2250 0 2250 0 225 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2430 1125 2520 1125 2520 2025 2430 2025 2430 1125 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 1485 2565 1485 2565 1665 2385 1665 2385 1485 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2385 1575 990 1575 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 900 765 900 1485 +4 1 0 40 -1 18 12 0.0000 4 180 1335 900 495 _targetContact\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 1710 1755 Lt\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 1035 1170 Lt\001 diff --git a/katabatic/doc/images/GCellConfiguration-11.pdf b/katabatic/doc/images/GCellConfiguration-11.pdf new file mode 100644 index 00000000..f93833b1 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-11.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-11.png b/katabatic/doc/images/GCellConfiguration-11.png new file mode 100644 index 00000000..0aa990d6 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-11.png differ diff --git a/katabatic/doc/images/GCellConfiguration-12.fig b/katabatic/doc/images/GCellConfiguration-12.fig new file mode 100644 index 00000000..855304c2 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-12.fig @@ -0,0 +1,31 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 180 405 4410 1485 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1890 1350 90 90 1800 1350 1980 1350 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1890 675 90 90 1800 675 1980 675 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3375 1260 3555 1260 3555 1440 3375 1440 3375 1260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3375 1350 1980 1350 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 765 1890 1260 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1035 585 1215 585 1215 765 1035 765 1035 585 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1800 675 1260 675 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 225 720 225 630 1125 630 1125 720 225 720 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 3465 1395 3465 1305 4365 1305 4365 1395 3465 1395 +4 1 0 40 -1 18 12 0.0000 4 180 285 720 540 rp1\001 +4 1 0 40 -1 18 12 0.0000 4 180 285 3915 1215 rp2\001 +-6 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 225 4725 225 4725 1800 0 1800 0 225 diff --git a/katabatic/doc/images/GCellConfiguration-12.pdf b/katabatic/doc/images/GCellConfiguration-12.pdf new file mode 100644 index 00000000..38fefd9e Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-12.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-12.png b/katabatic/doc/images/GCellConfiguration-12.png new file mode 100644 index 00000000..effeae92 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-12.png differ diff --git a/katabatic/doc/images/GCellConfiguration-13.fig b/katabatic/doc/images/GCellConfiguration-13.fig new file mode 100644 index 00000000..6f170f76 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-13.fig @@ -0,0 +1,29 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 450 2025 90 90 360 2025 540 2025 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1125 2025 90 90 1035 2025 1215 2025 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 405 450 495 450 495 1350 405 1350 405 450 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 360 1260 540 1260 540 1440 360 1440 360 1260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 450 1440 450 1935 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1035 2025 540 2025 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1125 2385 1125 2115 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1035 2385 1215 2385 1215 2565 1035 2565 1035 2385 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 1080 2475 1170 2475 1170 3375 1080 3375 1080 2475 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 225 1800 225 1800 3600 0 3600 0 225 +4 1 0 40 -1 18 12 0.0000 4 180 285 720 900 rp1\001 +4 1 0 40 -1 18 12 0.0000 4 180 285 1395 2970 rp2\001 diff --git a/katabatic/doc/images/GCellConfiguration-13.pdf b/katabatic/doc/images/GCellConfiguration-13.pdf new file mode 100644 index 00000000..c38506f2 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-13.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-13.png b/katabatic/doc/images/GCellConfiguration-13.png new file mode 100644 index 00000000..3db5d3d1 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-13.png differ diff --git a/katabatic/doc/images/GCellConfiguration-14.fig b/katabatic/doc/images/GCellConfiguration-14.fig new file mode 100644 index 00000000..348653bc --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-14.fig @@ -0,0 +1,76 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 5220 2745 5400 2880 +4 1 18 30 -1 18 12 0.0000 4 135 150 5310 2880 G\001 +-6 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3825 1575 90 90 3735 1575 3915 1575 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 1575 1800 90 90 1485 1800 1665 1800 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 2700 2250 90 90 2610 2250 2790 2250 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 1125 90 90 2610 1125 2790 1125 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 2700 1800 90 90 2610 1800 2790 1800 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 3825 2700 90 90 3735 2700 3915 2700 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 3825 2250 90 90 3735 2250 3915 2250 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1350 90 90 1485 1350 1665 1350 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3825 1665 3825 2160 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4185 1575 3915 1575 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 1485 4365 1485 4365 1665 4185 1665 4185 1485 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 1125 4320 1125 4320 2025 4230 2025 4230 1125 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3735 2250 2790 2250 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2700 2160 2700 1890 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2610 1800 1665 1800 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1575 1710 1575 1440 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 1980 225 2070 225 2070 1125 1980 1125 1980 225 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1935 585 2115 585 2115 765 1935 765 1935 585 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1935 675 1665 675 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1575 765 1575 1260 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 3105 675 3195 675 3195 1575 3105 1575 3105 675 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 1035 3240 1035 3240 1215 3060 1215 3060 1035 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3060 1125 2790 1125 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2700 1215 2700 1710 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5175 0 5175 3600 0 3600 0 0 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 3150 2700 3150 2700 3600 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 1485 1350 -225 1350 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3825 2610 3825 2340 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 1575 1440 1575 1440 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 2700 1710 2700 1890 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 3825 2160 3825 2385 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 5400 2700 3915 2700 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 945 1575 3555 East+West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 2-3-0-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 1530 G\001 +4 1 0 40 -1 18 12 0.0000 4 180 1665 3825 3015 _northEastContact\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 1485 1215 _southWestContact\001 diff --git a/katabatic/doc/images/GCellConfiguration-14.pdf b/katabatic/doc/images/GCellConfiguration-14.pdf new file mode 100644 index 00000000..14ac6032 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-14.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-14.png b/katabatic/doc/images/GCellConfiguration-14.png new file mode 100644 index 00000000..6419620f Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-14.png differ diff --git a/katabatic/doc/images/GCellConfiguration-15.fig b/katabatic/doc/images/GCellConfiguration-15.fig new file mode 100644 index 00000000..ce0ba8b9 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-15.fig @@ -0,0 +1,22 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 665 670 90 90 575 670 755 670 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2250 1575 90 90 2160 1575 2340 1575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2250 675 90 90 2160 675 2340 675 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 765 2250 1485 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 675 765 675 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 2925 0 2925 2025 0 2025 0 0 +4 1 0 40 -1 18 12 0.0000 4 180 540 675 495 target\001 +4 1 0 40 -1 18 12 0.0000 4 105 600 2250 1845 source\001 +4 1 12 40 -1 18 12 0.0000 4 135 105 1440 630 L\001 +4 1 12 40 -1 18 12 0.0000 4 135 105 2340 1215 L\001 diff --git a/katabatic/doc/images/GCellConfiguration-15.pdf b/katabatic/doc/images/GCellConfiguration-15.pdf new file mode 100644 index 00000000..ea4ddd91 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-15.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-15.png b/katabatic/doc/images/GCellConfiguration-15.png new file mode 100644 index 00000000..586b696b Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-15.png differ diff --git a/katabatic/doc/images/GCellConfiguration-16.fig b/katabatic/doc/images/GCellConfiguration-16.fig new file mode 100644 index 00000000..f1d7de0d --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-16.fig @@ -0,0 +1,22 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 665 670 90 90 575 670 755 670 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2250 1575 90 90 2160 1575 2340 1575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 675 1575 90 90 585 1575 765 1575 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 2925 0 2925 2025 0 2025 0 0 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 1575 765 1575 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 675 765 675 1485 +4 1 0 40 -1 18 12 0.0000 4 180 540 675 495 target\001 +4 1 0 40 -1 18 12 0.0000 4 105 600 2250 1845 source\001 +4 1 12 40 -1 18 12 0.0000 4 135 105 1575 1530 L\001 +4 1 12 40 -1 18 12 0.0000 4 135 105 765 1170 L\001 diff --git a/katabatic/doc/images/GCellConfiguration-16.pdf b/katabatic/doc/images/GCellConfiguration-16.pdf new file mode 100644 index 00000000..aaf748a2 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-16.pdf @@ -0,0 +1,72 @@ +%PDF-1.3 +%Çì¢ +5 0 obj +<> +stream +xœ•TÍrÔ0 ¾û)t,‡ +Ë–lùÚ†K/-y&, ;nËðú(k[)ˉÉ!Ñéûqì^ß-?B+˜‹™¹UÁ˜-Ãò%ܼ<ý:¯‡íõ‡%<ü³%ÿªÿ׎ +‹Û Iøbç~“º¸}@[ÔRK¹8¹wŒ5Ù¦³¯‡BE£¢¤œ Pªv&Î[·‡ð%†Ûúendstream +endobj +6 0 obj +455 +endobj +4 0 obj +<> +/Contents 5 0 R +>> +endobj +3 0 obj +<< /Type /Pages /Kids [ +4 0 R +] /Count 1 +>> +endobj +1 0 obj +<> +endobj +7 0 obj +<>endobj +9 0 obj +<> +endobj +10 0 obj +<> +endobj +8 0 obj +<> +endobj +2 0 obj +<>endobj +xref +0 11 +0000000000 65535 f +0000000768 00000 n +0000000985 00000 n +0000000709 00000 n +0000000559 00000 n +0000000015 00000 n +0000000540 00000 n +0000000816 00000 n +0000000916 00000 n +0000000857 00000 n +0000000886 00000 n +trailer +<< /Size 11 /Root 1 0 R /Info 2 0 R +/ID [(á]01¡”ÏÝ9­r.)(á]01¡”ÏÝ9­r.)] +>> +startxref +1096 +%%EOF diff --git a/katabatic/doc/images/GCellConfiguration-16.png b/katabatic/doc/images/GCellConfiguration-16.png new file mode 100644 index 00000000..dfbe7bb8 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-16.png differ diff --git a/katabatic/doc/images/GCellConfiguration-17.fig b/katabatic/doc/images/GCellConfiguration-17.fig new file mode 100644 index 00000000..b6d79a4d --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-17.fig @@ -0,0 +1,458 @@ +#FIG 3.2 +Portrait +Center +Metric +A4 +55.00 +Single +-2 +1200 2 +6 -270 22230 5490 26370 +6 4140 23355 4410 24345 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 23760 4365 23760 4365 23940 4185 23940 4185 23760 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 23400 4320 23400 4320 24300 4230 24300 4230 23400 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 24525 90 90 2835 24525 3015 24525 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 22500 5175 22500 5175 26100 0 26100 0 22500 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 25650 4050 25650 4050 26100 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2250 25155 3825 25155 3825 25245 2250 25245 2250 25155 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2835 25110 3015 25110 3015 25290 2835 25290 2835 25110 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 25110 2925 24615 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 2115 23850 3510 23850 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 4185 23850 3690 23850 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3600 24615 3600 26325 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 2025 22275 2025 23085 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3015 24525 3510 24525 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 3690 24615 3510 24615 3510 23760 3690 23760 3690 24615 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 5400 23175 2115 23175 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 2115 23940 1935 23940 1935 23085 2115 23085 2115 23940 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3510 24300 -225 24300 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 3510 24210 3690 24210 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 26055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 25830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 25830 4-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 2175 1575 26055 North+South+East+West\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 3915 23805 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 3060 24930 Lt\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 1890 23715 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 1890 22410 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3510 26325 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 3735 24660 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5355 23130 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 24525 G\001 +-6 +6 -270 17730 5445 21600 +6 4140 18405 4410 19395 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 18810 4365 18810 4365 18990 4185 18990 4185 18810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 18450 4320 18450 4320 19350 4230 19350 4230 18450 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 19575 90 90 2835 19575 3015 19575 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 3600 20700 90 90 3510 20700 3690 20700 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 18000 5175 18000 5175 21600 0 21600 0 18000 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 21150 3375 21150 3375 21600 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3600 17775 3600 18810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2250 20205 3825 20205 3825 20295 2250 20295 2250 20205 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2835 20160 3015 20160 3015 20340 2835 20340 2835 20160 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 20160 2925 19665 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 4185 18900 3690 18900 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3015 19575 3510 19575 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 3690 19665 3510 19665 3510 18810 3690 18810 3690 19665 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 5400 19575 3690 19575 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3600 19665 3600 20610 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + -225 20700 3510 20700 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 3510 19260 3690 19260 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 21555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 21330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 21330 3-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 1545 1575 21555 North+East+West\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3510 17910 G\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 3915 18855 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 3060 19980 Lt\001 +4 0 0 40 -1 18 12 0.0000 4 180 1665 3780 19800 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5310 19530 G\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 3420 20610 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -180 20655 G\001 +-6 +6 5805 18000 11565 21870 +6 10215 18855 10485 19845 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 19260 10440 19260 10440 19440 10260 19440 10260 19260 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 10305 18900 10395 18900 10395 19800 10305 19800 10305 18900 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 9000 20025 90 90 8910 20025 9090 20025 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 6075 18000 11250 18000 11250 21600 6075 21600 6075 18000 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 6075 21150 9450 21150 9450 21600 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8325 20655 9900 20655 9900 20745 8325 20745 8325 20655 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 20610 9090 20610 9090 20790 8910 20790 8910 20610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 9000 20610 9000 20115 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 10260 19350 9765 19350 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 9675 20115 9675 21825 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 9090 20025 9585 20025 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 9765 20115 9585 20115 9585 19260 9765 19260 9765 20115 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 9585 19800 5850 19800 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 9765 18540 9585 18540 9585 18360 9765 18360 9765 18540 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 9675 18540 9675 19260 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 11475 18450 9765 18450 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 9585 19710 9765 19710 +4 0 0 30 -1 18 12 0.0000 4 135 615 6120 21555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 21330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7650 21330 3-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 1575 7650 21555 South+East+West\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 9990 19305 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 9135 20430 Lt\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 9585 21825 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 9810 20160 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5940 19710 G\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 9495 18495 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 11385 18360 G\001 +-6 +6 -270 13230 5490 17370 +6 4140 14355 4410 15345 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 14760 4365 14760 4365 14940 4185 14940 4185 14760 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 14400 4320 14400 4320 15300 4230 15300 4230 14400 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2025 14850 90 90 1935 14850 2115 14850 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 15525 90 90 2835 15525 3015 15525 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 13500 5175 13500 5175 17100 0 17100 0 13500 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 16650 3375 16650 3375 17100 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2250 16155 3825 16155 3825 16245 2250 16245 2250 16155 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2835 16110 3015 16110 3015 16290 2835 16290 2835 16110 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 16110 2925 15615 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 2115 14850 3510 14850 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 4185 14850 3690 14850 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3600 15615 3600 17325 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 2025 13275 2025 14760 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3015 15525 3510 15525 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 3690 15615 3510 15615 3510 14760 3690 14760 3690 15615 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3510 15300 -225 15300 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 3510 15255 3690 15255 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 17055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 16830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 16830 3-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 1665 1575 17055 North+South+West\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 3915 14805 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 3060 15930 Lt\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 1890 14715 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 1890 13410 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3510 17325 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 3735 15660 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -180 15255 G\001 +-6 +6 6075 13230 11565 17370 +6 10215 14355 10485 15345 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 14760 10440 14760 10440 14940 10260 14940 10260 14760 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 10305 14400 10395 14400 10395 15300 10305 15300 10305 14400 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 9000 15525 90 90 8910 15525 9090 15525 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 6075 13500 11250 13500 11250 17100 6075 17100 6075 13500 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 6075 16650 9450 16650 9450 17100 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8325 16155 9900 16155 9900 16245 8325 16245 8325 16155 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 16110 9090 16110 9090 16290 8910 16290 8910 16110 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 9000 16110 9000 15615 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 8190 14850 9585 14850 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 10260 14850 9765 14850 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 9675 15615 9675 17325 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 8100 13275 8100 14085 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 9090 15525 9585 15525 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 9765 15615 9585 15615 9585 14760 9765 14760 9765 15615 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 11475 14175 8190 14175 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 8190 14940 8010 14940 8010 14085 8190 14085 8190 14940 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 9585 15210 9765 15210 +4 0 0 30 -1 18 12 0.0000 4 135 615 6120 17055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 16830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7650 16830 3-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 1635 7650 17055 North+South+East\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 9990 14805 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 9135 15930 Lt\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 7965 14715 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 7965 13410 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 9585 17325 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 9810 15660 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 11430 14130 G\001 +-6 +6 -270 9000 5490 12600 +6 4140 9855 4410 10845 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 10260 4365 10260 4365 10440 4185 10440 4185 10260 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 9900 4320 9900 4320 10800 4230 10800 4230 9900 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 9720 90 90 2835 9720 3015 9720 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3590 10345 90 90 3500 10345 3680 10345 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 9000 5175 9000 5175 12600 0 12600 0 9000 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 12150 3375 12150 3375 12600 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 2835 11025 -225 11025 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2250 11655 3825 11655 3825 11745 2250 11745 2250 11655 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2835 11610 3015 11610 3015 11790 2835 11790 2835 11610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 11610 2925 11115 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 5445 9720 3015 9720 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 2925 9810 2925 10935 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 4185 10350 3690 10350 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3600 10440 3600 10935 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 3690 11115 2835 11115 2835 10935 3690 10935 3690 11115 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 3285 10935 3285 11115 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 12555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 12330 Configuration:\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 10980 G\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 12330 2-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 945 1575 12555 West+East\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 3915 10305 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 3060 11430 Lt\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 2745 10935 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5355 9675 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1665 2925 9540 _northEastContact\001 +4 0 12 40 -1 18 12 0.0000 4 135 180 3645 10755 Lt\001 +-6 +6 6075 8730 11565 12870 +6 10215 9855 10485 10845 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 10260 10440 10260 10440 10440 10260 10440 10260 10260 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 10305 9900 10395 9900 10395 10800 10305 10800 10305 9900 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 8100 10350 90 90 8010 10350 8190 10350 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 9000 11025 90 90 8910 11025 9090 11025 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 6075 9000 11250 9000 11250 12600 6075 12600 6075 9000 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 6075 12150 9450 12150 9450 12600 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8325 11655 9900 11655 9900 11745 8325 11745 8325 11655 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 11610 9090 11610 9090 11790 8910 11790 8910 11610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 9000 11610 9000 11115 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 8190 10350 9585 10350 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 10260 10350 9765 10350 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 9675 11115 9675 12825 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 8100 8775 8100 10260 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 9090 11025 9585 11025 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 9765 11115 9585 11115 9585 10260 9765 10260 9765 11115 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 9585 10710 9765 10710 +4 0 0 30 -1 18 12 0.0000 4 135 615 6120 12555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 12330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7650 12330 2-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 1125 7650 12555 North+South\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 9990 10305 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 9135 11430 Lt\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 7965 10215 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 7965 8910 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 9585 12825 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 9810 11160 _southWestContact\001 +-6 +6 -270 4500 5175 8100 +6 4140 5355 4410 6345 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 5760 4365 5760 4365 5940 4185 5940 4185 5760 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 5400 4320 5400 4320 6300 4230 6300 4230 5400 +-6 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3600 5850 90 90 3510 5850 3690 5850 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 4500 5175 4500 5175 8100 0 8100 0 4500 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 7650 3375 7650 3375 8100 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 2835 6525 -225 6525 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 4185 5850 3690 5850 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3600 5940 3600 6435 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2250 7155 3825 7155 3825 7245 2250 7245 2250 7155 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2835 7110 3015 7110 3015 7290 2835 7290 2835 7110 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 7110 2925 6615 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 3735 6615 2835 6615 2835 6435 3735 6435 3735 6615 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 3285 6435 3285 6615 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 8055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 7830 Configuration:\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 6480 G\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 7830 1-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 435 1575 8055 West\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 3915 5805 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 3060 6930 Lt\001 +4 0 12 40 -1 18 12 0.0000 4 135 180 3645 6255 Lt\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 2745 6435 _southWestContact\001 +-6 +6 6075 4500 11250 8370 +6 10215 5355 10485 6345 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 5760 10440 5760 10440 5940 10260 5940 10260 5760 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 10305 5400 10395 5400 10395 6300 10305 6300 10305 5400 +-6 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 9675 6615 9675 8325 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 6075 4500 11250 4500 11250 8100 6075 8100 6075 4500 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 6075 7650 9450 7650 9450 8100 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 10260 5850 9765 5850 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8325 7155 9900 7155 9900 7245 8325 7245 8325 7155 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 7110 9090 7110 9090 7290 8910 7290 8910 7110 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 9000 7110 9000 6615 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 9765 5760 9585 5760 9585 6615 9765 6615 9765 5760 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 9090 6435 8910 6435 8910 6615 9090 6615 9090 6435 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 9585 6525 9090 6525 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 9585 6210 9765 6210 +4 0 0 30 -1 18 12 0.0000 4 135 615 6120 8055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 7830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7650 7830 1-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 525 7650 8055 South\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 9990 5805 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 9135 6930 Lt\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 9810 8280 G\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 9495 5850 _southWestContact\001 +-6 +6 -270 26730 5490 30600 +6 4140 27855 4410 28845 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 28260 4365 28260 4365 28440 4185 28440 4185 28260 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 27900 4320 27900 4320 28800 4230 28800 4230 27900 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 29025 90 90 2835 29025 3015 29025 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 27000 5175 27000 5175 30600 0 30600 0 27000 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 30150 4050 30150 4050 30600 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2250 29655 3825 29655 3825 29745 2250 29745 2250 29655 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2835 29610 3015 29610 3015 29790 2835 29790 2835 29610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 29610 2925 29115 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 4185 28350 3690 28350 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3015 29025 3510 29025 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 3690 29115 3510 29115 3510 28260 3690 28260 3690 29115 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3510 28800 -225 28800 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 3510 28710 3690 28710 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3600 26775 3600 28260 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 30555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 30330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 30330 2-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 1035 1575 30555 North+West\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 3915 28305 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 3060 29430 Lt\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 3735 29160 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5355 27630 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 29025 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3465 26910 G\001 +-6 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 1 + -990 25695 diff --git a/katabatic/doc/images/GCellConfiguration-17.pdf b/katabatic/doc/images/GCellConfiguration-17.pdf new file mode 100644 index 00000000..93348df5 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-17.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-17.png b/katabatic/doc/images/GCellConfiguration-17.png new file mode 100644 index 00000000..e1777537 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-17.png differ diff --git a/katabatic/doc/images/GCellConfiguration-18.fig b/katabatic/doc/images/GCellConfiguration-18.fig new file mode 100644 index 00000000..f3bae363 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-18.fig @@ -0,0 +1,123 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 675 3870 3375 4500 +6 675 3870 3375 4500 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 890 4090 90 90 800 4090 980 4090 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 675 3870 3375 3870 3375 4500 +4 0 0 30 -1 18 12 0.0000 4 180 930 2250 4410 G: "global"\001 +4 0 0 30 -1 18 12 0.0000 4 135 1095 1125 4140 AutoContact\001 +4 0 0 30 -1 18 12 0.0000 4 135 780 1125 4410 L: "local"\001 +-6 +-6 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1125 2025 90 90 1035 2025 1215 2025 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2025 2025 90 90 1935 2025 2115 2025 +1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 2025 2475 90 90 1935 2475 2115 2475 +1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 3150 2475 90 90 3060 2475 3240 2475 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2025 1350 90 90 1935 1350 2115 1350 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3150 1800 90 90 3060 1800 3240 1800 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3150 3150 90 90 3060 3150 3240 3150 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 5175 3150 90 90 5085 3150 5265 3150 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1215 2025 1935 2025 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 450 4950 450 4950 3600 1575 3600 1575 450 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3060 2475 2115 2475 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 2115 2025 2385 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 1440 2025 1935 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 1890 3150 2385 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 2565 3150 3060 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3240 3150 5085 3150 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5850 450 9900 450 9900 3600 5850 3600 5850 450 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 9225 3105 10125 3105 10125 3195 9225 3195 9225 3105 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 6930 900 7020 900 7020 1800 6930 1800 6930 900 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8055 1350 8145 1350 8145 2250 8055 2250 8055 1350 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 6975 1080 7470 1080 7470 1170 6975 1170 6975 1080 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 6975 1980 8100 1980 8100 2070 6975 2070 6975 1980 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 7380 1125 7470 1125 7470 2475 7380 2475 7380 1125 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 5625 2430 7425 2430 7425 2520 5625 2520 5625 2430 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 6930 2025 7020 2025 7020 2925 6930 2925 6930 2025 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 7380 2475 7470 2475 7470 2925 7380 2925 7380 2475 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 9180 2925 9270 2925 9270 3150 9180 3150 9180 2925 +2 2 0 2 18 7 40 -1 45 0.000 0 0 -1 0 0 5 + 7425 2880 9225 2880 9225 2970 7425 2970 7425 2880 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 7065 2925 7335 2925 +2 4 0 1 18 7 30 -1 -1 0.000 0 0 7 0 0 5 + 7650 3060 7650 2790 6750 2790 6750 3060 7650 3060 +2 1 0 1 18 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 7200 3240 7200 2925 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 675 0 10350 0 10350 4500 675 4500 675 0 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 2115 1350 2160 1350 2610 1350 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 3240 1800 3285 1800 3735 1800 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2655 900 2745 900 2745 1800 2655 1800 2655 900 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2610 1260 2790 1260 2790 1440 2610 1440 2610 1260 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 3780 1350 3870 1350 3870 2250 3780 2250 3780 1350 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3735 1710 3915 1710 3915 1890 3735 1890 3735 1710 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 1035 7515 1035 7515 1215 7335 1215 7335 1035 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6885 1935 7065 1935 7065 2115 6885 2115 6885 1935 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 2835 7515 2835 7515 3015 7335 3015 7335 2835 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 9135 2835 9315 2835 9315 3015 9135 3015 9135 2835 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 9135 3060 9315 3060 9315 3240 9135 3240 9135 3060 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 2385 7515 2385 7515 2565 7335 2565 7335 2385 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6885 1035 7065 1035 7065 1215 6885 1215 6885 1035 +4 1 12 40 -1 18 12 0.0000 4 135 255 1350 2205 G1\001 +4 1 18 40 -1 18 12 0.0000 4 135 210 2610 2655 L4\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 2385 1305 L1\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 2160 1755 L2\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 3510 1755 L5\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 3285 2205 L6\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 10035 3060 G2\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 4680 3375 G2\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 5715 2700 G1\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 7245 1035 L1\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 7605 1575 L2\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 7740 2250 L5\001 +4 1 18 40 -1 18 12 0.0000 4 135 210 8325 3150 L4\001 +4 1 18 40 -1 18 12 0.0000 4 150 315 7200 3375 gap\001 +4 1 0 30 -1 14 12 0.0000 4 120 2205 3375 270 AutoContact Structure\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 7875 225 Physical Mapping\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 2160 2340 L3\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 3285 2880 L7\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 7605 2745 L3\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 9450 3060 L7\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 6795 2340 L6\001 diff --git a/katabatic/doc/images/GCellConfiguration-18.pdf b/katabatic/doc/images/GCellConfiguration-18.pdf new file mode 100644 index 00000000..2508ed72 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-18.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-18.png b/katabatic/doc/images/GCellConfiguration-18.png new file mode 100644 index 00000000..1b6cbda2 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-18.png differ diff --git a/katabatic/doc/images/GCellConfiguration-19.fig b/katabatic/doc/images/GCellConfiguration-19.fig new file mode 100644 index 00000000..769c42c0 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-19.fig @@ -0,0 +1,119 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 675 3870 3375 4500 +6 675 3870 3375 4500 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 890 4090 90 90 800 4090 980 4090 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 675 3870 3375 3870 3375 4500 +4 0 0 30 -1 18 12 0.0000 4 180 930 2250 4410 G: "global"\001 +4 0 0 30 -1 18 12 0.0000 4 135 1095 1125 4140 AutoContact\001 +4 0 0 30 -1 18 12 0.0000 4 135 780 1125 4410 L: "local"\001 +-6 +-6 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1125 2025 90 90 1035 2025 1215 2025 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2025 2025 90 90 1935 2025 2115 2025 +1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 2025 2475 90 90 1935 2475 2115 2475 +1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 3150 2475 90 90 3060 2475 3240 2475 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2025 1350 90 90 1935 1350 2115 1350 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3150 1800 90 90 3060 1800 3240 1800 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3150 3150 90 90 3060 3150 3240 3150 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 5175 3150 90 90 5085 3150 5265 3150 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1215 2025 1935 2025 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 450 4950 450 4950 3600 1575 3600 1575 450 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3060 2475 2115 2475 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 2115 2025 2385 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 1440 2025 1935 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 1890 3150 2385 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 2565 3150 3060 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3240 3150 5085 3150 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5850 450 9900 450 9900 3600 5850 3600 5850 450 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 6930 900 7020 900 7020 1800 6930 1800 6930 900 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8055 1350 8145 1350 8145 2250 8055 2250 8055 1350 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 6975 1080 7470 1080 7470 1170 6975 1170 6975 1080 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 6975 1980 8100 1980 8100 2070 6975 2070 6975 1980 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 7380 1125 7470 1125 7470 2475 7380 2475 7380 1125 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 5625 2430 7425 2430 7425 2520 5625 2520 5625 2430 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 6930 2025 7020 2025 7020 2925 6930 2925 6930 2025 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 7380 2475 7470 2475 7470 2925 7380 2925 7380 2475 +2 4 0 1 18 7 30 -1 -1 0.000 0 0 7 0 0 5 + 7650 3060 7650 2790 6750 2790 6750 3060 7650 3060 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 675 0 10350 0 10350 4500 675 4500 675 0 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 2115 1350 2160 1350 2610 1350 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 3240 1800 3285 1800 3735 1800 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2655 900 2745 900 2745 1800 2655 1800 2655 900 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2610 1260 2790 1260 2790 1440 2610 1440 2610 1260 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 3780 1350 3870 1350 3870 2250 3780 2250 3780 1350 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3735 1710 3915 1710 3915 1890 3735 1890 3735 1710 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 1035 7515 1035 7515 1215 7335 1215 7335 1035 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6885 1935 7065 1935 7065 2115 6885 2115 6885 1935 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 2835 7515 2835 7515 3015 7335 3015 7335 2835 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 2385 7515 2385 7515 2565 7335 2565 7335 2385 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6885 1035 7065 1035 7065 1215 6885 1215 6885 1035 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 2385 3150 2565 +2 2 0 2 18 7 40 -1 45 0.000 0 0 -1 0 0 5 + 7425 2880 6975 2880 6975 2970 7425 2970 7425 2880 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6885 2835 7065 2835 7065 3015 6885 3015 6885 2835 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 6930 2925 7020 2925 7020 3150 6930 3150 6930 2925 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6885 3060 7065 3060 7065 3240 6885 3240 6885 3060 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 6975 3105 10125 3105 10125 3195 6975 3195 6975 3105 +4 1 12 40 -1 18 12 0.0000 4 135 255 1350 2205 G1\001 +4 1 18 40 -1 18 12 0.0000 4 135 210 2610 2655 L4\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 2385 1305 L1\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 2160 1755 L2\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 3510 1755 L5\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 3285 2205 L6\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 3285 2880 L7\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 10035 3060 G2\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 4680 3375 G2\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 5715 2700 G1\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 7245 1035 L1\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 7605 1575 L2\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 7740 2250 L5\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 6795 2250 L6\001 +4 1 0 30 -1 14 12 0.0000 4 120 2205 3375 270 AutoContact Structure\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 7875 225 Physical Mapping\001 +4 1 18 40 -1 18 12 0.0000 4 135 210 7200 2745 L4\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 6615 3105 L7\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 2160 2340 L3\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 7605 2790 L3\001 diff --git a/katabatic/doc/images/GCellConfiguration-19.pdf b/katabatic/doc/images/GCellConfiguration-19.pdf new file mode 100644 index 00000000..99e7f269 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-19.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-19.png b/katabatic/doc/images/GCellConfiguration-19.png new file mode 100644 index 00000000..08cd38a1 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-19.png differ diff --git a/katabatic/doc/images/GCellConfiguration-2.fig b/katabatic/doc/images/GCellConfiguration-2.fig new file mode 100644 index 00000000..ca0ba438 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-2.fig @@ -0,0 +1,70 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 675 3195 3375 3825 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 890 3415 90 90 800 3415 980 3415 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 675 3195 3375 3195 3375 3825 +4 0 0 30 -1 18 12 0.0000 4 180 930 2250 3735 G: "global"\001 +4 0 0 30 -1 18 12 0.0000 4 135 1095 1125 3465 AutoContact\001 +4 0 0 30 -1 18 12 0.0000 4 135 780 1125 3735 L: "local"\001 +-6 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 1350 90 90 2610 1350 2790 1350 +1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 2700 2025 90 90 2610 2025 2790 2025 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1125 2025 90 90 1035 2025 1215 2025 +1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 2700 2475 90 90 2610 2475 2790 2475 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3600 2475 90 90 3510 2475 3690 2475 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2025 900 2115 900 2115 1800 2025 1800 2025 900 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1980 1260 2160 1260 2160 1440 1980 1440 1980 1260 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2160 1350 2610 1350 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 1440 2700 1935 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1215 2025 2610 2025 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5130 900 5220 900 5220 1800 5130 1800 5130 900 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 450 3150 450 3150 2925 1575 2925 1575 450 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2790 2475 3510 2475 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 2385 2700 2115 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 5625 1350 5715 1350 5715 2250 5625 2250 5625 1350 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 5175 1305 5670 1305 5670 1395 5175 1395 5175 1305 +2 2 0 2 18 7 40 -1 45 0.000 0 0 -1 0 0 5 + 6030 675 6120 675 6120 2250 6030 2250 6030 675 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 4500 2205 6075 2205 6075 2295 4500 2295 4500 2205 +2 4 0 1 18 7 30 -1 -1 0.000 0 0 7 0 0 5 + 6255 2430 6255 495 5895 495 5895 2430 6255 2430 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 6075 630 6975 630 6975 720 6075 720 6075 630 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 4725 450 6750 450 6750 2925 4725 2925 4725 450 +2 4 0 1 18 7 30 -1 -1 0.000 0 0 7 0 0 5 + 6210 2385 6210 2115 5535 2115 5535 2385 6210 2385 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 675 0 7200 0 7200 3825 675 3825 675 0 +4 1 12 40 -1 18 12 0.0000 4 135 210 2385 1305 L1\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 4590 2475 G1\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 5445 1260 L1\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 1350 2205 G1\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 2835 1755 L2\001 +4 1 0 30 -1 14 12 0.0000 4 120 2205 2340 270 AutoContact Structure\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 3375 2700 G2\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 5490 1845 L2\001 +4 1 18 40 -1 18 12 0.0000 4 135 210 2835 2340 L3\001 +4 1 12 40 -1 18 12 0.0000 4 135 255 6885 585 G2\001 +4 1 18 40 -1 18 12 0.0000 4 135 210 6390 1530 L3\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 5715 225 Physical Mapping\001 diff --git a/katabatic/doc/images/GCellConfiguration-2.pdf b/katabatic/doc/images/GCellConfiguration-2.pdf new file mode 100644 index 00000000..3a6ad533 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-2.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-2.png b/katabatic/doc/images/GCellConfiguration-2.png new file mode 100644 index 00000000..02121a5e Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-2.png differ diff --git a/katabatic/doc/images/GCellConfiguration-20.fig b/katabatic/doc/images/GCellConfiguration-20.fig new file mode 100644 index 00000000..f86dc05f --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-20.fig @@ -0,0 +1,66 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 2250 1800 90 90 2160 1800 2340 1800 +1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 3375 1800 90 90 3285 1800 3465 1800 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 450 4050 450 4050 3150 1575 3150 1575 450 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3285 1800 2340 1800 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2250 1125 2250 1710 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3375 1125 3375 1710 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3375 1890 3375 2475 +2 2 0 2 18 7 40 -1 45 0.000 0 0 -1 0 0 5 + 5850 1755 7650 1755 7650 1845 5850 1845 5850 1755 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5760 1710 5940 1710 5940 1890 5760 1890 5760 1710 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7560 1710 7740 1710 7740 1890 7560 1890 7560 1710 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 5805 900 5895 900 5895 1800 5805 1800 5805 900 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 4905 900 4995 900 4995 1800 4905 1800 4905 900 +2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 + 7605 1800 7695 1800 7695 2700 7605 2700 7605 1800 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 4500 450 8100 450 8100 3150 4500 3150 4500 450 +2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5085 1800 5670 1800 +2 1 0 1 18 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5400 720 5400 1755 +2 1 0 1 18 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6300 2700 4950 1800 +2 1 0 1 18 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6300 2700 7560 1890 +2 1 0 1 18 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6975 945 5940 1710 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 1125 0 8550 0 8550 3600 1125 3600 1125 0 +4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 +4 1 18 40 -1 18 12 0.0000 4 135 210 2835 1980 L4\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 3510 1530 L6\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 2385 1665 L3\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 3510 2205 L7\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 1935 1890 AC1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 3690 1890 AC2\001 +4 1 18 40 -1 18 12 0.0000 4 135 210 6750 2025 L4\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 6030 1620 L3\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 7830 2115 L7\001 +4 1 12 40 -1 18 12 0.0000 4 135 210 4770 1215 L6\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 6300 225 Physical Mapping\001 +4 1 18 40 -1 18 12 0.0000 4 150 315 5400 675 gap\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 6975 900 AC1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 6300 2925 AC2\001 diff --git a/katabatic/doc/images/GCellConfiguration-20.pdf b/katabatic/doc/images/GCellConfiguration-20.pdf new file mode 100644 index 00000000..67d77e35 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-20.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-20.png b/katabatic/doc/images/GCellConfiguration-20.png new file mode 100644 index 00000000..af8117ee Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-20.png differ diff --git a/katabatic/doc/images/GCellConfiguration-21.fig b/katabatic/doc/images/GCellConfiguration-21.fig new file mode 100644 index 00000000..4510ae6b --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-21.fig @@ -0,0 +1,92 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 0 -270 5175 3870 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 1125 90 90 3735 1125 3915 1125 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5175 0 5175 3600 0 3600 0 0 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 3150 2925 3150 2925 3600 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2610 2385 2790 2385 2790 2565 2610 2565 2610 2385 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2655 2025 2745 2025 2745 2925 2655 2925 2655 2025 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 405 675 495 675 495 1575 405 1575 405 675 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 360 1035 540 1035 540 1215 360 1215 360 1035 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 1530 1350 1620 1350 1620 2250 1530 2250 1530 1350 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1485 1710 1665 1710 1665 1890 1485 1890 1485 1710 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3060 1125 540 1125 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3060 1800 1665 1800 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3060 2475 2790 2475 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 + 3240 2565 3240 1035 3060 1035 3060 2565 3240 2565 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 3150 3825 3150 2565 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3735 1125 3240 1125 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 3825 1035 3825 -225 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1125 1575 3555 North+South\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 2-3-0-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3960 -90 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3285 3825 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 3285 2610 _southWestContact\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 3735 945 _northEastContact\001 +-6 +6 5805 -270 11250 3870 +6 7515 630 9180 1620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7605 675 7695 675 7695 1575 7605 1575 7605 675 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7560 1035 7740 1035 7740 1215 7560 1215 7560 1035 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9135 1125 7740 1125 +-6 +6 8640 1305 9180 2295 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8685 1710 8865 1710 8865 1890 8685 1890 8685 1710 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8730 1350 8820 1350 8820 2250 8730 2250 8730 1350 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9135 1800 8865 1800 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 9900 1125 90 90 9810 1125 9990 1125 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 6075 0 11250 0 11250 3600 6075 3600 6075 0 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 6075 3150 9675 3150 9675 3600 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 + 9315 2565 9315 1035 9135 1035 9135 2565 9315 2565 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 9225 3825 9225 2565 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9810 1125 9315 1125 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 9900 1035 9900 -225 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 9135 2475 5850 2475 +4 0 0 30 -1 18 12 0.0000 4 135 615 6120 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1665 7650 3555 North+South+West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7650 3330 3-2-0-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 10035 -90 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 9360 3825 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 9360 2610 _southWestContact\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 9810 945 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5895 2700 G\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-21.pdf b/katabatic/doc/images/GCellConfiguration-21.pdf new file mode 100644 index 00000000..4cd1519e Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-21.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-21.png b/katabatic/doc/images/GCellConfiguration-21.png new file mode 100644 index 00000000..80343814 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-21.png differ diff --git a/katabatic/doc/images/GCellConfiguration-22.fig b/katabatic/doc/images/GCellConfiguration-22.fig new file mode 100644 index 00000000..d9ace215 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-22.fig @@ -0,0 +1,96 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 0 -270 5445 3870 +6 1440 630 3105 1620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 1530 675 1620 675 1620 1575 1530 1575 1530 675 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1485 1035 1665 1035 1665 1215 1485 1215 1485 1035 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3060 1125 1665 1125 +-6 +6 2565 1305 3105 2295 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2610 1710 2790 1710 2790 1890 2610 1890 2610 1710 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2655 1350 2745 1350 2745 2250 2655 2250 2655 1350 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3060 1800 2790 1800 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 1125 90 90 3735 1125 3915 1125 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5175 0 5175 3600 0 3600 0 0 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 3150 3600 3150 3600 3600 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 + 3240 2565 3240 1035 3060 1035 3060 2565 3240 2565 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 3150 3825 3150 2565 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3735 1125 3240 1125 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 3825 1035 3825 -225 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 5400 1125 3915 1125 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1635 1575 3555 North+South+East\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 3-2-0-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3960 -90 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3285 3825 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 3285 2610 _southWestContact\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 3735 945 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5310 1350 G\001 +-6 +6 5805 -270 11520 3870 +6 7515 630 9180 1620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7605 675 7695 675 7695 1575 7605 1575 7605 675 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7560 1035 7740 1035 7740 1215 7560 1215 7560 1035 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9135 1125 7740 1125 +-6 +6 8640 1305 9180 2295 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8685 1710 8865 1710 8865 1890 8685 1890 8685 1710 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8730 1350 8820 1350 8820 2250 8730 2250 8730 1350 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9135 1800 8865 1800 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 9900 1125 90 90 9810 1125 9990 1125 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 6075 0 11250 0 11250 3600 6075 3600 6075 0 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 6075 3150 10125 3150 10125 3600 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 + 9315 2565 9315 1035 9135 1035 9135 2565 9315 2565 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 9225 3825 9225 2565 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9810 1125 9315 1125 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 9900 1035 9900 -225 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 9135 2475 5850 2475 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 11475 1125 9990 1125 +4 0 0 30 -1 18 12 0.0000 4 135 615 6120 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 2175 7650 3555 North+South+West+East\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7650 3330 4-2-0-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 10035 -90 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 9360 3825 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 9360 2610 _southWestContact\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 9810 945 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5895 2700 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 11385 1350 G\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-22.pdf b/katabatic/doc/images/GCellConfiguration-22.pdf new file mode 100644 index 00000000..9c7d54d1 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-22.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-22.png b/katabatic/doc/images/GCellConfiguration-22.png new file mode 100644 index 00000000..1370d722 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-22.png differ diff --git a/katabatic/doc/images/GCellConfiguration-23.fig b/katabatic/doc/images/GCellConfiguration-23.fig new file mode 100644 index 00000000..37cbdf0d --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-23.fig @@ -0,0 +1,91 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 1440 630 3105 1620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 1530 675 1620 675 1620 1575 1530 1575 1530 675 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1485 1035 1665 1035 1665 1215 1485 1215 1485 1035 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3060 1125 1665 1125 +-6 +6 2565 1305 3105 2295 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2610 1710 2790 1710 2790 1890 2610 1890 2610 1710 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2655 1350 2745 1350 2745 2250 2655 2250 2655 1350 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3060 1800 2790 1800 +-6 +6 7515 180 9180 1170 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7605 225 7695 225 7695 1125 7605 1125 7605 225 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7560 585 7740 585 7740 765 7560 765 7560 585 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9135 675 7740 675 +-6 +6 8640 855 9180 1845 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8685 1260 8865 1260 8865 1440 8685 1440 8685 1260 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8730 900 8820 900 8820 1800 8730 1800 8730 900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9135 1350 8865 1350 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3150 450 90 90 3060 450 3240 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 9225 2925 90 90 9135 2925 9315 2925 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5175 0 5175 3600 0 3600 0 0 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 3150 3600 3150 3600 3600 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 3060 2475 -225 2475 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3150 540 3150 1035 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 + 3240 2565 3240 1035 3060 1035 3060 2565 3240 2565 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 3150 3825 3150 2565 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 5400 450 3240 450 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 6075 0 11250 0 11250 3600 6075 3600 6075 0 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 6075 3150 9675 3150 9675 3600 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 11475 1125 9315 1125 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 5850 2925 9135 2925 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 + 9315 2115 9315 585 9135 585 9135 2115 9315 2115 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9225 2835 9225 585 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 9225 585 9225 -225 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3150 1035 3150 2520 +4 0 0 40 -1 18 12 0.0000 4 180 1725 3285 2610 _southWestContact\001 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1575 1575 3555 South+East+West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 3-2-0-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3285 3825 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 2700 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5310 675 G\001 +4 1 0 40 -1 18 12 0.0000 4 180 1665 3150 270 _northEastContact\001 +4 0 0 30 -1 18 12 0.0000 4 135 615 6120 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1545 7650 3555 North+East+West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7650 3330 3-2-0-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 11385 1350 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5940 3105 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 9360 2970 _southWestContact\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 9810 495 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 9360 -90 G\001 diff --git a/katabatic/doc/images/GCellConfiguration-23.pdf b/katabatic/doc/images/GCellConfiguration-23.pdf new file mode 100644 index 00000000..b6a1040b Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-23.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-23.png b/katabatic/doc/images/GCellConfiguration-23.png new file mode 100644 index 00000000..be407d03 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-23.png differ diff --git a/katabatic/doc/images/GCellConfiguration-24.fig b/katabatic/doc/images/GCellConfiguration-24.fig new file mode 100644 index 00000000..a3d425f9 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-24.fig @@ -0,0 +1,45 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 -270 -270 5175 3600 +6 1440 630 3105 1620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 1530 675 1620 675 1620 1575 1530 1575 1530 675 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1485 1035 1665 1035 1665 1215 1485 1215 1485 1035 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3060 1125 1665 1125 +-6 +6 2565 1305 3105 2295 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2610 1710 2790 1710 2790 1890 2610 1890 2610 1710 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2655 1350 2745 1350 2745 2250 2655 2250 2655 1350 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3060 1800 2790 1800 +-6 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5175 0 5175 3600 0 3600 0 0 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 3150 3600 3150 3600 3600 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 3060 2475 -225 2475 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 + 3240 2565 3240 1035 3060 1035 3060 2565 3240 2565 +2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 + 3150 -225 3150 1035 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1035 1575 3555 North+West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 2-2-0-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 2700 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3285 -90 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 3285 2925 _southWestContact\001 +4 0 0 40 -1 18 12 0.0000 4 180 1665 3285 2700 _northEastContact\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-24.pdf b/katabatic/doc/images/GCellConfiguration-24.pdf new file mode 100644 index 00000000..7d5c44dd Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-24.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-24.png b/katabatic/doc/images/GCellConfiguration-24.png new file mode 100644 index 00000000..5ab40997 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-24.png differ diff --git a/katabatic/doc/images/GCellConfiguration-3.fig b/katabatic/doc/images/GCellConfiguration-3.fig new file mode 100644 index 00000000..b4e5958a --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-3.fig @@ -0,0 +1,171 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9450 2475 90 90 9360 2475 9540 2475 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9450 1800 90 90 9360 1800 9540 1800 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 7200 2025 90 90 7110 2025 7290 2025 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 8325 2475 90 90 8235 2475 8415 2475 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9450 3150 90 90 9360 3150 9540 3150 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 7200 900 90 90 7110 900 7290 900 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 8325 1350 90 90 8235 1350 8415 1350 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 8325 2025 90 90 8235 2025 8415 2025 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 7200 1575 90 90 7110 1575 7290 1575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3825 1800 90 90 3735 1800 3915 1800 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 1575 2025 90 90 1485 2025 1665 2025 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 2700 2475 90 90 2610 2475 2790 2475 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3825 3150 90 90 3735 3150 3915 3150 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1575 900 90 90 1485 900 1665 900 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 1350 90 90 2610 1350 2790 1350 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 2700 2025 90 90 2610 2025 2790 2025 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 1575 1575 90 90 1485 1575 1665 1575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3825 2475 90 90 3735 2475 3915 2475 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 6525 1575 90 90 6435 1575 6615 1575 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 10305 2700 10395 2700 10395 3600 10305 3600 10305 2700 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 3060 10440 3060 10440 3240 10260 3240 10260 3060 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10260 3150 9540 3150 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9450 2565 9450 3060 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9450 1890 9450 2385 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9810 1800 9540 1800 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 9810 1710 9990 1710 9990 1890 9810 1890 9810 1710 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 9855 1350 9945 1350 9945 2250 9855 2250 9855 1350 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9360 2475 8415 2475 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 8325 2385 8325 2115 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 8235 2025 7290 2025 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 7200 1935 7200 1665 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7605 450 7695 450 7695 1350 7605 1350 7605 450 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7560 810 7740 810 7740 990 7560 990 7560 810 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 7560 900 7290 900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 7200 990 7200 1485 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8730 900 8820 900 8820 1800 8730 1800 8730 900 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8685 1260 8865 1260 8865 1440 8685 1440 8685 1260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 8685 1350 8415 1350 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 8325 1440 8325 1935 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 5625 225 10800 225 10800 3825 5625 3825 5625 225 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 5625 3375 8100 3375 8100 3825 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6525 2925 6525 1710 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 6525 1485 6525 0 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4680 2700 4770 2700 4770 3600 4680 3600 4680 2700 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4635 3060 4815 3060 4815 3240 4635 3240 4635 3060 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4635 3150 3915 3150 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3825 2565 3825 3060 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3825 1890 3825 2385 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4185 1800 3915 1800 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 1710 4365 1710 4365 1890 4185 1890 4185 1710 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 1350 4320 1350 4320 2250 4230 2250 4230 1350 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3735 2475 2790 2475 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2700 2385 2700 2115 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2610 2025 1665 2025 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1575 1935 1575 1665 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 1980 450 2070 450 2070 1350 1980 1350 1980 450 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1935 810 2115 810 2115 990 1935 990 1935 810 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1935 900 1665 900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1575 990 1575 1485 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 3105 900 3195 900 3195 1800 3105 1800 3105 900 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 1260 3240 1260 3240 1440 3060 1440 3060 1260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3060 1350 2790 1350 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2700 1440 2700 1935 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 225 5175 225 5175 3825 0 3825 0 225 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 1575 2925 1575 2160 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 3375 2475 3375 2475 3825 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 1935 2700 2115 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1575 1485 1575 1665 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 1485 1575 -225 1575 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3825 2385 3825 2565 +2 1 0 2 0 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 6615 1575 7110 1575 +4 0 0 30 -1 18 12 0.0000 4 135 615 5670 3780 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 5670 3555 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 495 7200 3780 North\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7200 3555 1-4-0-0\001 +4 1 0 40 -1 18 12 0.0000 4 180 1725 6525 3150 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 6615 135 G\001 +4 1 0 40 -1 18 12 0.0000 4 180 1725 1620 3150 _southWestContact\001 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 3780 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3555 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 435 1575 3780 West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3555 1-4-0-0\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 4275 3105 Lt\001 +4 1 12 40 -1 18 12 0.0000 4 135 285 4050 1665 Lct\001 +4 1 12 40 -1 18 12 0.0000 4 135 285 2925 1215 Lct\001 +4 1 12 40 -1 18 12 0.0000 4 135 285 1755 765 Lct\001 +4 1 0 40 -1 18 12 0.0000 4 135 105 3240 2655 L\001 +4 1 12 40 -1 18 12 0.0000 4 135 105 3915 2205 L\001 +4 1 12 40 -1 18 12 0.0000 4 135 105 3915 2880 L\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 2835 2340 Lc\001 +4 1 0 40 -1 18 12 0.0000 4 135 105 2115 2205 L\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 1710 1890 Lc\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 9945 3105 Lt\001 +4 1 12 40 -1 18 12 0.0000 4 135 285 9675 1710 Lct\001 +4 1 12 40 -1 18 12 0.0000 4 135 285 8550 1260 Lct\001 +4 1 12 40 -1 18 12 0.0000 4 135 285 7425 810 Lct\001 +4 1 12 40 -1 18 12 0.0000 4 135 105 9540 2880 L\001 +4 1 12 40 -1 18 12 0.0000 4 135 105 9540 2205 L\001 +4 1 0 40 -1 18 12 0.0000 4 135 105 8865 2655 L\001 +4 1 0 40 -1 18 12 0.0000 4 135 105 7740 2205 L\001 +4 1 0 40 -1 18 12 0.0000 4 135 105 6840 2205 L\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 8460 2340 Lc\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 7335 1890 Lc\001 +4 1 12 40 -1 18 12 0.0000 4 135 105 2790 1755 L\001 +4 1 12 40 -1 18 12 0.0000 4 135 105 1665 1305 L\001 +4 1 12 40 -1 18 12 0.0000 4 135 105 8415 1755 L\001 +4 1 12 40 -1 18 12 0.0000 4 135 105 7290 1305 L\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 1800 G\001 diff --git a/katabatic/doc/images/GCellConfiguration-3.pdf b/katabatic/doc/images/GCellConfiguration-3.pdf new file mode 100644 index 00000000..55a7f4d1 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-3.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-3.png b/katabatic/doc/images/GCellConfiguration-3.png new file mode 100644 index 00000000..6ae37943 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-3.png differ diff --git a/katabatic/doc/images/GCellConfiguration-30.fig b/katabatic/doc/images/GCellConfiguration-30.fig new file mode 100644 index 00000000..79c79d7c --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-30.fig @@ -0,0 +1,128 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 -270 0 6570 3600 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 1575 90 90 2070 1575 2250 1575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 900 90 90 2070 900 2250 900 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 895 90 90 3430 895 3610 895 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 1350 90 90 3420 1350 3600 1350 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1353 1578 183 183 1170 1578 1536 1578 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4953 1350 183 183 4770 1350 5136 1350 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4950 450 90 90 4860 450 5040 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1350 450 90 90 1260 450 1440 450 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 3150 2700 3150 2700 3600 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 6300 0 6300 3600 0 3600 0 0 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + -225 450 1260 450 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 5040 450 6525 450 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 1620 900 1530 1800 1530 1800 1620 900 1620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 945 2475 855 3150 855 3150 945 2475 945 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 1485 1890 1485 1890 1665 1710 1665 1710 1485 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 810 2565 810 2565 990 2385 990 2385 810 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 810 3240 810 3240 990 3060 990 3060 810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 1395 4275 1305 5400 1305 5400 1395 4275 1395 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 1260 4365 1260 4365 1440 4185 1440 4185 1260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 1575 2070 1575 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 990 2160 1485 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 900 2385 900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 900 3420 900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 990 3510 1260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 1350 4185 1350 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1350 1395 1350 540 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4950 1170 4950 540 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 945 1575 3555 East+West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 2-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 675 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 6435 675 G\001 +4 1 0 40 -1 18 12 0.0000 4 180 765 4860 1755 _rightRP\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 1485 1035 L1\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 5085 945 L2\001 +4 1 0 40 -1 18 12 0.0000 4 180 660 1350 1935 _leftRP\001 +4 1 0 40 -1 18 12 0.0000 4 180 1725 1350 270 _southWestContact\001 +4 1 0 40 -1 18 12 0.0000 4 180 1665 4950 270 _northEastContact\001 +-6 +6 7200 -270 13500 3870 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 1575 90 90 9270 1575 9450 1575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 900 90 90 9270 900 9450 900 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 895 90 90 10630 895 10810 895 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 1350 90 90 10620 1350 10800 1350 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 10350 1800 90 90 10260 1800 10440 1800 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12825 900 90 90 12735 900 12915 900 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 7200 3150 10125 3150 10125 3600 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 7200 0 13500 0 13500 3600 7200 3600 7200 0 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 12825 810 12825 -225 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 10350 3825 10350 1890 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8100 1620 8100 1530 9000 1530 9000 1620 8100 1620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 9675 945 9675 855 10350 855 10350 945 9675 945 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 1485 9090 1485 9090 1665 8910 1665 8910 1485 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 9585 810 9765 810 9765 990 9585 990 9585 810 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 810 10440 810 10440 990 10260 990 10260 810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 11475 1395 11475 1305 12600 1305 12600 1395 11475 1395 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 11385 1260 11565 1260 11565 1440 11385 1440 11385 1260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9090 1575 9270 1575 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9360 990 9360 1485 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9450 900 9585 900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10440 900 10620 900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10710 990 10710 1260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10800 1350 11385 1350 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 12735 900 12105 900 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 11925 1800 10440 1800 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 12105 1890 11925 1890 11925 810 12105 810 12105 1890 +4 0 0 30 -1 18 12 0.0000 4 135 615 7245 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1125 8775 3555 North+South\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 8775 3330 2-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 12960 -45 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 10485 3825 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 12465 1080 L2\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 11160 1980 L1\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 12735 675 _northEastContact\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 12240 1845 biggestRP\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 10170 1890 _southWestContact\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-30.pdf b/katabatic/doc/images/GCellConfiguration-30.pdf new file mode 100644 index 00000000..24064df4 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-30.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-30.png b/katabatic/doc/images/GCellConfiguration-30.png new file mode 100644 index 00000000..0ac65c09 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-30.png differ diff --git a/katabatic/doc/images/GCellConfiguration-31.fig b/katabatic/doc/images/GCellConfiguration-31.fig new file mode 100644 index 00000000..ccb44fc4 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-31.fig @@ -0,0 +1,133 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 6930 4230 13770 8100 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 6120 90 90 9270 6120 9450 6120 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 5445 90 90 9270 5445 9450 5445 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 5440 90 90 10630 5440 10810 5440 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 5895 90 90 10620 5895 10800 5895 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12015 4950 90 90 11925 4950 12105 4950 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12015 7200 90 90 11925 7200 12105 7200 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 7200 7650 10800 7650 10800 8100 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 7200 4500 13500 4500 13500 8100 7200 8100 7200 4500 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 11925 7200 6975 7200 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8100 6165 8100 6075 9000 6075 9000 6165 8100 6165 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 9675 5490 9675 5400 10350 5400 10350 5490 9675 5490 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 6030 9090 6030 9090 6210 8910 6210 8910 6030 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 9585 5355 9765 5355 9765 5535 9585 5535 9585 5355 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 5355 10440 5355 10440 5535 10260 5535 10260 5355 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 11475 5940 11475 5850 12600 5850 12600 5940 11475 5940 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 11385 5805 11565 5805 11565 5985 11385 5985 11385 5805 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9090 6120 9270 6120 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9360 5535 9360 6030 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9450 5445 9585 5445 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10440 5445 10620 5445 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10710 5535 10710 5805 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10800 5895 11385 5895 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 12015 5040 12015 5355 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 12105 4950 13725 4950 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 12015 6435 12015 7110 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 12015 4860 12015 4275 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 12105 6435 11925 6435 11925 5355 12105 5355 12105 6435 +4 0 0 30 -1 18 12 0.0000 4 135 615 7245 8055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 7830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 8775 7830 3-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 7065 7425 G\001 +4 0 0 30 -1 18 12 0.0000 4 135 1575 8775 8055 South+East+West\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 12240 6390 biggestRP\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 11925 5265 _northEastContact\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 12150 5265 L2\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 13635 5175 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 12150 6840 L1\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 12150 4410 G\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 11835 7110 _southWestContact\001 +-6 +6 -270 4500 6570 8370 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 6120 90 90 2070 6120 2250 6120 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 5445 90 90 2070 5445 2250 5445 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 5440 90 90 3430 5440 3610 5440 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 5895 90 90 3420 5895 3600 5895 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 4950 90 90 4725 4950 4905 4950 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 7200 90 90 4725 7200 4905 7200 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 7650 3600 7650 3600 8100 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 4500 6300 4500 6300 8100 0 8100 0 4500 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4725 7200 -225 7200 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 6165 900 6075 1800 6075 1800 6165 900 6165 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 5490 2475 5400 3150 5400 3150 5490 2475 5490 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 6030 1890 6030 1890 6210 1710 6210 1710 6030 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 5355 2565 5355 2565 5535 2385 5535 2385 5355 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 5355 3240 5355 3240 5535 3060 5535 3060 5355 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 5940 4275 5850 5400 5850 5400 5940 4275 5940 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 5805 4365 5805 4365 5985 4185 5985 4185 5805 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 6120 2070 6120 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 5535 2160 6030 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 5445 2385 5445 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 5445 3420 5445 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 5535 3510 5805 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 5895 4185 5895 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 5040 4815 5355 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4905 4950 6525 4950 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4815 8325 4815 7290 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 6435 4815 7110 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 4905 6435 4725 6435 4725 5355 4905 5355 4905 6435 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 8055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 7830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 7830 3-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 7425 G\001 +4 0 0 30 -1 18 12 0.0000 4 135 1575 1575 8055 South+East+West\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 5040 6390 biggestRP\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 4725 5265 _northEastContact\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4950 5265 L2\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 6435 5175 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 4950 8325 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4950 6840 L1\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 4680 7110 _southWestContact\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-31.pdf b/katabatic/doc/images/GCellConfiguration-31.pdf new file mode 100644 index 00000000..d5316860 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-31.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-31.png b/katabatic/doc/images/GCellConfiguration-31.png new file mode 100644 index 00000000..c42d755f Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-31.png differ diff --git a/katabatic/doc/images/GCellConfiguration-32.fig b/katabatic/doc/images/GCellConfiguration-32.fig new file mode 100644 index 00000000..20ac81a3 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-32.fig @@ -0,0 +1,133 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 0 8730 6570 12870 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 10575 90 90 2070 10575 2250 10575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 9900 90 90 2070 9900 2250 9900 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 9895 90 90 3430 9895 3610 9895 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 10350 90 90 3420 10350 3600 10350 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 10800 90 90 3735 10800 3915 10800 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 9450 90 90 4725 9450 4905 9450 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 12150 3600 12150 3600 12600 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 9000 6300 9000 6300 12600 0 12600 0 9000 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3825 12825 3825 10890 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 10620 900 10530 1800 10530 1800 10620 900 10620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 9945 2475 9855 3150 9855 3150 9945 2475 9945 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 10485 1890 10485 1890 10665 1710 10665 1710 10485 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 9810 2565 9810 2565 9990 2385 9990 2385 9810 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 9810 3240 9810 3240 9990 3060 9990 3060 9810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 10395 4275 10305 5400 10305 5400 10395 4275 10395 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 10260 4365 10260 4365 10440 4185 10440 4185 10260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 10575 2070 10575 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 9990 2160 10485 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 9900 2385 9900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 9900 3420 9900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 9990 3510 10260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 10350 4185 10350 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4725 10800 3915 10800 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4815 9360 4815 8775 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4905 9450 6525 9450 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 9540 4815 9810 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 4905 10890 4725 10890 4725 9810 4905 9810 4905 10890 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 12555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 12330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1635 1575 12555 North+South+East\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 12330 3-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3690 12825 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 5040 10845 biggestRP\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4320 11025 L1\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 4590 9450 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 6435 9675 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4995 9720 L2\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 4950 8910 G\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 3645 10890 _southWestContact\001 +-6 +6 6930 8730 13500 12870 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 10575 90 90 9270 10575 9450 10575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 9900 90 90 9270 9900 9450 9900 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 9895 90 90 10630 9895 10810 9895 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 10350 90 90 10620 10350 10800 10350 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12825 9900 90 90 12735 9900 12915 9900 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12015 11700 90 90 11925 11700 12105 11700 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 7200 12150 10800 12150 10800 12600 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 7200 9000 13500 9000 13500 12600 7200 12600 7200 9000 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 6975 11700 11925 11700 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 12825 9810 12825 8775 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8100 10620 8100 10530 9000 10530 9000 10620 8100 10620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 9675 9945 9675 9855 10350 9855 10350 9945 9675 9945 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 10485 9090 10485 9090 10665 8910 10665 8910 10485 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 9585 9810 9765 9810 9765 9990 9585 9990 9585 9810 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 9810 10440 9810 10440 9990 10260 9990 10260 9810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 11475 10395 11475 10305 12600 10305 12600 10395 11475 10395 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 11385 10260 11565 10260 11565 10440 11385 10440 11385 10260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9090 10575 9270 10575 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9360 9990 9360 10485 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9450 9900 9585 9900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10440 9900 10620 9900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10710 9990 10710 10260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10800 10350 11385 10350 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 12735 9900 12105 9900 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 12015 12825 12015 11790 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 12015 10890 12015 11610 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 12105 10890 11925 10890 11925 9810 12105 9810 12105 10890 +4 0 0 30 -1 18 12 0.0000 4 135 615 7245 12555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 12330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1665 8775 12555 North+South+West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 8775 12330 3-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 12960 8955 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 7065 11925 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 12465 10080 L2\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 12735 9675 _northEastContact\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 12240 10845 biggestRP\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 11925 12825 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 11880 11295 L1\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 11880 11610 _southWestContact\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-32.pdf b/katabatic/doc/images/GCellConfiguration-32.pdf new file mode 100644 index 00000000..233e81eb Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-32.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-32.png b/katabatic/doc/images/GCellConfiguration-32.png new file mode 100644 index 00000000..d8edc01e Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-32.png differ diff --git a/katabatic/doc/images/GCellConfiguration-33.fig b/katabatic/doc/images/GCellConfiguration-33.fig new file mode 100644 index 00000000..37ea4802 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-33.fig @@ -0,0 +1,74 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 -270 13230 6570 17370 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 15075 90 90 2070 15075 2250 15075 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 14400 90 90 2070 14400 2250 14400 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 14395 90 90 3430 14395 3610 14395 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 14850 90 90 3420 14850 3600 14850 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 16200 90 90 4725 16200 4905 16200 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 13950 90 90 4725 13950 4905 13950 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 16650 3780 16650 3780 17100 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 13500 6300 13500 6300 17100 0 17100 0 13500 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 15120 900 15030 1800 15030 1800 15120 900 15120 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 14445 2475 14355 3150 14355 3150 14445 2475 14445 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 14985 1890 14985 1890 15165 1710 15165 1710 14985 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 14310 2565 14310 2565 14490 2385 14490 2385 14310 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 14310 3240 14310 3240 14490 3060 14490 3060 14310 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 14895 4275 14805 5400 14805 5400 14895 4275 14895 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 14760 4365 14760 4365 14940 4185 14940 4185 14760 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 15075 2070 15075 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 14490 2160 14985 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 14400 2385 14400 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 14400 3420 14400 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 14490 3510 14760 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 14850 4185 14850 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 15390 4815 16110 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4815 17325 4815 16290 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + -225 16200 4725 16200 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4905 13950 6525 13950 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4815 13860 4815 13275 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 14040 4815 14310 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 4905 15390 4725 15390 4725 14310 4905 14310 4905 15390 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 17055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 16830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 2175 1575 17055 North+South+East+West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 16830 4-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 16425 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 5040 15345 biggestRP\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4680 15840 L1\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 4725 17325 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 6435 14175 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 4950 13410 G\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 4635 13995 _northEastContact\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4995 14265 L2\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 4680 16110 _southWestContact\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-33.pdf b/katabatic/doc/images/GCellConfiguration-33.pdf new file mode 100644 index 00000000..0d08c952 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-33.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-33.png b/katabatic/doc/images/GCellConfiguration-33.png new file mode 100644 index 00000000..256e3b5c Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-33.png differ diff --git a/katabatic/doc/images/GCellConfiguration-34.fig b/katabatic/doc/images/GCellConfiguration-34.fig new file mode 100644 index 00000000..5b2aac4b --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-34.fig @@ -0,0 +1,67 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 -270 18000 6300 21870 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 19575 90 90 2070 19575 2250 19575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 18900 90 90 2070 18900 2250 18900 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 18895 90 90 3430 18895 3610 18895 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 19350 90 90 3420 19350 3600 19350 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 20250 90 90 4725 20250 4905 20250 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 18000 6300 18000 6300 21600 0 21600 0 18000 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 19620 900 19530 1800 19530 1800 19620 900 19620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 18945 2475 18855 3150 18855 3150 18945 2475 18945 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 19485 1890 19485 1890 19665 1710 19665 1710 19485 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 18810 2565 18810 2565 18990 2385 18990 2385 18810 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 18810 3240 18810 3240 18990 3060 18990 3060 18810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 19395 4275 19305 5400 19305 5400 19395 4275 19395 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 19260 4365 19260 4365 19440 4185 19440 4185 19260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 19575 2070 19575 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 18990 2160 19485 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 18900 2385 18900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 18900 3420 18900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 18990 3510 19260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 19350 4185 19350 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + -225 20700 5535 20700 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 19530 4815 20160 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 4905 19530 4725 19530 4725 19170 4905 19170 4905 19530 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4905 20250 5535 20250 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 5715 20790 5535 20790 5535 20160 5715 20160 5715 20790 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 5625 21825 5625 20790 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 21150 3780 21150 3780 21600 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 21555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 21330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1065 1575 21555 South+West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 21330 2-0-3-0\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 5040 19620 biggestRP\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5535 21825 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -180 20880 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 465 4545 19890 L1-tc\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 5490 20565 _southWestContact\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-34.pdf b/katabatic/doc/images/GCellConfiguration-34.pdf new file mode 100644 index 00000000..997e84a2 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-34.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-34.png b/katabatic/doc/images/GCellConfiguration-34.png new file mode 100644 index 00000000..d7a178b9 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-34.png differ diff --git a/katabatic/doc/images/GCellConfiguration-35.fig b/katabatic/doc/images/GCellConfiguration-35.fig new file mode 100644 index 00000000..c30ff532 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-35.fig @@ -0,0 +1,111 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 0 22500 6570 26100 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 24075 90 90 2070 24075 2250 24075 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 23400 90 90 2070 23400 2250 23400 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 23395 90 90 3430 23395 3610 23395 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 23850 90 90 3420 23850 3600 23850 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 24750 90 90 4725 24750 4905 24750 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 22500 6300 22500 6300 26100 0 26100 0 22500 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 24120 900 24030 1800 24030 1800 24120 900 24120 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 23445 2475 23355 3150 23355 3150 23445 2475 23445 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 23985 1890 23985 1890 24165 1710 24165 1710 23985 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 23310 2565 23310 2565 23490 2385 23490 2385 23310 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 23310 3240 23310 3240 23490 3060 23490 3060 23310 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 23895 4275 23805 5400 23805 5400 23895 4275 23895 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 23760 4365 23760 4365 23940 4185 23940 4185 23760 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 24075 2070 24075 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 23490 2160 23985 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 23400 2385 23400 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 23400 3420 23400 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 23490 3510 23760 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 23850 4185 23850 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 24030 4815 24660 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 4905 24030 4725 24030 4725 23670 4905 23670 4905 24030 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 25650 3780 25650 3780 26100 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4905 24750 6525 24750 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 26055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 25830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 405 1575 26055 East\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 25830 1-0-3-0\001 +4 0 0 40 -1 18 12 0.0000 4 180 660 5040 24120 rightRP\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4680 24390 L1\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 4635 24660 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 6480 24930 G\001 +-6 +6 6930 22500 13500 26100 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 24075 90 90 9270 24075 9450 24075 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 23400 90 90 9270 23400 9450 23400 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 23395 90 90 10630 23395 10810 23395 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 23850 90 90 10620 23850 10800 23850 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 8550 24750 90 90 8460 24750 8640 24750 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 7200 22500 13500 22500 13500 26100 7200 26100 7200 22500 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8100 24120 8100 24030 9000 24030 9000 24120 8100 24120 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 9675 23445 9675 23355 10350 23355 10350 23445 9675 23445 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 23985 9090 23985 9090 24165 8910 24165 8910 23985 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 9585 23310 9765 23310 9765 23490 9585 23490 9585 23310 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 23310 10440 23310 10440 23490 10260 23490 10260 23310 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 11475 23895 11475 23805 12600 23805 12600 23895 11475 23895 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 11385 23760 11565 23760 11565 23940 11385 23940 11385 23760 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9090 24075 9270 24075 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9360 23490 9360 23985 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9450 23400 9585 23400 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10440 23400 10620 23400 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10710 23490 10710 23760 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10800 23850 11385 23850 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 7200 25650 10980 25650 10980 26100 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 8640 24255 8460 24255 8460 23895 8640 23895 8640 24255 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 8550 24255 8550 24660 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 6975 24750 8460 24750 +4 0 0 30 -1 18 12 0.0000 4 135 615 7245 26055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 25830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 435 8775 26055 West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 8775 25830 1-0-3-0\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 8415 24525 L1\001 +4 2 0 40 -1 18 12 0.0000 4 135 555 8325 23940 leftRP\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 8685 24795 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 7020 24930 G\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-35.pdf b/katabatic/doc/images/GCellConfiguration-35.pdf new file mode 100644 index 00000000..779c3f69 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-35.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-35.png b/katabatic/doc/images/GCellConfiguration-35.png new file mode 100644 index 00000000..53dbeb98 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-35.png differ diff --git a/katabatic/doc/images/GCellConfiguration-36.fig b/katabatic/doc/images/GCellConfiguration-36.fig new file mode 100644 index 00000000..43e883bc --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-36.fig @@ -0,0 +1,64 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 0 26775 6300 30645 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 28350 90 90 2070 28350 2250 28350 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 27675 90 90 2070 27675 2250 27675 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 27670 90 90 3430 27670 3610 27670 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 28125 90 90 3420 28125 3600 28125 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 29025 90 90 4725 29025 4905 29025 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 26775 6300 26775 6300 30375 0 30375 0 26775 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 28395 900 28305 1800 28305 1800 28395 900 28395 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 27720 2475 27630 3150 27630 3150 27720 2475 27720 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 28260 1890 28260 1890 28440 1710 28440 1710 28260 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 27585 2565 27585 2565 27765 2385 27765 2385 27585 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 27585 3240 27585 3240 27765 3060 27765 3060 27585 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 28170 4275 28080 5400 28080 5400 28170 4275 28170 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 28035 4365 28035 4365 28215 4185 28215 4185 28035 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 28350 2070 28350 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 27765 2160 28260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 27675 2385 27675 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 27675 3420 27675 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 27765 3510 28035 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 28125 4185 28125 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 28305 4815 28935 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 4905 28305 4725 28305 4725 27945 4905 27945 4905 28305 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4905 29025 5535 29025 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 5625 30600 5625 29115 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 29925 3780 29925 3780 30375 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 5715 29115 5535 29115 5535 28935 5715 28935 5715 29115 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 30330 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 30105 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 525 1575 30330 South\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 30105 1-0-3-0\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 5040 28395 biggestRP\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5535 30600 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 465 4545 28665 L1-tc\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 5490 29340 _southWestContact\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-36.pdf b/katabatic/doc/images/GCellConfiguration-36.pdf new file mode 100644 index 00000000..6b21257b Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-36.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-36.png b/katabatic/doc/images/GCellConfiguration-36.png new file mode 100644 index 00000000..b3dbd97e Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-36.png differ diff --git a/katabatic/doc/images/GCellConfiguration-4.fig b/katabatic/doc/images/GCellConfiguration-4.fig new file mode 100644 index 00000000..1bd6fbe1 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-4.fig @@ -0,0 +1,86 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 10215 2430 10485 3420 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 10305 2475 10395 2475 10395 3375 10305 3375 10305 2475 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 2835 10440 2835 10440 3015 10260 3015 10260 2835 +-6 +6 9315 1755 9585 2745 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 9360 2160 9540 2160 9540 2340 9360 2340 9360 2160 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 9405 1800 9495 1800 9495 2700 9405 2700 9405 1800 +-6 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2697 1574 183 183 2514 1573 2880 1575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2790 2250 90 90 2700 2250 2880 2250 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2610 2925 90 90 2520 2925 2700 2925 +1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 2700 900 90 90 2610 900 2790 900 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 8328 2026 183 183 8145 2025 8511 2027 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 5625 225 10800 225 10800 3825 5625 3825 5625 225 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 5625 3375 8325 3375 8325 3825 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 225 5175 225 5175 3825 0 3825 0 225 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 3375 2700 3375 2700 3825 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2610 1755 2610 2835 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2790 1755 2790 2160 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3735 2250 2880 2250 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4680 2475 4770 2475 4770 3375 4680 3375 4680 2475 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4635 2835 4815 2835 4815 3015 4635 3015 4635 2835 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4635 2925 2700 2925 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3735 2160 3915 2160 3915 2340 3735 2340 3735 2160 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 3780 1800 3870 1800 3870 2700 3780 2700 3780 1800 +2 1 0 2 18 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 2520 1575 -225 1575 +2 1 0 2 0 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 2700 990 2700 1395 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 1350 2295 2520 1665 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 8325 1845 8325 0 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 5400 900 2790 900 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 4 + 9360 2250 9225 2250 8775 1935 8505 1935 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 4 + 10260 2925 9225 2925 8775 2115 8505 2115 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 8100 2025 5400 2025 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 7200 2745 8190 2115 +4 0 0 30 -1 18 12 0.0000 4 135 615 5670 3780 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 5670 3555 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1035 7200 3780 West+North\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7200 3555 2-2-0-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 3780 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3555 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 945 1575 3780 West+East\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3555 2-2-0-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 1755 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5310 1080 G\001 +4 1 0 30 -1 18 10 0.0000 4 150 1620 855 1530 _hasSourceWire=true\001 +4 1 0 40 -1 18 12 0.0000 4 180 1335 2700 720 _targetContact\001 +4 1 0 40 -1 18 12 0.0000 4 135 1110 1350 2475 subContact1\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 8460 135 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5490 2205 G\001 +4 1 0 40 -1 18 12 0.0000 4 180 1335 7245 2925 _targetContact\001 diff --git a/katabatic/doc/images/GCellConfiguration-4.pdf b/katabatic/doc/images/GCellConfiguration-4.pdf new file mode 100644 index 00000000..86b7b635 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-4.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-4.png b/katabatic/doc/images/GCellConfiguration-4.png new file mode 100644 index 00000000..56f65461 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-4.png differ diff --git a/katabatic/doc/images/GCellConfiguration-40.fig b/katabatic/doc/images/GCellConfiguration-40.fig new file mode 100644 index 00000000..bf5e41fa --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-40.fig @@ -0,0 +1,81 @@ +#FIG 3.2 +Portrait +Center +Metric +A4 +55.00 +Single +-2 +1200 2 +6 4140 5355 4410 6345 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 5760 4365 5760 4365 5940 4185 5940 4185 5760 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 5400 4320 5400 4320 6300 4230 6300 4230 5400 +-6 +6 10215 5355 10485 6345 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 5760 10440 5760 10440 5940 10260 5940 10260 5760 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 10305 5400 10395 5400 10395 6300 10305 6300 10305 5400 +-6 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3600 5850 90 90 3510 5850 3690 5850 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 4500 5175 4500 5175 8100 0 8100 0 4500 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 7650 3375 7650 3375 8100 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 2835 6525 -225 6525 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 4185 5850 3690 5850 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3600 5940 3600 6435 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2250 7155 3825 7155 3825 7245 2250 7245 2250 7155 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2835 7110 3015 7110 3015 7290 2835 7290 2835 7110 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 7110 2925 6615 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 3735 6615 2835 6615 2835 6435 3735 6435 3735 6615 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 9675 6615 9675 8325 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 6075 4500 11250 4500 11250 8100 6075 8100 6075 4500 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 6075 7650 9450 7650 9450 8100 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 10260 5850 9765 5850 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8325 7155 9900 7155 9900 7245 8325 7245 8325 7155 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 7110 9090 7110 9090 7290 8910 7290 8910 7110 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 9000 7110 9000 6615 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 9765 5760 9585 5760 9585 6615 9765 6615 9765 5760 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 9090 6435 8910 6435 8910 6615 9090 6615 9090 6435 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 9585 6525 9090 6525 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 3285 6435 3285 6615 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 9585 6210 9765 6210 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 8055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 7830 Configuration:\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 6480 G\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 7830 1-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 435 1575 8055 West\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 3915 5805 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 3060 6930 Lt\001 +4 0 12 40 -1 18 12 0.0000 4 135 180 3645 6255 Lt\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 2745 6435 _southWestContact\001 +4 0 0 30 -1 18 12 0.0000 4 135 615 6120 8055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 7830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7650 7830 1-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 525 7650 8055 South\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 9990 5805 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 9135 6930 Lt\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 9810 8280 G\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 9495 5850 _southWestContact\001 diff --git a/katabatic/doc/images/GCellConfiguration-40.pdf b/katabatic/doc/images/GCellConfiguration-40.pdf new file mode 100644 index 00000000..2de1c32d Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-40.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-40.png b/katabatic/doc/images/GCellConfiguration-40.png new file mode 100644 index 00000000..ed77e55b Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-40.png differ diff --git a/katabatic/doc/images/GCellConfiguration-41.fig b/katabatic/doc/images/GCellConfiguration-41.fig new file mode 100644 index 00000000..c3a293ba --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-41.fig @@ -0,0 +1,98 @@ +#FIG 3.2 +Portrait +Center +Metric +A4 +55.00 +Single +-2 +1200 2 +6 -270 9000 5490 12600 +6 4140 9855 4410 10845 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 10260 4365 10260 4365 10440 4185 10440 4185 10260 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 9900 4320 9900 4320 10800 4230 10800 4230 9900 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 9720 90 90 2835 9720 3015 9720 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3590 10345 90 90 3500 10345 3680 10345 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 9000 5175 9000 5175 12600 0 12600 0 9000 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 12150 3375 12150 3375 12600 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 2835 11025 -225 11025 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2250 11655 3825 11655 3825 11745 2250 11745 2250 11655 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2835 11610 3015 11610 3015 11790 2835 11790 2835 11610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 11610 2925 11115 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 5445 9720 3015 9720 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 2925 9810 2925 10935 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 4185 10350 3690 10350 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3600 10440 3600 10935 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 3690 11115 2835 11115 2835 10935 3690 10935 3690 11115 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 3285 10935 3285 11115 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 12555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 12330 Configuration:\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 10980 G\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 12330 2-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 945 1575 12555 West+East\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 3915 10305 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 3060 11430 Lt\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 2745 10935 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5355 9675 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1665 2925 9540 _northEastContact\001 +4 0 12 40 -1 18 12 0.0000 4 135 180 3645 10755 Lt\001 +-6 +6 6075 8730 11565 12870 +6 10215 9855 10485 10845 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 10260 10440 10260 10440 10440 10260 10440 10260 10260 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 10305 9900 10395 9900 10395 10800 10305 10800 10305 9900 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 8100 10350 90 90 8010 10350 8190 10350 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 9000 11025 90 90 8910 11025 9090 11025 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 6075 9000 11250 9000 11250 12600 6075 12600 6075 9000 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 6075 12150 9450 12150 9450 12600 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8325 11655 9900 11655 9900 11745 8325 11745 8325 11655 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 11610 9090 11610 9090 11790 8910 11790 8910 11610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 9000 11610 9000 11115 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 8190 10350 9585 10350 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 10260 10350 9765 10350 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 9675 11115 9675 12825 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 8100 8775 8100 10260 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 9090 11025 9585 11025 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 9765 11115 9585 11115 9585 10260 9765 10260 9765 11115 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 9585 10710 9765 10710 +4 0 0 30 -1 18 12 0.0000 4 135 615 6120 12555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 12330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7650 12330 2-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 1125 7650 12555 North+South\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 9990 10305 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 9135 11430 Lt\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 7965 10215 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 7965 8910 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 9585 12825 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 9810 11160 _southWestContact\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-41.pdf b/katabatic/doc/images/GCellConfiguration-41.pdf new file mode 100644 index 00000000..e13e9461 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-41.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-41.png b/katabatic/doc/images/GCellConfiguration-41.png new file mode 100644 index 00000000..b59500b4 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-41.png differ diff --git a/katabatic/doc/images/GCellConfiguration-42.fig b/katabatic/doc/images/GCellConfiguration-42.fig new file mode 100644 index 00000000..7b1ddad1 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-42.fig @@ -0,0 +1,104 @@ +#FIG 3.2 +Portrait +Center +Metric +A4 +55.00 +Single +-2 +1200 2 +6 -270 13230 5490 17370 +6 4140 14355 4410 15345 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 14760 4365 14760 4365 14940 4185 14940 4185 14760 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 14400 4320 14400 4320 15300 4230 15300 4230 14400 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2025 14850 90 90 1935 14850 2115 14850 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 15525 90 90 2835 15525 3015 15525 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 13500 5175 13500 5175 17100 0 17100 0 13500 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 16650 3375 16650 3375 17100 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2250 16155 3825 16155 3825 16245 2250 16245 2250 16155 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2835 16110 3015 16110 3015 16290 2835 16290 2835 16110 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 16110 2925 15615 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 2115 14850 3510 14850 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 4185 14850 3690 14850 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3600 15615 3600 17325 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 2025 13275 2025 14760 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3015 15525 3510 15525 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 3690 15615 3510 15615 3510 14760 3690 14760 3690 15615 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3510 15300 -225 15300 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 3510 15255 3690 15255 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 17055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 16830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 16830 3-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 1665 1575 17055 North+South+West\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 3915 14805 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 3060 15930 Lt\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 1890 14715 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 1890 13410 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3510 17325 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 3735 15660 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -180 15255 G\001 +-6 +6 6075 13230 11565 17370 +6 10215 14355 10485 15345 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 14760 10440 14760 10440 14940 10260 14940 10260 14760 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 10305 14400 10395 14400 10395 15300 10305 15300 10305 14400 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 9000 15525 90 90 8910 15525 9090 15525 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 6075 13500 11250 13500 11250 17100 6075 17100 6075 13500 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 6075 16650 9450 16650 9450 17100 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8325 16155 9900 16155 9900 16245 8325 16245 8325 16155 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 16110 9090 16110 9090 16290 8910 16290 8910 16110 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 9000 16110 9000 15615 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 8190 14850 9585 14850 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 10260 14850 9765 14850 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 9675 15615 9675 17325 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 8100 13275 8100 14085 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 9090 15525 9585 15525 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 9765 15615 9585 15615 9585 14760 9765 14760 9765 15615 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 11475 14175 8190 14175 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 8190 14940 8010 14940 8010 14085 8190 14085 8190 14940 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 9585 15210 9765 15210 +4 0 0 30 -1 18 12 0.0000 4 135 615 6120 17055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 16830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7650 16830 3-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 1635 7650 17055 North+South+East\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 9990 14805 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 9135 15930 Lt\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 7965 14715 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 7965 13410 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 9585 17325 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 9810 15660 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 11430 14130 G\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-42.pdf b/katabatic/doc/images/GCellConfiguration-42.pdf new file mode 100644 index 00000000..5ce09f6b Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-42.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-42.png b/katabatic/doc/images/GCellConfiguration-42.png new file mode 100644 index 00000000..47fe02ea Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-42.png differ diff --git a/katabatic/doc/images/GCellConfiguration-43.fig b/katabatic/doc/images/GCellConfiguration-43.fig new file mode 100644 index 00000000..0ae754e1 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-43.fig @@ -0,0 +1,104 @@ +#FIG 3.2 +Portrait +Center +Metric +A4 +55.00 +Single +-2 +1200 2 +6 -270 17730 5445 21600 +6 4140 18405 4410 19395 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 18810 4365 18810 4365 18990 4185 18990 4185 18810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 18450 4320 18450 4320 19350 4230 19350 4230 18450 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 19575 90 90 2835 19575 3015 19575 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 3600 20700 90 90 3510 20700 3690 20700 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 18000 5175 18000 5175 21600 0 21600 0 18000 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 21150 3375 21150 3375 21600 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3600 17775 3600 18810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2250 20205 3825 20205 3825 20295 2250 20295 2250 20205 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2835 20160 3015 20160 3015 20340 2835 20340 2835 20160 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 20160 2925 19665 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 4185 18900 3690 18900 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3015 19575 3510 19575 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 3690 19665 3510 19665 3510 18810 3690 18810 3690 19665 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 5400 19575 3690 19575 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3600 19665 3600 20610 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + -225 20700 3510 20700 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 3510 19260 3690 19260 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 21555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 21330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 21330 3-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 1545 1575 21555 North+East+West\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3510 17910 G\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 3915 18855 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 3060 19980 Lt\001 +4 0 0 40 -1 18 12 0.0000 4 180 1665 3780 19800 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5310 19530 G\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 3420 20610 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -180 20655 G\001 +-6 +6 5805 18000 11565 21870 +6 10215 18855 10485 19845 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 19260 10440 19260 10440 19440 10260 19440 10260 19260 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 10305 18900 10395 18900 10395 19800 10305 19800 10305 18900 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 9000 20025 90 90 8910 20025 9090 20025 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 6075 18000 11250 18000 11250 21600 6075 21600 6075 18000 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 6075 21150 9450 21150 9450 21600 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8325 20655 9900 20655 9900 20745 8325 20745 8325 20655 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 20610 9090 20610 9090 20790 8910 20790 8910 20610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 9000 20610 9000 20115 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 10260 19350 9765 19350 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 9675 20115 9675 21825 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 9090 20025 9585 20025 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 9765 20115 9585 20115 9585 19260 9765 19260 9765 20115 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 9585 19800 5850 19800 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 9765 18540 9585 18540 9585 18360 9765 18360 9765 18540 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 9675 18540 9675 19260 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 11475 18450 9765 18450 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 9585 19710 9765 19710 +4 0 0 30 -1 18 12 0.0000 4 135 615 6120 21555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 21330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7650 21330 3-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 1575 7650 21555 South+East+West\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 9990 19305 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 9135 20430 Lt\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 9585 21825 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 9810 20160 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5940 19710 G\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 9495 18495 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 11385 18360 G\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-43.pdf b/katabatic/doc/images/GCellConfiguration-43.pdf new file mode 100644 index 00000000..c85b4c1c Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-43.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-43.png b/katabatic/doc/images/GCellConfiguration-43.png new file mode 100644 index 00000000..fa066fca Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-43.png differ diff --git a/katabatic/doc/images/GCellConfiguration-44.fig b/katabatic/doc/images/GCellConfiguration-44.fig new file mode 100644 index 00000000..cf11f1af --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-44.fig @@ -0,0 +1,60 @@ +#FIG 3.2 +Portrait +Center +Metric +A4 +55.00 +Single +-2 +1200 2 +6 -270 22230 5490 26370 +6 4140 23355 4410 24345 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 23760 4365 23760 4365 23940 4185 23940 4185 23760 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 23400 4320 23400 4320 24300 4230 24300 4230 23400 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 24525 90 90 2835 24525 3015 24525 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 22500 5175 22500 5175 26100 0 26100 0 22500 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 25650 4050 25650 4050 26100 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2250 25155 3825 25155 3825 25245 2250 25245 2250 25155 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2835 25110 3015 25110 3015 25290 2835 25290 2835 25110 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 25110 2925 24615 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 2115 23850 3510 23850 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 4185 23850 3690 23850 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3600 24615 3600 26325 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 2025 22275 2025 23085 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3015 24525 3510 24525 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 3690 24615 3510 24615 3510 23760 3690 23760 3690 24615 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 5400 23175 2115 23175 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 2115 23940 1935 23940 1935 23085 2115 23085 2115 23940 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3510 24300 -225 24300 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 3510 24210 3690 24210 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 26055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 25830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 25830 4-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 2175 1575 26055 North+South+East+West\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 3915 23805 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 3060 24930 Lt\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 1890 23715 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 1890 22410 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3510 26325 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 3735 24660 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5355 23130 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 24525 G\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-44.pdf b/katabatic/doc/images/GCellConfiguration-44.pdf new file mode 100644 index 00000000..52a5c8c8 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-44.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-44.png b/katabatic/doc/images/GCellConfiguration-44.png new file mode 100644 index 00000000..54ebe937 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-44.png differ diff --git a/katabatic/doc/images/GCellConfiguration-45.fig b/katabatic/doc/images/GCellConfiguration-45.fig new file mode 100644 index 00000000..1c0ba1d5 --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-45.fig @@ -0,0 +1,50 @@ +#FIG 3.2 +Portrait +Center +Metric +A4 +55.00 +Single +-2 +1200 2 +6 -270 26730 5490 30600 +6 4140 27855 4410 28845 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 28260 4365 28260 4365 28440 4185 28440 4185 28260 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4230 27900 4320 27900 4320 28800 4230 28800 4230 27900 +-6 +1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 29025 90 90 2835 29025 3015 29025 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 27000 5175 27000 5175 30600 0 30600 0 27000 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 30150 4050 30150 4050 30600 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2250 29655 3825 29655 3825 29745 2250 29745 2250 29655 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2835 29610 3015 29610 3015 29790 2835 29790 2835 29610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 29610 2925 29115 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 4185 28350 3690 28350 +2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3015 29025 3510 29025 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 + 3690 29115 3510 29115 3510 28260 3690 28260 3690 29115 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3510 28800 -225 28800 +2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 + 3510 28710 3690 28710 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3600 26775 3600 28260 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 30555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 30330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 30330 2-1-1-0\001 +4 0 0 30 -1 18 12 0.0000 4 135 1035 1575 30555 North+West\001 +4 1 12 40 -1 18 12 0.0000 4 135 180 3915 28305 Lt\001 +4 1 0 40 -1 18 12 0.0000 4 135 180 3060 29430 Lt\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 3735 29160 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5355 27630 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 29025 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3465 26910 G\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-45.pdf b/katabatic/doc/images/GCellConfiguration-45.pdf new file mode 100644 index 00000000..01422d35 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-45.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-45.png b/katabatic/doc/images/GCellConfiguration-45.png new file mode 100644 index 00000000..9985c9d9 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-45.png differ diff --git a/katabatic/doc/images/GCellConfiguration-5.fig b/katabatic/doc/images/GCellConfiguration-5.fig new file mode 100644 index 00000000..110d200b --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-5.fig @@ -0,0 +1,90 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 10215 2205 10485 3195 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 10305 2250 10395 2250 10395 3150 10305 3150 10305 2250 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 2610 10440 2610 10440 2790 10260 2790 10260 2610 +-6 +6 9315 1530 9585 2520 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 9360 1935 9540 1935 9540 2115 9360 2115 9360 1935 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 9405 1575 9495 1575 9495 2475 9405 2475 9405 1575 +-6 +6 4590 2205 4860 3195 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4680 2250 4770 2250 4770 3150 4680 3150 4680 2250 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4635 2610 4815 2610 4815 2790 4635 2790 4635 2610 +-6 +6 3690 1530 3960 2520 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3735 1935 3915 1935 3915 2115 3735 2115 3735 1935 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 3780 1575 3870 1575 3870 2475 3780 2475 3780 1575 +-6 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 5625 0 10800 0 10800 3600 5625 3600 5625 0 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 5625 3150 9675 3150 9675 3600 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 8325 1260 8325 -225 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 8235 1800 5400 1800 +2 1 1 2 18 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 8325 2790 8325 3105 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5175 0 5175 3600 0 3600 0 0 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 3150 3375 3150 3375 3600 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 2610 1800 -225 1800 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 1350 720 2565 1305 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 + 2790 2790 2790 1260 2610 1260 2610 2790 2790 2790 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 2700 1260 2700 -225 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 2790 1350 5400 1350 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 4635 2700 2790 2700 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 3735 2025 2790 2025 +2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 + 8415 2790 8415 1260 8235 1260 8235 2790 8415 2790 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 8415 1350 11025 1350 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 9360 2025 8415 2025 +2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 + 10260 2700 8415 2700 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6975 495 8190 1260 +4 0 0 30 -1 18 12 0.0000 4 135 615 5670 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 5670 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 2175 7200 3555 West+East+South+North\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 8460 -90 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5490 1980 G\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 7200 3330 4-2-0-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 10935 1530 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 8460 3105 G\001 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1545 1575 3555 West+East+North\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 2835 -90 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 1980 G\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 3-2-0-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5310 1530 G\001 +4 1 0 40 -1 18 12 0.0000 4 180 1335 1350 675 _targetContact\001 +4 1 0 40 -1 18 12 0.0000 4 180 1335 6975 450 _targetContact\001 diff --git a/katabatic/doc/images/GCellConfiguration-5.pdf b/katabatic/doc/images/GCellConfiguration-5.pdf new file mode 100644 index 00000000..05750d5b Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-5.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-5.png b/katabatic/doc/images/GCellConfiguration-5.png new file mode 100644 index 00000000..7084ee10 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-5.png differ diff --git a/katabatic/doc/images/GCellConfiguration-6.fig b/katabatic/doc/images/GCellConfiguration-6.fig new file mode 100644 index 00000000..5023988c --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-6.fig @@ -0,0 +1,656 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 -270 0 6570 3600 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 1575 90 90 2070 1575 2250 1575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 900 90 90 2070 900 2250 900 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 895 90 90 3430 895 3610 895 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 1350 90 90 3420 1350 3600 1350 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1353 1578 183 183 1170 1578 1536 1578 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4953 1350 183 183 4770 1350 5136 1350 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4950 450 90 90 4860 450 5040 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1350 450 90 90 1260 450 1440 450 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 3150 2700 3150 2700 3600 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 6300 0 6300 3600 0 3600 0 0 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + -225 450 1260 450 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 5040 450 6525 450 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 1620 900 1530 1800 1530 1800 1620 900 1620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 945 2475 855 3150 855 3150 945 2475 945 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 1485 1890 1485 1890 1665 1710 1665 1710 1485 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 810 2565 810 2565 990 2385 990 2385 810 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 810 3240 810 3240 990 3060 990 3060 810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 1395 4275 1305 5400 1305 5400 1395 4275 1395 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 1260 4365 1260 4365 1440 4185 1440 4185 1260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 1575 2070 1575 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 990 2160 1485 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 900 2385 900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 900 3420 900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 990 3510 1260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 1350 4185 1350 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1350 1395 1350 540 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4950 1170 4950 540 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 945 1575 3555 East+West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 2-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 675 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 6435 675 G\001 +4 1 0 40 -1 18 12 0.0000 4 180 765 4860 1755 _rightRP\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 1485 1035 L1\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 5085 945 L2\001 +4 1 0 40 -1 18 12 0.0000 4 180 660 1350 1935 _leftRP\001 +4 1 0 40 -1 18 12 0.0000 4 180 1725 1350 270 _southWestContact\001 +4 1 0 40 -1 18 12 0.0000 4 180 1665 4950 270 _northEastContact\001 +-6 +6 -270 18000 6300 21870 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 19575 90 90 2070 19575 2250 19575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 18900 90 90 2070 18900 2250 18900 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 18895 90 90 3430 18895 3610 18895 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 19350 90 90 3420 19350 3600 19350 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 20250 90 90 4725 20250 4905 20250 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 18000 6300 18000 6300 21600 0 21600 0 18000 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 19620 900 19530 1800 19530 1800 19620 900 19620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 18945 2475 18855 3150 18855 3150 18945 2475 18945 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 19485 1890 19485 1890 19665 1710 19665 1710 19485 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 18810 2565 18810 2565 18990 2385 18990 2385 18810 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 18810 3240 18810 3240 18990 3060 18990 3060 18810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 19395 4275 19305 5400 19305 5400 19395 4275 19395 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 19260 4365 19260 4365 19440 4185 19440 4185 19260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 19575 2070 19575 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 18990 2160 19485 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 18900 2385 18900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 18900 3420 18900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 18990 3510 19260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 19350 4185 19350 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + -225 20700 5535 20700 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 19530 4815 20160 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 4905 19530 4725 19530 4725 19170 4905 19170 4905 19530 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4905 20250 5535 20250 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 5715 20790 5535 20790 5535 20160 5715 20160 5715 20790 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 5625 21825 5625 20790 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 21150 3780 21150 3780 21600 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 21555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 21330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1065 1575 21555 South+West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 21330 2-0-3-0\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 5040 19620 biggestRP\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5535 21825 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -180 20880 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 465 4545 19890 L1-tc\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 5490 20565 _southWestContact\001 +-6 +6 -270 13230 6570 17370 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 15075 90 90 2070 15075 2250 15075 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 14400 90 90 2070 14400 2250 14400 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 14395 90 90 3430 14395 3610 14395 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 14850 90 90 3420 14850 3600 14850 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 16200 90 90 4725 16200 4905 16200 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 13950 90 90 4725 13950 4905 13950 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 16650 3780 16650 3780 17100 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 13500 6300 13500 6300 17100 0 17100 0 13500 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 15120 900 15030 1800 15030 1800 15120 900 15120 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 14445 2475 14355 3150 14355 3150 14445 2475 14445 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 14985 1890 14985 1890 15165 1710 15165 1710 14985 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 14310 2565 14310 2565 14490 2385 14490 2385 14310 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 14310 3240 14310 3240 14490 3060 14490 3060 14310 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 14895 4275 14805 5400 14805 5400 14895 4275 14895 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 14760 4365 14760 4365 14940 4185 14940 4185 14760 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 15075 2070 15075 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 14490 2160 14985 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 14400 2385 14400 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 14400 3420 14400 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 14490 3510 14760 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 14850 4185 14850 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 15390 4815 16110 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4815 17325 4815 16290 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + -225 16200 4725 16200 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4905 13950 6525 13950 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4815 13860 4815 13275 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 14040 4815 14310 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 4905 15390 4725 15390 4725 14310 4905 14310 4905 15390 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 17055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 16830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 2175 1575 17055 North+South+East+West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 16830 4-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 16425 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 5040 15345 biggestRP\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4680 15840 L1\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 4725 17325 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 6435 14175 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 4950 13410 G\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 4635 13995 _northEastContact\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4995 14265 L2\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 4680 16110 _southWestContact\001 +-6 +6 0 8730 6570 12870 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 10575 90 90 2070 10575 2250 10575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 9900 90 90 2070 9900 2250 9900 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 9895 90 90 3430 9895 3610 9895 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 10350 90 90 3420 10350 3600 10350 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 10800 90 90 3735 10800 3915 10800 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 9450 90 90 4725 9450 4905 9450 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 12150 3600 12150 3600 12600 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 9000 6300 9000 6300 12600 0 12600 0 9000 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 3825 12825 3825 10890 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 10620 900 10530 1800 10530 1800 10620 900 10620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 9945 2475 9855 3150 9855 3150 9945 2475 9945 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 10485 1890 10485 1890 10665 1710 10665 1710 10485 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 9810 2565 9810 2565 9990 2385 9990 2385 9810 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 9810 3240 9810 3240 9990 3060 9990 3060 9810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 10395 4275 10305 5400 10305 5400 10395 4275 10395 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 10260 4365 10260 4365 10440 4185 10440 4185 10260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 10575 2070 10575 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 9990 2160 10485 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 9900 2385 9900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 9900 3420 9900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 9990 3510 10260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 10350 4185 10350 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4725 10800 3915 10800 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4815 9360 4815 8775 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4905 9450 6525 9450 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 9540 4815 9810 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 4905 10890 4725 10890 4725 9810 4905 9810 4905 10890 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 12555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 12330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1635 1575 12555 North+South+East\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 12330 3-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 3690 12825 G\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 5040 10845 biggestRP\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4320 11025 L1\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 4590 9450 _northEastContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 6435 9675 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4995 9720 L2\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 4950 8910 G\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 3645 10890 _southWestContact\001 +-6 +6 6930 4230 13770 8100 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 6120 90 90 9270 6120 9450 6120 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 5445 90 90 9270 5445 9450 5445 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 5440 90 90 10630 5440 10810 5440 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 5895 90 90 10620 5895 10800 5895 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12015 4950 90 90 11925 4950 12105 4950 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12015 7200 90 90 11925 7200 12105 7200 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 7200 7650 10800 7650 10800 8100 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 7200 4500 13500 4500 13500 8100 7200 8100 7200 4500 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 11925 7200 6975 7200 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8100 6165 8100 6075 9000 6075 9000 6165 8100 6165 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 9675 5490 9675 5400 10350 5400 10350 5490 9675 5490 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 6030 9090 6030 9090 6210 8910 6210 8910 6030 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 9585 5355 9765 5355 9765 5535 9585 5535 9585 5355 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 5355 10440 5355 10440 5535 10260 5535 10260 5355 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 11475 5940 11475 5850 12600 5850 12600 5940 11475 5940 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 11385 5805 11565 5805 11565 5985 11385 5985 11385 5805 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9090 6120 9270 6120 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9360 5535 9360 6030 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9450 5445 9585 5445 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10440 5445 10620 5445 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10710 5535 10710 5805 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10800 5895 11385 5895 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 12015 5040 12015 5355 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 12105 4950 13725 4950 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 12015 6435 12015 7110 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 12015 4860 12015 4275 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 12105 6435 11925 6435 11925 5355 12105 5355 12105 6435 +4 0 0 30 -1 18 12 0.0000 4 135 615 7245 8055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 7830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 8775 7830 3-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 7065 7425 G\001 +4 0 0 30 -1 18 12 0.0000 4 135 1575 8775 8055 South+East+West\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 12240 6390 biggestRP\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 11925 5265 _northEastContact\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 12150 5265 L2\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 13635 5175 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 12150 6840 L1\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 12150 4410 G\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 11835 7110 _southWestContact\001 +-6 +6 -270 4500 6570 8370 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 6120 90 90 2070 6120 2250 6120 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 5445 90 90 2070 5445 2250 5445 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 5440 90 90 3430 5440 3610 5440 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 5895 90 90 3420 5895 3600 5895 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 4950 90 90 4725 4950 4905 4950 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 7200 90 90 4725 7200 4905 7200 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 7650 3600 7650 3600 8100 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 4500 6300 4500 6300 8100 0 8100 0 4500 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4725 7200 -225 7200 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 6165 900 6075 1800 6075 1800 6165 900 6165 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 5490 2475 5400 3150 5400 3150 5490 2475 5490 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 6030 1890 6030 1890 6210 1710 6210 1710 6030 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 5355 2565 5355 2565 5535 2385 5535 2385 5355 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 5355 3240 5355 3240 5535 3060 5535 3060 5355 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 5940 4275 5850 5400 5850 5400 5940 4275 5940 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 5805 4365 5805 4365 5985 4185 5985 4185 5805 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 6120 2070 6120 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 5535 2160 6030 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 5445 2385 5445 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 5445 3420 5445 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 5535 3510 5805 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 5895 4185 5895 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 5040 4815 5355 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4905 4950 6525 4950 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4815 8325 4815 7290 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 6435 4815 7110 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 4905 6435 4725 6435 4725 5355 4905 5355 4905 6435 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 8055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 7830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 7830 3-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 7425 G\001 +4 0 0 30 -1 18 12 0.0000 4 135 1575 1575 8055 South+East+West\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 5040 6390 biggestRP\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 4725 5265 _northEastContact\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4950 5265 L2\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 6435 5175 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 4950 8325 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4950 6840 L1\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 4680 7110 _southWestContact\001 +-6 +6 7200 -270 13500 3870 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 1575 90 90 9270 1575 9450 1575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 900 90 90 9270 900 9450 900 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 895 90 90 10630 895 10810 895 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 1350 90 90 10620 1350 10800 1350 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 10350 1800 90 90 10260 1800 10440 1800 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12825 900 90 90 12735 900 12915 900 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 7200 3150 10125 3150 10125 3600 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 7200 0 13500 0 13500 3600 7200 3600 7200 0 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 12825 810 12825 -225 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 10350 3825 10350 1890 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8100 1620 8100 1530 9000 1530 9000 1620 8100 1620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 9675 945 9675 855 10350 855 10350 945 9675 945 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 1485 9090 1485 9090 1665 8910 1665 8910 1485 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 9585 810 9765 810 9765 990 9585 990 9585 810 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 810 10440 810 10440 990 10260 990 10260 810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 11475 1395 11475 1305 12600 1305 12600 1395 11475 1395 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 11385 1260 11565 1260 11565 1440 11385 1440 11385 1260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9090 1575 9270 1575 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9360 990 9360 1485 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9450 900 9585 900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10440 900 10620 900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10710 990 10710 1260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10800 1350 11385 1350 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 12735 900 12105 900 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 11925 1800 10440 1800 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 12105 1890 11925 1890 11925 810 12105 810 12105 1890 +4 0 0 30 -1 18 12 0.0000 4 135 615 7245 3555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 3330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1125 8775 3555 North+South\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 8775 3330 2-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 12960 -45 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 10485 3825 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 12465 1080 L2\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 11160 1980 L1\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 12735 675 _northEastContact\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 12240 1845 biggestRP\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 10170 1890 _southWestContact\001 +-6 +6 6930 8730 13500 12870 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 10575 90 90 9270 10575 9450 10575 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 9900 90 90 9270 9900 9450 9900 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 9895 90 90 10630 9895 10810 9895 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 10350 90 90 10620 10350 10800 10350 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12825 9900 90 90 12735 9900 12915 9900 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12015 11700 90 90 11925 11700 12105 11700 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 7200 12150 10800 12150 10800 12600 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 7200 9000 13500 9000 13500 12600 7200 12600 7200 9000 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 6975 11700 11925 11700 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 12825 9810 12825 8775 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8100 10620 8100 10530 9000 10530 9000 10620 8100 10620 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 9675 9945 9675 9855 10350 9855 10350 9945 9675 9945 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 10485 9090 10485 9090 10665 8910 10665 8910 10485 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 9585 9810 9765 9810 9765 9990 9585 9990 9585 9810 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 9810 10440 9810 10440 9990 10260 9990 10260 9810 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 11475 10395 11475 10305 12600 10305 12600 10395 11475 10395 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 11385 10260 11565 10260 11565 10440 11385 10440 11385 10260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9090 10575 9270 10575 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9360 9990 9360 10485 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9450 9900 9585 9900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10440 9900 10620 9900 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10710 9990 10710 10260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10800 10350 11385 10350 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 12735 9900 12105 9900 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 12015 12825 12015 11790 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 12015 10890 12015 11610 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 12105 10890 11925 10890 11925 9810 12105 9810 12105 10890 +4 0 0 30 -1 18 12 0.0000 4 135 615 7245 12555 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 12330 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1665 8775 12555 North+South+West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 8775 12330 3-0-3-0\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 12960 8955 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 7065 11925 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 12465 10080 L2\001 +4 2 0 40 -1 18 12 0.0000 4 180 1665 12735 9675 _northEastContact\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 12240 10845 biggestRP\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 11925 12825 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 11880 11295 L1\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 11880 11610 _southWestContact\001 +-6 +6 0 22500 6570 26100 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 24075 90 90 2070 24075 2250 24075 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 23400 90 90 2070 23400 2250 23400 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 23395 90 90 3430 23395 3610 23395 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 23850 90 90 3420 23850 3600 23850 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 24750 90 90 4725 24750 4905 24750 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 22500 6300 22500 6300 26100 0 26100 0 22500 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 24120 900 24030 1800 24030 1800 24120 900 24120 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 23445 2475 23355 3150 23355 3150 23445 2475 23445 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 23985 1890 23985 1890 24165 1710 24165 1710 23985 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 23310 2565 23310 2565 23490 2385 23490 2385 23310 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 23310 3240 23310 3240 23490 3060 23490 3060 23310 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 23895 4275 23805 5400 23805 5400 23895 4275 23895 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 23760 4365 23760 4365 23940 4185 23940 4185 23760 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 24075 2070 24075 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 23490 2160 23985 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 23400 2385 23400 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 23400 3420 23400 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 23490 3510 23760 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 23850 4185 23850 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 24030 4815 24660 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 4905 24030 4725 24030 4725 23670 4905 23670 4905 24030 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 25650 3780 25650 3780 26100 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4905 24750 6525 24750 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 26055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 25830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 405 1575 26055 East\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 25830 1-0-3-0\001 +4 0 0 40 -1 18 12 0.0000 4 180 660 5040 24120 rightRP\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 4680 24390 L1\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 4635 24660 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 6480 24930 G\001 +-6 +6 6930 22500 13500 26100 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 24075 90 90 9270 24075 9450 24075 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 23400 90 90 9270 23400 9450 23400 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 23395 90 90 10630 23395 10810 23395 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 23850 90 90 10620 23850 10800 23850 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 8550 24750 90 90 8460 24750 8640 24750 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 7200 22500 13500 22500 13500 26100 7200 26100 7200 22500 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 8100 24120 8100 24030 9000 24030 9000 24120 8100 24120 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 9675 23445 9675 23355 10350 23355 10350 23445 9675 23445 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 8910 23985 9090 23985 9090 24165 8910 24165 8910 23985 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 9585 23310 9765 23310 9765 23490 9585 23490 9585 23310 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 10260 23310 10440 23310 10440 23490 10260 23490 10260 23310 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 11475 23895 11475 23805 12600 23805 12600 23895 11475 23895 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 11385 23760 11565 23760 11565 23940 11385 23940 11385 23760 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9090 24075 9270 24075 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9360 23490 9360 23985 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 9450 23400 9585 23400 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10440 23400 10620 23400 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10710 23490 10710 23760 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 10800 23850 11385 23850 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 7200 25650 10980 25650 10980 26100 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 8640 24255 8460 24255 8460 23895 8640 23895 8640 24255 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 8550 24255 8550 24660 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 6975 24750 8460 24750 +4 0 0 30 -1 18 12 0.0000 4 135 615 7245 26055 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 25830 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 435 8775 26055 West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 8775 25830 1-0-3-0\001 +4 1 -1 30 -1 18 12 0.0000 4 135 210 8415 24525 L1\001 +4 2 0 40 -1 18 12 0.0000 4 135 555 8325 23940 leftRP\001 +4 0 0 40 -1 18 12 0.0000 4 180 1725 8685 24795 _southWestContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 7020 24930 G\001 +-6 +6 0 26775 6300 30645 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 28350 90 90 2070 28350 2250 28350 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 27675 90 90 2070 27675 2250 27675 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 27670 90 90 3430 27670 3610 27670 +1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 28125 90 90 3420 28125 3600 28125 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 29025 90 90 4725 29025 4905 29025 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 26775 6300 26775 6300 30375 0 30375 0 26775 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 900 28395 900 28305 1800 28305 1800 28395 900 28395 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2475 27720 2475 27630 3150 27630 3150 27720 2475 27720 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 28260 1890 28260 1890 28440 1710 28440 1710 28260 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 27585 2565 27585 2565 27765 2385 27765 2385 27585 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3060 27585 3240 27585 3240 27765 3060 27765 3060 27585 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4275 28170 4275 28080 5400 28080 5400 28170 4275 28170 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4185 28035 4365 28035 4365 28215 4185 28215 4185 28035 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 28350 2070 28350 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2160 27765 2160 28260 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 27675 2385 27675 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3240 27675 3420 27675 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3510 27765 3510 28035 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 3600 28125 4185 28125 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 28305 4815 28935 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 4905 28305 4725 28305 4725 27945 4905 27945 4905 28305 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4905 29025 5535 29025 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 5625 30600 5625 29115 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 29925 3780 29925 3780 30375 +2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 + 5715 29115 5535 29115 5535 28935 5715 28935 5715 29115 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 30330 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 30105 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 525 1575 30330 South\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 30105 1-0-3-0\001 +4 0 0 40 -1 18 12 0.0000 4 180 900 5040 28395 biggestRP\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 5535 30600 G\001 +4 1 -1 30 -1 18 12 0.0000 4 135 465 4545 28665 L1-tc\001 +4 2 0 40 -1 18 12 0.0000 4 180 1725 5490 29340 _southWestContact\001 +-6 diff --git a/katabatic/doc/images/GCellConfiguration-6.pdf b/katabatic/doc/images/GCellConfiguration-6.pdf new file mode 100644 index 00000000..19e75386 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-6.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-6.png b/katabatic/doc/images/GCellConfiguration-6.png new file mode 100644 index 00000000..f9b6df62 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-6.png differ diff --git a/katabatic/doc/images/GCellConfiguration-7.fig b/katabatic/doc/images/GCellConfiguration-7.fig new file mode 100644 index 00000000..b2bb7a5b --- /dev/null +++ b/katabatic/doc/images/GCellConfiguration-7.fig @@ -0,0 +1,106 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 -270 -1575 3150 3825 +6 1665 -1395 2610 3195 +1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 2475 1890 90 90 2475 1980 2475 1800 +1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 1800 1890 90 90 1800 1980 1800 1800 +1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 1795 530 90 90 1795 620 1795 440 +1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 2250 540 90 90 2250 630 2250 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 1.5708 2251 -768 183 183 2251 -585 2251 -951 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2520 3150 2430 3150 2430 2250 2520 2250 2520 3150 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 1845 1575 1755 1575 1755 900 1845 900 1845 1575 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 2340 2385 2160 2565 2160 2565 2340 2385 2340 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 1665 1710 1485 1890 1485 1890 1665 1710 1665 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1710 990 1710 810 1890 810 1890 990 1710 990 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 2295 -225 2205 -225 2205 -1350 2295 -1350 2295 -225 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2160 -135 2160 -315 2340 -315 2340 -135 2160 -135 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2475 2160 2475 1980 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 1890 2385 1890 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1800 1800 1800 1665 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1800 810 1800 630 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1890 540 2160 540 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2250 450 2250 -135 +-6 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 0 3375 2700 3375 2700 3825 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 0 -1575 3150 -1575 3150 3825 0 3825 0 -1575 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + -225 -765 2070 -765 +4 0 0 30 -1 18 12 0.0000 4 135 615 45 3780 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3555 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 435 1575 3780 West\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3555 1-0-0-3\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 -135 -585 G\001 +4 1 0 40 -1 18 12 0.0000 4 180 1335 1350 -585 _targetContact\001 +-6 +1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 7470 1890 90 90 7470 1980 7470 1800 +1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 6795 1890 90 90 6795 1980 6795 1800 +1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 6790 530 90 90 6790 620 6790 440 +1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 7245 540 90 90 7245 630 7245 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 1.5708 7246 -768 183 183 7246 -585 7246 -951 +1 4 0 2 0 7 40 -1 -1 0.000 1 1.5708 6075 -768 93 93 6075 -675 6075 -861 +2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 + 4995 3375 7695 3375 7695 3825 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 4995 -1575 8145 -1575 8145 3825 4995 3825 4995 -1575 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7515 3150 7425 3150 7425 2250 7515 2250 7515 3150 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 6840 1575 6750 1575 6750 900 6840 900 6840 1575 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7380 2340 7380 2160 7560 2160 7560 2340 7380 2340 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6705 1665 6705 1485 6885 1485 6885 1665 6705 1665 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6705 990 6705 810 6885 810 6885 990 6705 990 +2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7290 -225 7200 -225 7200 -1350 7290 -1350 7290 -225 +2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7155 -135 7155 -315 7335 -315 7335 -135 7155 -135 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 7470 2160 7470 1980 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 6885 1890 7380 1890 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 6795 1800 6795 1665 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 6795 810 6795 630 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 6885 540 7155 540 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 7245 450 7245 -135 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 7065 -765 6165 -765 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 4725 -765 5985 -765 +2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 + 6075 -900 6075 -1800 +4 0 0 30 -1 18 12 0.0000 4 135 615 5040 3780 Global:\001 +4 0 0 30 -1 18 12 0.0000 4 180 1230 5040 3555 Configuration:\001 +4 0 0 30 -1 18 12 0.0000 4 135 1035 6570 3780 West+North\001 +4 0 0 30 -1 18 12 0.0000 4 135 645 6570 3555 2-0-0-3\001 +4 1 0 40 -1 18 12 0.0000 4 180 1335 6075 -495 _targetContact\001 +4 1 0 40 -1 18 12 1.5708 4 135 1005 7605 -810 subContact\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 4815 -585 G\001 +4 1 18 30 -1 18 12 0.0000 4 135 150 6165 -1665 G\001 diff --git a/katabatic/doc/images/GCellConfiguration-7.pdf b/katabatic/doc/images/GCellConfiguration-7.pdf new file mode 100644 index 00000000..47da82b4 Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-7.pdf differ diff --git a/katabatic/doc/images/GCellConfiguration-7.png b/katabatic/doc/images/GCellConfiguration-7.png new file mode 100644 index 00000000..2a0c761d Binary files /dev/null and b/katabatic/doc/images/GCellConfiguration-7.png differ diff --git a/katabatic/doc/images/LegalConstruct-1.fig b/katabatic/doc/images/LegalConstruct-1.fig new file mode 100644 index 00000000..580037c3 --- /dev/null +++ b/katabatic/doc/images/LegalConstruct-1.fig @@ -0,0 +1,136 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 675 4275 675 4275 3375 1575 3375 1575 675 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 675 7875 675 7875 3375 5175 3375 5175 675 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 1125 1935 1125 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2115 2025 3780 2025 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2115 2115 2115 1035 1935 1035 1935 2115 2115 2115 +2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5 + 3870 2475 3780 2475 3780 1800 3870 1800 3870 2475 +2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5 + 7470 2475 7380 2475 7380 1800 7470 1800 7470 2475 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 1935 7515 1935 7515 2115 7335 2115 7335 1935 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6435 1035 6615 1035 6615 1215 6435 1215 6435 1035 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6435 1935 6615 1935 6615 2115 6435 2115 6435 1935 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 1080 6525 1080 6525 1170 4950 1170 4950 1080 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 6525 1980 7425 1980 7425 2070 6525 2070 6525 1980 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6930 1485 6615 1215 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6930 1485 6615 1935 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6525 1215 6525 1935 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 6120 1575 6480 1575 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 1125 0 8325 0 8325 10125 1125 10125 1125 0 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 6975 4275 6975 4275 9675 1575 9675 1575 6975 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 6975 7875 6975 7875 9675 5175 9675 5175 6975 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 7425 1935 7425 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2115 8325 3780 8325 +2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5 + 3870 8775 3780 8775 3780 8100 3870 8100 3870 8775 +2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5 + 7470 8775 7380 8775 7380 8100 7470 8100 7470 8775 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 8235 7515 8235 7515 8415 7335 8415 7335 8235 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2115 7515 2115 7335 1935 7335 1935 7515 2115 7515 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2115 8415 2115 8235 1935 8235 1935 8415 2115 8415 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 7515 2025 8235 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 8235 5715 8235 5715 8415 5535 8415 5535 8235 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5625 8280 7425 8280 7425 8370 5625 8370 5625 8280 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 8280 5625 8280 5625 8370 4950 8370 4950 8280 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 3825 4275 3825 4275 6525 1575 6525 1575 3825 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 3825 7875 3825 7875 6525 5175 6525 5175 3825 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 4275 1935 4275 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2115 5175 3780 5175 +2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5 + 3870 5625 3780 5625 3780 4950 3870 4950 3870 5625 +2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5 + 7470 5625 7380 5625 7380 4950 7470 4950 7470 5625 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 5085 7515 5085 7515 5265 7335 5265 7335 5085 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2115 4365 2115 4185 1935 4185 1935 4365 2115 4365 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2115 5265 2115 5085 1935 5085 1935 5265 2115 5265 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 4365 2025 5085 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 4275 5670 4275 5670 5175 5580 5175 5580 4275 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 4185 5715 4185 5715 4365 5535 4365 5535 4185 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 5085 5715 5085 5715 5265 5535 5265 5535 5085 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5625 5130 7425 5130 7425 5220 5625 5220 5625 5130 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 4230 5625 4230 5625 4320 4950 4320 4950 4230 +4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1395 1080 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 1035 G1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 2025 2340 AC1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 2925 1980 L1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 7155 1575 AC1\001 +4 1 0 40 -1 18 12 0.0000 4 135 120 4050 2205 T\001 +4 1 0 40 -1 18 12 0.0000 4 135 120 7650 2205 T\001 +4 2 18 50 -1 19 12 0.0000 4 150 300 6030 1620 gap\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1395 7380 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 2925 8280 L1\001 +4 1 0 40 -1 18 12 0.0000 4 135 120 4050 8505 T\001 +4 1 0 40 -1 18 12 0.0000 4 135 120 7650 8505 T\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 2385 7470 AC1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 6525 8235 L1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 2025 8640 AC2\001 +4 1 0 40 -1 18 12 0.0000 4 135 390 2250 7920 L2-c\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 4995 8235 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 390 5625 8190 L2-c\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 5625 8595 AC1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 5625 8775 AC2\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1395 4230 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 4185 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 2925 5130 L1\001 +4 1 0 40 -1 18 12 0.0000 4 135 120 4050 5355 T\001 +4 1 0 40 -1 18 12 0.0000 4 135 120 7650 5355 T\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 2385 4320 AC1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 2205 4770 L2\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 5850 4770 L2\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 6525 5085 L1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 6030 4365 AC1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 5625 5490 AC2\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 2025 5490 AC2\001 diff --git a/katabatic/doc/images/LegalConstruct-1.pdf b/katabatic/doc/images/LegalConstruct-1.pdf new file mode 100644 index 00000000..add7279f Binary files /dev/null and b/katabatic/doc/images/LegalConstruct-1.pdf differ diff --git a/katabatic/doc/images/LegalConstruct-1.png b/katabatic/doc/images/LegalConstruct-1.png new file mode 100644 index 00000000..0415dba1 Binary files /dev/null and b/katabatic/doc/images/LegalConstruct-1.png differ diff --git a/katabatic/doc/images/LegalConstruct-2.fig b/katabatic/doc/images/LegalConstruct-2.fig new file mode 100644 index 00000000..773af630 --- /dev/null +++ b/katabatic/doc/images/LegalConstruct-2.fig @@ -0,0 +1,151 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 1260 675 7875 3645 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 675 4275 675 4275 3375 1575 3375 1575 675 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 675 7875 675 7875 3375 5175 3375 5175 675 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 2025 1935 2025 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 1935 2700 1215 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2790 2160 2790 1935 1935 1935 1935 2160 2790 2160 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 3600 2025 2160 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2790 1215 2790 1035 2610 1035 2610 1215 2790 1215 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 1935 5715 1935 5715 2115 5535 2115 5535 1935 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 6255 2025 6345 2025 6345 1125 6255 1125 6255 2025 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 1980 6300 1980 6300 2070 4950 2070 4950 1980 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6210 1935 6390 1935 6390 2115 6210 2115 6210 1935 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6210 1035 6390 1035 6390 1215 6210 1215 6210 1035 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5625 1395 5625 1935 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5625 1395 6210 1935 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 3600 5670 3600 5670 2025 5580 2025 5580 3600 +4 1 0 40 -1 18 12 0.0000 4 135 255 1395 1980 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 2835 1620 L1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 2340 1890 AC1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 1935 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 6480 1665 L1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 5580 1350 AC1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 2205 3600 G2\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5850 3600 G2\001 +-6 +6 1260 4050 7875 6750 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 4050 4275 4050 4275 6750 1575 6750 1575 4050 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 4050 7875 4050 7875 6750 5175 6750 5175 4050 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 5400 1935 5400 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 5310 2700 4590 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2790 5535 2790 5310 1935 5310 1935 5535 2790 5535 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 6210 2025 5535 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2790 4590 2790 4410 2610 4410 2610 4590 2790 4590 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2115 6390 2115 6210 1935 6210 1935 6390 2115 6390 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 5310 5715 5310 5715 5490 5535 5490 5535 5310 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 6300 5670 6300 5670 5400 5580 5400 5580 6300 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 6255 5400 6345 5400 6345 4500 6255 4500 6255 5400 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 5355 6300 5355 6300 5445 4950 5445 4950 5355 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6210 5310 6390 5310 6390 5490 6210 5490 6210 5310 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6210 4410 6390 4410 6390 4590 6210 4590 6210 4410 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 6210 5715 6210 5715 6390 5535 6390 5535 6210 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5625 4770 5625 5310 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5625 4770 6210 5310 +4 1 0 40 -1 18 12 0.0000 4 135 255 1395 5355 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 2160 5940 L2\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 2835 4995 L1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 2340 5265 AC1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 5310 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 5805 5940 L2\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 6480 5040 L1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 5580 4725 AC1\001 +-6 +6 1575 7200 7875 9900 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 7200 4275 7200 4275 9900 1575 9900 1575 7200 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 7200 7875 7200 7875 9900 5175 9900 5175 7200 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2115 8550 3060 8550 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 8460 3825 7740 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3915 8685 3915 8460 3060 8460 3060 8685 3915 8685 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 9360 3150 8685 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3915 7740 3915 7560 3735 7560 3735 7740 3915 7740 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3240 9540 3240 9360 3060 9360 3060 9540 3240 9540 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6660 8460 6840 8460 6840 8640 6660 8640 6660 8460 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 6705 9450 6795 9450 6795 8550 6705 8550 6705 9450 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6660 9360 6840 9360 6840 9540 6660 9540 6660 9360 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2115 8640 2115 8460 1935 8460 1935 8640 2115 8640 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 8460 5715 8460 5715 8640 5535 8640 5535 8460 +2 1 0 2 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3510 8460 3510 8685 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 6705 8550 6795 8550 6795 7650 6705 7650 6705 8550 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6660 7560 6840 7560 6840 7740 6660 7740 6660 7560 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5625 8505 6750 8505 6750 8595 5625 8595 5625 8505 +2 1 0 1 -1 7 50 -1 -1 0.000 0 0 -1 1 1 4 + 3 0 1.00 60.00 120.00 + 3 0 1.00 60.00 120.00 + 7110 8100 7425 8100 7425 9000 7110 9000 +4 1 0 40 -1 18 12 0.0000 4 135 210 2520 8505 L3\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 3285 9090 L2\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 3960 8145 L1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 3465 8415 AC1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 6165 8460 L3\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 6930 9090 L2\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 2025 8415 AC2\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 5580 8415 AC2\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 6930 8145 L1\001 +4 1 18 40 -1 18 12 0.0000 4 135 345 7110 8640 AC1\001 +-6 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 1125 0 8325 0 8325 10350 1125 10350 1125 0 +4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 diff --git a/katabatic/doc/images/LegalConstruct-2.pdf b/katabatic/doc/images/LegalConstruct-2.pdf new file mode 100644 index 00000000..f8a21ad9 Binary files /dev/null and b/katabatic/doc/images/LegalConstruct-2.pdf differ diff --git a/katabatic/doc/images/LegalConstruct-2.png b/katabatic/doc/images/LegalConstruct-2.png new file mode 100644 index 00000000..c8ba3a62 Binary files /dev/null and b/katabatic/doc/images/LegalConstruct-2.png differ diff --git a/katabatic/doc/images/LegalConstruct-3.fig b/katabatic/doc/images/LegalConstruct-3.fig new file mode 100644 index 00000000..d0747f65 --- /dev/null +++ b/katabatic/doc/images/LegalConstruct-3.fig @@ -0,0 +1,55 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 1260 630 7875 3600 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 900 4275 900 4275 3600 1575 3600 1575 900 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 900 7875 900 7875 3600 5175 3600 5175 900 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 2250 1935 2250 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 2160 2700 675 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2790 2385 2790 2160 1935 2160 1935 2385 2790 2385 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 3060 2025 2385 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2115 3240 2115 3060 1935 3060 1935 3240 2115 3240 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 2160 5715 2160 5715 2340 5535 2340 5535 2160 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 3150 5670 3150 5670 2250 5580 2250 5580 3150 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 2205 6300 2205 6300 2295 4950 2295 4950 2205 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6210 2160 6390 2160 6390 2340 6210 2340 6210 2160 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 3060 5715 3060 5715 3240 5535 3240 5535 3060 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5625 1620 5625 2160 +2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 + 3 0 1.00 60.00 120.00 + 5625 1620 6210 2160 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 6255 2250 6345 2250 6345 675 6255 675 6255 2250 +4 1 0 40 -1 18 12 0.0000 4 135 255 1395 2205 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 2160 2790 L2\001 +4 1 18 40 -1 18 12 0.0000 4 135 555 2340 2115 AC-BL\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 2160 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 5805 2790 L2\001 +4 1 18 40 -1 18 12 0.0000 4 135 555 5580 1575 AC-BL\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 2880 810 G3\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 6525 810 G3\001 +-6 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 1125 0 8325 0 8325 4050 1125 4050 1125 0 +4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 diff --git a/katabatic/doc/images/LegalConstruct-3.pdf b/katabatic/doc/images/LegalConstruct-3.pdf new file mode 100644 index 00000000..560b1b25 Binary files /dev/null and b/katabatic/doc/images/LegalConstruct-3.pdf differ diff --git a/katabatic/doc/images/LegalConstruct-3.png b/katabatic/doc/images/LegalConstruct-3.png new file mode 100644 index 00000000..391ec4a2 Binary files /dev/null and b/katabatic/doc/images/LegalConstruct-3.png differ diff --git a/katabatic/doc/images/LegalConstruct-4.fig b/katabatic/doc/images/LegalConstruct-4.fig new file mode 100644 index 00000000..f36a2629 --- /dev/null +++ b/katabatic/doc/images/LegalConstruct-4.fig @@ -0,0 +1,91 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 1125 0 8325 0 8325 7875 1125 7875 1125 0 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 4500 4275 4500 4275 7200 1575 7200 1575 4500 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 4500 7875 4500 7875 7200 5175 7200 5175 4500 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 5850 1935 5850 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 7425 2025 5985 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 5760 5715 5760 5715 5940 5535 5940 5535 5760 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2160 5985 2160 5760 1935 5760 1935 5985 2160 5985 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 7425 5670 7425 5670 5850 5580 5850 5580 7425 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2160 5040 2160 4815 1935 4815 1935 5040 2160 5040 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 5760 2025 5040 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4500 4950 2160 4950 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 4860 5715 4860 5715 5040 5535 5040 5535 4860 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 5805 5625 5805 5625 5895 4950 5895 4950 5805 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 5850 5670 5850 5670 4950 5580 4950 5580 5850 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5625 4905 8100 4905 8100 4995 5625 4995 5625 4905 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 900 4275 900 4275 3600 1575 3600 1575 900 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 900 7875 900 7875 3600 5175 3600 5175 900 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 2250 1935 2250 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 3825 2025 2385 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 2160 5715 2160 5715 2340 5535 2340 5535 2160 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2160 2385 2160 2160 1935 2160 1935 2385 2160 2385 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 2160 3825 675 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3960 2385 3960 2160 3735 2160 3735 2385 3960 2385 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3735 2250 2160 2250 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7380 2250 7470 2250 7470 675 7380 675 7380 2250 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 2160 7515 2160 7515 2340 7335 2340 7335 2160 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 3825 5670 3825 5670 2250 5580 2250 5580 3825 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 2205 7425 2205 7425 2295 4950 2295 4950 2205 +4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1395 5805 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 5760 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 2205 7425 G2\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5850 7425 G2\001 +4 1 18 40 -1 18 12 0.0000 4 135 600 1620 6120 AC-SW\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 4455 4905 G4\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 2025 4725 AC-NE\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 8055 4860 G4\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 5580 4770 AC-NE\001 +4 1 18 40 -1 18 12 0.0000 4 135 600 5220 6165 AC-SW\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1395 2205 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 2160 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 4005 810 G3\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 2205 3825 G2\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 7650 810 G3\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5850 3825 G2\001 +4 1 18 40 -1 18 12 0.0000 4 135 600 2070 2070 AC-SW\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 3825 2610 AC-NE\001 +4 1 18 40 -1 18 12 0.0000 4 135 600 5625 2070 AC-SW\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 7425 2610 AC-NE\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 2925 2205 L1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 6570 2160 L1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 2205 5490 L1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 5850 5490 L1\001 diff --git a/katabatic/doc/images/LegalConstruct-4.pdf b/katabatic/doc/images/LegalConstruct-4.pdf new file mode 100644 index 00000000..572d8774 Binary files /dev/null and b/katabatic/doc/images/LegalConstruct-4.pdf differ diff --git a/katabatic/doc/images/LegalConstruct-4.png b/katabatic/doc/images/LegalConstruct-4.png new file mode 100644 index 00000000..902e745d Binary files /dev/null and b/katabatic/doc/images/LegalConstruct-4.png differ diff --git a/katabatic/doc/images/LegalConstruct-5.fig b/katabatic/doc/images/LegalConstruct-5.fig new file mode 100644 index 00000000..4899adff --- /dev/null +++ b/katabatic/doc/images/LegalConstruct-5.fig @@ -0,0 +1,94 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 1125 0 8325 0 8325 7875 1125 7875 1125 0 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 4500 4275 4500 4275 7200 1575 7200 1575 4500 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 4500 7875 4500 7875 7200 5175 7200 5175 4500 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 5850 3735 5850 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4500 4950 3960 4950 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 900 4275 900 4275 3600 1575 3600 1575 900 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 900 7875 900 7875 3600 5175 3600 5175 900 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 3825 2025 2385 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 2160 5715 2160 5715 2340 5535 2340 5535 2160 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2160 2385 2160 2160 1935 2160 1935 2385 2160 2385 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 2160 3825 675 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3960 2385 3960 2160 3735 2160 3735 2385 3960 2385 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3735 2250 2160 2250 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7380 2250 7470 2250 7470 675 7380 675 7380 2250 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 2160 7515 2160 7515 2340 7335 2340 7335 2160 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 3825 5670 3825 5670 2250 5580 2250 5580 3825 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3960 2250 4545 2250 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5625 2205 7425 2205 7425 2295 5625 2295 5625 2205 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7425 2205 8100 2205 8100 2295 7425 2295 7425 2205 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3960 5085 3960 4860 3735 4860 3735 5085 3960 5085 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 5760 3825 5085 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 4860 3825 4275 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3960 5985 3960 5760 3735 5760 3735 5985 3960 5985 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 4860 7515 4860 7515 5040 7335 5040 7335 4860 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 5760 7515 5760 7515 5940 7335 5940 7335 5760 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7425 4905 8100 4905 8100 4995 7425 4995 7425 4905 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7380 5850 7470 5850 7470 4950 7380 4950 7380 5850 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7380 4950 7470 4950 7470 4275 7380 4275 7380 4950 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 5805 7425 5805 7425 5895 4950 5895 4950 5805 +4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 5760 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 2160 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 4005 810 G3\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 2205 3825 G2\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 7650 810 G3\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5850 3825 G2\001 +4 1 18 40 -1 18 12 0.0000 4 135 600 2070 2070 AC-SW\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 3825 2610 AC-NE\001 +4 1 18 40 -1 18 12 0.0000 4 135 600 5625 2070 AC-SW\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 7425 2610 AC-NE\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 4455 2205 G4\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 8055 2160 G4\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 4005 4410 G3\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 4455 4905 G4\001 +4 1 18 40 -1 18 12 0.0000 4 135 600 3825 6210 AC-SW\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 3330 5040 AC-NE\001 +4 1 18 40 -1 18 12 0.0000 4 135 600 7425 6210 AC-SW\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 7650 4410 G3\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 8055 4860 G4\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 2925 2475 L1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 6525 2475 L1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 7200 5445 L1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 3645 5490 L1\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 6975 5040 AC-NE\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1440 5805 G1\001 diff --git a/katabatic/doc/images/LegalConstruct-5.pdf b/katabatic/doc/images/LegalConstruct-5.pdf new file mode 100644 index 00000000..1aa5a5bd Binary files /dev/null and b/katabatic/doc/images/LegalConstruct-5.pdf differ diff --git a/katabatic/doc/images/LegalConstruct-5.png b/katabatic/doc/images/LegalConstruct-5.png new file mode 100644 index 00000000..f7c7ec17 Binary files /dev/null and b/katabatic/doc/images/LegalConstruct-5.png differ diff --git a/katabatic/doc/images/LegalConstruct-6.fig b/katabatic/doc/images/LegalConstruct-6.fig new file mode 100644 index 00000000..0e99e7d4 --- /dev/null +++ b/katabatic/doc/images/LegalConstruct-6.fig @@ -0,0 +1,59 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 1575 900 4275 900 4275 3600 1575 3600 1575 900 +2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 + 5175 900 7875 900 7875 3600 5175 3600 5175 900 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2025 3825 2025 2385 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5535 2160 5715 2160 5715 2340 5535 2340 5535 2160 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 2160 2385 2160 2160 1935 2160 1935 2385 2160 2385 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 2160 3825 675 +2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 + 3960 2385 3960 2160 3735 2160 3735 2385 3960 2385 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3735 2250 2160 2250 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7380 2250 7470 2250 7470 675 7380 675 7380 2250 +2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 7335 2160 7515 2160 7515 2340 7335 2340 7335 2160 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5580 3825 5670 3825 5670 2250 5580 2250 5580 3825 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3960 2250 4545 2250 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 5625 2205 7425 2205 7425 2295 5625 2295 5625 2205 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 7425 2205 8100 2205 8100 2295 7425 2295 7425 2205 +2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 2250 1935 2250 +2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 + 4950 2205 5625 2205 5625 2295 4950 2295 4950 2205 +2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 + 1125 0 8325 0 8325 4275 1125 4275 1125 0 +4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 +4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5040 2160 G1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 4005 810 G3\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 2205 3825 G2\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 7650 810 G3\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 5850 3825 G2\001 +4 1 18 40 -1 18 12 0.0000 4 135 600 2070 2070 AC-SW\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 3825 2610 AC-NE\001 +4 1 18 40 -1 18 12 0.0000 4 135 600 5625 2070 AC-SW\001 +4 1 18 40 -1 18 12 0.0000 4 135 570 7425 2610 AC-NE\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 4455 2205 G4\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 8055 2160 G4\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 2925 2475 L1\001 +4 1 0 40 -1 18 12 0.0000 4 135 210 6525 2475 L1\001 +4 1 0 40 -1 18 12 0.0000 4 135 255 1440 2205 G1\001 diff --git a/katabatic/doc/images/LegalConstruct-6.pdf b/katabatic/doc/images/LegalConstruct-6.pdf new file mode 100644 index 00000000..1386ceb0 Binary files /dev/null and b/katabatic/doc/images/LegalConstruct-6.pdf differ diff --git a/katabatic/doc/images/LegalConstruct-6.png b/katabatic/doc/images/LegalConstruct-6.png new file mode 100644 index 00000000..abb31882 Binary files /dev/null and b/katabatic/doc/images/LegalConstruct-6.png differ diff --git a/katabatic/doc/images/Makefile.am b/katabatic/doc/images/Makefile.am new file mode 100644 index 00000000..68eb5a0e --- /dev/null +++ b/katabatic/doc/images/Makefile.am @@ -0,0 +1,65 @@ + + +EXTRA_DIST = AutoInvalidate-1.fig \ + AutoContact-1.fig \ + AutoContact-2.fig \ + AutoContact-3.fig \ + AutoContactG1-1.fig \ + AutoContactG2-1.fig \ + AutoContactG3-1.fig \ + AutoContactG3-2.fig \ + AutoContactG3-3.fig \ + AutoContactG3-4.fig \ + AutoContactG4-1.fig \ + AutoContactG4-2.fig \ + AutoContactG4-3.fig \ + AutoContactG4-4.fig \ + AutoContactG4-5.fig \ + LegalConstruct-1.fig \ + LegalConstruct-2.fig \ + LegalConstruct-3.fig \ + LegalConstruct-4.fig \ + LegalConstruct-5.fig \ + LegalConstruct-6.fig \ + AutoSegmentCollapse-1.fig \ + AutoSegmentCollapse-2.fig \ + AutoSegmentCollapse-3.fig \ + AutoSegmentCollapse-4.fig \ + AutoSegmentCollapse-5.fig \ + AutoSegmentCollapse-6.fig \ + PerpandicularState-1.fig \ + PerpandicularState-2.fig \ + PerpandicularState-3.fig \ + PerpandicularState-4.fig \ + NetConstraints-1.fig \ + NetConstraints-2.fig \ + NetConstraints-3.fig \ + NetConstraints-4.fig \ + NetOptimals-1.fig \ + NetOptimals-2.fig \ + NetOptimals-3.fig \ + NetOptimals-4.fig \ + SplitAutoContact-1.fig \ + SplitAutoContact-2.fig \ + SplitAutoContact-3.fig \ + SplitAutoContact-4.fig \ + SplitAutoContact-5.fig \ + SplitAutoContact-6.fig \ + FCellConfiguration-1.fig \ + FCellConfiguration-2.fig \ + FCellConfiguration-3.fig \ + FCellConfiguration-4.fig \ + FCellConfiguration-5.fig \ + FCellConfiguration-6.fig \ + FCellConfiguration-7.fig \ + FCellConfiguration-10.fig \ + FCellConfiguration-11.fig \ + FCellConfiguration-12.fig \ + FCellConfiguration-13.fig \ + FCellConfiguration-14.fig \ + FCellConfiguration-15.fig \ + FCellConfiguration-16.fig \ + FCellConfiguration-17.fig \ + FCellConfiguration-18.fig \ + FCellConfiguration-19.fig \ + FCellConfiguration-20.fig diff --git a/katabatic/doc/images/Makefile.in b/katabatic/doc/images/Makefile.in new file mode 100644 index 00000000..19113af0 --- /dev/null +++ b/katabatic/doc/images/Makefile.in @@ -0,0 +1,403 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +subdir = doc/images +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AR = @AR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CORIOLIS_CFLAGS = @CORIOLIS_CFLAGS@ +CORIOLIS_CONFIG = @CORIOLIS_CONFIG@ +CORIOLIS_LIBS = @CORIOLIS_LIBS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DEVEL_LIBS = @DEVEL_LIBS@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FFLAGS = @FFLAGS@ +GTK_CFLAGS = @GTK_CFLAGS@ +GTK_CONFIG = @GTK_CONFIG@ +GTK_LIBS = @GTK_LIBS@ +HURRICANE_CFLAGS = @HURRICANE_CFLAGS@ +HURRICANE_LIBS = @HURRICANE_LIBS@ +HUR_CONFIG = @HUR_CONFIG@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +KATABATIC_DLL_VERSION = @KATABATIC_DLL_VERSION@ +LDFLAGS = @LDFLAGS@ +LEFDEF_CFLAGS = @LEFDEF_CFLAGS@ +LEFDEF_CONFIG = @LEFDEF_CONFIG@ +LEFDEF_LIBS = @LEFDEF_LIBS@ +LEFDEF_LIBXXS = @LEFDEF_LIBXXS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PYTHON = @PYTHON@ +PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ +PYTHON_LIBS = @PYTHON_LIBS@ +PYTHON_LIB_PATH = @PYTHON_LIB_PATH@ +PYTHON_PLATFORM = @PYTHON_PLATFORM@ +PYTHON_PREFIX = @PYTHON_PREFIX@ +PYTHON_VERSION = @PYTHON_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +SUNLD_FALSE = @SUNLD_FALSE@ +SUNLD_TRUE = @SUNLD_TRUE@ +VERSION = @VERSION@ +XML2_CONFIG = @XML2_CONFIG@ +XML_CPPFLAGS = @XML_CPPFLAGS@ +XML_LIBS = @XML_LIBS@ +ac_ct_AR = @ac_ct_AR@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pkgpyexecdir = @pkgpyexecdir@ +pkgpythondir = @pkgpythondir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +pyexecdir = @pyexecdir@ +pythondir = @pythondir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +EXTRA_DIST = AutoInvalidate-1.fig \ + AutoContact-1.fig \ + AutoContact-2.fig \ + AutoContact-3.fig \ + AutoContactG1-1.fig \ + AutoContactG2-1.fig \ + AutoContactG3-1.fig \ + AutoContactG3-2.fig \ + AutoContactG3-3.fig \ + AutoContactG3-4.fig \ + AutoContactG4-1.fig \ + AutoContactG4-2.fig \ + AutoContactG4-3.fig \ + AutoContactG4-4.fig \ + AutoContactG4-5.fig \ + LegalConstruct-1.fig \ + LegalConstruct-2.fig \ + LegalConstruct-3.fig \ + LegalConstruct-4.fig \ + LegalConstruct-5.fig \ + LegalConstruct-6.fig \ + AutoSegmentCollapse-1.fig \ + AutoSegmentCollapse-2.fig \ + AutoSegmentCollapse-3.fig \ + AutoSegmentCollapse-4.fig \ + AutoSegmentCollapse-5.fig \ + AutoSegmentCollapse-6.fig \ + PerpandicularState-1.fig \ + PerpandicularState-2.fig \ + PerpandicularState-3.fig \ + PerpandicularState-4.fig \ + NetConstraints-1.fig \ + NetConstraints-2.fig \ + NetConstraints-3.fig \ + NetConstraints-4.fig \ + NetOptimals-1.fig \ + NetOptimals-2.fig \ + NetOptimals-3.fig \ + NetOptimals-4.fig \ + SplitAutoContact-1.fig \ + SplitAutoContact-2.fig \ + SplitAutoContact-3.fig \ + SplitAutoContact-4.fig \ + SplitAutoContact-5.fig \ + SplitAutoContact-6.fig \ + FCellConfiguration-1.fig \ + FCellConfiguration-2.fig \ + FCellConfiguration-3.fig \ + FCellConfiguration-4.fig \ + FCellConfiguration-5.fig \ + FCellConfiguration-6.fig \ + FCellConfiguration-7.fig \ + FCellConfiguration-10.fig \ + FCellConfiguration-11.fig \ + FCellConfiguration-12.fig \ + FCellConfiguration-13.fig \ + FCellConfiguration-14.fig \ + FCellConfiguration-15.fig \ + FCellConfiguration-16.fig \ + FCellConfiguration-17.fig \ + FCellConfiguration-18.fig \ + FCellConfiguration-19.fig \ + FCellConfiguration-20.fig + +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/images/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --foreign doc/images/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-libtool + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic clean-libtool \ + distclean distclean-generic distclean-libtool distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-generic \ + mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/katabatic/doc/images/NetConstraints-1.fig b/katabatic/doc/images/NetConstraints-1.fig new file mode 100644 index 00000000..55487b6a --- /dev/null +++ b/katabatic/doc/images/NetConstraints-1.fig @@ -0,0 +1,78 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 0 4185 4275 4950 +1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 270 4770 90 90 180 4770 360 4770 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 1 1.00 60.00 120.00 + 45 4590 495 4590 +2 1 0 1 12 7 40 -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 + 45 4365 495 4365 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 4185 2925 4950 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 0 4185 4275 4185 4275 4950 +4 0 0 40 -1 18 12 0.0000 4 180 1230 720 4860 Starting Point\001 +4 0 0 40 -1 18 12 0.0000 4 180 2025 720 4635 Constraint Propagation\001 +4 0 0 40 -1 18 12 0.0000 4 180 735 720 4410 Collapse\001 +4 0 0 40 -1 18 12 0.0000 4 135 165 3195 4500 L:\001 +4 0 0 40 -1 18 12 0.0000 4 135 210 3195 4770 G:\001 +4 0 0 40 -1 18 12 0.0000 4 135 465 3510 4500 Local\001 +4 0 0 40 -1 18 12 0.0000 4 135 555 3510 4770 Global\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 2700 90 90 360 2700 540 2700 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 2700 90 90 2610 2700 2790 2700 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 3825 90 90 1485 3825 1665 3825 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 1575 90 90 2610 1575 2790 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 1575 90 90 3735 1575 3915 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 450 90 90 3735 450 3915 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4950 450 90 90 4860 450 5040 450 +1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 1575 2700 90 90 1485 2700 1665 2700 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5400 0 5400 4950 0 4950 0 0 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 540 2700 1485 2700 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1665 2700 2610 2700 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1575 2790 1575 3735 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 1665 2700 2610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2790 1575 3735 1575 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3825 540 3825 1485 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3915 450 4860 450 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 + 3 1 1.00 60.00 120.00 + 1350 2790 675 2790 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 + 3 1 1.00 60.00 120.00 + 1485 2925 1485 3600 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 + 3 1 1.00 60.00 120.00 + 1800 2790 2475 2790 +3 2 0 1 12 7 40 -1 -1 0.000 0 1 1 4 + 3 1 1.00 60.00 120.00 + 3 1 1.00 60.00 120.00 + 3735 495 3600 765 3600 1215 3780 1530 + 0.000 -1.000 -1.000 0.000 +4 1 0 40 -1 18 12 0.0000 4 135 150 990 2655 G\001 +4 1 0 40 -1 18 12 0.0000 4 135 150 1710 3330 G\001 +4 1 0 40 -1 18 12 0.0000 4 135 150 3240 1530 G\001 +4 1 0 40 -1 18 12 0.0000 4 135 150 4365 405 G\001 +4 1 0 40 -1 18 12 0.0000 4 135 105 2115 2655 L\001 +4 1 0 40 -1 18 12 0.0000 4 135 105 2835 2205 L\001 +4 1 0 40 -1 18 12 0.0000 4 135 105 3960 1080 L\001 +4 1 12 40 -1 19 12 0.0000 4 135 240 1035 2970 dX\001 +4 1 12 40 -1 19 12 0.0000 4 135 210 1305 3330 dY\001 +4 1 12 40 -1 19 12 0.0000 4 135 240 2115 2970 dX\001 diff --git a/katabatic/doc/images/NetConstraints-1.pdf b/katabatic/doc/images/NetConstraints-1.pdf new file mode 100644 index 00000000..9d030919 Binary files /dev/null and b/katabatic/doc/images/NetConstraints-1.pdf differ diff --git a/katabatic/doc/images/NetConstraints-1.png b/katabatic/doc/images/NetConstraints-1.png new file mode 100644 index 00000000..1595213f Binary files /dev/null and b/katabatic/doc/images/NetConstraints-1.png differ diff --git a/katabatic/doc/images/NetConstraints-2.fig b/katabatic/doc/images/NetConstraints-2.fig new file mode 100644 index 00000000..9a20b85c --- /dev/null +++ b/katabatic/doc/images/NetConstraints-2.fig @@ -0,0 +1,75 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 0 3060 4275 3825 +1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 270 3645 90 90 180 3645 360 3645 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 1 1.00 60.00 120.00 + 45 3465 495 3465 +2 1 0 1 12 7 40 -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 + 45 3240 495 3240 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 3060 2925 3825 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 0 3060 4275 3060 4275 3825 +4 0 0 40 -1 18 12 0.0000 4 180 1230 720 3735 Starting Point\001 +4 0 0 40 -1 18 12 0.0000 4 180 2025 720 3510 Constraint Propagation\001 +4 0 0 40 -1 18 12 0.0000 4 180 735 720 3285 Collapse\001 +4 0 0 40 -1 18 12 0.0000 4 135 165 3195 3375 L:\001 +4 0 0 40 -1 18 12 0.0000 4 135 210 3195 3645 G:\001 +4 0 0 40 -1 18 12 0.0000 4 135 465 3510 3375 Local\001 +4 0 0 40 -1 18 12 0.0000 4 135 555 3510 3645 Global\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 1575 90 90 360 1575 540 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 1575 90 90 2610 1575 2790 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 2700 90 90 1485 2700 1665 2700 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 450 90 90 2610 450 2790 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 450 90 90 3735 450 3915 450 +1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 1575 1575 90 90 1485 1575 1665 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 450 135 135 3690 450 3960 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4950 450 90 90 4860 450 5040 450 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 540 1575 1485 1575 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1665 1575 2610 1575 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1575 1665 1575 2610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 540 2700 1485 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 + 3 1 1.00 60.00 120.00 + 1350 1665 675 1665 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 + 3 1 1.00 60.00 120.00 + 1485 1800 1485 2475 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 + 3 1 1.00 60.00 120.00 + 1800 1665 2475 1665 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2790 450 3690 450 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3960 450 4860 450 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5400 0 5400 3825 0 3825 0 0 +3 2 0 1 12 7 40 -1 -1 0.000 0 1 1 4 + 3 1 1.00 60.00 120.00 + 3 1 1.00 60.00 120.00 + 1620 1485 1890 1350 2385 1350 2655 1485 + 0.000 -1.000 -1.000 0.000 +4 1 0 40 -1 18 12 0.0000 4 135 150 990 1530 G\001 +4 1 0 40 -1 18 12 0.0000 4 135 150 1710 2205 G\001 +4 1 0 40 -1 18 12 0.0000 4 135 150 3240 405 G\001 +4 1 0 40 -1 18 12 0.0000 4 135 105 2115 1530 L\001 +4 1 0 40 -1 18 12 0.0000 4 135 105 2835 1080 L\001 +4 1 12 40 -1 19 12 0.0000 4 135 240 1035 1845 dX\001 +4 1 12 40 -1 19 12 0.0000 4 135 210 1305 2205 dY\001 +4 1 12 40 -1 19 12 0.0000 4 135 240 2115 1845 dX\001 +4 1 0 40 -1 18 12 0.0000 4 135 150 4365 405 G\001 diff --git a/katabatic/doc/images/NetConstraints-2.pdf b/katabatic/doc/images/NetConstraints-2.pdf new file mode 100644 index 00000000..704f7009 Binary files /dev/null and b/katabatic/doc/images/NetConstraints-2.pdf differ diff --git a/katabatic/doc/images/NetConstraints-2.png b/katabatic/doc/images/NetConstraints-2.png new file mode 100644 index 00000000..5925d715 Binary files /dev/null and b/katabatic/doc/images/NetConstraints-2.png differ diff --git a/katabatic/doc/images/NetConstraints-3.fig b/katabatic/doc/images/NetConstraints-3.fig new file mode 100644 index 00000000..fcce99ce --- /dev/null +++ b/katabatic/doc/images/NetConstraints-3.fig @@ -0,0 +1,72 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 0 3060 4275 3825 +1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 270 3645 90 90 180 3645 360 3645 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 1 1.00 60.00 120.00 + 45 3465 495 3465 +2 1 0 1 12 7 40 -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 + 45 3240 495 3240 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 3060 2925 3825 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 0 3060 4275 3060 4275 3825 +4 0 0 40 -1 18 12 0.0000 4 180 1230 720 3735 Starting Point\001 +4 0 0 40 -1 18 12 0.0000 4 180 2025 720 3510 Constraint Propagation\001 +4 0 0 40 -1 18 12 0.0000 4 180 735 720 3285 Collapse\001 +4 0 0 40 -1 18 12 0.0000 4 135 165 3195 3375 L:\001 +4 0 0 40 -1 18 12 0.0000 4 135 210 3195 3645 G:\001 +4 0 0 40 -1 18 12 0.0000 4 135 465 3510 3375 Local\001 +4 0 0 40 -1 18 12 0.0000 4 135 555 3510 3645 Global\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 1575 90 90 360 1575 540 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 2700 90 90 1485 2700 1665 2700 +1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 1575 1575 90 90 1485 1575 1665 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1575 135 135 1440 1575 1710 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 450 90 90 1485 450 1665 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 450 90 90 2610 450 2790 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 450 135 135 2565 450 2835 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 450 90 90 3735 450 3915 450 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 + 3 1 1.00 60.00 120.00 + 1350 1665 675 1665 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 + 3 1 1.00 60.00 120.00 + 1485 1800 1485 2475 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5400 0 5400 3825 0 3825 0 0 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1665 450 2565 450 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2835 450 3735 450 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1575 540 1575 1440 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 540 1575 1440 1575 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1575 1710 1575 2610 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 + 3 1 1.00 60.00 120.00 + 1485 1350 1485 675 +3 2 0 1 12 7 40 -1 -1 0.000 0 1 1 4 + 3 1 1.00 60.00 120.00 + 3 1 1.00 60.00 120.00 + 1665 495 2025 765 2025 1260 1665 1485 + 0.000 -1.000 -1.000 0.000 +4 1 0 40 -1 18 12 0.0000 4 135 150 990 1530 G\001 +4 1 0 40 -1 18 12 0.0000 4 135 150 1710 2205 G\001 +4 1 12 40 -1 19 12 0.0000 4 135 240 1035 1845 dX\001 +4 1 12 40 -1 19 12 0.0000 4 135 210 1305 2205 dY\001 +4 1 0 40 -1 18 12 0.0000 4 135 150 2115 405 G\001 +4 1 0 40 -1 18 12 0.0000 4 135 150 3240 405 G\001 +4 1 0 40 -1 18 12 0.0000 4 135 105 1710 1080 L\001 +4 1 12 40 -1 19 12 0.0000 4 135 210 1305 1125 dY\001 diff --git a/katabatic/doc/images/NetConstraints-3.pdf b/katabatic/doc/images/NetConstraints-3.pdf new file mode 100644 index 00000000..e19d3678 Binary files /dev/null and b/katabatic/doc/images/NetConstraints-3.pdf differ diff --git a/katabatic/doc/images/NetConstraints-3.png b/katabatic/doc/images/NetConstraints-3.png new file mode 100644 index 00000000..0aea6c1e Binary files /dev/null and b/katabatic/doc/images/NetConstraints-3.png differ diff --git a/katabatic/doc/images/NetConstraints-4.fig b/katabatic/doc/images/NetConstraints-4.fig new file mode 100644 index 00000000..63a05d53 --- /dev/null +++ b/katabatic/doc/images/NetConstraints-4.fig @@ -0,0 +1,68 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 0 2160 4275 2925 +1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 270 2745 90 90 180 2745 360 2745 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 1 1.00 60.00 120.00 + 45 2565 495 2565 +2 1 0 1 12 7 40 -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 + 45 2340 495 2340 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2925 2160 2925 2925 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 0 2160 4275 2160 4275 2925 +4 0 0 40 -1 18 12 0.0000 4 180 1230 720 2835 Starting Point\001 +4 0 0 40 -1 18 12 0.0000 4 180 2025 720 2610 Constraint Propagation\001 +4 0 0 40 -1 18 12 0.0000 4 180 735 720 2385 Collapse\001 +4 0 0 40 -1 18 12 0.0000 4 135 165 3195 2475 L:\001 +4 0 0 40 -1 18 12 0.0000 4 135 210 3195 2745 G:\001 +4 0 0 40 -1 18 12 0.0000 4 135 465 3510 2475 Local\001 +4 0 0 40 -1 18 12 0.0000 4 135 555 3510 2745 Global\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 675 90 90 360 675 540 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1800 90 90 1485 1800 1665 1800 +1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 135 135 1440 675 1710 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 180 180 1395 675 1755 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 675 90 90 2610 675 2790 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 675 135 135 2565 675 2835 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 675 90 90 3735 675 3915 675 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 + 3 1 1.00 60.00 120.00 + 1350 765 675 765 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 + 3 1 1.00 60.00 120.00 + 1485 900 1485 1575 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 540 675 1395 675 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1575 855 1575 1710 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2835 675 3735 675 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1755 675 2565 675 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 0 1 2 + 3 1 1.00 60.00 120.00 + 2475 765 1800 765 +2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 0 1 2 + 3 1 1.00 60.00 120.00 + 3600 765 2925 765 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 5400 0 5400 2925 0 2925 0 0 +4 1 0 40 -1 18 12 0.0000 4 135 150 990 630 G\001 +4 1 0 40 -1 18 12 0.0000 4 135 150 1710 1305 G\001 +4 1 12 40 -1 19 12 0.0000 4 135 240 1035 945 dX\001 +4 1 12 40 -1 19 12 0.0000 4 135 210 1305 1305 dY\001 +4 1 0 40 -1 18 12 0.0000 4 135 150 2115 630 G\001 +4 1 0 40 -1 18 12 0.0000 4 135 150 3240 630 G\001 +4 1 12 40 -1 19 12 0.0000 4 135 240 2070 945 dX\001 +4 1 12 40 -1 19 12 0.0000 4 135 240 3195 945 dX\001 diff --git a/katabatic/doc/images/NetConstraints-4.pdf b/katabatic/doc/images/NetConstraints-4.pdf new file mode 100644 index 00000000..457a8779 Binary files /dev/null and b/katabatic/doc/images/NetConstraints-4.pdf differ diff --git a/katabatic/doc/images/NetConstraints-4.png b/katabatic/doc/images/NetConstraints-4.png new file mode 100644 index 00000000..4244f8a3 Binary files /dev/null and b/katabatic/doc/images/NetConstraints-4.png differ diff --git a/katabatic/doc/images/NetOptimals-1.fig b/katabatic/doc/images/NetOptimals-1.fig new file mode 100644 index 00000000..3b00a325 --- /dev/null +++ b/katabatic/doc/images/NetOptimals-1.fig @@ -0,0 +1,146 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 405 225 3195 6795 +6 2340 1305 2610 2070 +2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 + 2430 1350 2520 1350 2520 2025 2430 2025 2430 1350 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 1710 2565 1710 2565 1890 2385 1890 2385 1710 +-6 +6 990 3105 1260 3870 +2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 + 1080 3150 1170 3150 1170 3825 1080 3825 1080 3150 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1035 3285 1215 3285 1215 3465 1035 3465 1035 3285 +-6 +6 2340 2880 2610 3645 +2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 + 2430 2925 2520 2925 2520 3600 2430 3600 2430 2925 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2385 3060 2565 3060 2565 3240 2385 3240 2385 3060 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 4275 90 90 1485 4275 1665 4275 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 450 5625 3150 5625 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 675 4770 675 5850 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 1125 3870 1125 5850 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 2475 3645 2475 5850 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 2925 4770 2925 5850 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 2475 2070 2475 2880 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 675 5400 675 5625 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 1125 5400 1125 5625 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 2475 5400 2475 5625 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 2925 5400 2925 5625 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 1 0 2 + 3 1 2.00 120.00 240.00 + 2475 6525 2475 5940 +2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 2 + 675 2475 2880 2475 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1485 675 450 675 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1665 4275 3150 4275 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1215 3375 1575 3375 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2385 3150 1575 3150 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 2385 1800 1575 1800 +2 2 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 5 + 675 225 2925 225 2925 4725 675 4725 675 225 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1575 765 1575 4185 +4 0 12 40 -1 18 12 0.0000 4 135 105 765 5580 1\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 1215 5580 1\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 2565 5580 2\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 3015 5580 1\001 +4 1 12 40 -1 19 12 0.0000 4 180 660 2475 6750 Optimal\001 +-6 +6 4005 225 6750 6345 +6 5940 1305 6210 2070 +2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 + 6030 1350 6120 1350 6120 2025 6030 2025 6030 1350 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5985 1710 6165 1710 6165 1890 5985 1890 5985 1710 +-6 +6 4590 3105 4860 3870 +2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 + 4680 3150 4770 3150 4770 3825 4680 3825 4680 3150 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4635 3285 4815 3285 4815 3465 4635 3465 4635 3285 +-6 +6 5940 2880 6210 3645 +2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 + 6030 2925 6120 2925 6120 3600 6030 3600 6030 2925 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5985 3060 6165 3060 6165 3240 5985 3240 5985 3060 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 675 90 90 5085 675 5265 675 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 4050 5625 6750 5625 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 4275 4770 4275 5850 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 4725 3870 4725 5850 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 6075 3645 6075 5850 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 6075 2070 6075 2880 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 4275 5400 4275 5625 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 4725 5400 4725 5625 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 6075 5400 6075 5625 +2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 2 + 4275 2475 6480 2475 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 5085 675 4050 675 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 4815 3375 5175 3375 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 5985 3150 5175 3150 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 5985 1800 5175 1800 +2 2 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 5 + 4275 225 6525 225 6525 4725 4275 4725 4275 225 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 5175 765 5175 3375 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 1 1 2 + 3 1 2.00 120.00 240.00 + 3 1 2.00 120.00 240.00 + 4725 6075 6075 6075 +4 0 12 40 -1 18 12 0.0000 4 135 105 4365 5580 1\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 4815 5580 1\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 6165 5580 2\001 +4 1 12 40 -1 19 12 0.0000 4 180 660 5400 6300 Optimal\001 +-6 +6 1305 1980 1575 2295 +2 2 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 5 + 1350 2025 1530 2025 1530 2250 1350 2250 1350 2025 +4 1 0 40 -1 18 12 0.0000 4 135 120 1440 2205 A\001 +-6 +6 4905 1980 5175 2295 +2 2 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 5 + 4950 2025 5130 2025 5130 2250 4950 2250 4950 2025 +4 1 0 40 -1 18 12 0.0000 4 135 120 5040 2205 A\001 +-6 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 7200 0 7200 6975 0 6975 0 0 diff --git a/katabatic/doc/images/NetOptimals-1.pdf b/katabatic/doc/images/NetOptimals-1.pdf new file mode 100644 index 00000000..edd270f9 Binary files /dev/null and b/katabatic/doc/images/NetOptimals-1.pdf differ diff --git a/katabatic/doc/images/NetOptimals-1.png b/katabatic/doc/images/NetOptimals-1.png new file mode 100644 index 00000000..e1111950 Binary files /dev/null and b/katabatic/doc/images/NetOptimals-1.png differ diff --git a/katabatic/doc/images/NetOptimals-2.fig b/katabatic/doc/images/NetOptimals-2.fig new file mode 100644 index 00000000..e9cc4a9e --- /dev/null +++ b/katabatic/doc/images/NetOptimals-2.fig @@ -0,0 +1,80 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 1575 1755 1845 2070 +2 2 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 5 + 1620 1800 1800 1800 1800 2025 1620 2025 1620 1800 +4 1 0 40 -1 18 12 0.0000 4 135 120 1710 1980 A\001 +-6 +6 5175 1755 5445 2070 +2 2 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 5 + 5220 1800 5400 1800 5400 2025 5220 2025 5220 1800 +4 1 0 40 -1 18 12 0.0000 4 135 120 5310 1980 A\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 4275 90 90 1485 4275 1665 4275 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 675 90 90 5085 675 5265 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 4275 90 90 5085 4275 5265 4275 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 7200 0 7200 6975 0 6975 0 0 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 450 5625 3150 5625 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 675 4770 675 5850 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 2925 4770 2925 5850 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 675 5400 675 5625 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 2925 5400 2925 5625 +2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 2 + 675 2475 2880 2475 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1485 675 450 675 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1665 4275 3150 4275 +2 2 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 5 + 675 225 2925 225 2925 4725 675 4725 675 225 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1575 765 1575 4185 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 4050 5625 6750 5625 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 4275 4770 4275 5850 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 4275 5400 4275 5625 +2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 2 + 4275 2475 6480 2475 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 5085 675 4050 675 +2 2 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 5 + 4275 225 6525 225 6525 4725 4275 4725 4275 225 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 5175 765 5175 4185 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 6750 4275 5265 4275 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 6750 675 5265 675 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 6525 5400 6525 5625 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 6525 4770 6525 5850 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 1 0 2 + 3 1 2.00 120.00 240.00 + 6525 6570 6525 5985 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 1 1 2 + 3 1 2.00 120.00 240.00 + 3 1 2.00 120.00 240.00 + 675 6075 2925 6075 +4 0 12 40 -1 18 12 0.0000 4 135 105 765 5580 1\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 3015 5580 1\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 4365 5580 1\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 6615 5580 2\001 +4 1 12 40 -1 19 12 0.0000 4 180 660 6525 6750 Optimal\001 +4 1 12 40 -1 19 12 0.0000 4 180 660 1800 6255 Optimal\001 diff --git a/katabatic/doc/images/NetOptimals-2.pdf b/katabatic/doc/images/NetOptimals-2.pdf new file mode 100644 index 00000000..32a2ec78 Binary files /dev/null and b/katabatic/doc/images/NetOptimals-2.pdf differ diff --git a/katabatic/doc/images/NetOptimals-2.png b/katabatic/doc/images/NetOptimals-2.png new file mode 100644 index 00000000..3f366dbf Binary files /dev/null and b/katabatic/doc/images/NetOptimals-2.png differ diff --git a/katabatic/doc/images/NetOptimals-3.fig b/katabatic/doc/images/NetOptimals-3.fig new file mode 100644 index 00000000..3a96cb69 --- /dev/null +++ b/katabatic/doc/images/NetOptimals-3.fig @@ -0,0 +1,109 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 405 225 3150 5850 +6 1980 3240 2745 3510 +2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 + 2025 3420 2025 3330 2700 3330 2700 3420 2025 3420 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2160 3465 2160 3285 2340 3285 2340 3465 2160 3465 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 3375 90 90 1485 3375 1665 3375 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 450 5625 3150 5625 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 675 4770 675 5850 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 675 5400 675 5625 +2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 2 + 675 2475 2880 2475 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1485 675 450 675 +2 2 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 5 + 675 225 2925 225 2925 4725 675 4725 675 225 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1575 765 1575 3285 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 1665 3375 2160 3375 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 2025 3465 2025 5850 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 2700 3465 2700 5850 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 2025 5400 2025 5625 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 2700 5400 2700 5625 +4 0 12 40 -1 18 12 0.0000 4 135 105 765 5580 1\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 2115 5580 1\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 2790 5580 1\001 +-6 +6 5580 3240 6345 3510 +2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 + 5625 3420 5625 3330 6300 3330 6300 3420 5625 3420 +2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5760 3465 5760 3285 5940 3285 5940 3465 5760 3465 +-6 +6 5175 1305 5445 1620 +2 2 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 5 + 5220 1350 5400 1350 5400 1575 5220 1575 5220 1350 +4 1 0 40 -1 18 12 0.0000 4 135 120 5310 1530 A\001 +-6 +6 1575 1350 1845 1665 +2 2 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 5 + 1620 1395 1800 1395 1800 1620 1620 1620 1620 1395 +4 1 0 40 -1 18 12 0.0000 4 135 120 1710 1575 A\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 675 90 90 5085 675 5265 675 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5180 4285 90 90 5090 4285 5270 4285 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 7200 0 7200 6975 0 6975 0 0 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 1 0 2 + 3 1 2.00 120.00 240.00 + 2025 6525 2025 5940 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 4050 5625 6750 5625 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 4275 4770 4275 5850 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 4275 5400 4275 5625 +2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 2 + 4275 2475 6480 2475 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 5085 675 4050 675 +2 2 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 5 + 4275 225 6525 225 6525 4725 4275 4725 4275 225 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 5175 765 5175 4185 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 5175 3375 5760 3375 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 5625 3465 5625 5850 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 6300 3465 6300 5850 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 5625 5400 5625 5625 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 6300 5400 6300 5625 +2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 + 6750 4275 5265 4275 +2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 + 6525 4770 6525 5850 +2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 + 6525 5400 6525 5625 +2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 1 1 2 + 3 1 2.00 120.00 240.00 + 3 1 2.00 120.00 240.00 + 5625 6075 6300 6075 +4 1 12 40 -1 19 12 0.0000 4 180 660 2025 6750 Optimal\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 4365 5580 1\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 5715 5580 1\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 6390 5580 1\001 +4 0 12 40 -1 18 12 0.0000 4 135 105 6615 5580 1\001 +4 1 12 40 -1 19 12 0.0000 4 180 660 5940 6300 Optimal\001 diff --git a/katabatic/doc/images/NetOptimals-3.pdf b/katabatic/doc/images/NetOptimals-3.pdf new file mode 100644 index 00000000..88eb9b89 Binary files /dev/null and b/katabatic/doc/images/NetOptimals-3.pdf differ diff --git a/katabatic/doc/images/NetOptimals-3.png b/katabatic/doc/images/NetOptimals-3.png new file mode 100644 index 00000000..9d6c7052 Binary files /dev/null and b/katabatic/doc/images/NetOptimals-3.png differ diff --git a/katabatic/doc/images/PerpandicularState-1.fig b/katabatic/doc/images/PerpandicularState-1.fig new file mode 100644 index 00000000..ebdb61a7 --- /dev/null +++ b/katabatic/doc/images/PerpandicularState-1.fig @@ -0,0 +1,102 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 90 315 3105 1755 +6 495 1215 1035 1485 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 495 1215 1035 1215 1035 1485 495 1485 495 1215 +4 1 0 40 -1 14 12 0.0000 4 165 420 765 1395 Cg--\001 +-6 +6 1620 1215 2160 1485 +2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1620 1215 2160 1215 2160 1485 1620 1485 1620 1215 +4 1 18 40 -1 14 12 0.0000 4 135 420 1890 1395 --g-\001 +-6 +6 2565 855 3105 1125 +2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2565 855 3105 855 3105 1125 2565 1125 2565 855 +4 1 1 40 -1 14 12 0.0000 4 15 420 2835 1035 ----\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 225 1575 90 90 135 1575 315 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 90 90 1260 1575 1440 1575 +1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 135 135 1215 1575 1485 1575 +1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 2475 1575 90 90 2385 1575 2565 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2475 450 90 90 2385 450 2565 450 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 315 1575 1215 1575 +2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1485 1575 2385 1575 +2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2475 540 2475 1485 +-6 +6 3465 315 7875 2835 +6 4770 2025 5310 2295 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4770 2025 5310 2025 5310 2295 4770 2295 4770 2025 +4 1 0 40 -1 14 12 0.0000 4 90 420 5040 2205 -c--\001 +-6 +6 3870 2340 4410 2610 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3870 2340 4410 2340 4410 2610 3870 2610 3870 2340 +4 1 0 40 -1 14 12 0.0000 4 165 420 4140 2520 Cg--\001 +-6 +6 4995 1215 5535 1485 +2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4995 1215 5535 1215 5535 1485 4995 1485 4995 1215 +4 1 18 40 -1 14 12 0.0000 4 135 420 5265 1395 --g-\001 +-6 +6 5940 900 6480 1170 +2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5940 900 6480 900 6480 1170 5940 1170 5940 900 +4 1 1 40 -1 14 12 0.0000 4 15 420 6210 1080 ----\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4725 2700 90 90 4635 2700 4815 2700 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4725 1575 90 90 4635 1575 4815 1575 +1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 5850 1575 90 90 5760 1575 5940 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5850 450 90 90 5760 450 5940 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3600 2700 90 90 3510 2700 3690 2700 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4725 1665 4725 2610 +2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4815 1575 5760 1575 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3690 2700 4635 2700 +2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5850 540 5850 1485 +2 1 0 1 1 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 1 1.00 60.00 120.00 + 6165 1845 6165 1170 +4 0 1 40 -1 14 12 0.0000 4 150 1785 6075 2025 PERPANDICULAR_ANY\001 +-6 +6 2025 3555 3870 4860 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2565 3825 3645 3825 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2655 3825 2655 4050 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2970 3825 2970 4275 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3555 3825 3555 4680 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3240 3825 3240 4455 +4 1 0 40 -1 14 14 0.0000 4 195 945 3105 3735 C c g t\001 +4 2 0 40 -1 18 12 0.0000 4 135 840 2880 4185 Canonical\001 +4 2 0 40 -1 18 12 0.0000 4 180 840 3150 4410 Collapsed\001 +4 2 0 40 -1 18 12 0.0000 4 135 555 3465 4635 Global\001 +4 2 0 40 -1 18 12 0.0000 4 135 765 3870 4860 Terminal\001 +-6 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 8325 0 8325 4950 0 4950 0 0 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1845 3375 1845 4950 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 0 3375 4050 3375 4050 4950 +4 0 1 40 -1 18 12 0.0000 4 135 645 90 3780 current\001 +4 0 0 40 -1 18 12 0.0000 4 135 630 90 4230 master\001 +4 0 18 40 -1 18 12 0.0000 4 135 1530 90 4680 source & contact\001 diff --git a/katabatic/doc/images/PerpandicularState-1.pdf b/katabatic/doc/images/PerpandicularState-1.pdf new file mode 100644 index 00000000..65095e4e Binary files /dev/null and b/katabatic/doc/images/PerpandicularState-1.pdf differ diff --git a/katabatic/doc/images/PerpandicularState-1.png b/katabatic/doc/images/PerpandicularState-1.png new file mode 100644 index 00000000..a23d85b2 Binary files /dev/null and b/katabatic/doc/images/PerpandicularState-1.png differ diff --git a/katabatic/doc/images/PerpandicularState-2.fig b/katabatic/doc/images/PerpandicularState-2.fig new file mode 100644 index 00000000..397bbe6e --- /dev/null +++ b/katabatic/doc/images/PerpandicularState-2.fig @@ -0,0 +1,113 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 2025 3555 3870 4860 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2565 3825 3645 3825 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2655 3825 2655 4050 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2970 3825 2970 4275 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3555 3825 3555 4680 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3240 3825 3240 4455 +4 1 0 40 -1 14 14 0.0000 4 195 945 3105 3735 C c g t\001 +4 2 0 40 -1 18 12 0.0000 4 135 840 2880 4185 Canonical\001 +4 2 0 40 -1 18 12 0.0000 4 180 840 3150 4410 Collapsed\001 +4 2 0 40 -1 18 12 0.0000 4 135 555 3465 4635 Global\001 +4 2 0 40 -1 18 12 0.0000 4 135 765 3870 4860 Terminal\001 +-6 +6 5670 3150 6210 3420 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5670 3150 6210 3150 6210 3420 5670 3420 5670 3150 +4 1 0 40 -1 14 12 0.0000 4 90 420 5940 3330 -c--\001 +-6 +6 4770 3465 5310 3735 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4770 3465 5310 3465 5310 3735 4770 3735 4770 3465 +4 1 0 40 -1 14 12 0.0000 4 165 420 5040 3645 Cg--\001 +-6 +6 6840 900 7380 1170 +2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6840 900 7380 900 7380 1170 6840 1170 6840 900 +4 1 1 40 -1 14 12 0.0000 4 15 420 7110 1080 ----\001 +-6 +6 495 1215 1035 1485 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 495 1215 1035 1215 1035 1485 495 1485 495 1215 +4 1 0 40 -1 14 12 0.0000 4 165 420 765 1395 Cg--\001 +-6 +6 2565 855 3105 1125 +2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2565 855 3105 855 3105 1125 2565 1125 2565 855 +4 1 1 40 -1 14 12 0.0000 4 15 420 2835 1035 ----\001 +-6 +6 5895 2385 6435 2655 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5895 2385 6435 2385 6435 2655 5895 2655 5895 2385 +4 1 0 40 -1 14 12 0.0000 4 135 420 6165 2565 -g--\001 +-6 +6 1620 1260 2160 1530 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1620 1260 2160 1260 2160 1530 1620 1530 1620 1260 +4 1 0 40 -1 14 12 0.0000 4 135 420 1890 1440 -g--\001 +-6 +6 6120 1980 6660 2250 +2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6120 1980 6660 1980 6660 2250 6120 2250 6120 1980 +4 1 18 40 -1 14 12 0.0000 4 90 420 6390 2160 -c--\001 +-6 +6 2700 1755 3240 2025 +2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2700 1755 3240 1755 3240 2025 2700 2025 2700 1755 +4 1 18 40 -1 14 12 0.0000 4 90 420 2970 1935 -c--\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5625 3825 90 90 5535 3825 5715 3825 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5625 2700 90 90 5535 2700 5715 2700 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4500 3825 90 90 4410 3825 4590 3825 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 6750 450 90 90 6660 450 6840 450 +1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 6750 1575 90 90 6660 1575 6840 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 6750 2700 90 90 6660 2700 6840 2700 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 225 1575 90 90 135 1575 315 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 90 90 1260 1575 1440 1575 +1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 135 135 1215 1575 1485 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2475 450 90 90 2385 450 2565 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2475 1575 90 90 2385 1575 2565 1575 +1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 2475 1575 180 180 2295 1575 2655 1575 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1845 3375 1845 4950 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 0 3375 4050 3375 4050 4950 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 9675 0 9675 4950 0 4950 0 0 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5625 2790 5625 3735 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4590 3825 5535 3825 +2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 6750 540 6750 1485 +2 1 0 1 1 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 1 1.00 60.00 120.00 + 7065 1845 7065 1170 +2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 6750 1665 6750 2610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5715 2700 6660 2700 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 315 1575 1215 1575 +2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2475 540 2475 1395 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1485 1575 2295 1575 +4 0 1 40 -1 18 12 0.0000 4 135 645 90 3780 current\001 +4 0 0 40 -1 18 12 0.0000 4 135 630 90 4230 master\001 +4 0 18 40 -1 18 12 0.0000 4 135 1530 90 4680 source & contact\001 +4 0 1 40 -1 14 12 0.0000 4 150 1785 7020 2025 PERPANDICULAR_ANY\001 +4 0 1 40 -1 14 12 0.0000 4 150 2310 7020 2250 PERPANDICULAR_INDIRECT\001 diff --git a/katabatic/doc/images/PerpandicularState-2.pdf b/katabatic/doc/images/PerpandicularState-2.pdf new file mode 100644 index 00000000..f9924b4d Binary files /dev/null and b/katabatic/doc/images/PerpandicularState-2.pdf differ diff --git a/katabatic/doc/images/PerpandicularState-2.png b/katabatic/doc/images/PerpandicularState-2.png new file mode 100644 index 00000000..ed5b2538 Binary files /dev/null and b/katabatic/doc/images/PerpandicularState-2.png differ diff --git a/katabatic/doc/images/PerpandicularState-3.fig b/katabatic/doc/images/PerpandicularState-3.fig new file mode 100644 index 00000000..30ee9aa4 --- /dev/null +++ b/katabatic/doc/images/PerpandicularState-3.fig @@ -0,0 +1,108 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 2025 3555 3870 4860 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2565 3825 3645 3825 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2655 3825 2655 4050 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2970 3825 2970 4275 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3555 3825 3555 4680 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3240 3825 3240 4455 +4 1 0 40 -1 14 14 0.0000 4 195 945 3105 3735 C c g t\001 +4 2 0 40 -1 18 12 0.0000 4 135 840 2880 4185 Canonical\001 +4 2 0 40 -1 18 12 0.0000 4 180 840 3150 4410 Collapsed\001 +4 2 0 40 -1 18 12 0.0000 4 135 555 3465 4635 Global\001 +4 2 0 40 -1 18 12 0.0000 4 135 765 3870 4860 Terminal\001 +-6 +6 4770 2025 5310 2295 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4770 2025 5310 2025 5310 2295 4770 2295 4770 2025 +4 1 0 40 -1 14 12 0.0000 4 90 420 5040 2205 -c--\001 +-6 +6 3870 2340 4410 2610 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3870 2340 4410 2340 4410 2610 3870 2610 3870 2340 +4 1 0 40 -1 14 12 0.0000 4 165 420 4140 2520 Cg--\001 +-6 +6 4995 1215 5535 1485 +2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4995 1215 5535 1215 5535 1485 4995 1485 4995 1215 +4 1 18 40 -1 14 12 0.0000 4 135 420 5265 1395 --g-\001 +-6 +6 495 1215 1035 1485 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 495 1215 1035 1215 1035 1485 495 1485 495 1215 +4 1 0 40 -1 14 12 0.0000 4 165 420 765 1395 Cg--\001 +-6 +6 1620 1215 2160 1485 +2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1620 1215 2160 1215 2160 1485 1620 1485 1620 1215 +4 1 18 40 -1 14 12 0.0000 4 135 420 1890 1395 --g-\001 +-6 +6 2565 855 3105 1125 +2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2565 855 3105 855 3105 1125 2565 1125 2565 855 +4 1 1 40 -1 14 12 0.0000 4 15 420 2835 1035 ----\001 +-6 +6 5940 900 6480 1170 +2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5940 900 6480 900 6480 1170 5940 1170 5940 900 +4 1 1 40 -1 14 12 0.0000 4 90 420 6210 1080 -c--\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4725 2700 90 90 4635 2700 4815 2700 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4725 1575 90 90 4635 1575 4815 1575 +1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 5850 1575 90 90 5760 1575 5940 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5850 450 90 90 5760 450 5940 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3600 2700 90 90 3510 2700 3690 2700 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 225 1575 90 90 135 1575 315 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 90 90 1260 1575 1440 1575 +1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 135 135 1215 1575 1485 1575 +1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 2475 1575 90 90 2385 1575 2565 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2475 450 90 90 2385 450 2565 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 6975 1575 90 90 6885 1575 7065 1575 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 8325 0 8325 4950 0 4950 0 0 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1845 3375 1845 4950 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 0 3375 4050 3375 4050 4950 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4725 1665 4725 2610 +2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4815 1575 5760 1575 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3690 2700 4635 2700 +2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5850 540 5850 1485 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 315 1575 1215 1575 +2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1485 1575 2385 1575 +2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2475 540 2475 1485 +2 1 0 1 1 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 1 1.00 60.00 120.00 + 6165 495 6165 900 +2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5940 1575 6885 1575 +2 1 0 1 1 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 1 1.00 60.00 120.00 + 6345 2340 6345 1935 +2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6120 1665 6660 1665 6660 1935 6120 1935 6120 1665 +4 0 1 40 -1 18 12 0.0000 4 135 645 90 3780 current\001 +4 0 0 40 -1 18 12 0.0000 4 135 630 90 4230 master\001 +4 0 18 40 -1 18 12 0.0000 4 135 1530 90 4680 source & contact\001 +4 0 1 40 -1 14 12 0.0000 4 90 420 6075 405 zero\001 +4 0 1 40 -1 14 12 0.0000 4 150 2100 5265 2520 PARALLEL_OR_EXPANDED\001 +4 1 1 40 -1 14 12 0.0000 4 165 420 6390 1845 Cg--\001 diff --git a/katabatic/doc/images/PerpandicularState-3.pdf b/katabatic/doc/images/PerpandicularState-3.pdf new file mode 100644 index 00000000..f0119afc Binary files /dev/null and b/katabatic/doc/images/PerpandicularState-3.pdf differ diff --git a/katabatic/doc/images/PerpandicularState-3.png b/katabatic/doc/images/PerpandicularState-3.png new file mode 100644 index 00000000..2d0aeb57 Binary files /dev/null and b/katabatic/doc/images/PerpandicularState-3.png differ diff --git a/katabatic/doc/images/PerpandicularState-4.fig b/katabatic/doc/images/PerpandicularState-4.fig new file mode 100644 index 00000000..c83e4aec --- /dev/null +++ b/katabatic/doc/images/PerpandicularState-4.fig @@ -0,0 +1,108 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 2025 3555 3870 4860 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2565 3825 3645 3825 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2655 3825 2655 4050 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2970 3825 2970 4275 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3555 3825 3555 4680 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3240 3825 3240 4455 +4 1 0 40 -1 14 14 0.0000 4 195 945 3105 3735 C c g t\001 +4 2 0 40 -1 18 12 0.0000 4 135 840 2880 4185 Canonical\001 +4 2 0 40 -1 18 12 0.0000 4 180 840 3150 4410 Collapsed\001 +4 2 0 40 -1 18 12 0.0000 4 135 555 3465 4635 Global\001 +4 2 0 40 -1 18 12 0.0000 4 135 765 3870 4860 Terminal\001 +-6 +6 4770 2025 5310 2295 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4770 2025 5310 2025 5310 2295 4770 2295 4770 2025 +4 1 0 40 -1 14 12 0.0000 4 90 420 5040 2205 -c--\001 +-6 +6 3870 2340 4410 2610 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 3870 2340 4410 2340 4410 2610 3870 2610 3870 2340 +4 1 0 40 -1 14 12 0.0000 4 165 420 4140 2520 Cg--\001 +-6 +6 4995 1215 5535 1485 +2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 4995 1215 5535 1215 5535 1485 4995 1485 4995 1215 +4 1 18 40 -1 14 12 0.0000 4 135 420 5265 1395 --g-\001 +-6 +6 495 1215 1035 1485 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 495 1215 1035 1215 1035 1485 495 1485 495 1215 +4 1 0 40 -1 14 12 0.0000 4 165 420 765 1395 Cg--\001 +-6 +6 1620 1215 2160 1485 +2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 1620 1215 2160 1215 2160 1485 1620 1485 1620 1215 +4 1 18 40 -1 14 12 0.0000 4 135 420 1890 1395 --g-\001 +-6 +6 2565 855 3105 1125 +2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 2565 855 3105 855 3105 1125 2565 1125 2565 855 +4 1 1 40 -1 14 12 0.0000 4 15 420 2835 1035 ----\001 +-6 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4725 2700 90 90 4635 2700 4815 2700 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4725 1575 90 90 4635 1575 4815 1575 +1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 5850 1575 90 90 5760 1575 5940 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5850 450 90 90 5760 450 5940 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3600 2700 90 90 3510 2700 3690 2700 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 225 1575 90 90 135 1575 315 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 90 90 1260 1575 1440 1575 +1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 135 135 1215 1575 1485 1575 +1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 2475 1575 90 90 2385 1575 2565 1575 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2475 450 90 90 2385 450 2565 450 +1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 6975 1575 90 90 6885 1575 7065 1575 +2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 8325 0 8325 4950 0 4950 0 0 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1845 3375 1845 4950 +2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 + 0 3375 4050 3375 4050 4950 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4725 1665 4725 2610 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3690 2700 4635 2700 +2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5850 540 5850 1485 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 315 1575 1215 1575 +2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1485 1575 2385 1575 +2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2475 540 2475 1485 +2 1 0 1 1 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 1 1.00 60.00 120.00 + 6165 495 6165 900 +2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5940 1575 6885 1575 +2 1 0 1 1 7 40 -1 -1 0.000 0 0 -1 1 0 2 + 3 1 1.00 60.00 120.00 + 6345 2340 6345 1935 +2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 6120 1665 6660 1665 6660 1935 6120 1935 6120 1665 +2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 + 5940 900 6480 900 6480 1170 5940 1170 5940 900 +2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4815 1575 5895 1575 +4 0 1 40 -1 18 12 0.0000 4 135 645 90 3780 current\001 +4 0 0 40 -1 18 12 0.0000 4 135 630 90 4230 master\001 +4 0 18 40 -1 18 12 0.0000 4 135 1530 90 4680 source & contact\001 +4 1 1 40 -1 14 12 0.0000 4 135 420 6390 1845 -g--\001 +4 1 1 40 -1 14 12 0.0000 4 90 420 6210 1080 -c--\001 +# zero +4 0 1 40 -1 14 12 0.0000 4 90 420 6030 450 zero\001 +# zero +4 0 1 40 -1 14 12 0.0000 4 90 420 6120 2520 zero\001 diff --git a/katabatic/doc/images/PerpandicularState-4.pdf b/katabatic/doc/images/PerpandicularState-4.pdf new file mode 100644 index 00000000..13ce5ffe Binary files /dev/null and b/katabatic/doc/images/PerpandicularState-4.pdf differ diff --git a/katabatic/doc/images/PerpandicularState-4.png b/katabatic/doc/images/PerpandicularState-4.png new file mode 100644 index 00000000..f495c881 Binary files /dev/null and b/katabatic/doc/images/PerpandicularState-4.png differ diff --git a/katabatic/doc/images/SplitAutoContact-1.fig b/katabatic/doc/images/SplitAutoContact-1.fig new file mode 100644 index 00000000..fedf34fc --- /dev/null +++ b/katabatic/doc/images/SplitAutoContact-1.fig @@ -0,0 +1,58 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 1710 90 2610 225 +4 0 0 50 -1 18 12 0.0000 4 135 270 1710 225 M2\001 +4 0 0 50 -1 19 12 0.0000 4 135 180 2070 225 to\001 +4 0 0 50 -1 18 12 0.0000 4 135 270 2340 225 M5\001 +-6 +1 3 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 1800 90 90 1800 1800 1890 1800 +1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 1800 2700 90 90 1800 2700 1890 2700 +1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 2700 90 90 2700 2700 2790 2700 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 675 1845 1350 1845 1350 1755 675 1755 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 1800 1710 1800 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1800 1350 1800 1710 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 2700 2790 2700 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 2790 2700 3150 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1800 1890 1800 2610 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1890 2700 2610 2700 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 1755 675 1755 1350 1845 1350 1845 675 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 2745 3825 2745 3150 2655 3150 2655 3825 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 3825 2745 3150 2745 3150 2655 3825 2655 +2 2 3 1 0 7 60 -1 -1 8.000 0 0 -1 0 0 5 + 1080 1125 3375 1125 3375 3375 1080 3375 1080 1125 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4140 675 4140 +2 1 0 4 12 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4365 675 4365 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 0 3960 2025 3960 2025 4500 +2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 4275 0 4275 4500 0 4500 0 0 +4 1 0 40 -1 18 12 0.0000 4 135 270 3690 2610 M4\001 +4 1 0 40 -1 18 12 0.0000 4 135 270 2925 3825 M5\001 +4 1 0 40 -1 18 12 0.0000 4 135 270 2025 810 M3\001 +4 1 0 40 -1 18 12 0.0000 4 135 270 810 1710 M2\001 +4 1 0 60 -1 18 12 0.0000 4 135 330 2115 1845 C23\001 +4 1 12 60 -1 18 12 0.0000 4 135 330 1485 2745 C34\001 +4 1 12 60 -1 18 12 0.0000 4 135 330 2655 2565 C45\001 +4 0 0 50 -1 18 12 0.0000 4 135 405 810 4410 New\001 +4 0 0 50 -1 18 12 0.0000 4 180 1065 810 4185 Pre-existing\001 +4 1 12 60 -1 18 12 0.0000 4 135 270 1980 2340 M3\001 +4 1 12 60 -1 18 12 0.0000 4 135 270 2250 2655 M4\001 diff --git a/katabatic/doc/images/SplitAutoContact-1.pdf b/katabatic/doc/images/SplitAutoContact-1.pdf new file mode 100644 index 00000000..34fbea72 Binary files /dev/null and b/katabatic/doc/images/SplitAutoContact-1.pdf differ diff --git a/katabatic/doc/images/SplitAutoContact-1.png b/katabatic/doc/images/SplitAutoContact-1.png new file mode 100644 index 00000000..d66e2237 Binary files /dev/null and b/katabatic/doc/images/SplitAutoContact-1.png differ diff --git a/katabatic/doc/images/SplitAutoContact-2.fig b/katabatic/doc/images/SplitAutoContact-2.fig new file mode 100644 index 00000000..a93b4700 --- /dev/null +++ b/katabatic/doc/images/SplitAutoContact-2.fig @@ -0,0 +1,53 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 1710 90 2610 225 +4 0 0 50 -1 18 12 0.0000 4 135 270 1710 225 M2\001 +4 0 0 50 -1 19 12 0.0000 4 135 180 2070 225 to\001 +4 0 0 50 -1 18 12 0.0000 4 135 270 2340 225 M5\001 +-6 +1 3 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 1800 90 90 1800 1800 1890 1800 +1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 1800 2700 90 90 1800 2700 1890 2700 +1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 2700 90 90 2700 2700 2790 2700 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 675 1845 1350 1845 1350 1755 675 1755 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 1800 1710 1800 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 2700 2790 2700 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 2790 2700 3150 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1800 1890 1800 2610 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1890 2700 2610 2700 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 2745 3825 2745 3150 2655 3150 2655 3825 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 3825 2745 3150 2745 3150 2655 3825 2655 +2 2 3 1 0 7 60 -1 -1 8.000 0 0 -1 0 0 5 + 1080 1125 3375 1125 3375 3375 1080 3375 1080 1125 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4140 675 4140 +2 1 0 4 12 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4365 675 4365 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 0 3960 2025 3960 2025 4500 +2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 4275 0 4275 4500 0 4500 0 0 +4 1 0 40 -1 18 12 0.0000 4 135 270 3690 2610 M4\001 +4 1 0 40 -1 18 12 0.0000 4 135 270 2925 3825 M5\001 +4 1 0 40 -1 18 12 0.0000 4 135 270 810 1710 M2\001 +4 1 0 60 -1 18 12 0.0000 4 135 330 2115 1845 C23\001 +4 1 12 60 -1 18 12 0.0000 4 135 330 1485 2745 C34\001 +4 1 12 60 -1 18 12 0.0000 4 135 330 2655 2565 C45\001 +4 0 0 50 -1 18 12 0.0000 4 135 405 810 4410 New\001 +4 0 0 50 -1 18 12 0.0000 4 180 1065 810 4185 Pre-existing\001 +4 1 12 60 -1 18 12 0.0000 4 135 270 1980 2340 M3\001 +4 1 12 60 -1 18 12 0.0000 4 135 270 2250 2655 M4\001 diff --git a/katabatic/doc/images/SplitAutoContact-2.pdf b/katabatic/doc/images/SplitAutoContact-2.pdf new file mode 100644 index 00000000..eb75d971 Binary files /dev/null and b/katabatic/doc/images/SplitAutoContact-2.pdf differ diff --git a/katabatic/doc/images/SplitAutoContact-2.png b/katabatic/doc/images/SplitAutoContact-2.png new file mode 100644 index 00000000..4bd10f8b Binary files /dev/null and b/katabatic/doc/images/SplitAutoContact-2.png differ diff --git a/katabatic/doc/images/SplitAutoContact-3.fig b/katabatic/doc/images/SplitAutoContact-3.fig new file mode 100644 index 00000000..16aa86ce --- /dev/null +++ b/katabatic/doc/images/SplitAutoContact-3.fig @@ -0,0 +1,48 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +6 1710 90 2610 225 +4 0 0 50 -1 18 12 0.0000 4 135 270 1710 225 M2\001 +4 0 0 50 -1 19 12 0.0000 4 135 180 2070 225 to\001 +4 0 0 50 -1 18 12 0.0000 4 135 270 2340 225 M5\001 +-6 +1 3 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 1800 90 90 1800 1800 1890 1800 +1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 1800 2700 90 90 1800 2700 1890 2700 +1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 2700 90 90 2700 2700 2790 2700 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 675 1845 1350 1845 1350 1755 675 1755 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 1800 1710 1800 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 2790 2700 3150 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1800 1890 1800 2610 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1890 2700 2610 2700 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 2745 3825 2745 3150 2655 3150 2655 3825 +2 2 3 1 0 7 60 -1 -1 8.000 0 0 -1 0 0 5 + 1080 1125 3375 1125 3375 3375 1080 3375 1080 1125 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4140 675 4140 +2 1 0 4 12 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4365 675 4365 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 0 3960 2025 3960 2025 4500 +2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 4275 0 4275 4500 0 4500 0 0 +4 1 0 40 -1 18 12 0.0000 4 135 270 2925 3825 M5\001 +4 1 0 40 -1 18 12 0.0000 4 135 270 810 1710 M2\001 +4 1 0 60 -1 18 12 0.0000 4 135 330 2115 1845 C23\001 +4 1 12 60 -1 18 12 0.0000 4 135 330 1485 2745 C34\001 +4 1 12 60 -1 18 12 0.0000 4 135 330 2655 2565 C45\001 +4 0 0 50 -1 18 12 0.0000 4 135 405 810 4410 New\001 +4 0 0 50 -1 18 12 0.0000 4 180 1065 810 4185 Pre-existing\001 +4 1 12 60 -1 18 12 0.0000 4 135 270 1980 2340 M3\001 +4 1 12 60 -1 18 12 0.0000 4 135 270 2250 2655 M4\001 diff --git a/katabatic/doc/images/SplitAutoContact-3.pdf b/katabatic/doc/images/SplitAutoContact-3.pdf new file mode 100644 index 00000000..8e507292 Binary files /dev/null and b/katabatic/doc/images/SplitAutoContact-3.pdf differ diff --git a/katabatic/doc/images/SplitAutoContact-3.png b/katabatic/doc/images/SplitAutoContact-3.png new file mode 100644 index 00000000..b167f4b4 Binary files /dev/null and b/katabatic/doc/images/SplitAutoContact-3.png differ diff --git a/katabatic/doc/images/SplitAutoContact-4.fig b/katabatic/doc/images/SplitAutoContact-4.fig new file mode 100644 index 00000000..4afaa7d3 --- /dev/null +++ b/katabatic/doc/images/SplitAutoContact-4.fig @@ -0,0 +1,46 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 2700 90 90 2700 2700 2790 2700 +1 3 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 2700 90 90 1800 2700 1890 2700 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1800 1350 1800 2610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 2700 2790 2700 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2700 2790 2700 3150 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1890 2700 2610 2700 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 1755 675 1755 1350 1845 1350 1845 675 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 2745 3825 2745 3150 2655 3150 2655 3825 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 3825 2745 3150 2745 3150 2655 3825 2655 +2 2 3 1 0 7 60 -1 -1 8.000 0 0 -1 0 0 5 + 1080 1125 3375 1125 3375 3375 1080 3375 1080 1125 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4140 675 4140 +2 1 0 4 12 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4365 675 4365 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 0 3960 2025 3960 2025 4500 +2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 4275 0 4275 4500 0 4500 0 0 +4 1 0 40 -1 18 12 0.0000 4 135 270 3690 2610 M4\001 +4 1 0 40 -1 18 12 0.0000 4 135 270 2925 3825 M5\001 +4 1 0 40 -1 18 12 0.0000 4 135 270 2025 810 M3\001 +4 1 12 60 -1 18 12 0.0000 4 135 330 2655 2565 C45\001 +4 0 0 50 -1 18 12 0.0000 4 135 405 810 4410 New\001 +4 0 0 50 -1 18 12 0.0000 4 180 1065 810 4185 Pre-existing\001 +4 1 12 60 -1 18 12 0.0000 4 135 270 2250 2655 M4\001 +4 0 0 50 -1 19 12 0.0000 4 135 180 2070 225 to\001 +4 0 0 50 -1 18 12 0.0000 4 135 270 2340 225 M5\001 +4 0 0 50 -1 18 12 0.0000 4 135 270 1710 225 M3\001 +4 1 0 60 -1 18 12 0.0000 4 135 330 1485 2745 C34\001 diff --git a/katabatic/doc/images/SplitAutoContact-4.pdf b/katabatic/doc/images/SplitAutoContact-4.pdf new file mode 100644 index 00000000..822ee6c6 Binary files /dev/null and b/katabatic/doc/images/SplitAutoContact-4.pdf differ diff --git a/katabatic/doc/images/SplitAutoContact-4.png b/katabatic/doc/images/SplitAutoContact-4.png new file mode 100644 index 00000000..13a9e077 Binary files /dev/null and b/katabatic/doc/images/SplitAutoContact-4.png differ diff --git a/katabatic/doc/images/SplitAutoContact-5.fig b/katabatic/doc/images/SplitAutoContact-5.fig new file mode 100644 index 00000000..17371c26 --- /dev/null +++ b/katabatic/doc/images/SplitAutoContact-5.fig @@ -0,0 +1,46 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +1 3 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 1800 90 90 1800 1800 1890 1800 +1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 1800 2700 90 90 1800 2700 1890 2700 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 675 1845 1350 1845 1350 1755 675 1755 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1350 1800 1710 1800 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1800 1350 1800 1710 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 2700 1890 2700 +2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1800 1890 1800 2610 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 1755 675 1755 1350 1845 1350 1845 675 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 3825 2745 3150 2745 3150 2655 3825 2655 +2 2 3 1 0 7 60 -1 -1 8.000 0 0 -1 0 0 5 + 1080 1125 3375 1125 3375 3375 1080 3375 1080 1125 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4140 675 4140 +2 1 0 4 12 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4365 675 4365 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 0 3960 2025 3960 2025 4500 +2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 4275 0 4275 4500 0 4500 0 0 +4 1 0 40 -1 18 12 0.0000 4 135 270 3690 2610 M4\001 +4 1 0 40 -1 18 12 0.0000 4 135 270 2025 810 M3\001 +4 1 0 40 -1 18 12 0.0000 4 135 270 810 1710 M2\001 +4 1 0 60 -1 18 12 0.0000 4 135 330 2115 1845 C23\001 +4 1 12 60 -1 18 12 0.0000 4 135 330 1485 2745 C34\001 +4 0 0 50 -1 18 12 0.0000 4 135 405 810 4410 New\001 +4 0 0 50 -1 18 12 0.0000 4 180 1065 810 4185 Pre-existing\001 +4 1 12 60 -1 18 12 0.0000 4 135 270 1980 2340 M3\001 +4 0 0 50 -1 18 12 0.0000 4 135 270 1710 225 M2\001 +4 0 0 50 -1 19 12 0.0000 4 135 180 2070 225 to\001 +4 0 0 50 -1 18 12 0.0000 4 135 270 2340 225 M4\001 diff --git a/katabatic/doc/images/SplitAutoContact-5.pdf b/katabatic/doc/images/SplitAutoContact-5.pdf new file mode 100644 index 00000000..93135be0 Binary files /dev/null and b/katabatic/doc/images/SplitAutoContact-5.pdf differ diff --git a/katabatic/doc/images/SplitAutoContact-5.png b/katabatic/doc/images/SplitAutoContact-5.png new file mode 100644 index 00000000..472e2645 Binary files /dev/null and b/katabatic/doc/images/SplitAutoContact-5.png differ diff --git a/katabatic/doc/images/SplitAutoContact-6.fig b/katabatic/doc/images/SplitAutoContact-6.fig new file mode 100644 index 00000000..34fb0bb0 --- /dev/null +++ b/katabatic/doc/images/SplitAutoContact-6.fig @@ -0,0 +1,36 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +1 3 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 2700 90 90 1800 2700 1890 2700 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1800 1350 1800 2610 +2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3150 2700 1890 2700 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 1755 675 1755 1350 1845 1350 1845 675 +2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 + 3825 2745 3150 2745 3150 2655 3825 2655 +2 2 3 1 0 7 60 -1 -1 8.000 0 0 -1 0 0 5 + 1080 1125 3375 1125 3375 3375 1080 3375 1080 1125 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4140 675 4140 +2 1 0 4 12 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 225 4365 675 4365 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 0 3960 2025 3960 2025 4500 +2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 + 0 0 4275 0 4275 4500 0 4500 0 0 +4 1 0 40 -1 18 12 0.0000 4 135 270 3690 2610 M4\001 +4 1 0 40 -1 18 12 0.0000 4 135 270 2025 810 M3\001 +4 0 0 50 -1 18 12 0.0000 4 135 405 810 4410 New\001 +4 0 0 50 -1 18 12 0.0000 4 180 1065 810 4185 Pre-existing\001 +4 0 0 50 -1 19 12 0.0000 4 135 180 2070 225 to\001 +4 0 0 50 -1 18 12 0.0000 4 135 270 2340 225 M4\001 +4 0 0 50 -1 18 12 0.0000 4 135 270 1710 225 M3\001 +4 1 0 60 -1 18 12 0.0000 4 135 330 1485 2745 C34\001 diff --git a/katabatic/doc/images/SplitAutoContact-6.pdf b/katabatic/doc/images/SplitAutoContact-6.pdf new file mode 100644 index 00000000..1da5d1b6 Binary files /dev/null and b/katabatic/doc/images/SplitAutoContact-6.pdf differ diff --git a/katabatic/doc/images/SplitAutoContact-6.png b/katabatic/doc/images/SplitAutoContact-6.png new file mode 100644 index 00000000..b95acf11 Binary files /dev/null and b/katabatic/doc/images/SplitAutoContact-6.png differ diff --git a/katabatic/doc/mkDoc.sh b/katabatic/doc/mkDoc.sh new file mode 100644 index 00000000..f7b1749c --- /dev/null +++ b/katabatic/doc/mkDoc.sh @@ -0,0 +1,10 @@ +#!/bin/sh + + cd images + for file in *.fig; do + echo "Translating $file into PDF..." + fig2dev -L pdf -p dummy $file `basename $file .fig`.pdf + done + cd .. + + exit 0 diff --git a/katabatic/src/AutoContact.cpp b/katabatic/src/AutoContact.cpp new file mode 100644 index 00000000..94bd4e5e --- /dev/null +++ b/katabatic/src/AutoContact.cpp @@ -0,0 +1,2686 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./AutoContact.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include +#include +#include + +#include "hurricane/Bug.h" +#include "hurricane/Error.h" +#include "hurricane/Warning.h" +#include "hurricane/Layer.h" +#include "hurricane/ViaLayer.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/Technology.h" +#include "hurricane/Net.h" +#include "hurricane/Contact.h" +#include "hurricane/Plug.h" +#include "hurricane/RoutingPad.h" +#include "hurricane/Vertical.h" +#include "hurricane/Horizontal.h" +#include "hurricane/UpdateSession.h" +#include "hurricane/DebugSession.h" + +#include "crlcore/RoutingGauge.h" + +#include "katabatic/GCell.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/AutoVertical.h" +#include "katabatic/AutoHorizontal.h" +#include "katabatic/Session.h" + + +namespace { + + /*! \class SegmentEnd + * \brief Segment manipulator (\b internal) + * + * SegmentPosition compute detailed informations about how an + * Segment is connected to the current AutoContact. This + * object act as a cache, avoiding to recalculate the position + * information many times. + * + * It also provide uniform way of resizing the Segment extention + * from the AutoContact. + */ + + /*! \var bool SegmentEnd::_isSourceHook; + * set to \b true if the Segment is attached to the AutoContact + * through it's source hook (\b false for target \c hook). + */ + + /*! \function SegmentEnd::SegmentEnd ( AutoSegment* segment, bool isSourceHook ); + * \param segment the supporting segment. + * \param isSourceHook initialize _isSourceHook. + */ + + /*! \function static SegmentEnd* SegmentEnd::create ( Hook* hook, bool checking ); + * \param contact The AutoContact we are currently processing. + * \return The appropriate SegmentPosition. + * + * This create function allocate the relevant HorizontalPosition or + * VerticalPosition derived object, providing an uniform allocator + * function. + */ + + /*! \function virtual bool SegmentEnd::isVertical () const; + * \return \b true if the associated Segment is vertical. + */ + + /*! \function virtual bool SegmentEnd::isHorizontal () const; + * \return \b true if the associated Segment is horizontal. + */ + + /*! \function bool SegmentEnd::isSourceHook () const; + * \return The _isSourceHook value (accessor). + */ + + /*! \function bool SegmentEnd::isGlobal () const; + * \return The _isGlobal value (accessor). + */ + + /*! \function virtual DbU::Unit SegmentEnd::getAxis () const; + * \return For horizontal segment, the Y coordinate and the X coordinate for + * vertical ones. + */ + + /*! \function Layer* SegmentEnd::getLayer () const; + * \return The layer of the segment. + */ + + /*! \function Point SegmentEnd::getEnd () const; + * \return The position of the segment's extremity attached to the AutoContact. + */ + + + /*! \function void SegmentEnd::setDelta ( DbU::Unit delta ); + * \param delta the new value of the extention. + * + * Adjust the segment's extention. Coordinate must be expressed + * as an offset to the absolute coordinate of the relevant hook. + */ + + /*! \function void SegmentEnd::orient (); + * restore correct orientation of the segment (source \e lower than + * target), usually needed after a setDelta(). + */ + + + + + /*! \class HorizontalEnd + * \brief Horizontal Segment manipulator (\b internal) + * + * This class must only be accessed through it's base class + * SegmentPosition, it's constructed through SegmentPosition::create(). + */ + + + /*! \class VerticalEnd + * \brief Vertical Segment manipulator (\b internal) + * + * This class must only be accessed through it's base class + * SegmentPosition, it's constructed through SegmentPosition::create(). + */ + + + using namespace std; + using namespace Hurricane; + using namespace Katabatic; + + +// ------------------------------------------------------------------- +// Local Variables. + +// const char* badAutoContactAnchor = +// "AutoContact::AutoContact() :\n\n" +// " Only are supported to anchor an AutoContact :\n" +// " %s\n"; + +// const char* nonAdjacentLayers = +// "%s :\n\n" +// " %s and %s are not adjacent, cannot build a VIA.\n"; + +// const char* missingAutoLayer = +// "AutoContact::create() :\n\n" +// " DataBase is lacking \"AutoLayer\" layer, please check technology file.\n"; + +// const char* emptyJunctionBox = +// " Empty JunctionBox in %s (internal error)."; + + const char* badHookType = + "Hook of %s is neither a SourceHook nor a TargetHook (internal error)."; + + const char* missingAutoSegment = + "No AutoSegment associated to %s (internal error)."; + + +// Forward Declarations. + class StackedContact; + + +// ------------------------------------------------------------------- +// Class : "::UPoint". + + + class UPoint { + // Constructors. + public: + inline UPoint ( bool isHorizontal, DbU::Unit ux, DbU::Unit uy ); + // Accessors. + inline DbU::Unit getUX () const; + inline DbU::Unit getUY () const; + inline DbU::Unit getX () const; + inline DbU::Unit getY () const; + // Modifiers. + inline void setUX ( DbU::Unit ux ); + inline void setUY ( DbU::Unit uy ); + // Attributes. + protected: + bool _isHorizontal; + DbU::Unit _ux; + DbU::Unit _uy; + }; + + +// Inline Functions. + inline UPoint::UPoint ( bool isHorizontal, DbU::Unit ux, DbU::Unit uy ) + : _isHorizontal(isHorizontal), _ux(ux), _uy(uy) {} + inline DbU::Unit UPoint::getUX () const { return _ux; } + inline DbU::Unit UPoint::getUY () const { return _uy; } + inline DbU::Unit UPoint::getX () const { return (_isHorizontal)?_ux:_uy; } + inline DbU::Unit UPoint::getY () const { return (_isHorizontal)?_uy:_ux; } + inline void UPoint::setUX ( DbU::Unit ux ) { _ux = ux; } + inline void UPoint::setUY ( DbU::Unit uy ) { _uy = uy; } + + +// ------------------------------------------------------------------- +// Class : "::SegmentEnd". + + + class SegmentEnd { + public: + struct Compare : public binary_function { + inline bool operator() ( const SegmentEnd* lhs, const SegmentEnd* rhs ) const; + }; + public: + // AutoSegment & Segment wrapped functions. + inline bool isGlobal () const; + inline bool isLocal () const; + inline bool isHorizontal () const; + inline bool isVertical () const; + inline bool isSlackened () const; + inline Net* getNet () const; + inline const Layer* getLayer () const; + inline Hook* getSourceHook (); + inline Hook* getTargetHook (); + inline DbU::Unit getSourceX () const; + inline DbU::Unit getSourceY () const; + inline DbU::Unit getTargetX () const; + inline DbU::Unit getTargetY () const; + inline DbU::Unit getSourceU () const; + inline DbU::Unit getTargetU () const; + inline DbU::Unit getDuSource () const; + inline DbU::Unit getDuTarget () const; + inline DbU::Unit getAxis () const; + inline DbU::Unit getWidth () const; + inline void setDuSource ( DbU::Unit ); + inline void setDuTarget ( DbU::Unit ); + inline void invert (); + inline void invalidate (); + // Constructors & Destructors. + inline SegmentEnd ( AutoSegment* , bool isSourceHook ); + virtual ~SegmentEnd (); + static SegmentEnd* create ( Hook*, bool checking ); + // Accessors. + static size_t getAllocateds (); + inline bool isSourceHook () const; + inline AutoSegment* getSegment () const; + virtual Hook* getHook () const; + inline Point getEnd () const; + inline DbU::Unit getEndX () const; + inline DbU::Unit getEndY () const; + virtual vector* getForks (); + virtual vector* getAligneds (); + // Modifiers. + void setDelta ( DbU::Unit ); + virtual void orient (); + virtual void addFork ( SegmentEnd* ); + virtual void addAligned ( SegmentEnd* ); + virtual void split ( vector& ); + // Inspector Managment. + inline Record* _getRecord () const; + inline string _getString () const; + inline string _getTypeName () const; + protected: + // Attributes. + static size_t _allocateds; + AutoSegment* _autoSegment; + bool _isSourceHook; + }; + + +} + +INSPECTOR_P_SUPPORT(SegmentEnd); + +namespace { + + size_t SegmentEnd::_allocateds = 0; + + SegmentEnd::~SegmentEnd () { _allocateds--; } + size_t SegmentEnd::getAllocateds () { return _allocateds; } + inline bool SegmentEnd::isGlobal () const { return _autoSegment->isGlobal(); } + inline bool SegmentEnd::isLocal () const { return _autoSegment->isLocal(); } + inline bool SegmentEnd::isHorizontal () const { return _autoSegment->isHorizontal(); } + inline bool SegmentEnd::isVertical () const { return _autoSegment->isVertical(); } + inline bool SegmentEnd::isSlackened () const { return _autoSegment->isSlackened(); } + inline AutoSegment* SegmentEnd::getSegment () const { return _autoSegment; } + inline Net* SegmentEnd::getNet () const { return _autoSegment->getNet(); } + inline const Layer* SegmentEnd::getLayer () const { return _autoSegment->getLayer(); } + inline Hook* SegmentEnd::getSourceHook () { return _autoSegment->getSourceHook(); } + inline Hook* SegmentEnd::getTargetHook () { return _autoSegment->getTargetHook(); } + inline DbU::Unit SegmentEnd::getSourceX () const { return _autoSegment->getSourceX(); } + inline DbU::Unit SegmentEnd::getSourceY () const { return _autoSegment->getSourceY(); } + inline DbU::Unit SegmentEnd::getTargetX () const { return _autoSegment->getTargetX(); } + inline DbU::Unit SegmentEnd::getTargetY () const { return _autoSegment->getTargetY(); } + inline DbU::Unit SegmentEnd::getSourceU () const { return _autoSegment->getSourceU(); } + inline DbU::Unit SegmentEnd::getTargetU () const { return _autoSegment->getTargetU(); } + inline DbU::Unit SegmentEnd::getDuSource () const { return _autoSegment->getDuSource(); } + inline DbU::Unit SegmentEnd::getDuTarget () const { return _autoSegment->getDuTarget(); } + inline DbU::Unit SegmentEnd::getAxis () const { return _autoSegment->getAxis(); } + inline DbU::Unit SegmentEnd::getWidth () const { return _autoSegment->getWidth(); } + inline void SegmentEnd::setDuSource ( DbU::Unit du ) { _autoSegment->setDuSource(du); } + inline void SegmentEnd::setDuTarget ( DbU::Unit du ) { _autoSegment->setDuTarget(du); } + inline void SegmentEnd::invert () { _autoSegment->invert(); } + inline void SegmentEnd::invalidate () { _autoSegment->invalidate(); } + inline bool SegmentEnd::isSourceHook () const { return _isSourceHook; } + inline Point SegmentEnd::getEnd () const { return isSourceHook() ? Point(getSourceX(),getSourceY()) : Point(getTargetX(),getTargetY()); } + inline DbU::Unit SegmentEnd::getEndX () const { return isSourceHook() ? getSourceX() : getTargetX(); } + inline DbU::Unit SegmentEnd::getEndY () const { return isSourceHook() ? getSourceY() : getTargetY(); } + vector* SegmentEnd::getForks () { return NULL; } + vector* SegmentEnd::getAligneds () { return NULL; } + void SegmentEnd::addFork ( SegmentEnd* ) {} + void SegmentEnd::addAligned ( SegmentEnd* ) {} + void SegmentEnd::split ( vector& ) {} + inline Record* SegmentEnd::_getRecord () const { return _autoSegment->_getRecord(); } + inline string SegmentEnd::_getString () const { return _autoSegment->_getString(); } + inline string SegmentEnd::_getTypeName () const { return "Katabatic::SegmentEnd"; } + + inline bool SegmentEnd::Compare::operator() ( const SegmentEnd* lhs, const SegmentEnd* rhs ) const + { return AutoSegment::CompareCanonical() ( lhs->getSegment(), rhs->getSegment() ); } + + inline SegmentEnd::SegmentEnd ( AutoSegment* segment, bool isSourceHook ) + : _autoSegment(segment) + , _isSourceHook(isSourceHook) + { + _allocateds++; + } + + + Hook* SegmentEnd::getHook () const + { + if ( isSourceHook() ) return _autoSegment->getSourceHook(); + return _autoSegment->getTargetHook(); + } + + + void SegmentEnd::orient () + { + if ( ( !isGlobal() ) && ( getSourceU() > getTargetU() ) ) { + ltrace(99) << "Orient() before - " << this << endl; + + invert (); + DbU::Unit duSource = getDuSource(); + DbU::Unit duTarget = getDuTarget(); + setDuSource ( duTarget ); + setDuTarget ( duSource ); + _isSourceHook = !_isSourceHook; + + ltrace(99) << "Orient() after - " << this << endl; + } + } + + + void SegmentEnd::setDelta ( DbU::Unit delta ) + { + ltrace(99) << "setDelta(" << DbU::getLambda(delta) << ") - " << this << endl; + + if ( isSourceHook() ) { + if ( getDuSource() != delta ) { + setDuSource ( delta ); + ltrace(99) << "DuSource actualized: " << this << endl; + } + } else { + if ( getDuTarget() != delta ) { + setDuTarget ( delta ); + ltrace(99) << "DuTarget actualized: " << this << endl; + } + } + + orient (); + } + + +} + + +namespace { + + +// ------------------------------------------------------------------- +// Class : "::ForkCompare". + + + class ForkCompare { + public: + inline ForkCompare ( bool increasing ) : _increasing(increasing) {}; + inline bool operator() ( SegmentEnd* lhs, SegmentEnd* rhs ) const; + protected: + bool _increasing; + }; + + + bool ForkCompare::operator() ( SegmentEnd* lhs, SegmentEnd* rhs ) const + { + bool superior = rhs->isGlobal(); + + if ( lhs->getAxis() == rhs->getAxis() ) { + if ( lhs->isLocal() && rhs->isLocal() ) + return false; + } else + superior = lhs->getAxis() > rhs->getAxis(); + + return (_increasing) ? !superior : superior; + } + + +// ------------------------------------------------------------------- +// Class : "::StackedContact". + + + class StackedContact : public Contact { + + public: + static StackedContact* create ( Net* , const Layer* , DbU::Unit x, DbU::Unit y ); + StackedContact ( Net* , const Layer* , DbU::Unit x, DbU::Unit y ); + virtual ~StackedContact (); + public: + void setAnchor ( Component* ); + void addLayer ( const Layer* ); + void attachSlave ( SegmentEnd* ); + void breakUp (); + + protected: + vector _useds; + Component* _anchor; + private: + StackedContact ( const StackedContact& ); + StackedContact& operator= ( const StackedContact& ); + }; + + +// ------------------------------------------------------------------- +// Class : "::GlobalEnd". + + + class GlobalEnd : public SegmentEnd { + public: + GlobalEnd ( AutoSegment* , bool isSourceHook ); + virtual ~GlobalEnd (); + virtual vector* getForks (); + virtual vector* getAligneds (); + virtual void split ( vector& ); + virtual void addFork ( SegmentEnd* ); + virtual void addAligned ( SegmentEnd* ); + virtual Segment* _create ( Contact* source, Contact* target ) = 0; + protected: + vector _forks; + vector _aligneds; + }; + + + GlobalEnd::GlobalEnd ( AutoSegment* segment, bool isSourceHook ) + : SegmentEnd(segment,isSourceHook) + , _forks() + , _aligneds() + {} + + + GlobalEnd::~GlobalEnd () + {} + + + vector* GlobalEnd::getForks () + { + return &_forks; + } + + + vector* GlobalEnd::getAligneds () + { + return &_aligneds; + } + + + void GlobalEnd::addFork ( SegmentEnd* segmentEnd ) + { + for ( size_t i = 0 ; i < _forks.size() ; i++ ) { + if ( _forks[i] == segmentEnd ) return; + } + _forks.push_back ( segmentEnd ); + } + + + void GlobalEnd::addAligned ( SegmentEnd* segmentEnd ) + { + for ( size_t i = 0 ; i < _aligneds.size() ; i++ ) { + if ( _aligneds[i] == segmentEnd ) return; + } + _aligneds.push_back ( segmentEnd ); + } + + + void GlobalEnd::split ( vector& stackedContacts ) + { + ltrace(99) << "GlobalEnd::split() - " << this << endl; + ltracein(99); + + sort ( _forks.begin(), _forks.end(), ForkCompare(!isSourceHook()) ); + + StackedContact* contact1 = NULL; + StackedContact* contact2 = NULL; + const Layer* contactLayer = NULL; + Hook* hook = getHook(); + vector::iterator it = _forks.begin(); + + if ( it == _forks.end() ) { + ltrace(99) << "No forks!" << endl; + stackedContacts.push_back ( StackedContact::create ( getNet() + , getLayer() + , getEndX() + , getEndY() + ) ); + stackedContacts.back()->attachSlave ( this ); + + ltraceout(99); + return; + } + + ltrace(99) << "splitted Axis " << DbU::getLambda(getAxis()) << endl; + ltrace(99) << "iterator Axis " << DbU::getLambda((*it)->getAxis()) << " " << (*it) << endl; + + UPoint center ( isHorizontal(), (*it)->getAxis(), getAxis() ); + contactLayer = Session::getTechnology()->getViaBetween ( getLayer(), (*it)->getLayer() ); + stackedContacts.push_back + ( StackedContact::create ( getNet(), contactLayer, center.getX(), center.getY() ) ); + contact1 = stackedContacts.back (); + contact1->attachSlave ( *it ); + + hook->detach (); + hook->attach ( contact1->getBodyHook() ); + setDelta ( 0 ); + + for ( it++ ; it != _forks.end() ; it++ ) { + ltrace(99) << "splitted Axis " << DbU::getLambda(getAxis()) << endl; + ltrace(99) << "iterator Axis " << DbU::getLambda((*it)->getAxis()) << " " << (*it) << endl; + + if ( (*(it-1))->getAxis() != (*it)->getAxis() ) { + UPoint center ( isHorizontal(), (*it)->getAxis(), getAxis() ); + contactLayer = Session::getTechnology()->getViaBetween ( getLayer(), (*it)->getLayer() ); + stackedContacts.push_back + ( StackedContact::create ( getNet(), contactLayer, center.getX(), center.getY() ) ); + contact2 = stackedContacts.back (); + } else { + contact2 = contact1; + } + + if ( contact1 != contact2 ) { + if ( !isSourceHook() ) _create ( contact1, contact2 ); + else _create ( contact2, contact1 ); + } + + contact2->attachSlave ( *it ); + contact1 = contact2; + } + + for ( it = _aligneds.begin() ; it != _aligneds.end() ; it++ ) { + if ( isSourceHook() == (*it)->isSourceHook() ) { + stackedContacts.front()->attachSlave ( *it ); + } else { + stackedContacts.back()->attachSlave ( *it ); + } + } + + ltraceout(99); + } + + +// ------------------------------------------------------------------- +// Class : "::HorizontalEnd". + + + class HorizontalEnd : public GlobalEnd { + public: + HorizontalEnd ( AutoSegment* , bool isSourceHook ); + virtual ~HorizontalEnd (); + virtual Segment* _create ( Contact* source , Contact* target ); + }; + + + HorizontalEnd::HorizontalEnd ( AutoSegment* horizontal, bool isSourceHook ) + : GlobalEnd(horizontal,isSourceHook) + { } + + + HorizontalEnd::~HorizontalEnd () + { } + + + Segment* HorizontalEnd::_create ( Contact* source , Contact* target ) + { + return Horizontal::create ( source, target, getLayer(), getAxis(), getWidth() ); + } + + +// ------------------------------------------------------------------- +// Class : "::VerticalEnd". + + + class VerticalEnd : public GlobalEnd { + public: + VerticalEnd ( AutoSegment* , bool isSourceHook ); + virtual ~VerticalEnd (); + virtual Segment* _create ( Contact* source , Contact* target ); + }; + + + VerticalEnd::VerticalEnd ( AutoSegment* vertical, bool isSourceHook ) + : GlobalEnd(vertical,isSourceHook) + { } + + + VerticalEnd::~VerticalEnd () + { } + + + Segment* VerticalEnd::_create ( Contact* source , Contact* target ) + { + return Vertical::create ( source, target, getLayer(), getAxis(), getWidth() ); + } + + +// ------------------------------------------------------------------- +// Static Generic Constructor for all SegmentEnd. + + + SegmentEnd* SegmentEnd::create ( Hook* hook, bool checking ) + { + bool isSourceHook = (dynamic_cast(hook)); + if ( !isSourceHook && ( dynamic_cast(hook) == NULL ) ) { + cerr << Error ( badHookType, getString(hook->getComponent()).c_str() ) << endl; + return NULL; + } + + AutoSegment* autoSegment = Session::lookup ( dynamic_cast(hook->getComponent()) ); + + if ( !autoSegment ) + throw Error ( missingAutoSegment, getString(hook->getComponent()).c_str() ); + + if ( !checking ) + autoSegment->invalidate (); + + if ( autoSegment->isGlobal() ) { + if ( autoSegment->isHorizontal() ) + return new HorizontalEnd ( autoSegment, isSourceHook ); + else + return new VerticalEnd ( autoSegment, isSourceHook ); + } else { + if ( autoSegment->isHorizontal() ) + return new SegmentEnd ( autoSegment, isSourceHook ); + } + return new SegmentEnd ( autoSegment, isSourceHook ); + } + + +// ------------------------------------------------------------------- +// Class : "::JunctionBox". + + + class JunctionBox { + + public: + // Constructor & Destructor. + JunctionBox ( AutoContact*, bool checking ); + ~JunctionBox (); + // Predicates. + inline bool isVFlat (); + inline bool isHFlat (); + inline bool isFlat (); + inline bool isPunctual (); + inline bool isVEmpty (); + inline bool isHEmpty (); + inline bool isEmpty (); + bool isHExtended (); + bool isVExtended (); + bool canGoOutside ( const AutoSegment* ) const; + bool canHDesalignate () const; + bool canVDesalignate () const; + void getZSpan ( size_t& zMin, size_t& zMax ) const; + // Modifiers. + void checkTopology (); + void revalidateTopology (); + void computeGlobalStem (); + void computeAlignate (); + void mergeX ( DbU::Unit ); + void mergeY ( DbU::Unit ); + void mergeAnchor (); + void merge ( Hook* ); + void postMerge ( SegmentEnd* ); + void resizePunctual (); + void resize (); + void breakUpPunctual (); + void breakUp (); + void split (); + void splitTerminal (); + void updateContacts ( VirtualContacts& ); + void restoreHConnexity ( DbU::Unit x, bool split ); + void restoreVConnexity ( DbU::Unit y, bool split ); + + protected: + // Attributes. + RoutingGauge* _routingGauge; + AutoContact* _contact; + Component* _anchor; + DbU::Unit _xMin; + DbU::Unit _yMin; + DbU::Unit _xMax; + DbU::Unit _yMax; + SegmentEnd* _globalStem; + vector _globalEnds; + vector _localEnds; + vector _layerStack; + size_t _wireCount; + bool _failsafe; + bool _checking; + }; + + + inline bool JunctionBox::isVFlat () { return _yMin == _yMax; } + inline bool JunctionBox::isHFlat () { return _xMin == _xMax; } + inline bool JunctionBox::isFlat () { return isHFlat() || isVFlat(); } + inline bool JunctionBox::isPunctual () { return isHFlat() && isVFlat(); } + inline bool JunctionBox::isVEmpty () { return _yMin > _yMax; } + inline bool JunctionBox::isHEmpty () { return _xMin > _xMax; } + inline bool JunctionBox::isEmpty () { return isHEmpty() || isVEmpty(); } + + + JunctionBox::JunctionBox ( AutoContact* contact, bool checking ) + : _routingGauge(Session::getRoutingGauge()) + , _contact (contact) + , _anchor (NULL) + , _xMin (+1) + , _yMin (+1) + , _xMax (-1) + , _yMax (-1) + , _globalStem (NULL) + , _globalEnds () + , _localEnds () + , _layerStack (Session::getRoutingGauge()->getDepth()) + , _wireCount (0) + , _failsafe (false) + , _checking (checking) + { + ltrace(110) << "JunctionBox() " << contact << endl; + ltracein(109); + + forEach ( Hook*, hook, _contact->getBodyHook()->getSlaveHooks() ) merge ( *hook ); + mergeAnchor (); + + sort ( _globalEnds.begin(), _globalEnds.end(), SegmentEnd::Compare() ); + sort ( _localEnds.begin() , _localEnds.end() , SegmentEnd::Compare() ); + + if ( ( _wireCount < 1 ) && !_contact->getAnchor() ) + cerr << Warning("%s has less than 2 wires (%d)" + ,getString(_contact).c_str(),_wireCount) << endl; + + computeGlobalStem (); + if ( _globalStem ) { + ltrace(109) << "_globalStem: " << _globalStem << endl; + for ( size_t i=0 ; i < _localEnds.size() ; i++ ) + postMerge ( _localEnds[i] ); + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) + postMerge ( _globalEnds[i] ); + + ltraceout(109); + return; + } + + if ( isPunctual() || (isFlat() && !_contact->getAnchor()) ) { + ltraceout(109); + return; + } + + // JunctionBox is empty, non-flat or flat with anchor. + _failsafe = true; + ltraceout(109); + } + + + JunctionBox::~JunctionBox () + { + for ( size_t i = 0 ; i < _globalEnds.size() ; i++ ) delete _globalEnds[i]; + for ( size_t i = 0 ; i < _localEnds.size() ; i++ ) delete _localEnds[i]; + } + + + bool JunctionBox::isHExtended () + { + if ( _globalStem ) { + ltrace(109) << "JunctionBox::isHExtended(): " << _globalStem->isHorizontal() << endl; + return _globalStem->isHorizontal(); + } + return _contact->isHAlignate(); + } + + + bool JunctionBox::isVExtended () + { + if ( _globalStem ) { + ltrace(109) << "JunctionBox::isVExtended(): " << _globalStem->isVertical() << endl; + return _globalStem->isVertical(); + } + return _contact->isVAlignate(); + } + + + void JunctionBox::getZSpan ( size_t& zMin, size_t& zMax ) const + { + bool minFound = false; + + zMin = 0; + zMax = 0; + for ( size_t i=0 ; i<_layerStack.size() ; i++ ) { + if ( !minFound ) { + if ( _layerStack[i] > 0 ) { + zMin = zMax = i; + minFound = true; + } + } else { + if ( _layerStack[i] > 0 ) { + zMax = i; + } + } + } + } + + + void JunctionBox::revalidateTopology () + { + _contact->setInvalidatedTopology ( false ); + _contact->setCorner ( false ); + if ( !_contact->getAnchor() ) { + size_t horizontals = 0; + size_t verticals = 0; + + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { + if ( _globalEnds[i]->isHorizontal() ) horizontals++; + else verticals++; + } + for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { + if ( _localEnds[i]->isHorizontal() ) horizontals++; + else verticals++; + } + _contact->setCorner ( (horizontals == 1) + and (verticals == 1) + and (not _contact->isHAlignate()) + and (not _contact->isVAlignate()) ); + } + + checkTopology (); + } + + + void JunctionBox::checkTopology () + { + vector errors; + + bool anchored = (_contact->getAnchor()); + bool alignateHorizontal = _contact->isHAlignate() || anchored; + bool alignateVertical = _contact->isVAlignate() || anchored; + bool globalHorizontal = false; + bool globalVertical = false; + size_t localHorizontals = 0; + size_t localVerticals = 0; + + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { + if ( _globalEnds[i]->isHorizontal() ) { + globalHorizontal = true; + localHorizontals++; + } else { + globalVertical = true; + localVerticals++; + } + } + + for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { + if ( _localEnds[i]->isHorizontal() ) localHorizontals++; + else localVerticals++; + } + + if ( !(localHorizontals || globalHorizontal || anchored) ) + errors.push_back ( "No horizontal components" ); + + if ( !(localVerticals || globalVertical || anchored) ) + errors.push_back ( "No vertical components" ); + + if ( !alignateHorizontal && !globalVertical && (localHorizontals > 1) ) + errors.push_back ( "Disconnecteds horizontals components" ); + + if ( !alignateVertical && !globalHorizontal && (localVerticals > 1) ) + errors.push_back ( "Disconnecteds verticals components" ); + + if ( _globalEnds.size() > 3 ) + errors.push_back ( "More than three globals" ); + + if ( ( _globalEnds.size() == 3 ) && ( _localEnds.size() ) ) + errors.push_back ( "Three globals AND locals" ); + + if ( _globalEnds.size() + _localEnds.size() + ((anchored)?1:0) < 2 ) + errors.push_back ( "Less than two connections" ); + + if ( errors.size() ) { + cerr << Error("AutoContact topology of %s",getString(_contact).c_str()) << endl; + if ( anchored ) + cerr << " A: " << _contact->getAnchor() << endl; + + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) + cerr << " G: " << _globalEnds[i] << endl; + + for ( size_t i=0 ; i < _localEnds.size() ; i++ ) + cerr << " L: " << _localEnds[i] << endl; + + for ( size_t i=0 ; i < errors.size() ; i++ ) + cerr << " " << errors[i] << endl; + } + } + + + bool JunctionBox::canGoOutside ( const AutoSegment* segment ) const + { + if ( _contact->isCorner () ) return true; + if ( _contact->getAnchor() ) return false; + + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { + if ( _globalEnds[i]->isHorizontal() xor segment->isHorizontal() ) { + ltrace(200) << "canGoOutside(): true (has global) " << _contact << endl; + return true; + } + } + + return false; + } + + + bool JunctionBox::canHDesalignate () const + { + if ( _contact->getAnchor () ) return false; + if ( !_contact->isHAlignate() ) return false; + + SegmentEnd* globalHorizontal = NULL; + SegmentEnd* globalVertical = NULL; + + size_t verticals = 0; + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { + ltrace(109) << _globalEnds[i]->getSegment() << endl; + if ( _globalEnds[i]->isHorizontal() ) { + globalHorizontal = _globalEnds[i]; + } else { + globalVertical = _globalEnds[i]; + verticals++; + } + } + + for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { + ltrace(109) << _localEnds[i]->getSegment() << endl; + if ( _localEnds[i]->isVertical() ) verticals++; + } + + ltrace(200) << "canHDesalignate(Contact*) - " << _contact << endl; + ltrace(200) << " Vertical stem: " << globalVertical + << " isVAlignate():" << _contact->isVAlignate() + << " verticals:" << verticals + << endl; + return (globalVertical != NULL) && (_contact->isVAlignate() || (verticals == 1)); + } + + + bool JunctionBox::canVDesalignate () const + { + if ( _contact->getAnchor () ) return false; + if ( !_contact->isVAlignate() ) return false; + + SegmentEnd* globalHorizontal = NULL; + SegmentEnd* globalVertical = NULL; + + size_t horizontals = 0; + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { + if ( _globalEnds[i]->isHorizontal() ) { + globalHorizontal = _globalEnds[i]; + horizontals++; + } else { + globalVertical = _globalEnds[i]; + } + } + + for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { + ltrace(109) << _localEnds[i]->getSegment() << endl; + if ( _localEnds[i]->isHorizontal() ) horizontals++; + } + + ltrace(200) << "canVDesalignate(Contact*) - " << _contact << endl; + ltrace(200) << " Vertical stem: " << globalHorizontal + << " isHAlignate():" << _contact->isHAlignate() + << " horizontals:" << horizontals + << endl; + return (globalHorizontal != NULL) && (_contact->isHAlignate() || (horizontals == 1)); + } + + + void JunctionBox::restoreHConnexity ( DbU::Unit x, bool split ) + { + ltrace(200) << "restoreHConnexity() - @" << DbU::getValueString(x) << " " << _contact << endl; + + _contact->invalidate (); + + if ( _contact->isHAlignate() ) return; + if ( _contact->getAnchor () ) { + _contact->setHAlignate ( true ); + return; + } + + bool slackened = false; + SegmentEnd* verticalStem = NULL; + vector horizontals; + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { + if ( _globalEnds[i]->isHorizontal() ) { + horizontals.push_back ( _globalEnds[i] ) ; + } else { + verticalStem = _globalEnds[i]; + } + } + + if ( verticalStem ) { + ltrace(200) << "Done nothing has vertical stem: " << verticalStem << endl; + return; + } + + for ( size_t i=0 ; i<_localEnds.size() ; i++ ) { + if ( _localEnds[i]->isHorizontal() ) + horizontals.push_back ( _localEnds[i] ) ; + else + slackened = slackened or _localEnds[i]->isSlackened(); + } + + if ( (horizontals.size() == 1) and (horizontals[0]->isGlobal()) ) { + ltrace(200) << "Done nothing, has only a horizontal stem: " << horizontals[0] << endl; + return; + } + + if ( !split ) { + _contact->setHAlignate ( true ); + return; + } + + GCell* gcell = _contact->getGCell (); + Net* net = _contact->getNet (); + const Layer* layer = dynamic_cast(_contact->getLayer())->getTop(); + if ( _routingGauge->getLayerDirection(layer) != Constant::Vertical ) + layer = dynamic_cast(_contact->getLayer())->getBottom(); + + _contact->setVAlignate ( true ); + AutoContact* splitContact = NULL; + for ( size_t i=1 ; isetVAlignate ( true ); + + ltrace(200) << "| Separate " << horizontals[i]->getSegment()->base() + << ":" << horizontals[i]->getSegment() << endl; + + horizontals[i]->getHook()->detach(); + + splitContact = AutoContact::create ( gcell, net, _contact->getLayer() ); + AutoSegment* segment = AutoVertical::create ( _contact + , splitContact + , layer + , x //globalHorizontals[i]->getAxis() + , DbU::lambda(2.0) + , AutoSegment::Local + , false + , false + ); + horizontals[i]->getHook()->attach ( splitContact->getContact()->getBodyHook() ); + segment->setSlackened ( slackened ); + ltrace(200) << "restoreHConnexity() strap: " << segment << endl; + } + } + + + void JunctionBox::restoreVConnexity ( DbU::Unit y, bool split ) + { + ltrace(200) << "restoreVConnexity() - @" << DbU::getValueString(y) << " " << _contact << endl; + + _contact->invalidate (); + + if ( _contact->isVAlignate() ) return; + if ( _contact->getAnchor () ) { + _contact->setVAlignate ( true ); + return; + } + + bool slackened = false; + SegmentEnd* horizontalStem = NULL; + vector verticals; + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { + if ( _globalEnds[i]->isVertical() ) { + verticals.push_back ( _globalEnds[i] ) ; + } else { + horizontalStem = _globalEnds[i]; + } + } + + if ( horizontalStem ) { + ltrace(200) << "Done nothing, has horizontal stem: " << horizontalStem << endl; + return; + } + + for ( size_t i=0 ; i<_localEnds.size() ; i++ ) { + if ( _localEnds[i]->isVertical() ) + verticals.push_back ( _localEnds[i] ) ; + else + slackened = slackened or _localEnds[i]->isSlackened(); + } + + if ( (verticals.size() == 1) and (verticals[0]->isGlobal()) ) { + ltrace(200) << "Done nothing, has only a vertical stem: " << verticals[0] << endl; + return; + } + + if ( !split ) { + _contact->setVAlignate ( true ); + return; + } + + GCell* gcell = _contact->getGCell (); + Net* net = _contact->getNet (); + const Layer* layer = dynamic_cast(_contact->getLayer())->getBottom(); + if ( _routingGauge->getLayerDirection(layer) != Constant::Horizontal ) + layer = dynamic_cast(_contact->getLayer())->getTop(); + + _contact->setHAlignate ( true ); + AutoContact* splitContact = NULL; + for ( size_t i=1 ; isetHAlignate ( true ); + + ltrace(200) << "| Separate " << verticals[i]->getSegment()->base() + << ":" << verticals[i]->getSegment() << endl; + + verticals[i]->getHook()->detach(); + + splitContact = AutoContact::create ( gcell, net, _contact->getLayer() ); + AutoSegment* segment = AutoHorizontal::create ( _contact + , splitContact + , layer + , y //globalVerticals[i]->getAxis() + , DbU::lambda(2.0) + , AutoSegment::Local + , false + , false + ); + verticals[i]->getHook()->attach ( splitContact->getContact()->getBodyHook() ); + segment->setSlackened ( slackened ); + ltrace(200) << "restoreVConnexity() strap: " << segment << endl; + } + } + + + void JunctionBox::computeAlignate () + { + + bool globalHorizontal = false; + bool globalVertical = false; + size_t horizontals = 0; + size_t verticals = 0; + + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { + if ( _globalEnds[i]->isHorizontal() ) { + globalHorizontal = true; + horizontals++; + } else { + globalVertical = true; + verticals++; + } + } + + for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { + if ( _localEnds[i]->isHorizontal() ) horizontals++; + else verticals++; + } + + if ( !globalVertical && (horizontals > 1) ) + _contact->setHAlignate ( true ); + + if ( !globalHorizontal && (verticals > 1) ) + _contact->setVAlignate ( true ); + + ltrace(109) << "computeAlignate(): [AFTER] " << _contact << endl; + } + + + void JunctionBox::computeGlobalStem () + { + SegmentEnd* globalHorizontal = NULL; + SegmentEnd* globalVertical = NULL; + size_t horizontals = 0; + size_t verticals = 0; + + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { + if ( _globalEnds[i]->isHorizontal() ) { + globalHorizontal = _globalEnds[i]; + horizontals++; + } else { + globalVertical = _globalEnds[i]; + verticals++; + } + } + + for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { + if ( _localEnds[i]->isHorizontal() ) horizontals++; + else verticals++; + } + + ltrace(109) << "computeGlobalStem(): " << _contact << endl; + ltrace(109) << "| h:" << horizontals << " v:" << verticals << endl; + + if ( globalVertical && (horizontals > 1) && !_contact->isHAlignate() ) { + ltrace(109) << "| Vertical GlobalStem h:" << horizontals << " v:" << verticals << endl; + _globalStem = globalVertical; + } + + if ( globalHorizontal && (verticals > 1) && !_contact->isVAlignate() ) { + ltrace(109) << "| Horizontal GlobalStem h:" << horizontals << " v:" << verticals << endl; + _globalStem = globalHorizontal; + } + + + if ( (horizontals > 1) && (verticals > 1) && !_contact->isVAlignate() && !_contact->isHAlignate() ) { + ltrace(109) << "* Bad AutoContact: " << _contact << endl; + + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) + ltrace(109) << "| G: " << _globalEnds[i] << endl; + + for ( size_t i=0 ; i < _localEnds.size() ; i++ ) + ltrace(109) << "| L: " << _localEnds[i] << endl; + } + } + + + void JunctionBox::mergeX ( DbU::Unit x ) + { + if ( _xMin > _xMax ) { _xMin = _xMax = x; return; } + if ( x < _xMin ) { _xMin = x; return; } + if ( x > _xMax ) { _xMax = x; return; } + } + + + void JunctionBox::mergeY ( DbU::Unit y ) + { + if ( _yMin > _yMax ) { _yMin = _yMax = y; return; } + if ( y < _yMin ) { _yMin = y; return; } + if ( y > _yMax ) { _yMax = y; return; } + } + + + void JunctionBox::mergeAnchor () + { + _anchor = _contact->getAnchor (); + if ( !_anchor ) return; + + RoutingPad* rp = dynamic_cast(_anchor); + if ( !rp ) { + _failsafe = true; + return; + } + + _layerStack [ _routingGauge->getLayerDepth(_anchor->getLayer()) ] ++; + _wireCount++; + + Point source = rp->getSourcePosition (); + Point target = rp->getTargetPosition (); + if ( ( source.getX() == target.getX() ) || isHEmpty() ) { + ltrace(109) << "merge() Axis " + << DbU::getLambda(source.getX()) << " [RoutingPad] " + << rp->getLayer() << endl; + mergeX ( source.getX() ); + } + if ( ( source.getY() == target.getY() ) || isVEmpty() ) { + ltrace(109) << "merge() Axis " + << DbU::getLambda(source.getY()) << " [RoutingPad] " + << rp->getLayer() << endl; + mergeY ( source.getY() ); + } + } + + + void JunctionBox::merge ( Hook* hook ) + { + SegmentEnd* segmentEnd = SegmentEnd::create ( hook, _checking ); + if ( !segmentEnd ) return; + + _layerStack [ _routingGauge->getLayerDepth(segmentEnd->getLayer()) ] ++; + _wireCount++; + + if ( segmentEnd->isGlobal() ) { + ltrace(109) << "merge() Axis " + << DbU::getLambda(segmentEnd->getAxis()) + << " [global] " << segmentEnd << endl; + _globalEnds.push_back ( segmentEnd ); + } else { + ltrace(109) << "merge() Axis " << DbU::getLambda(segmentEnd->getAxis()) + << " [local] " << segmentEnd << endl; + _localEnds.push_back ( segmentEnd ); + } + + if ( segmentEnd->isHorizontal() ) mergeY ( segmentEnd->getAxis() ); + else mergeX ( segmentEnd->getAxis() ); + } + + + void JunctionBox::postMerge ( SegmentEnd* segmentEnd ) + { + if ( segmentEnd == _globalStem ) return; + + if ( _globalStem->isHorizontal() xor segmentEnd->isHorizontal() ) + _globalStem->addFork ( segmentEnd ); + else + _globalStem->addAligned ( segmentEnd ); + } + + + void JunctionBox::resizePunctual () + { + Point center; + DbU::Unit delta; + + if ( isEmpty() ) center = _contact->getCenter(); + else if ( isPunctual() ) { + center.setX ( _xMin ); + center.setY ( _yMin ); + } else { + center.setX ( (_xMin+_xMax)/2 ); + center.setY ( (_yMin+_yMax)/2 ); + } + + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { + if ( _globalEnds[i]->isHorizontal() ) + delta = center.getX() - _contact->getX(); + else + delta = center.getY() - _contact->getY(); + _globalEnds[i]->setDelta ( delta ); + } + + for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { + if ( _localEnds[i]->isHorizontal() ) + delta = center.getX() - _contact->getX(); + else + delta = center.getY() - _contact->getY(); + + _localEnds[i]->setDelta ( delta ); + } + + Box constraint = _contact->getConstraintBox()/*.inflate(DbU::lambda(0.5))*/; + if ( !constraint.contains(center) ) + cerr << Bug("%s [%s %s] outside constraint %s." + ,getString(_contact).c_str() + ,DbU::getValueString(center.getX()).c_str() + ,DbU::getValueString(center.getY()).c_str() + ,getString(constraint).c_str()) << endl; + } + + + void JunctionBox::resize () + { + ltrace(99) << "JunctionBox::resize() - " << endl; + + if ( !_wireCount ) { + cerr << Warning("Standalone %s skipped.",getString(_contact).c_str()) << endl; + return; + } + + if ( _failsafe || isPunctual() || !_globalStem ) + resizePunctual (); + else { + // Flat geometry. + DbU::Unit deltaMin; + DbU::Unit deltaMax; + DbU::Unit deltaFork; + + if ( _globalStem->isHorizontal() ) { + deltaMin = _xMin - _contact->getX(); + deltaMax = _xMax - _contact->getX(); + deltaFork = _yMin - _contact->getY(); + } else { + deltaMin = _yMin - _contact->getY(); + deltaMax = _yMax - _contact->getY(); + deltaFork = _xMin - _contact->getX(); + } + + _globalStem->setDelta ( _globalStem->isSourceHook() ? deltaMin : deltaMax ); + + vector* forks = _globalStem->getForks(); + vector* aligneds = _globalStem->getAligneds(); + + for ( size_t i=0 ; i < aligneds->size() ; i++ ) + (*aligneds)[i]->setDelta ( (*aligneds)[i]->isSourceHook() ? deltaMax : deltaMin ); + + for ( size_t i=0 ; i < forks->size() ; i++ ) + (*forks)[i]->setDelta ( deltaFork ); + } + } + + + void JunctionBox::split () + { + ltrace(200) << "JunctionBox::split() - " << _contact << endl; + + size_t zMin, zMax; + size_t anchorDepth = 0; + getZSpan ( zMin, zMax ); + + if ( _anchor ) { + ltrace(200) << "Anchor: " << _anchor << endl; + + anchorDepth = _routingGauge->getLayerDepth(_anchor->getLayer()); + if ( anchorDepth == 0 ) { + if ( zMax-zMin < 2 ) return; + splitTerminal (); + _contact->split (); + return; + } + } + + ltracein(200); + ltrace(200) << "Z span: [" << zMin << ":" << zMax << "]" << endl; + ltrace(200) << "Global Stem: " << _globalStem << endl; + + if ( zMax-zMin > 3 ) { + cerr << Error("AutoContact::split(): Spans on more than 4 layers, ignoring." + "\n %s",getString(_contact).c_str()) << endl; + ltraceout(200); + return; + } + + _contact->invalidate (); + + if ( zMax-zMin < 2 ) { + const Layer* contactLayer = _routingGauge->getContactLayer(zMin); + _contact->setLayer ( contactLayer ); + ltrace(200) << "Needs only to change Layer." << endl; + ltraceout(200); + return; + } + + // The complete case. + bool hExtended = isHExtended(); + bool vExtended = isVExtended(); + bool xFound = false; + bool yFound = false; + vector hBottom; + vector vBottom; + vector hTop; + vector vTop; + Point position; + + for ( size_t i=0; i < _globalEnds.size() ; i++ ) { + ltrace(200) << "| G: " << _globalEnds[i] << endl; + if ( _globalEnds[i]->isHorizontal() ) { + if ( not yFound ) { + yFound = true; + position.setY ( _globalEnds[i]->getAxis() ); + } + if ( _routingGauge->getLayerDepth(_globalEnds[i]->getLayer()) < zMin+2 ) + hBottom.push_back ( _globalEnds[i] ); + else + hTop.push_back ( _globalEnds[i] ); + } else { + if ( not xFound ) { + xFound = true; + position.setX ( _globalEnds[i]->getAxis() ); + } + if ( _routingGauge->getLayerDepth(_globalEnds[i]->getLayer()) < zMin+2 ) + vBottom.push_back ( _globalEnds[i] ); + else + vTop.push_back ( _globalEnds[i] ); + } + } + + for ( size_t i=0; i < _localEnds.size() ; i++ ) { + ltrace(200) << "| L: " << _localEnds[i] << endl; + if ( _localEnds[i]->isHorizontal() ) { + if ( not yFound ) { + yFound = true; + position.setY ( _localEnds[i]->getAxis() ); + } + if ( _routingGauge->getLayerDepth(_localEnds[i]->getLayer()) < zMin+2 ) + hBottom.push_back ( _localEnds[i] ); + else + hTop.push_back ( _localEnds[i] ); + } else { + if ( not xFound ) { + xFound = true; + position.setX ( _localEnds[i]->getAxis() ); + } + if ( _routingGauge->getLayerDepth(_localEnds[i]->getLayer()) < zMin+2 ) + vBottom.push_back ( _localEnds[i] ); + else + vTop.push_back ( _localEnds[i] ); + } + } + + if ( not xFound ) position.setX ( _xMin ); + if ( not yFound ) position.setY ( _yMin ); + + for ( size_t i=0 ; igetHook()->detach (); + for ( size_t i=0 ; igetHook()->detach (); + + AutoContact* corner = AutoContact::create ( _contact->getGCell() + , _contact->getNet() + , _routingGauge->getContactLayer(zMin+1) + ); + ltrace(200) << "Corner " << corner << endl; + + AutoSegment* segment = AutoSegment::create ( _contact + , corner + , _routingGauge->getLayerDirection(zMin+1) + , AutoSegment::Local + ); + DbU::Unit axis = (segment->isHorizontal()) ? position.getY() : position.getX(); + segment->setLayer ( _routingGauge->getRoutingLayer(zMin+1) ); + segment->setAxis ( axis ); + segment->setSlackened ( true ); + segment->setLayerChange ( true ); + ltrace(200) << "Corner @" << DbU::getValueString(axis) << " " << segment << endl; + + if ( vExtended ) _contact->setVAlignate ( true ); + if ( hExtended ) _contact->setHAlignate ( true ); + + AutoContact* secondary = NULL; + if ( zMax-zMin == 3 ) { + secondary = AutoContact::create ( _contact->getGCell() + , _contact->getNet() + , _routingGauge->getContactLayer(zMin+2) + ); + ltrace(200) << "Secondary " << secondary << endl; + + segment = AutoSegment::create ( corner + , secondary + , _routingGauge->getLayerDirection(zMin+2) + , AutoSegment::Local + ); + axis = (segment->isHorizontal()) ? position.getY() : position.getX(); + segment->setLayer ( _routingGauge->getRoutingLayer(zMin+2) ); + segment->setAxis ( axis ); + segment->setCanonical ( true ); + segment->setSlackened ( true ); + segment->setLayerChange ( true ); + ltrace(200) << "Secondary @" << DbU::getValueString(axis) << " " << segment << endl; + } else + secondary = corner; + + for ( size_t i=0 ; igetHook()->attach ( secondary->getBodyHook() ); + for ( size_t i=0 ; igetHook()->attach ( secondary->getBodyHook() ); + + if ( _contact->isVAlignate() ) secondary->setVAlignate(true); + if ( _contact->isHAlignate() ) secondary->setHAlignate(true); + + if ( hExtended ) { + ltrace(200) << "Original was H extended: restore V connexity." << endl; + _contact ->restoreVConnexity ( position.getY(), true ); + secondary->restoreVConnexity ( position.getY(), true ); + } + + if ( vExtended ) { + ltrace(200) << "Original was V extended: restore H connexity." << endl; + _contact ->restoreHConnexity ( position.getX(), true ); + secondary->restoreHConnexity ( position.getX(), true ); + } + + ltraceout(200); + } + + + void JunctionBox::splitTerminal () + { + ltrace(200) << "JunctionBox::splitTerminal(): AutoSegment connected to RoutingPad." << endl; + ltracein(200); + Point position = _contact->getPosition (); + + _contact->getAnchorHook()->detach (); + + RoutingPad* routingPad = dynamic_cast ( _anchor ); + if ( !routingPad ) { + cerr << Bug("JunctionBox::splitTerminal(): %s is not anchored on a ." + ,getString(_contact).c_str()) << endl; + ltraceout(200); + return; + } + + AutoContact* rpContact = AutoContact::fromRp ( _contact->getGCell() + , routingPad + , _routingGauge->getContactLayer(0) + , position + , DbU::lambda(1.0), DbU::lambda(1.0) + ); + AutoContact* via23 = AutoContact::create ( _contact->getGCell() + , _contact->getNet() + , _routingGauge->getContactLayer(1) + ); + + AutoSegment* segment = AutoSegment::create ( rpContact + , via23 + , Constant::Horizontal + , AutoSegment::Local + , true // terminal. + , false // Temporary: *not* collapsed. + ); + segment->setLayer ( _routingGauge->getRoutingLayer(1) ); + segment->setAxis ( position.getY() ); + ltrace(200) << "@" << DbU::getValueString(position.getY()) << segment << endl; + + segment = AutoSegment::create ( via23 + , _contact + , Constant::Vertical + , AutoSegment::Local + , false // terminal. + , false //true // collapsed. + ); + segment->setAxis ( position.getX() ); + segment->setLayer ( _routingGauge->getRoutingLayer(2) ); + _contact->setLayer ( _routingGauge->getContactLayer(1) ); + ltrace(200) << "@" << DbU::getValueString(position.getX()) << segment << endl; + + ltraceout(200); + } + + + void JunctionBox::breakUpPunctual () + { + Component* anchor = _contact->getAnchor(); + Point center; + StackedContact* stackedContact; + + if ( isEmpty() ) center = _contact->getCenter(); + else if ( isPunctual() ) { + center.setX ( _xMin ); + center.setY ( _yMin ); + } else { + center.setX ( (_xMin+_xMax)/2 ); + center.setY ( (_yMin+_yMax)/2 ); + } + + const Layer* layer = NULL; + if ( !_localEnds.empty () ) layer = _localEnds [0]->getLayer(); + else if ( !_globalEnds.empty() ) layer = _globalEnds[0]->getLayer(); + else if ( anchor ) layer = anchor->getLayer (); + + stackedContact = StackedContact::create ( _contact->getNet() + , layer + , center.getX() + , center.getY() + ); + + if ( anchor ) stackedContact->setAnchor ( anchor ); + + for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) + stackedContact->attachSlave ( _globalEnds[i] ); + + for ( size_t i=0 ; i < _localEnds.size() ; i++ ) + stackedContact->attachSlave ( _localEnds[i] ); + + stackedContact->breakUp (); + stackedContact->destroy (); + ltrace(99) << "JunctionBox::breakUpPunctual() succeded" << endl; + } + + + void JunctionBox::breakUp () + { + ltrace(99) << "JunctionBox::breakUp() - " << endl; + + if ( !_wireCount ) { + cerr << Warning("Standalone %s skipped.",getString(_contact).c_str()) << endl; + return; + } + + if ( _failsafe or isPunctual() ) + breakUpPunctual (); + else { + if ( not _globalStem ) { + cerr << Bug ( "JunctionBox::breakUp(): Flatten geometry whitout global stem,\n" + " on %p:%s." + , _contact->base() + , getString(_contact).c_str() + ) << endl; + breakUpPunctual (); + } else { + // Flat geometry. + vector stackedContacts; + + _globalStem->split ( stackedContacts ); + for ( size_t i=0 ; i < stackedContacts.size() ; i++ ) { + stackedContacts[i]->breakUp (); + stackedContacts[i]->destroy (); + } + } + } + ltrace(99) << "JunctionBox::breakUp() succeded" << endl; + } + + + void JunctionBox::updateContacts ( VirtualContacts& vcs ) + { + ltrace(109) << "JunctionBox::updateContacts()" << endl; + ltracein(109); + + vcs.clear (); + + Component* anchor = _contact->getAnchor (); + RoutingPad* rp = dynamic_cast(anchor); + if ( rp ) + vcs.merge ( Point(_xMin,_yMin), rp->getLayer() ); + + vector::iterator it = _localEnds.begin(); + for ( ; it != _localEnds.end() ; it++ ) + vcs.merge ( (*it)->getEnd(), (*it)->getLayer() ); + + for ( it = _globalEnds.begin() ; it != _globalEnds.end() ; it++ ) + vcs.merge ( (*it)->getEnd(), (*it)->getLayer() ); + + ltraceout(109); + } + + + StackedContact::~StackedContact () + { + ltrace(99) << "StackedContact::~StackedContact() - " << (void*)this << endl; + } + + + StackedContact::StackedContact ( Net* net, const Layer* layer, DbU::Unit x, DbU::Unit y ) + : Contact(net,layer,x,y) + , _useds(Session::getRoutingGauge()->getDepth()) + , _anchor(NULL) + { + for ( unsigned index = 0 ; index < Session::getRoutingGauge()->getDepth() ; index++ ) + _useds [ index ] = false; + + forEach ( BasicLayer*, basicLayer, getLayer()->getBasicLayers() ) + addLayer ( *basicLayer ); + } + + + StackedContact* StackedContact::create ( Net* net, const Layer* layer, DbU::Unit x, DbU::Unit y ) + { + StackedContact* contact = new StackedContact ( net, layer, x, y ); + contact->_postCreate (); + + ltrace(99) << "create: " << contact << endl; + + return contact; + } + + + void StackedContact::addLayer ( const Layer* layer ) + { + if ( !Session::getTechnology()->isMetal(layer) ) return; + + unsigned int index = Session::getRoutingGauge()->getLayerDepth ( layer ); + if ( index == UINT_MAX ) return; + + ltrace(99) << "StackedContact::addLayer() - " << layer << " [" << index << "]" << endl; + + _useds [ index ] = true; + } + + + void StackedContact::setAnchor ( Component* anchor ) + { + if ( (_anchor=anchor) ) { + forEach ( BasicLayer*, layer, _anchor->getLayer()->getBasicLayers() ) + addLayer ( *layer ); + } + } + + + void StackedContact::attachSlave ( SegmentEnd* segmentEnd ) + { + ltrace(88) << "add at " << getCenter() << " " << segmentEnd->getLayer() << endl; + + addLayer ( segmentEnd->getLayer() ); + + segmentEnd->setDelta ( 0 ); + + Hook* hook = segmentEnd->getHook(); + hook->detach (); + hook->attach ( getBodyHook() ); + } + + + void StackedContact::breakUp () + { + ltrace(99) << "StakedContact::breakUp() - " << this << endl; + + unsigned int zMin = 0; + unsigned int zMax = Session::getRoutingGauge()->getDepth() - 1; + Contact* contacts [ zMax+1 ]; + + for ( unsigned int i=0 ; i <= zMax ; i++ ) contacts[i] = NULL; + + for ( ; (zMin <= zMax) && !_useds[zMin] ; zMin++ ); + for ( ; (zMax > 0 ) && !_useds[zMax] ; zMax-- ); + + ltrace(99) << "Contact depth span [" << zMin << ":" << zMax << "]" << endl; + + if ( zMin > zMax ) return; + if ( zMin == zMax ) { + if ( _anchor ) + contacts[zMin] = Contact::create ( _anchor + , Session::getRoutingGauge()->getRoutingLayer(zMin) + , getX() - _anchor->getX() + , getY() - _anchor->getY() + , DbU::lambda(1.0), DbU::lambda(1.0) + ); + else + contacts[zMin] = Contact::create ( getNet() + , Session::getRoutingGauge()->getRoutingLayer(zMin) + , getX() + , getY() + , DbU::lambda(1.0), DbU::lambda(1.0) + ); + ltrace(88) << "Creating [" << zMin << "] " << contacts[zMin] << endl; + } else { + if ( _anchor ) + contacts[zMin] = contacts[zMin+1] + = Contact::create ( _anchor + , Session::getRoutingGauge()->getContactLayer(zMin) + , getX() - _anchor->getX() + , getY() - _anchor->getY() + , DbU::lambda(1.0), DbU::lambda(1.0) + ); + else + contacts[zMin] = contacts[zMin+1] + = Contact::create ( getNet() + , Session::getRoutingGauge()->getContactLayer(zMin) + , getX() + , getY() + , DbU::lambda(1.0), DbU::lambda(1.0) + ); + ltrace(88) << "Creating [" << zMin << "] " << contacts[zMin] << endl; + + for ( unsigned int j = zMin+1 ; j < zMax ; j++ ) { + contacts[j] = contacts[j+1] + = Contact::create ( contacts[j-1] + , Session::getRoutingGauge()->getContactLayer(j) + , 0 + , 0 + , DbU::lambda(1.0), DbU::lambda(1.0) + ); + ltrace(88) << "Creating [" << j << "] " << contacts[j] << endl; + } + } + + Hook* bodyHook = getBodyHook (); + Hook* currHook = bodyHook->getNextHook (); + + while ( currHook != bodyHook ) { + Hook* nextHook = currHook->getNextHook (); + + currHook->_setNextHook ( currHook ); + Segment* segment = dynamic_cast(currHook->getComponent()); + ltrace(88) << "Reattach [" << Session::getRoutingGauge()->getLayerDepth(segment->getLayer()) + << "] " << segment << endl; + currHook->attach ( contacts[Session::getRoutingGauge()->getLayerDepth(segment->getLayer())]->getBodyHook() ); + + currHook = nextHook; + } + + bodyHook->_setNextHook ( bodyHook ); + ltrace(99) << "StakedContact::breakUp() succeeded" << endl; + } + + +// ------------------------------------------------------------------- +// Class : "::FixedJunctionBox". + + + class FixedJunctionBox { + + public: + // Constructor & Destructor. + FixedJunctionBox ( AutoContact*, bool checking ); + ~FixedJunctionBox (); + // Modifiers. + void checkTopology (); + void merge ( Hook* ); + void resize (); + void breakUp (); + + protected: + // Attributes. + AutoContact* _contact; + vector _segmentEnds; + bool _checking; + }; + + + FixedJunctionBox::FixedJunctionBox ( AutoContact* contact, bool checking ) + : _contact(contact) + , _segmentEnds() + , _checking(checking) + { + ltrace(110) << "FixedJunctionBox() " << contact << endl; + ltracein(109); + + forEach ( Hook*, hook, _contact->getBodyHook()->getSlaveHooks() ) merge ( *hook ); + + ltraceout(109); + } + + + FixedJunctionBox::~FixedJunctionBox () + { + for ( size_t i=0 ; i<_segmentEnds.size() ; i++ ) delete _segmentEnds[i]; + } + + + void FixedJunctionBox::checkTopology () + { } + + + void FixedJunctionBox::merge ( Hook* hook ) + { + SegmentEnd* segmentEnd = SegmentEnd::create ( hook, _checking ); + if ( !segmentEnd ) return; + + ltrace(109) << "merge() Axis " + << DbU::getLambda(segmentEnd->getAxis()) + << " [global] " << segmentEnd << endl; + _segmentEnds.push_back ( segmentEnd ); + } + + + void FixedJunctionBox::resize () + { + for ( size_t i=0 ; i<_segmentEnds.size() ; i++ ) _segmentEnds[i]->setDelta(0); + } + + + void FixedJunctionBox::breakUp () + { + Component* anchor = _contact->getAnchor(); + StackedContact* stackedContact; + + const Layer* layer = NULL; + if ( !_segmentEnds.empty () ) layer = _segmentEnds[0]->getLayer(); + else if ( anchor ) layer = anchor->getLayer (); + + stackedContact = StackedContact::create ( _contact->getNet() + , layer + , _contact->getX() + , _contact->getY() + ); + + if ( anchor ) stackedContact->setAnchor ( anchor ); + + for ( size_t i=0 ; i < _segmentEnds.size() ; i++ ) + stackedContact->attachSlave ( _segmentEnds[i] ); + + stackedContact->breakUp (); + stackedContact->destroy (); + ltrace(99) << "FixedJunctionBox::breakUp() succeded" << endl; + } + + +} // End of local namespace. + + + + +namespace Katabatic { + + +// ------------------------------------------------------------------- +// Class : "Katabatic::VirtualContacts::VC". + + + bool operator== ( const VirtualContacts::VC& lhs + , const VirtualContacts::VC& rhs ) + { + return lhs._point == rhs._point; + } + + + void VirtualContacts::VC::merge ( const Layer* layer ) + { + if ( _layer->contains(layer) ) return; + Layer *newLayer = Session::getTechnology()->getLayer ( _layer->getMask() & layer->getMask() ); + + if ( !newLayer ) return; + _layer = newLayer; + } + + + void VirtualContacts::merge ( const Point& point, const Layer* layer ) + { + VC vc ( point, layer ); + + ltrace(109) << "VirtualContacts::merge() " << point << " " << layer << endl; + + vector::iterator it = _vcs.begin(); + vector::iterator end = _vcs.end(); + + for ( ; it != end ; it++ ) { + if ( *it == vc ) { (*it).merge ( layer ); return; } + } + + _vcs.push_back ( vc ); + _boundingBox.merge ( Box(point).inflate(DbU::lambda(1.0)) ); + } + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoContact". + + + size_t AutoContact::_maxId = 0; + size_t AutoContact::_allocateds = 0; + const Name AutoContact::_goName = "Katabatic::AutoContact"; + + + AutoContact* AutoContact::fromRp ( GCell* gcell + , RoutingPad* routingPad + , const Layer* layer + , Point point + , DbU::Unit width + , DbU::Unit height + , bool fixed + ) + { + routingPad->getBodyHook()->detach (); + + DbU::Unit x = 0; + DbU::Unit y = 0; + Entity* entity = routingPad->getOccurrence().getEntity(); + + // Assumes there is no rotation in the Transformation. + if ( dynamic_cast(entity) ) { x = point.getX(); } + else if ( dynamic_cast(entity) ) { y = point.getY(); } + + return AutoContact::create ( gcell + , routingPad + , layer + , x, y + , width, height + , false, false + , fixed + ); + } + + + AutoContact::AutoContact ( GCell* gcell + , Contact* contact + , bool hAlignate + , bool vAlignate + ) + : ExtensionGo (contact->getCell()) + , _id (_maxId++) + , _contact (contact) + , _gcell (gcell) + , _invalid (false) + , _invalidTopology(true) + , _isTerminal (false) + , _fixed (false) + , _hAlignate (hAlignate) + , _vAlignate (vAlignate) + , _isCorner (false) + , _dxMin (0) + , _dxMax (_gcell->getXMax()-_gcell->getX()) + , _dyMin (0) + , _dyMax (_gcell->getYMax()-_gcell->getY()) + , _subContacts () + { + _allocateds++; + _gcell->addContact ( this ); + } + + + void AutoContact::_postCreate () + { + ExtensionGo::_postCreate (); + + restoreNativeConstraintBox (); + + ltrace(90) << "Native CBox: " << this + << " <" << DbU::getLambda(getCBXMin()) + << " " << DbU::getLambda(getCBYMin()) + << " " << DbU::getLambda(getCBXMax()) + << " " << DbU::getLambda(getCBYMax()) << ">" << endl; + + Session::link ( this ); + invalidate (); + + ltrace(90) << "AutoContact::_postCreate() - " << this << " in " << _gcell << endl; + } + + + void AutoContact::_preDestroy () + { + DebugSession::open ( _contact->getNet() ); + + ltrace(90) << "AutoContact::_preDestroy() - " << endl; + + if ( not _contact->getSlaveComponents().isEmpty() ) { + cerr << Error("Base contact still have slaves components, cancelled.\n" + " (%s)" + ,_getString().c_str()) << endl; + DebugSession::close (); + return; + } + + if ( not Session::doDestroyTool() ) { + _gcell->removeContact ( this ); + Session::unlink ( this ); + } + + ExtensionGo::_preDestroy (); + if ( Session::doDestroyBaseContact() ) + _contact->destroy (); + + DebugSession::close (); + } + + + AutoContact::~AutoContact () + { + _allocateds--; + } + + + AutoContact* AutoContact::create ( GCell* gcell + , Net* net + , const Layer* layer + , bool hAlignate + , bool vAlignate + ) + { + Contact* contact = Contact::create ( net + , layer + , gcell->getCenter().getX() + , gcell->getCenter().getY() + , DbU::lambda(2.0) + , DbU::lambda(2.0) + ); + AutoContact* autoContact = new AutoContact ( gcell, contact, hAlignate, vAlignate ); + + autoContact->_postCreate (); + + ltrace(90) << "create(net*) " << autoContact << endl; + return autoContact; + } + + + AutoContact* AutoContact::create ( GCell* gcell + , RoutingPad* rp + , const Layer* layer + , const DbU::Unit dx + , const DbU::Unit dy + , const DbU::Unit width + , const DbU::Unit height + , bool hAlignate + , bool vAlignate + , bool fixed + ) + { + Contact* contact = Contact::create ( rp + , layer + , dx /*- rp->getX()*/ + , dy /*- rp->getY()*/ + , width + , height + ); + AutoContact* autoContact = new AutoContact ( gcell, contact, hAlignate, vAlignate ); + + autoContact->setFixed ( fixed ); + autoContact->setTerminal ( true ); + autoContact->_postCreate (); + + ltrace(90) << "create(RoutingPad*) " << autoContact << endl; + return autoContact; + } + + + bool AutoContact::canDestroy ( bool error ) const + { + if ( not _contact->getSlaveComponents().isEmpty() ) { + if ( error ) { + cerr << Error("Base contact still have slaves components, cancelled.\n" + " (%s)" + ,_getString().c_str()) << endl; + } + return false; + } + return true; + } + + + size_t AutoContact::getSegmentEndAllocateds () + { + return SegmentEnd::getAllocateds(); + } + + + size_t AutoContact::getAllocateds () + { + return _allocateds; + } + + + const Name& AutoContact::getStaticName () + { + return _goName; + } + + + const Name& AutoContact::getName () const + { + return _goName; + } + + + unsigned int AutoContact::getMinDepth () const + { + unsigned int minDepth = (unsigned int)-1; + Component* anchor = getAnchor (); + if ( anchor ) { + minDepth = min ( minDepth, Session::getRoutingGauge()->getLayerDepth(anchor->getLayer()) ); + //ltrace(200) << "Anchor:" << anchor << endl; + } + + forEach ( Component*, icomponent, getSlaveComponents() ) { + minDepth = min ( minDepth, Session::getRoutingGauge()->getLayerDepth(icomponent->getLayer()) ); + //ltrace(200) << "Slave:" << *icomponent << endl; + } + + return minDepth; + } + + + void AutoContact::getLengths ( DbU::Unit* lengths, set& processeds ) + { + forEach ( Hook*, ihook, getBodyHook()->getSlaveHooks() ) { + bool isSourceHook = (dynamic_cast(*ihook)); + if ( !isSourceHook && ( dynamic_cast(*ihook) == NULL ) ) { + cerr << Error ( badHookType, getString(ihook->getComponent()).c_str() ) << endl; + return; + } + + bool isHorizontal = true; + Segment* segment = dynamic_cast((*ihook)->getComponent()); + if ( !segment ) { + isHorizontal = false; + segment = dynamic_cast((*ihook)->getComponent()); + if ( !segment ) + continue; + } + + AutoSegment* autoSegment = Session::lookup ( segment ); + if ( not autoSegment or processeds.find(autoSegment) != processeds.end() ) + continue; + processeds.insert ( autoSegment ); + + size_t depth = Session::getRoutingGauge()->getLayerDepth(segment->getLayer()); + DbU::Unit length; + if ( autoSegment->isLocal() ) { + length = segment->getLength(); + lengths[depth] += length; + if ( abs(length) >= DbU::lambda(50.0) ) + cerr << Error("Supicious length:%.2f of %s." + ,DbU::getLambda(length),getString(autoSegment).c_str()) << endl; + } else { + if ( isHorizontal ) { + if ( isSourceHook ) + lengths[depth] += _gcell->getBoundingBox().getXMax() - segment->getSourceX(); + else + lengths[depth] += segment->getTargetX() - _gcell->getBoundingBox().getXMin(); + } else { + if ( isSourceHook ) + lengths[depth] += _gcell->getBoundingBox().getYMax() - segment->getSourceY(); + else + lengths[depth] += segment->getTargetY() - _gcell->getBoundingBox().getYMin(); + } + } + } + } + + + Box AutoContact::getNativeConstraintBox () const + { + //if ( _fixed ) return Box(getCenter()); + + Component* component = getAnchor(); + if ( !component ) return _gcell->getBoundingBox (); + + DbU::Unit xMin; + DbU::Unit xMax; + DbU::Unit yMin; + DbU::Unit yMax; + Vertical* vertical; + Horizontal* horizontal; + RoutingPad* routingPad; + + if ( (horizontal = dynamic_cast(component))) { + xMin = horizontal->getSourcePosition().getX(); + xMax = horizontal->getTargetPosition().getX(); + yMin = yMax + = horizontal->getTargetPosition().getY(); + } else if ( (vertical = dynamic_cast(component)) ) { + yMin = vertical->getSourcePosition().getY(); + yMax = vertical->getTargetPosition().getY(); + xMin = xMax + = vertical->getTargetPosition().getX(); + } else if ( (routingPad = dynamic_cast(component)) ) { + Entity* entity = routingPad->getOccurrence().getEntity(); + + // Assumes there is no rotation in the Transformation. + if ( dynamic_cast(entity) ) { + xMin = routingPad->getSourcePosition().getX(); + xMax = routingPad->getTargetPosition().getX(); + yMin = yMax + = routingPad->getTargetPosition().getY(); + } else if ( dynamic_cast(entity) ) { + yMin = routingPad->getSourcePosition().getY(); + yMax = routingPad->getTargetPosition().getY(); + xMin = xMax + = routingPad->getTargetPosition().getX(); + } else { + xMin = xMax = routingPad->getPosition().getX(); + yMin = yMax = routingPad->getPosition().getY(); + } + } else { + xMin = xMax = component->getPosition().getX(); + yMin = yMax = component->getPosition().getY(); + } + + order ( xMin, xMax ); + order ( yMin, yMax ); + + return Box ( xMin, yMin, xMax, yMax ); + } + + + Interval AutoContact::getUConstraints ( unsigned int direction ) const + { + if ( direction == Constant::Horizontal ) { + return Interval ( getCBYMin(), getCBYMax() ); + } + return Interval ( getCBXMin(), getCBXMax() ); + } + + + AutoContacts AutoContact::getCollapseds ( unsigned int direction ) + { + return AutoContacts_Collapsed ( this, direction ); + } + + + void AutoContact::invalidate () + { + if ( !isInvalidated() ) { + ltrace(110) << "AutoContact::invalidate() - " << this << endl; + setInvalidated ( true ); + Session::invalidate ( this ); + getGCell()->invalidate (); + } + } + + + void AutoContact::revalidate () + { + updateGeometry (); + if ( _invalidTopology ) + revalidateTopology (); + } + + + void AutoContact::updateGeometry () + { + DebugSession::open ( getNet(), 80 ); + + ltrace(110) << "AutoContact::updateGeometry() " << this << endl; + ltracein(110); + + _contact->invalidate ( false ); + setInvalidated ( false ); + + if ( isFixed() ) { + FixedJunctionBox junctionBox ( this, false ); + junctionBox.resize (); + } else { + JunctionBox junctionBox ( this, false ); + junctionBox.resize (); + junctionBox.updateContacts ( _subContacts ); + } +#if defined(CHECK_DATABASE) + checkTopology(); +#endif + + ltraceout(110); + + DebugSession::close (); + } + + + void AutoContact::setGCell ( GCell* gcell ) + { + invalidate (); + if ( _gcell ) _gcell->removeContact ( this ); + + _gcell = gcell; + if ( _gcell ) { + _gcell->addContact ( this ); + _contact->setPosition ( _gcell->getCenter() ); + _dxMin = 0; + _dyMin = 0; + _dxMax = _gcell->getXMax()-_gcell->getX(); + _dyMax = _gcell->getYMax()-_gcell->getY(); + } else { + cerr << Bug("NULL GCell for %p:%s.",_contact,_getString().c_str()) << endl; + } + } + + + void AutoContact::breakUp () + { + if ( isFixed() ) { + FixedJunctionBox(this,false).breakUp(); + } else { + JunctionBox(this,false).breakUp(); + } + ltrace(110) << "AutoContact::breakUp() succeded" << endl; + } + + + void AutoContact::split () + { + DebugSession::open ( getNet() ); + JunctionBox(this,false).split(); + DebugSession::close (); + } + + + void AutoContact::checkTopology () + { + ltrace(110) << "checkTopology() " << this << endl; + + if ( isFixed() ) { + FixedJunctionBox(this,true).checkTopology(); + } else { + JunctionBox(this,true).checkTopology(); + } + } + + + void AutoContact::revalidateTopology () + { + ltrace(110) << "revalidateTopology() " << this << endl; + + JunctionBox(this,true).revalidateTopology(); + } + + + bool AutoContact::isAlignate ( unsigned int direction ) const + { + return (_hAlignate && (direction == Constant::Horizontal)) + || (_vAlignate && (direction == Constant::Vertical )); + } + + + bool AutoContact::isHExtended () + { return JunctionBox(this,true).isHExtended(); } + + + bool AutoContact::isVExtended () + { return JunctionBox(this,true).isVExtended(); } + + + void AutoContact::computeAlignate () + { + if ( !isFixed() ) + JunctionBox(this,true).computeAlignate(); + } + + + bool AutoContact::canGoOutsideGCell ( const AutoSegment* segment ) + { return JunctionBox(this,true).canGoOutside(segment); } + + + bool AutoContact::canHDesalignate () + { return JunctionBox(this,true).canHDesalignate(); } + + + bool AutoContact::canVDesalignate () + { return JunctionBox(this,true).canVDesalignate(); } + + + bool AutoContact::hDesalignate () + { + bool desalignate = JunctionBox(this,true).canHDesalignate(); + + if ( desalignate ) setHAlignate ( false ); + return desalignate; + } + + + bool AutoContact::vDesalignate () + { + bool desalignate = JunctionBox(this,true).canVDesalignate(); + + if ( desalignate ) setVAlignate ( false ); + return desalignate; + } + + + void AutoContact::restoreHConnexity ( DbU::Unit x, bool split ) + { JunctionBox(this,true).restoreHConnexity ( x, split ); } + + + void AutoContact::restoreVConnexity ( DbU::Unit y, bool split ) + { JunctionBox(this,true).restoreVConnexity ( y, split ); } + + + bool AutoContact::canMoveUp ( AutoSegment* moved ) const + { + ltrace(200) << "AutoContact::canMoveUp() " << this << endl; + size_t viaDepth = 100; + + RoutingGauge* rg = Session::getRoutingGauge(); + size_t movedDepth = rg->getLayerDepth(moved->getLayer()); + + Component* anchor = getAnchor (); + if ( anchor ) { + viaDepth = rg->getLayerDepth(anchor->getLayer()); + ltrace(200) << "| Anchor depth: " << viaDepth << endl; + } + + forEach ( Segment*, isegment, _contact->getSlaveComponents().getSubSet() ) { + if ( *isegment == moved->base() ) continue; + + size_t depth = rg->getLayerDepth(isegment->getLayer()); + if ( viaDepth == 100 ) viaDepth = depth; + else + if ( viaDepth != depth ) return false; + + ltrace(200) << "| Segment depth: " << depth << endl; + } + + return ( movedDepth+1 == viaDepth ); + } + + + void AutoContact::setConstraintBox ( const Box& box ) + { + setCBXMin ( box.getXMin() ); + setCBXMax ( box.getXMax() ); + setCBYMin ( box.getYMin() ); + setCBYMax ( box.getYMax() ); + ltrace(110) << "setConstraintBox() - " << this << " " << getConstraintBox() << endl; + ltrace(110) << "* " << _gcell << endl; + } + + + void AutoContact::restrictConstraintBox ( DbU::Unit constraintMin + , DbU::Unit constraintMax + , unsigned int direction ) + { + if ( direction & Constant::Horizontal ) { + if ( (constraintMin > getCBYMax()) || (constraintMax < getCBYMin()) ) { + if ( Session::getDemoMode() ) return; + + cerr << Error ( "Incompatible DY restriction on %s", _getString().c_str() ) << endl; + if ( constraintMin > getCBYMax() ) + cerr << Error ( "(constraintMin > CBYMax : %lf > %lf)" + , DbU::getLambda(constraintMin) + , DbU::getLambda(getCBYMax()) ) + << endl; + if ( constraintMax < getCBYMin() ) + cerr << Error ( "(constraintMax < CBYMin : %lf < %lf)" + , DbU::getLambda(constraintMax) + , DbU::getLambda(getCBYMin()) ) + << endl; + return; + } + setCBYMin ( max(getCBYMin(),constraintMin) ); + setCBYMax ( min(getCBYMax(),constraintMax) ); + } else if ( direction & Constant::Vertical ) { + if ( (constraintMin > getCBXMax()) || (constraintMax < getCBXMin()) ) { + if ( Session::getDemoMode() ) return; + + cerr << Error ( "Incompatible DX restriction on %s", _getString().c_str() ) << endl; + if ( constraintMin > getCBXMax() ) + cerr << Error ( "(constraintMin > CBXMax : %lf > %lf)" + , DbU::getLambda(constraintMin) + , DbU::getLambda(getCBXMax()) ) + << endl; + if ( constraintMax < getCBXMin() ) + cerr << Error ( "(constraintMax < CBXMin : %lf < %lf)" + , DbU::getLambda(constraintMax) + , DbU::getLambda(getCBXMin()) ) + << endl; + return; + } + setCBXMin ( max(getCBXMin(),constraintMin) ); + setCBXMax ( min(getCBXMax(),constraintMax) ); + } + ltrace(110) << "restrictConstraintBox() - " << this << " " << getConstraintBox() << endl; + } + + + void AutoContact::restoreNativeConstraintBox () + { + setConstraintBox ( getNativeConstraintBox() ); + } + + + Box& AutoContact::intersectConstraintBox ( Box& box ) const + { + return box = box.getIntersection ( getConstraintBox() ); + } + + + Box AutoContact::getBoundingBox () const + { + return _gcell->getBoundingBox (); + } + + + void AutoContact::translate ( const DbU::Unit& tx, const DbU::Unit& ty ) + { + cerr << Warning("Calling AutoContact::translate() is likely a bug.") << endl; + _contact->translate ( tx, ty ); + } + + + string AutoContact::_getString () const + { + string s = _contact->_getString(); + s.insert ( 1, "id: " ); + s.insert ( 4, getString(_id) ); + s.insert ( s.size()-1, (_fixed )?" F":" -" ); + s.insert ( s.size()-1, (_isTerminal)? "t": "-" ); + s.insert ( s.size()-1, (_hAlignate) ? "h": "-" ); + s.insert ( s.size()-1, (_vAlignate) ? "v": "-" ); + s.insert ( s.size()-1, (_invalid) ? "i": "-" ); + + // Point p = _contact->getCenter(); + // s.insert ( s.size()-1, " [" ); + // s.insert ( s.size()-1, DbU::getValueString(p.getX()) ); + // s.insert ( s.size()-1, ":" ); + // s.insert ( s.size()-1, DbU::getValueString(p.getY()) ); + // s.insert ( s.size()-1, "]" ); + return s; + } + + + Record* AutoContact::_getRecord () const + { + Record* record = _contact->_getRecord (); + record->add ( getSlot ( "_gcell" , _gcell ) ); + record->add ( getSlot ( "_constraintBox", getConstraintBox() ) ); + record->add ( getSlot ( "_fixed" , _fixed ) ); + record->add ( getSlot ( "_isTerminal" , _isTerminal ) ); + record->add ( getSlot ( "_hAlignate" , _hAlignate ) ); + record->add ( getSlot ( "_vAlignate" , _vAlignate ) ); + record->add ( getSlot ( "_invalid" , _invalid ) ); + return record; + } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/AutoContacts.cpp b/katabatic/src/AutoContacts.cpp new file mode 100644 index 00000000..d2e2c974 --- /dev/null +++ b/katabatic/src/AutoContacts.cpp @@ -0,0 +1,140 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./AutoContacts.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include + +#include "hurricane/Segment.h" +#include "hurricane/Horizontal.h" +#include "hurricane/Vertical.h" + +#include "katabatic/Session.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" + + +namespace Katabatic { + + + using namespace std; + using Hurricane::Hook; + using Hurricane::Error; + using Hurricane::Segment; + using Hurricane::ForEachIterator; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoContacts_Collapsed". + + + void AutoContactStack::push ( AutoContact* contact, Segment* segment ) + { + ltrace(80) << "Stacking " << (void*)contact->getContact() << ":" << contact + << " + " << (void*)segment << ":" << segment << endl; + + push_back(make_pair(contact,segment)); + } + + + AutoContact* AutoContacts_Collapsed::Locator::getElement () const + { + return _stack.getAutoContact (); + } + + + void AutoContacts_Collapsed::Locator::progress () + { + AutoContact* sourceContact = _stack.getAutoContact (); + Segment* sourceSegment = _stack.getSegment (); + + _stack.pop (); + + forEach ( Hook*, ihook, sourceContact->getBodyHook()->getHooks() ) { + Segment* segment = NULL; + + if ( _direction & Constant::Horizontal ) segment = dynamic_cast(ihook->getComponent()); + else segment = dynamic_cast(ihook->getComponent()); + + if ( segment && (segment != sourceSegment) ) { + AutoSegment* autoSegment = Session::lookup ( segment ); + + if ( !autoSegment ) { + cerr << Error("Can't lookup for %s.",getString(segment).c_str()) << endl; + continue; + } + if ( !autoSegment->isCollapsed() ) continue; + + Hook* opposite = segment->getOppositeHook ( *ihook ); + AutoContact* targetContact = dynamic_cast(opposite->getMasterHook()->getComponent()); + + if ( targetContact ) _stack.push ( targetContact, segment ); + } + } + } + + + Hurricane::Locator* AutoContacts_Collapsed::Locator::getClone () const + { + return new Locator(*this); + } + + + bool AutoContacts_Collapsed::Locator::isValid () const + { + return _stack.isEmpty(); + } + + + string AutoContacts_Collapsed::Locator::_getString () const + { + string s = "<" + _TName("AutoContacts_Collapsed::Locator") + + getString(_stack.getAutoContact()) + + ">"; + return s; + } + + + Collection* AutoContacts_Collapsed::getClone () const + { + return new AutoContacts_Collapsed(*this); + } + + + Hurricane::Locator* AutoContacts_Collapsed::getLocator () const + { + return new Locator(_contact,_direction); + } + + + string AutoContacts_Collapsed::_getString () const + { + string s = "<" + _TName("AutoContacts_Collapsed") + " " + + getString(_contact) + " " + + getString(_direction) + + ">"; + return s; + } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/AutoHorizontal.cpp b/katabatic/src/AutoHorizontal.cpp new file mode 100644 index 00000000..7ae78a7f --- /dev/null +++ b/katabatic/src/AutoHorizontal.cpp @@ -0,0 +1,807 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./AutoHorizontal.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include +#include "hurricane/Bug.h" +#include "hurricane/Error.h" +#include "hurricane/DebugSession.h" +#include "crlcore/RoutingGauge.h" +#include "katabatic/Configuration.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoHorizontal.h" +#include "katabatic/AutoVertical.h" + + +namespace { + + using namespace std; + using namespace Hurricane; + using namespace Katabatic; + + + bool slacken ( AutoContact* contact ) + { + if ( contact->getLayer() != Session::getConfiguration()->getContactLayer(0) ) + return false; + + ltrace(200) << "Session::slacken(): " << contact << endl; + + vector hooks; + forEach ( Hook*, ihook, contact->getBodyHook()->getSlaveHooks() ) hooks.push_back ( *ihook ); + + contact->getBodyHook()->_setNextHook ( contact->getBodyHook() ); + for ( size_t i=0 ; i_setNextHook ( hooks[i] ); + + const Layer* paralLayer = Session::getConfiguration()->getRoutingLayer(1); + const Layer* perpandLayer = Session::getConfiguration()->getRoutingLayer(2); + const Layer* contactLayer = Session::getConfiguration()->getContactLayer(1); + AutoContact* contact1 = AutoContact::create ( contact->getGCell(), contact->getNet(), contactLayer ); + AutoContact* contact2 = AutoContact::create ( contact->getGCell(), contact->getNet(), contactLayer ); + + AutoSegment* hsegment = AutoHorizontal::create ( contact + , contact1 + , paralLayer + , contact->getY() + , DbU::lambda(2.0) + , AutoSegment::Local + , true // terminal + , false // collapsed + ); + + AutoSegment* vsegment = AutoVertical::create ( contact1 + , contact2 + , perpandLayer + , contact->getX() + , DbU::lambda(2.0) + , AutoSegment::Local + , false + , false + ); + + for ( size_t i=0 ; iattach ( contact2->getBodyHook() ); + + contact2->setVAlignate ( true ); + contact2->restoreHConnexity ( contact->getX(), true ); + + hsegment->setSlackened ( true ); + vsegment->setSlackened ( true ); + vsegment->setSlackenStrap ( true ); + + ltrace(200) << "Session::slacken() new paral: " << hsegment << endl; + ltrace(200) << "Session::slacken() perpand: " << vsegment << endl; + + return true; + } + + + void slacken ( AutoHorizontal* segment, bool fromSource ) + { + AutoContact* contact = NULL; + Point slackPoint; + if (fromSource) { + contact = segment->getAutoSource(); + slackPoint = Point ( segment->getSourceX(), segment->getSourceY() ); + } else { + contact = segment->getAutoTarget(); + slackPoint = Point ( segment->getTargetX(), segment->getTargetY() ); + } + if ( !contact ) return; + + forEach ( Vertical*, ivertical, contact->getSlaveComponents().getSubSet() ) { + AutoSegment* autoVertical = Session::lookup ( *ivertical ); + if ( autoVertical ) { + autoVertical->invalidate (); + if ( autoVertical->isGlobal() and not contact->getAnchor() ) return; + } + } + + if ( slacken(contact) ) return; + + size_t depth = Session::getRoutingGauge()->getLayerDepth ( segment->getLayer() ); + Layer* contactLayer = Session::getRoutingGauge()->getContactLayer ( depth ); + const Layer* slackLayer = Session::getRoutingGauge()->getRoutingLayer ( depth + 1 ); + + if ( fromSource ) segment->getSourceHook()->detach (); + else segment->getTargetHook()->detach (); + + AutoContact* contact1 = AutoContact::create ( contact->getGCell(), segment->getNet(), contactLayer ); + AutoContact* contact2 = AutoContact::create ( contact->getGCell(), segment->getNet(), contactLayer ); + + AutoSegment* hsegment = AutoHorizontal::create ( contact + , contact1 + , segment->getLayer() + , slackPoint.getY() + , DbU::lambda(2.0) + , AutoSegment::Local + , false + , false + ); + + AutoSegment* vsegment = AutoVertical::create ( contact1 + , contact2 + , slackLayer + , slackPoint.getX() + , DbU::lambda(2.0) + , AutoSegment::Local + , false + , false + ); + + if ( fromSource ) + segment->getSourceHook()->attach ( contact2->getContact()->getBodyHook() ); + else + segment->getTargetHook()->attach ( contact2->getContact()->getBodyHook() ); + contact->restoreVConnexity ( slackPoint.getY(), true ); + + hsegment->setSlackened ( true ); + vsegment->setSlackened ( true ); + vsegment->setSlackenStrap ( true ); + + //contact->setVAlignate ( true ); + + ltrace(200) << "Session::slacken() new paral: " << hsegment << endl; + ltrace(200) << "Session::slacken() perpand: " << vsegment << endl; + ltrace(200) << "Session::slacken() original: " << segment << endl; + } + + +} // End of local namespace. + + +namespace Katabatic { + + + using std::min; + using std::max; + using Hurricane::ltracein; + using Hurricane::ltraceout; + using Hurricane::Error; + using Hurricane::Bug; + using Hurricane::DebugSession; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoHorizontal". + + + AutoHorizontal::AutoHorizontal ( Horizontal* horizontal + , int type + , bool terminal + , bool collapsed + ) + : AutoSegment(horizontal,true,type,terminal,collapsed) + , _horizontal(horizontal) + { + } + + + void AutoHorizontal::_postCreate () + { + AutoSegment::_postCreate (); + orient (); + setPositions (); + + AutoContact* source = getAutoSource(); + if ( source->isTerminal() ) source->setY ( _horizontal->getY() ); + + AutoContact* target = getAutoTarget(); + if ( target->isTerminal() ) target->setY ( _horizontal->getY() ); + + if ( source->getGCell() == target->getGCell() ) { + setGlobal ( false ); + } else { + GCell* gcell; + GCell* end; + + if ( source->getGCell()->getX() < target->getGCell()->getX() ) { + gcell = source->getGCell()->getRight(); + end = target->getGCell(); + } else { + gcell = target->getGCell()->getRight(); + end = source->getGCell(); + } + + for ( ; gcell != end ; gcell = gcell->getRight() ) { + if ( !gcell ) { + cerr << Error("AutoHorizontal::create() : NULL GCell.") << endl; + break; + } + gcell->addHSegment ( this ); + } + } + } + + + AutoHorizontal* AutoHorizontal::create ( Horizontal* horizontal + , int type + , bool terminal + , bool collapsed + ) + { + AutoSegment::_preCreate ( horizontal->getSource(), horizontal->getTarget() ); + AutoHorizontal* autoHorizontal = new AutoHorizontal ( horizontal + , type + , terminal + , collapsed + ); + autoHorizontal->_postCreate (); + return autoHorizontal; + } + + + AutoHorizontal* AutoHorizontal::create ( AutoContact* source + , AutoContact* target + , const Layer* layer + , DbU::Unit y + , DbU::Unit width + , int type + , bool terminal + , bool collapsed + ) + { + AutoSegment::_preCreate ( source, target ); + AutoHorizontal* autoHorizontal + = new AutoHorizontal ( Horizontal::create ( source->getContact() + , target->getContact() + , layer + , y + , width ), type, terminal, collapsed ); + + autoHorizontal->_postCreate (); + + return autoHorizontal; + } + + + void AutoHorizontal::_preDestroy () + { + ltrace(200) << "AutoHorizontal::_preDestroy() - " << (void*)this << endl; + ltrace(200) << " " << _getString() << endl; + ltracein(90); + + if ( not Session::doDestroyTool() ) { + AutoContact* source = getAutoSource(); + AutoContact* target = getAutoTarget(); + + if ( source and target and (source->getGCell() != target->getGCell()) ) { + GCell* gcell; + GCell* end; + + if ( source->getGCell()->getX() < target->getGCell()->getX() ) { + gcell = source->getGCell()->getRight(); + end = target->getGCell(); + } else { + gcell = target->getGCell()->getRight(); + end = source->getGCell(); + } + + for ( ; gcell != end ; gcell = gcell->getRight() ) { + if ( !gcell ) { + cerr << Error("AutoHorizontal::_preDestroy() : NULL GCell.") << endl; + break; + } + gcell->removeHSegment ( this ); + } + } + } + + AutoSegment::_preDestroy (); + ltraceout(90); + } + + + AutoHorizontal::~AutoHorizontal () + { + if ( Session::doDestroyBaseSegment() and not Session::doDestroyTool() ) { + ltrace(200) << "~AutoHorizontal() - " << (void*)_horizontal << endl; + _horizontal->destroy (); + } + } + + + Interval AutoHorizontal::getSourceConstraints ( bool native ) const + { + if ( native ) { + Box nativeBox ( getAutoSource()->getNativeConstraintBox() ); + return Interval ( nativeBox.getYMin(), nativeBox.getYMax() ); + } + return Interval ( getAutoSource()->getCBYMin(), getAutoSource()->getCBYMax() ); + } + + + Interval AutoHorizontal::getTargetConstraints ( bool native ) const + { + if ( native ) { + Box nativeBox ( getAutoTarget()->getNativeConstraintBox() ); + return Interval ( nativeBox.getYMin(), nativeBox.getYMax() ); + } + return Interval ( getAutoTarget()->getCBYMin(), getAutoTarget()->getCBYMax() ); + } + + + bool AutoHorizontal::getConstraints ( DbU::Unit& constraintMin, DbU::Unit& constraintMax ) const + { + AutoContact* contact = getAutoSource(); + constraintMin = contact->getCBYMin(); + constraintMax = contact->getCBYMax(); + + ltrace(148) << "Source constraints: " << contact << " [" + << DbU::getValueString(constraintMin) << ":" + << DbU::getValueString(constraintMax) << "]" + << endl; + + contact = getAutoTarget(); + constraintMin = max ( constraintMin, contact->getCBYMin() ); + constraintMax = min ( constraintMax, contact->getCBYMax() ); + + ltrace(148) << "Merge with target constraints: " << contact << " [" + << DbU::getValueString(constraintMin) << ":" + << DbU::getValueString(constraintMax) << "]" + << endl; + + constraintMin = max ( constraintMin, getUserConstraints().getVMin() ); + constraintMax = min ( constraintMax, getUserConstraints().getVMax() ); + + ltrace(148) << "Merge with user constraints: " << getUserConstraints() << " [" + << DbU::getValueString(constraintMin) << ":" + << DbU::getValueString(constraintMax) << "]" + << endl; + + return true; + } + + + unsigned int AutoHorizontal::getDirection () const + { return Constant::Horizontal; } + + + size_t AutoHorizontal::getGCells ( vector& gcells ) const + { + vector().swap ( gcells ); + gcells.push_back ( getAutoSource()->getGCell() ); + + GCell* gcell = gcells.front(); + GCell* end = getAutoTarget()->getGCell(); + + while ( gcell != end ) { + gcell = gcell->getRight (); + if ( !gcell ) break; + + gcells.push_back ( gcell ); + } + + return gcells.size(); + } + + + bool AutoHorizontal::_canSlacken () const + { + Interval sourceConstraints = Interval(getAutoSource()->getCBYMin(),getAutoSource()->getCBYMax()); + Interval targetConstraints = Interval(getAutoTarget()->getCBYMin(),getAutoTarget()->getCBYMax()); + + // Ugly: should uses topRightShrink from GCell. + sourceConstraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + targetConstraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + + ltrace(200) << "source " << (void*)getAutoSource() << ":" << getAutoSource() << endl; + ltrace(200) << "source constraints: " << sourceConstraints + << " " << DbU::getValueString(sourceConstraints.getSize()) << endl; + ltrace(200) << "target " << (void*)getAutoTarget() << ":" << getAutoTarget() << endl; + ltrace(200) << "target constraints: " << targetConstraints + << " " << DbU::getValueString(targetConstraints.getSize()) << endl; + + // Ugly: GCell's track number is hardwired. + if ( sourceConstraints.getSize() / DbU::lambda(5.0) < 10 ) return true; + if ( targetConstraints.getSize() / DbU::lambda(5.0) < 10 ) return true; + + return false; + } + + + void AutoHorizontal::_slacken () + { + ltrace(200) << "AutoHorizontal::_slacken() " << this << endl; + ltracein(200); + + AutoContact* contact = getAutoSource(); + Interval constraints = Interval(contact->getCBYMin(),contact->getCBYMax()); + + constraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + + // Ugly: GCell's track number is hardwired. + if ( constraints.getSize() / DbU::lambda(5.0) < 10 ) ::slacken ( this, true ); + + contact = getAutoTarget (); + constraints = Interval(contact->getCBYMin(),contact->getCBYMax()); + constraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + + if ( constraints.getSize() / DbU::lambda(5.0) < 10 ) ::slacken ( this, false ); + + setSlackened ( true ); + + ltraceout(200); + } + + + bool AutoHorizontal::canDesalignate ( AutoContact* contact ) const + { return contact->canHDesalignate(); } + + + void AutoHorizontal::desalignate ( AutoContact* contact ) + { contact->hDesalignate(); } + + + void AutoHorizontal::alignate ( DbU::Unit axis ) + { + if ( _horizontal->getY() == axis ) return; + + ltrace(80) << "alignate() " << (void*)this << " " << this << " @Y " << DbU::getLambda(axis) << endl; + + _horizontal->setY ( axis ); + invalidate (); + + AutoContact* anchor = getAutoSource(); + anchor->invalidate (); + if ( anchor->isTerminal() ) anchor->setY ( axis ); + + anchor = getAutoTarget(); + anchor->invalidate (); + if ( anchor->isTerminal() ) anchor->setY ( axis ); + } + + + void AutoHorizontal::orient () + { + if ( _horizontal->getTargetX() < _horizontal->getSourceX() ) + _horizontal->invert (); + } + + + void AutoHorizontal::setPositions () + { + _sourcePosition = _horizontal->getSourceX() - Session::getExtensionCap(); + _targetPosition = _horizontal->getTargetX() + Session::getExtensionCap(); + } + + + bool AutoHorizontal::checkPositions () const + { + bool coherency = true; + DbU::Unit sourcePosition = _horizontal->getSourceX() - Session::getExtensionCap(); + DbU::Unit targetPosition = _horizontal->getTargetX() + Session::getExtensionCap(); + + if ( _sourcePosition != sourcePosition ) { + cerr << Error ( "%s\n Source position incoherency: " + "shadow: %s, real: %s." + , _getString().c_str() + , DbU::getValueString(_sourcePosition).c_str() + , DbU::getValueString( sourcePosition).c_str() + ) << endl; + coherency = false; + } + + if ( _targetPosition != targetPosition ) { + cerr << Error ( "%s\n Target position incoherency: " + "shadow: %s, real: %s." + , _getString().c_str() + , DbU::getValueString(_targetPosition).c_str() + , DbU::getValueString( targetPosition).c_str() + ) << endl; + coherency = false; + } + + return coherency; + } + + + bool AutoHorizontal::checkConstraints () const + { + Interval sourceConstraints = Interval(getAutoSource()->getCBYMin(),getAutoSource()->getCBYMax()); + Interval targetConstraints = Interval(getAutoTarget()->getCBYMin(),getAutoTarget()->getCBYMax()); + + if ( !sourceConstraints.intersect(targetConstraints) ) { + cerr << Error ( "%p:%s\n Constraints incoherency: S:%p:%s, T:%p:%s" + , (void*)base() + , _getString().c_str() + , getAutoSource()->getContact() + , getString(sourceConstraints).c_str() + , getAutoTarget()->getContact() + , getString(targetConstraints).c_str() + ) << endl; + return false; + } + + return true; + } + + + void AutoHorizontal::_computeTerminal () + { _computeTerminal(_horizontal); } + + + void AutoHorizontal::moveULeft () + { + if ( not getAutoSource()->isCorner() or not getAutoTarget()->isCorner() ) return; + if ( not getAutoSource()->getGCell()->getDown() ) return; + + Session::setInvalidateMask ( Session::RestoreHCon|Session::NetCanonize ); + Session::invalidate ( getNet() ); + + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + + forEach ( Vertical*, isegment, autoSource->getSlaveComponents().getSubSet() ) { + AutoSegment* segment = Session::lookup ( *isegment ); + if ( segment->isLocal() ) { + segment->setGlobal ( true ); + continue; + } + + if ( segment->getAutoSource() == autoSource ) { + begin->addVSegment ( segment ); + } else { + if ( begin->getDown() == segment->getAutoSource()->getGCell() ) { + segment->setGlobal ( false ); + segment->getAutoSource()->invalidate (); + } else + begin->getDown()->removeVSegment ( segment ); + } + } + + forEach ( Vertical*, isegment, autoTarget->getSlaveComponents().getSubSet() ) { + AutoSegment* segment = Session::lookup ( *isegment ); + if ( segment->isLocal() ) { + segment->setGlobal ( true ); + continue; + } + + if ( segment->getAutoSource() == autoTarget ) { + begin->addVSegment ( segment ); + } else { + if ( end->getDown() == segment->getAutoSource()->getGCell() ) { + segment->setGlobal ( false ); + segment->getAutoSource()->invalidate (); + } else + end->getDown()->removeVSegment ( segment ); + } + } + + if ( begin != end ) { + for ( GCell* gcell = begin->getLeft() ; gcell != end ; gcell = gcell->getLeft() ) + gcell->removeHSegment ( this ); + } + + begin = begin->getDown(); + end = end ->getDown(); + + autoSource->setGCell ( begin ); + autoTarget->setGCell ( end ); + if ( begin != end ) { + for ( GCell* gcell = begin->getLeft() ; gcell != end ; gcell = gcell->getLeft() ) + gcell->addHSegment ( this ); + } + + DbU::Unit y = begin->getUSide(Constant::Vertical).getVMax(); + setAxis ( y ); + + Session::revalidateTopology (); + } + + + void AutoHorizontal::moveURight () + { + if ( not getAutoSource()->isCorner() or not getAutoTarget()->isCorner() ) return; + if ( not getAutoSource()->getGCell()->getUp() ) return; + + Session::setInvalidateMask ( Session::RestoreVCon|Session::NetCanonize ); + Session::invalidate ( getNet() ); + + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + + forEach ( Vertical*, isegment, autoSource->getSlaveComponents().getSubSet() ) { + AutoSegment* segment = Session::lookup ( *isegment ); + if ( segment->isLocal() ) { + segment->setGlobal ( true ); + continue; + } + + if ( segment->getAutoTarget() == autoSource ) { + begin->addVSegment ( segment ); + } else { + if ( begin->getUp() == segment->getAutoTarget()->getGCell() ) { + segment->setGlobal ( false ); + segment->getAutoTarget()->invalidate (); + } else + begin->getUp()->removeVSegment ( segment ); + } + } + + forEach ( Vertical*, isegment, autoTarget->getSlaveComponents().getSubSet() ) { + AutoSegment* segment = Session::lookup ( *isegment ); + if ( segment->isLocal() ) { + segment->setGlobal ( true ); + continue; + } + + if ( segment->getAutoTarget() == autoTarget ) { + begin->addVSegment ( segment ); + } else { + if ( end->getUp() == segment->getAutoTarget()->getGCell() ) { + segment->setGlobal ( false ); + segment->getAutoTarget()->invalidate (); + } else + end->getUp()->removeVSegment ( segment ); + } + } + + if ( begin != end ) { + for ( GCell* gcell = begin->getLeft() ; gcell != end ; gcell = gcell->getLeft() ) + gcell->removeHSegment ( this ); + } + + begin = begin->getUp(); + end = end ->getUp(); + + autoSource->setGCell ( begin ); + autoTarget->setGCell ( end ); + if ( begin != end ) { + for ( GCell* gcell = begin->getLeft() ; gcell != end ; gcell = gcell->getLeft() ) + gcell->addHSegment ( this ); + } + + DbU::Unit y = begin->getUSide(Constant::Vertical).getVMin(); + setAxis ( y ); + + Session::revalidateTopology (); + } + + + void AutoHorizontal::_makeDogLeg ( GCell* dogLegGCell, bool upLayer ) + { + DebugSession::open ( getNet(), 110 ); + ltracein(159); + + Session::dogLegReset (); + + AutoContact* autoTarget = getAutoTarget(); + AutoContact* autoSource = getAutoSource(); + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + unsigned int fragmentType = AutoSegment::Global; + unsigned int splittedType = AutoSegment::Global; + + //DbU::Unit dogLegAxis = (detachSource)?dogLegGCell->getXMax():dogLegGCell->getX(); + DbU::Unit dogLegAxis = (dogLegGCell->getXMax() + dogLegGCell->getX()) / 2; + if ( isLocal() ) + dogLegAxis = (getSourceX() + getTargetX()) / 2; + + ltrace(159) << "Detaching Target AutoContact " + << (void*)autoTarget->getContact() << ":" + << autoTarget->getContact() << "." << endl; + if ( end == dogLegGCell ) { + fragmentType = AutoSegment::Local; + } + if ( begin == dogLegGCell ) { + setGlobal ( false ); + splittedType = AutoSegment::Local; + } + + autoTarget->invalidate (); + autoTarget->setInvalidatedTopology ( true ); + + if ( dogLegGCell != end ) { + GCell* gcell = dogLegGCell; + do { + if ( gcell != begin ) + gcell->removeHSegment ( this ); + gcell = gcell->getRight (); + } while ( gcell && (gcell != end) ); + } + + Session::dogLeg ( this ); + + size_t depth = Session::getRoutingGauge()->getLayerDepth ( _horizontal->getLayer() ); + Layer* contactLayer = Session::getRoutingGauge()->getContactLayer ( depth + ((upLayer)?0:-1) ); + const Layer* dogLegLayer = Session::getRoutingGauge()->getRoutingLayer ( depth + ((upLayer)?1:-1) ); + + _horizontal->getTargetHook()->detach (); + + AutoContact* dlContact1 = AutoContact::create ( dogLegGCell, _horizontal->getNet(), contactLayer ); + AutoContact* dlContact2 = AutoContact::create ( dogLegGCell, _horizontal->getNet(), contactLayer ); + AutoSegment* segment1 = AutoVertical::create ( dlContact1 + , dlContact2 + , dogLegLayer + , dogLegAxis + , DbU::lambda(2.0) + , AutoSegment::Local + , false + , false + ); + + ltrace(200) << "New " << (void*)dlContact1->getContact() << ":" << dlContact1->getContact() << "." << endl; + ltrace(200) << "New " << (void*)dlContact2->getContact() << ":" << dlContact2->getContact() << "." << endl; + ltrace(200) << "Session::dogLeg[1] perpand: " << segment1 << endl; + Session::dogLeg ( segment1 ); + + _horizontal->getTargetHook()->attach ( dlContact1->getContact()->getBodyHook() ); + AutoSegment* segment2 = AutoHorizontal::create ( dlContact2 + , autoTarget + , getLayer() + , getY() + , DbU::lambda(2.0) + , fragmentType + , false + , false + ); + segment2->setAxis ( getY(), AxisSet ); + ltrace(200) << "Session::dogLeg[2] new paral: " << segment2 << endl; + ltrace(200) << "Session::dogLeg[0] original: " << this << endl; + Session::dogLeg ( segment2 ); + + setGlobal ( (splittedType == AutoSegment::Global) ); + + if ( (splittedType == AutoSegment::Global) or ( fragmentType == AutoSegment::Global ) ) { + if ( splittedType == AutoSegment::Local ) autoSource->restoreVConnexity ( getY(), true ); + else autoTarget->restoreVConnexity ( getY(), true ); + } + + setTerminal ( false ); + segment2->setTerminal ( false ); + if ( autoSource->getAnchor() and not isGlobal() ) setTerminal ( true ); + if ( autoTarget->getAnchor() and not segment2->isGlobal() ) segment2->setTerminal ( true ); + + segment1->setSlackened ( true ); + segment2->setSlackened ( isSlackened() ); + + Session::invalidate ( getNet() ); + Session::revalidateTopology (); + + ltraceout(159); + DebugSession::close (); + } + + + string AutoHorizontal::_getString () const + { + string s = AutoSegment::_getString(); + return s; + } + + + Record* AutoHorizontal::_getRecord () const + { + Record* record = AutoSegment::_getRecord (); + record->add ( getSlot ( "_horizontal", _horizontal ) ); + + return record; + } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/AutoSegment.cpp b/katabatic/src/AutoSegment.cpp new file mode 100644 index 00000000..bd9f9c2e --- /dev/null +++ b/katabatic/src/AutoSegment.cpp @@ -0,0 +1,1877 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./AutoSegment.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include "hurricane/Warning.h" +#include "hurricane/Bug.h" +#include "hurricane/DataBase.h" +#include "hurricane/Technology.h" +#include "hurricane/Horizontal.h" +#include "hurricane/Vertical.h" +#include "crlcore/RoutingGauge.h" + +#include "katabatic/Session.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/AutoHorizontal.h" +#include "katabatic/AutoVertical.h" +#include "katabatic/GCell.h" +#include "katabatic/KatabaticEngine.h" + + +namespace { + + + using namespace std; + using namespace CRL; + using namespace Hurricane; + using namespace Katabatic; + + + // --------------------------------------------------------------- + // Local Variables. + + + const char* badAutoSegmentAnchor = + "AutoSegment::create() :\n\n" + " Source and/or target anchor is NOT an (internal error).\n" + " Source: %s, Target: %s"; + + const char* dupAutoSegmentAnchor = + "AutoSegment::create() :\n\n" + " Source and Target anchor are the same : %s (internal error)."; + + const char* badSegment = + "Katabatic::AutoSegment::create () :\n\n" + " Segment between %s and %s\n" + " is neither horizontal nor vertical .\n"; + + const char* badSegmentSource = + "Katabatic::AutoSegment::create () :\n\n" + " Source anchor of segment %s is not a Contact\n" + " (%s)\n"; + + const char* badSegmentTarget = + "Katabatic::AutoSegment::create () :\n\n" + " Source anchor of segment %s is not a Contact\n" + " (%s)\n"; + + const char* mismatchSegmentSource = + "Katabatic::AutoSegment::create () :\n\n" + " Source anchor of segment %s is already an AutoContact\n" + " (%s)\n"; + + const char* mismatchSegmentTarget = + "Katabatic::AutoSegment::create () :\n\n" + " Target anchor of segment %s is already an AutoContact\n" + " (%s)\n"; + + + // --------------------------------------------------------------- + // Local Functions. + + + bool getTerminalInterval ( AutoSegment* autoSegment + , AutoContact* fromContact + , bool isHorizontal + , DbU::Unit& min + , DbU::Unit& max + ) + { + AutoContact* terminalContact = NULL; + + if ( !fromContact ) { + bool found = getTerminalInterval ( autoSegment + , autoSegment->getAutoSource() + , autoSegment->isHorizontal() + , min + , max ); + if ( !found ) + found = getTerminalInterval ( autoSegment + , autoSegment->getAutoTarget() + , autoSegment->isHorizontal() + , min + , max ); + + //if ( !found ) + // cerr << "[ERROR] Cannot find terminal of " << autoSegment << "." << endl; + + return found; + } else { + if ( autoSegment->isGlobal() ) return false; + + ltrace(88) << "Examining " << autoSegment << " " << fromContact << endl; + + if ( autoSegment->getSource() == autoSegment->getTarget() ) { + cerr << Error("Source & Target are the same :\n" + " %s\n %s" + ,getString(autoSegment).c_str() + ,getString(autoSegment->getSource()).c_str()) << endl; + } + + terminalContact = autoSegment->getAutoSource(); + if ( terminalContact == fromContact ) { + terminalContact = autoSegment->getAutoTarget(); + } + + if ( !terminalContact->isTerminal() ) { + AutoSegment* segment = NULL; + size_t segmentCount = 0; + forEach ( Component*, icomponent, terminalContact->getSlaveComponents() ) { + if ( *icomponent == autoSegment->getSegment() ) continue; + + Segment* connex = dynamic_cast(*icomponent); + if ( !connex ) continue; + + segment = Session::lookup ( connex ); + if ( !segment || !segment->isTerminal() ) continue; + + segmentCount++; + } + + if ( segmentCount == 1 ) { + return getTerminalInterval ( segment, terminalContact, isHorizontal, min, max ); + + return false; + } + } else { + ltrace(88) << "Terminal is " << terminalContact << endl; + + Box constraintBox = terminalContact->getConstraintBox(); + if ( isHorizontal ) { + min = constraintBox.getXMin (); + max = constraintBox.getXMax (); + } else { + min = constraintBox.getYMin (); + max = constraintBox.getYMax (); + } + return true; + } + } + + return false; + } + + + // --------------------------------------------------------------- + // Class : "AttractorsMap". + + + class AttractorsMap { + // Constructor. + public: + inline AttractorsMap (); + inline size_t getAttractorsCount () const; + DbU::Unit getLowerMedian () const; + DbU::Unit getUpperMedian () const; + void addAttractor ( DbU::Unit position ); + protected: + map _attractors; + size_t _attractorsCount; + }; + + + inline AttractorsMap::AttractorsMap () + : _attractors(), _attractorsCount(0) + { } + + + inline size_t AttractorsMap::getAttractorsCount () const + { + return _attractorsCount; + } + + + void AttractorsMap::addAttractor ( DbU::Unit position ) + { + _attractors[position]++; + _attractorsCount++; + + ltrace(88) << "add Attractor @" << DbU::getLambda(position) + << " [" << _attractors[position] << "]" << endl; + } + + + DbU::Unit AttractorsMap::getLowerMedian () const + { + size_t median = (_attractorsCount/2) + (_attractorsCount%2); + size_t lower = 0; + + map::const_iterator it = _attractors.begin (); + for ( ; it != _attractors.end() ; it++ ) { + lower += it->second; + if ( lower >= median ) break; + } + + return it->first; + } + + + DbU::Unit AttractorsMap::getUpperMedian () const + { + size_t median = _attractorsCount / 2; + size_t upper = 0; + + map::const_iterator it = _attractors.begin (); + for ( ; it != _attractors.end() ; it++ ) { + upper += it->second; + if ( upper > median ) break; + } + + return it->first; + } + + +} // End of local namespace. + + +namespace Katabatic { + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoSegment::CompareCanonical". + + + bool AutoSegment::CompareCanonical::operator() ( const AutoSegment* lhs, const AutoSegment* rhs ) const + { + if ( lhs->isCanonical () xor rhs->isCanonical () ) return lhs->isCanonical(); + if ( lhs->isCollapsed () xor rhs->isCollapsed () ) return rhs->isCollapsed(); + if ( lhs->isSlackenStrap() xor rhs->isSlackenStrap() ) return lhs->isSlackenStrap(); + + if ( lhs->getSourceU() < rhs->getSourceU() ) return true; + if ( lhs->getSourceU() > rhs->getSourceU() ) return false; + + if ( lhs->getLength() > rhs->getLength() ) return true; + if ( lhs->getLength() < rhs->getLength() ) return false; + + if ( lhs->isGlobal () xor rhs->isGlobal () ) return lhs->isGlobal(); + if ( lhs->isTerminal () xor rhs->isTerminal () ) return rhs->isTerminal(); + if ( lhs->isHorizontal() xor rhs->isHorizontal() ) return lhs->isHorizontal(); + + if ( lhs->getAxis() < rhs->getAxis() ) return true; + if ( lhs->getAxis() > rhs->getAxis() ) return false; + + if ( lhs->isFixed() xor rhs->isFixed() ) return lhs->isFixed(); + + return lhs->getId() < rhs->getId(); + } + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoSegment::CompareByDepthLength". + + + bool AutoSegment::CompareByDepthLength::operator() ( AutoSegment* lhs, AutoSegment* rhs ) const + { + if ( Session::getRoutingGauge()->getLayerDepth(lhs->getLayer()) + < Session::getRoutingGauge()->getLayerDepth(rhs->getLayer()) ) + return true; + + if ( Session::getRoutingGauge()->getLayerDepth(lhs->getLayer()) + > Session::getRoutingGauge()->getLayerDepth(rhs->getLayer()) ) + return false; + + return AutoSegment::CompareCanonical() ( lhs, rhs ); + } + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoSegment". + + + size_t AutoSegment::_allocateds = 0; + unsigned long AutoSegment::_maxId = 0; + + + DbU::Unit AutoSegment::getX () const + { + return getSegment()->getX(); + } + + + DbU::Unit AutoSegment::getY () const + { + return getSegment()->getY(); + } + + + AutoContact* AutoSegment::getOppositeAnchor ( AutoContact* anchor ) const + { + return Session::lookup(static_cast(getOppositeAnchor(anchor->getContact()))); + } + + + Interval& AutoSegment::getOptimal ( Interval& i ) const + { + i.getVMin() = getOptimalMin(); + i.getVMax() = getOptimalMax(); + return i; + } + + + bool AutoSegment::checkInvalidated () const + { + if ( isInvalidated() ) + cerr << Error("%s is invalidated.",getString(this).c_str()) << endl; + + return !isInvalidated(); + } + + + void AutoSegment::invalidate () + { + if ( Session::doDestroyTool() ) return; + + _invalidate (); + forEach ( AutoSegment*, isegment, getCollapseds() ) + isegment->_invalidate (); + } + + + void AutoSegment::_invalidate () + { + if ( !isInvalidated() ) { + ltrace(110) << "AutoSegment::_invalidate() " << this << endl; + + setInvalidated ( true ); + Session::invalidate ( this ); + } + } + + + void AutoSegment::revalidate () + { + ltrace(110) << "AutoSegment::revalidate() " << this << endl; + ltracein(110); + + setPositions (); + setInvalidated ( false ); + + ltraceout(110); + } + + + DbU::Unit AutoSegment::getSlack () const + { + DbU::Unit constraintMin; + DbU::Unit constraintMax; + + getConstraints ( constraintMin, constraintMax ); + + return constraintMax - constraintMin; + } + + + DbU::Unit AutoSegment::getCost ( DbU::Unit axis ) const + { + DbU::Unit optimal = getOptimalMin(); + if ( axis < optimal ) + return optimal - axis; + + optimal = getOptimalMax(); + if ( axis > optimal ) + return axis - optimal; + + return 0; + } + + + AutoSegment* AutoSegment::getCanonical ( DbU::Unit& min, DbU::Unit& max ) + { + min = getSourcePosition (); + max = getTargetPosition (); + + if ( max < min ) swap ( min, max ); + + AutoSegment* canonical = this; + size_t canonicals = isCanonical(); + size_t aligneds = 1; + DbU::Unit collapsedMin; + DbU::Unit collapsedMax; + + forEach ( AutoSegment*, isegment, getCollapseds() ) { + if ( isegment->isCanonical() ) { + canonical = *isegment; + canonicals++; + } + + collapsedMin = isegment->getSourcePosition(); + collapsedMax = isegment->getTargetPosition(); + if ( collapsedMax < collapsedMin ) swap ( collapsedMin, collapsedMax ); + if ( collapsedMin < min ) min = collapsedMin; + if ( collapsedMax > max ) max = collapsedMax; + + aligneds++; + } + + if ( (canonicals > 1) || ( !canonicals && (aligneds > 2) ) ) { + cerr << Bug("AutoSegment::getCanonical(): %p:%s" + "\n Bad canonization: %d canonicals out of %d collapseds." + , base(), _getString().c_str(), canonicals, aligneds ) << endl; + + int count = 0; + cerr << " " << count++ << ": " << this << endl; + forEach ( AutoSegment*, isegment, getCollapseds() ) + cerr << " " << count++ << ": " << *isegment << endl; + } + + return canonical; + } + + + AutoSegments AutoSegment::getOnSourceContact ( unsigned int direction ) + { + return AutoSegments_OnContact + ( this, getSource() ).getSubSet ( AutoSegments_InDirection(direction) ); + } + + + AutoSegments AutoSegment::getOnTargetContact ( unsigned int direction ) + { + return AutoSegments_OnContact + ( this, getTarget() ).getSubSet ( AutoSegments_InDirection(direction) ); + } + + + AutoSegments AutoSegment::getCollapseds ( bool withPerpand ) + { + return AutoSegments_Collapsed ( this, withPerpand ); + } + + + AutoSegments AutoSegment::getCollapsedPerpandiculars () + { + return AutoSegments_CollapsedPerpandicular ( this ); + } + + + bool AutoSegment::isCanonicalStrap () const + { + if ( not isStrap() ) return false; + forEach ( AutoSegment*, isegment, const_cast(this)->getCollapseds() ) { + if ( not isegment->isStrap() ) return false; + } + return true; + } + + + bool AutoSegment::collapse () + { + if ( _isGlobal ) { + cerr << Error("Global %s cannot be collapsed.",getString(this).c_str()) << endl; + return false; + } + if ( _isCollapsed ) return true; + + _isCollapsed = true; + + unsigned int direction = (_isHorizontal) ? Constant::Vertical : Constant::Horizontal; + forEach ( AutoSegment*, isegment, AutoSegments_AnchoredBySource(getAutoSource(),direction) ) { + isegment->setCanonical ( false ); + } + forEach ( AutoSegment*, isegment, AutoSegments_AnchoredBySource(getAutoTarget(),direction) ) { + isegment->setCanonical ( false ); + } + + return true; + } + + + bool AutoSegment::expand () + { + if ( _isGlobal ) { + cerr << Warning("Global %s already uncollapsed.",getString(this).c_str()) << endl; + return false; + } + if ( !_isCollapsed ) { + cerr << Warning("Local %s already uncollapsed.",getString(this).c_str()) << endl; + return true; + } + + _isCollapsed = false; + + canonize (); + + unsigned int direction = (_isHorizontal) ? Constant::Vertical : Constant::Horizontal; + forEach ( AutoSegment*, segment, getOnSourceContact(direction) ) { + segment->canonize (); + } + forEach ( AutoSegment*, segment, getOnTargetContact(direction) ) { + segment->canonize (); + } + + return true; + } + + + bool AutoSegment::toConstraintAxis ( set* processeds ) + { + if ( processeds && (processeds->find(this) != processeds->end()) ) return false; + + DbU::Unit constraintMin; + DbU::Unit constraintMax; + + getConstraints ( constraintMin, constraintMax ); + + if ( allowOutsideGCell() ) { + // Ugly: hard-wired value of the track spacing. + constraintMin -= DbU::lambda(5.0) * 8; + constraintMax += DbU::lambda(5.0) * 8; + } + + if ( getAxis() < constraintMin ) { + setAxis ( constraintMin, Realignate, processeds ); + return true; + } + + if ( getAxis() > constraintMax ) { + setAxis ( constraintMax, Realignate, processeds ); + return true; + } + + return false; + } + + + bool AutoSegment::toOptimalAxis ( set* processeds ) + { + if ( processeds && (processeds->find(this) != processeds->end()) ) return false; + + DbU::Unit constraintMin; + DbU::Unit constraintMax; + + getConstraints ( constraintMin, constraintMax ); + + DbU::Unit optimalMin = max ( min(getOptimalMin(),constraintMax), constraintMin ); + DbU::Unit optimalMax = min ( max(getOptimalMax(),constraintMin), constraintMax ); + + if ( getAxis() < optimalMin ) { +#if defined(CHECK_DETERMINISM) + cerr << "Order: toOptimalMin " + << DbU::getValueString(optimalMin) << " [" + << DbU::getValueString(optimalMin) << ":" + << DbU::getValueString(optimalMax) << "] [" + << DbU::getValueString(constraintMin) << ":" + << DbU::getValueString(constraintMax) << "] " + << this << endl; +#endif + setAxis ( optimalMin, Realignate|AxisSet, processeds ); + return true; + } + + if ( getAxis() > optimalMax ) { +#if defined(CHECK_DETERMINISM) + cerr << "Order: toOptimalMax " + << DbU::getValueString(optimalMin) << " [" + << DbU::getValueString(optimalMin) << ":" + << DbU::getValueString(optimalMax) << "] [" + << DbU::getValueString(constraintMin) << ":" + << DbU::getValueString(constraintMax) << "] " + << this << endl; +#endif + setAxis ( optimalMax, Realignate|AxisSet, processeds ); + return true; + } + +#if defined(CHECK_DETERMINISM) + cerr << "Order: in optimal position " + << DbU::getValueString(optimalMin) << " [" + << DbU::getValueString(optimalMin) << ":" + << DbU::getValueString(optimalMax) << "] [" + << DbU::getValueString(constraintMin) << ":" + << DbU::getValueString(constraintMax) << "] " + << this << endl; +#endif + + return false; + } + + + void AutoSegment::setAxis ( DbU::Unit axis, unsigned int flags, set* processeds ) + { + if ( processeds and (processeds->find(this) != processeds->end()) ) return; + + if ( ( axis != getAxis() ) and isFixed() ) { + cerr << Error("AutoSegment::setAxis(): Cannot move a fixed segment.\n" + " (on: %s)",_getString().c_str()) << endl; + } + + if ( _isUnsetAxis and (flags & AxisSet) ) { + ltrace(200) << "setAxis() - AxisSet flag raised " << this << endl; + _isUnsetAxis = false; + } + if ( ( axis == getAxis() ) and not (flags & Realignate) ) return; + + ltrace(200) << "setAxis() @" + << ((_isHorizontal)?"Y ":"X ") << DbU::getLambda(getAxis()) + << " to " << DbU::getLambda(axis) << " on " << this << endl; + ltracein(80); + + alignate ( axis ); + if ( processeds ) processeds->insert ( this ); + + forEach ( AutoSegment*, isegment, getCollapseds() ) { + isegment->alignate ( getAxis() ); + if ( flags & AxisSet ) isegment->_isUnsetAxis = false; + if ( processeds ) processeds->insert ( *isegment ); + } + + ltraceout(80); + } + + + void AutoSegment::computeOptimal ( set* processeds ) + { + ltrace(89) << "computeOptimal() - " << this << endl; + ltracein(89); + + if ( processeds && (processeds->find(this) != processeds->end()) ) { ltraceout(89); return; } + + if ( _isCollapsed ) { + _optimalMin = 0; + setOptimalMax ( (_isHorizontal) ? _gcell->getBoundingBox().getYMax() + : _gcell->getBoundingBox().getXMax() ); + ltraceout(89); + return; + } + + DbU::Unit minGCell = getOrigin(); + DbU::Unit maxGCell = getExtremity(); + DbU::Unit terminalMin; + DbU::Unit terminalMax; + AttractorsMap attractors; + + AutoContact* anchor = getAutoSource(); + if ( anchor->isTerminal() ) { + Box constraintBox = anchor->getConstraintBox(); + if ( isHorizontal() ) { + terminalMin = constraintBox.getYMin (); + terminalMax = constraintBox.getYMax (); + } else { + terminalMin = constraintBox.getXMin (); + terminalMax = constraintBox.getXMax (); + } + + attractors.addAttractor ( terminalMin ); + if ( terminalMin != terminalMax ) + attractors.addAttractor ( terminalMax ); + } + + anchor = getAutoTarget(); + if ( anchor->isTerminal() ) { + Box constraintBox = anchor->getConstraintBox(); + if ( isHorizontal() ) { + terminalMin = constraintBox.getYMin (); + terminalMax = constraintBox.getYMax (); + } else { + terminalMin = constraintBox.getXMin (); + terminalMax = constraintBox.getXMax (); + } + + attractors.addAttractor ( terminalMin ); + if ( terminalMin != terminalMax ) + attractors.addAttractor ( terminalMax ); + } + + forEach ( AutoSegment*, autoSegment, getCollapsedPerpandiculars() ) { + ltrace(89) << "Perpandicular " << *autoSegment << endl; + ltracein(89); + if ( autoSegment->isLocal() ) { + if ( !autoSegment->isTerminal() ) { ltraceout(89); continue; } + + DbU::Unit terminalMin; + DbU::Unit terminalMax; + + if ( getTerminalInterval ( *autoSegment + , NULL + , isHorizontal() + , terminalMin + , terminalMax ) ) { + attractors.addAttractor ( terminalMin ); + if ( terminalMin != terminalMax ) + attractors.addAttractor ( terminalMax ); + } + } else { + bool isMin = true; + if ( isHorizontal() + && ( autoSegment->getAutoSource()->getGCell()->getRow() == _gcell->getRow() ) ) + isMin = false; + if ( isVertical() + && ( autoSegment->getAutoSource()->getGCell()->getColumn() == _gcell->getColumn() ) ) + isMin = false; + attractors.addAttractor ( (isMin) ? minGCell : maxGCell ); + } + ltraceout(89); + } + + DbU::Unit optimalMin; + DbU::Unit optimalMax; + DbU::Unit constraintMin; + DbU::Unit constraintMax; + getConstraints ( constraintMin, constraintMax ); + + if ( attractors.getAttractorsCount() ) { + ltrace(89) << "Lower Median " << DbU::getLambda(attractors.getLowerMedian()) << endl; + ltrace(89) << "Upper Median " << DbU::getLambda(attractors.getUpperMedian()) << endl; + + optimalMin = attractors.getLowerMedian(); + optimalMax = attractors.getUpperMedian(); + } else { + optimalMin = 0; + optimalMax = (_isHorizontal) ? _gcell->getBoundingBox().getYMax() + : _gcell->getBoundingBox().getXMax(); + } + + setInBound ( constraintMin, constraintMax, optimalMin ); + setInBound ( constraintMin, constraintMax, optimalMax ); + + if ( processeds ) processeds->insert ( this ); + setOptimalMin ( optimalMin ); + setOptimalMax ( optimalMax ); + forEach ( AutoSegment*, autoSegment, getCollapseds() ) { + if ( processeds ) processeds->insert ( *autoSegment ); + autoSegment->setOptimalMin ( optimalMin ); + autoSegment->setOptimalMax ( optimalMax ); + } + + ltraceout(89); + } + + + AutoSegment* AutoSegment::canonize () + { + ltrace(159) << "canonize() - " << this << endl; + + if ( isCanonical() ) { + ltrace(159) << "* " << this << " canonical" << endl; + return this; + } + + AutoSegment* canonical = this; + bool hasCanonical = false; + bool isCanonicalLocal = true; + + forEach ( AutoSegment*, isegment, getCollapseds() ) { + if ( isegment->isGlobal() ) isCanonicalLocal = false; + + if ( isegment->isCanonical() ) { + ltrace(159) << "* " << *isegment << " canonical" << endl; + //return *isegment; + canonical = *isegment; + hasCanonical = true; + break; + } + + if ( !hasCanonical ) { + if ( CompareCanonical()(*isegment,canonical) ) + canonical = *isegment; + } + } + + canonical->setCanonical ( true ); + canonical->setCanonicalLocal ( isCanonicalLocal ); + + // ltrace: 159 + if ( isCanonical() ) cerr << "* " << this << " canonical" << endl; + else cerr << "* " << this << endl; + + forEach ( AutoSegment*, isegment, getCollapseds() ) { + if ( isegment->isCanonical() ) cerr << "| " << *isegment << " canonical" << endl; + else cerr << "| " << *isegment << endl; + } + + return canonical; + } + + + AutoSegment::AutoSegment ( Segment* segment + , bool isHorizontal + , int type + , bool terminal + , bool collapsed + ) + : _isUnsetAxis (true) + , _invalidated (false) + , _isHorizontal (isHorizontal) + , _isTerminal (terminal) + , _isCollapsed (collapsed) + , _isCanonical (false) + , _isFixed (false) + , _strap (false) + , _layerChange (false) + , _slackened (false) + , _slackenStrap (false) + , _allowOutsideGCell(false) + , _id (_maxId++) + , _optimalMin (0) + , _userConstraints (false) + { + //cerr << "AutoSegment::AutoSegment() - " << endl; +#if defined(CHECK_DETERMINISM) + cerr << "Order: AutoSegment::AutoSegment() - " << endl; +#endif + _allocateds++; + + AutoContact* source = Session::lookup(dynamic_cast(segment->getSource())); + AutoContact* target = Session::lookup(dynamic_cast(segment->getTarget())); + + _gcell = source->getGCell(); + setOptimalMax ( (_isHorizontal) ? _gcell->getBoundingBox().getYMax() + : _gcell->getBoundingBox().getXMax() ); + + switch ( type ) { + case AutoSegment::Global: _isGlobal = true; break; + case AutoSegment::Local : _isGlobal = false; break; + case AutoSegment::Guess : + _isGlobal = ( source->getGCell() != target->getGCell() ); + break; + } + + _isCanonicalLocal = !_isGlobal; + + _computeTerminal ( segment ); + //if ( source->isTerminal() or target->isTerminal() ) _isTerminal = true; + + //if ( source->isTerminal() + // and target->isTerminal() + // /*and (segment->getLength() < DbU::lambda(25.0))*/ + // and (source->getGCell() == target->getGCell()) ) { + // _strap = true; + //} + + source->setInvalidatedTopology ( true ); + } + + + void AutoSegment::_preCreate ( Component* source, Component* target ) + { + AutoContact* acSource = Session::lookup(dynamic_cast(source)); + AutoContact* acTarget = Session::lookup(dynamic_cast(target)); + + _preCreate ( acSource, acTarget ); + } + + + void AutoSegment::_preCreate ( AutoContact* source, AutoContact* target ) + { + if ( !source || !target ) + throw Error ( badAutoSegmentAnchor + , ((source)?getString(source).c_str():"NULL") + , ((target)?getString(target).c_str():"NULL") + ); + + if ( source == target ) + throw Error ( dupAutoSegmentAnchor, getString(source).c_str() ); + } + + + void AutoSegment::_postCreate () + { + Session::invalidate ( getNet() ); + Session::link ( this ); + invalidate (); + } + + + void AutoSegment::_preDestroy () + { + ltrace(200) << "AutoSegment::_preDestroy() - " << (void*)this << endl; + ltracein(90); + + Session::unlink ( this ); + ltraceout(90); + } + + + AutoSegment::~AutoSegment () + { + _allocateds--; + } + + + void AutoSegment::_computeTerminal ( Segment* segment ) + { + AutoContact* source = Session::lookup(dynamic_cast(segment->getSource())); + AutoContact* target = Session::lookup(dynamic_cast(segment->getTarget())); + + if ( source->isTerminal() or target->isTerminal() ) _isTerminal = true; + } + + + size_t AutoSegment::getAlignedContacts ( map& innerContacts ) + { + map::iterator icontact; + + innerContacts.clear (); + innerContacts.insert ( make_pair(getAutoSource(),0x1) ); + innerContacts.insert ( make_pair(getAutoTarget(),0x4) ); + + forEach ( AutoSegment*, isegment, getCollapseds() ) { + if ( (icontact = innerContacts.find(isegment->getAutoSource())) != innerContacts.end() ) { + if ( icontact->second & 0x1 ) icontact->second |= 0x2; + else icontact->second |= 0x1; + } else + innerContacts.insert ( make_pair(getAutoSource(),0x1) ); + + if ( (icontact = innerContacts.find(isegment->getAutoTarget())) != innerContacts.end() ) { + if ( icontact->second & 0x4 ) icontact->second |= 0x8; + else icontact->second |= 0x4; + } else + innerContacts.insert ( make_pair(getAutoTarget(),0x4) ); + } + + return innerContacts.size(); + } + + + size_t AutoSegment::getPerpandicularsBound ( set& bounds ) + { + map contacts; + map::iterator icontact; + + getAlignedContacts ( contacts ); + + for ( icontact=contacts.begin() ; icontact != contacts.end() ; icontact++ ) { + if ( (icontact->second == 0x1) or (icontact->second == 0x4) ) { + forEach ( Segment*, isegment, icontact->first->getSlaveComponents().getSubSet() ) { + AutoSegment* autoSegment = Session::lookup ( *isegment ); + if ( !autoSegment ) continue; + if ( autoSegment->getDirection() == getDirection() ) continue; + + bounds.insert ( autoSegment ); + } + } + } + + return bounds.size(); + } + + + Interval AutoSegment::getMinSpanU () + { + map contacts; + map::iterator icontact; + + getAlignedContacts ( contacts ); + + DbU::Unit spanMin = DbU::Min; + DbU::Unit spanMax = DbU::Max; + Interval constraints; + unsigned int direction = Constant::perpandicular(getDirection()); + + for ( icontact=contacts.begin() ; icontact != contacts.end() ; icontact++ ) { + constraints = icontact->first->getUConstraints ( direction ); + if ( icontact->second == 0x1 ) { + spanMin = max ( spanMin, constraints.getVMax() ); + } + if ( icontact->second == 0x4 ) { + spanMax = min ( spanMax, constraints.getVMin() ); + } + } + + return Interval(spanMin,spanMax); + } + + + void AutoSegment::setAllowOutsideGCell ( bool state, bool propagate ) + { + if ( allowOutsideGCell() ) return; + + _setAllowOutsideGCell ( state ); + + if ( propagate ) { + forEach ( AutoSegment*, isegment, getCollapseds() ) { + isegment->_setAllowOutsideGCell ( state ); + } + } + } + + + void AutoSegment::_setAllowOutsideGCell ( bool state ) + { + ltrace(200) << "_setAllowOutsideGCell() - " << this << endl; + _allowOutsideGCell = state; + } + + + bool AutoSegment::canGoOutsideGCell () const + { + ltracein(200); + + bool goOutsideGCell = getAutoSource()->canGoOutsideGCell(this); + goOutsideGCell = goOutsideGCell and getAutoTarget()->canGoOutsideGCell(this); + + if ( !goOutsideGCell ) { + ltraceout(200); + return false; + } + + GCell* sourceGCell = getAutoSource()->getGCell(); + GCell* leftGCell = NULL; + GCell* rightGCell = NULL; + Interval uside; + bool goLeft = false; + bool goRight = false; + + if ( isHorizontal() ) { + uside = sourceGCell->getUSide ( Constant::Vertical ); + leftGCell = sourceGCell->getDown(); + rightGCell = sourceGCell->getUp (); + } else { + uside = sourceGCell->getUSide ( Constant::Horizontal ); + leftGCell = sourceGCell->getLeft (); + rightGCell = sourceGCell->getRight(); + } + + DbU::Unit constraintMin; + DbU::Unit constraintMax; + getConstraints ( constraintMin, constraintMax ); + + if ( leftGCell && (uside.getVMin() >= constraintMin) ) { + ltrace(200) << "Can go Left." << endl; + goLeft = true; + } + // Ugly: Must use the right compensator for VMax. + if ( rightGCell && (uside.getVMax() <= constraintMax)+DbU::lambda(1.0) ) { + ltrace(200) << "Can go Right." << endl; + goRight = true; + } + + goOutsideGCell = goOutsideGCell and (goRight or goLeft); + + // Override. + //goOutsideGCell = !isGlobal() && !isTerminal(); + + ltrace(200) << "AutoSegment::canGoOutsideGCell() - " << goOutsideGCell << endl; + ltraceout(200); + + return goOutsideGCell; + } + + + bool AutoSegment::canDesalignate () + { + ltrace(200) << "AutoSegment::canDesalignate()" << endl; + + map innerContacts; + map::iterator icontact; + + getAlignedContacts ( innerContacts ); + + for ( icontact=innerContacts.begin() ; icontact != innerContacts.end() ; icontact++ ) { + ltrace(200) << "| " << "flags:" << icontact->second + << " " << (void*)icontact->first->base() << ":" << icontact->first << endl; + if ( (icontact->second & 0x5 ) && canDesalignate(icontact->first) ) return true; + //if ( (icontact->second & 0x3 ) && canDesalignate(icontact->first) ) return true; + //if ( (icontact->second & 0x12) && canDesalignate(icontact->first) ) return true; + } + ltrace(200) << "No AutoContact suitable for desalignment." << endl; + + return false; + } + + + void AutoSegment::desalignate () + { + map innerContacts; + map::iterator icontact; + vector segments; + + // Ugly. Must fusion with the inner contact loop. + forEach ( AutoSegment*, isegment, getCollapseds() ) { + segments.push_back ( *isegment ); + } + + invalidate (); + getAlignedContacts ( innerContacts ); + + for ( icontact=innerContacts.begin() ; icontact != innerContacts.end() ; icontact++ ) { + desalignate ( icontact->first ); + //if ( icontact->second & 0x3 ) desalignate ( icontact->first ); + //if ( icontact->second & 0x3 ) desalignate ( icontact->first ); + //if ( icontact->second & 0x12) desalignate ( icontact->first ); + } + + Session::invalidate ( getNet() ); + Session::revalidateTopology (); + } + + + void AutoSegment::changeDepth ( unsigned int depth, bool propagate, bool standAlone ) + { + invalidate (); + Session::invalidate ( getNet() ); + Session::setInvalidateMask ( Session::NetSplitContacts ); + + _changeDepth ( depth, true ); + + if ( propagate ) { + forEach ( AutoSegment*, isegment, getCollapseds() ) { + isegment->_changeDepth ( depth, true ); + } + } + + if ( standAlone ) Session::revalidateTopology(); + } + + + void AutoSegment::_changeDepth ( unsigned int depth, bool withNeighbors ) + { + ltrace(200) << "_changeDepth() - " << this << endl; + ltracein(200); + + const Layer* layer0 = Session::getRoutingGauge()->getRoutingLayer(depth); + if ( getLayer() != layer0 ) { + setLayer ( layer0 ); + + getAutoSource()->invalidate(); + getAutoTarget()->invalidate(); + } + + if ( !withNeighbors ) { + ltraceout(200); + return; + } + + forEach ( Component*, icomponent, getAutoSource()->getSlaveComponents() ) { + if ( *icomponent == base() ) continue; + + Segment* segment = dynamic_cast(*icomponent); + if ( !segment ) continue; + + AutoSegment* autoSegment = Session::lookup ( segment ); + if ( !autoSegment ) continue; + if ( autoSegment->isGlobal () ) continue; + if ( autoSegment->isTerminal() ) continue; + + if ( !( autoSegment->isHorizontal() xor isHorizontal() ) ) { + autoSegment->_changeDepth ( depth, false ); + } else { + autoSegment->_changeDepth ( depth-1, false ); + } + } + + forEach ( Component*, icomponent, getAutoTarget()->getSlaveComponents() ) { + if ( *icomponent == base() ) continue; + + Segment* segment = dynamic_cast(*icomponent); + if ( !segment ) continue; + + AutoSegment* autoSegment = Session::lookup ( segment ); + if ( !autoSegment ) continue; + if ( autoSegment->isGlobal () ) continue; + if ( autoSegment->isTerminal() ) continue; + + if ( !( autoSegment->isHorizontal() xor isHorizontal() ) ) { + autoSegment->_changeDepth ( depth, false ); + } else { + autoSegment->_changeDepth ( depth-1, false ); + } + } + + vector gcells; + getGCells ( gcells ); + for ( size_t i=0 ; iinvalidate (); + } + + ltraceout(200); + } + + + bool AutoSegment::canSlacken ( bool propagate ) + { + ltrace(200) << "AutoSegment::canSlacken()" << endl; + + if ( !isGlobal() && !propagate ) return false; + + if ( _canSlacken() ) return true; + if ( propagate ) { + forEach ( AutoSegment*, isegment, getCollapseds() ) { + if ( isegment->_canSlacken() ) return true; + } + } + + return false; + } + + + void AutoSegment::slacken ( bool propagate ) + { + invalidate (); + + set collapseds; + collapseds.insert ( this ); + + if ( propagate ) { + forEach ( AutoSegment*, isegment, getCollapseds() ) + collapseds.insert ( *isegment ); + } + + set::iterator isegment = collapseds.begin(); + for ( ; isegment != collapseds.end() ; isegment++ ) + (*isegment)->_slacken (); + + Session::invalidate ( getNet() ); + Session::revalidateTopology (); + } + + + bool AutoSegment::canPivotUp ( bool propagate ) + { + ltrace(200) << "AutoSegment::canPivotUp()" << endl; + + //if ( isTerminal() ) return false; + + size_t depth = Session::getRoutingGauge()->getLayerDepth(getLayer()); + if ( depth+2 >= Session::getRoutingGauge()->getDepth() ) return false; + + vector gcells; + getGCells ( gcells ); + for ( size_t i=0 ; ihasFreeTrack(depth) ) return false; + } + + ltrace(200) << getAutoSource() << endl; + ltrace(200) << getAutoTarget() << endl; + ltrace(200) << "min depths, Segment:" << depth + << " S:" << getAutoSource()->getMinDepth() + << " T:" << getAutoTarget()->getMinDepth() << endl; + + if ( getAutoSource()->getMinDepth() < depth ) return false; + if ( getAutoTarget()->getMinDepth() < depth ) return false; + if ( not propagate ) { + ltrace(200) << "AutoSegment::canPivotUp() - true [no propagate]" << endl; + return true; + } + + if ( propagate ) { + forEach ( AutoSegment*, isegment, getCollapseds() ) { + isegment->getGCells ( gcells ); + for ( size_t i=0 ; ihasFreeTrack(depth) ) return false; + } + if ( isegment->getAutoSource()->getMinDepth() < depth ) return false; + if ( isegment->getAutoTarget()->getMinDepth() < depth ) return false; + } + } + + ltrace(200) << "AutoSegment::canPivotUp() - true [propagate]" << endl; + + return true; + } + + + bool AutoSegment::canMoveUp ( bool propagate ) + { + ltrace(200) << "AutoSegment::canMoveUp()" << endl; + + if ( isLayerChange() ) return false; + if ( isTerminal() and isLocal() ) return false; + + size_t depth = Session::getRoutingGauge()->getLayerDepth(getLayer()) + 2; + if ( depth >= Session::getRoutingGauge()->getDepth() ) return false; + + vector gcells; + getGCells ( gcells ); + for ( size_t i=0 ; ihasFreeTrack(depth) ) return false; + } + + if ( isLocal() and not propagate ) { + if ( not getAutoSource()->canMoveUp(this) ) return false; + if ( not getAutoTarget()->canMoveUp(this) ) return false; + return true; + } + + bool hasGlobalSegment = false; + size_t collapseds = 0; + if ( propagate ) { + forEach ( AutoSegment*, isegment, getCollapseds() ) { + collapseds++; + if ( isegment->isGlobal() ) hasGlobalSegment = true; + + isegment->getGCells ( gcells ); + for ( size_t i=0 ; ihasFreeTrack(depth) ) { + ltrace(200) << "Not enough free track in " << gcells[i] << endl; + return false; + } + } + } + } + + return true; + } + + + bool AutoSegment::moveUp ( bool propagate ) + { + if ( !canMoveUp(propagate) ) return false; + + changeDepth ( Session::getRoutingGauge()->getLayerDepth(getLayer()) + 2, propagate ); + + return true; + } + + + bool AutoSegment::canDogLeg ( Interval interval ) + { + ltrace(200) << "AutoSegment::canDogLeg(Interval) " << interval << endl; + + size_t leftDogleg = 0; + size_t rightDogleg = 0; + if ( getSpanU().contains(interval.getVMin()) ) leftDogleg++; + if ( getSpanU().contains(interval.getVMax()) ) rightDogleg++; + + forEach ( AutoSegment*, isegment, getCollapseds() ) { + if ( isegment->getSpanU().contains(interval.getVMin()) ) { + if ( isegment->isFixed() ) return false; + leftDogleg++; + } + if ( isegment->getSpanU().contains(interval.getVMax()) ) { + if ( isegment->isFixed() ) return false; + rightDogleg++; + } + } + + if ( (leftDogleg == 1) and (rightDogleg <= 1) ) return true; + if ( (leftDogleg <= 1) and (rightDogleg == 1) ) return true; + + ltrace(200) << "leftCount:" << leftDogleg << " rightCount:" << rightDogleg << endl; + + return false; + } + + + void AutoSegment::makeDogLeg ( Interval interval, bool upLayer, bool& leftDogleg ) + { + ltrace(200) << "AutoSegment::makeDogLeg(Interval)" << endl; + + size_t leftDoglegCount = 0; + size_t rightDoglegCount = 0; + AutoSegment* leftCandidate = NULL; + AutoSegment* rightCandidate = NULL; + + if ( getSpanU().contains(interval.getVMin()) ) { leftCandidate = this; leftDoglegCount++; } + if ( getSpanU().contains(interval.getVMax()) ) { rightCandidate = this; rightDoglegCount++; } + + forEach ( AutoSegment*, isegment, getCollapseds() ) { + if ( isegment->getSpanU().contains(interval.getVMin()) ) { leftCandidate = *isegment; leftDoglegCount++; } + if ( isegment->getSpanU().contains(interval.getVMax()) ) { rightCandidate = *isegment; rightDoglegCount++; } + } + + leftDogleg = true; + if ( (leftDoglegCount != 1) and (rightDoglegCount != 1) ) return; + if ( !leftDoglegCount ) { + leftDogleg = false; + leftCandidate = rightCandidate; + rightCandidate = NULL; + } + + if ( leftCandidate && rightCandidate ) { + ltrace(200) << "Left Constraint: " << leftCandidate->getSourceConstraints(true) << endl; + ltrace(200) << "Right Constraint: " << rightCandidate->getTargetConstraints(true) << endl; + + if ( leftCandidate ->getTargetConstraints(true).getSize() + < rightCandidate->getSourceConstraints(true).getSize() ) { + leftCandidate = rightCandidate; + leftDogleg = false; + } + } else { + if ( !leftCandidate ) { + leftCandidate = rightCandidate; + leftDogleg = false; + } + } + + if ( leftCandidate ) { + leftCandidate->_makeDogLeg ( getAutoSource()->getGCell(), upLayer ); + + const vector& dogLegs = Session::getDogLegs(); + if ( dogLegs.size() >= 2 ) { + DbU::Unit axis; + if ( leftDogleg ) + axis = interval.getVMin() - DbU::lambda(5.0); // Ugly: Hard-wired track spacing. + else + axis = interval.getVMax() + DbU::lambda(5.0); // Ugly: Hard-wired track spacing. + + ltrace(200) << "AutoSegment::makeDogLeg(): @" << DbU::getValueString(axis) << endl; + dogLegs[1]->setAxis ( axis ); + } + } + } + + + void AutoSegment::makeDogLeg ( GCell* dogLegGCell, bool upLayer ) + { + ltrace(160) << "AutoSegment::makeDogLeg(GCell*)" << endl; + ltracein(160); + + if ( isFixed() ) { + cerr << Error("AutoSegment::makeDogLeg(): Cannot make a dog leg on a fixed segment.\n" + " (on: %s)",_getString().c_str()) << endl; + return; + } + + invalidate (); + + if ( dogLegGCell->getUSide(getDirection()).intersect(getSpanU()) ) { + ltrace(159) << "Dogleg in " << this << endl; + _makeDogLeg ( dogLegGCell, upLayer ); + //Session::revalidate ( getNet() ); + } else { + ltrace(159) << "Looking in aligneds." << endl; + forEach ( AutoSegment*, aligned, getCollapseds() ) { + ltrace(159) << "| Try in " << *aligned << endl; + if ( dogLegGCell->getUSide(getDirection()).intersect(aligned->getSpanU()) ) { + ltrace(159) << "Dogleg in " << *aligned << endl; + aligned->_makeDogLeg ( dogLegGCell, upLayer ); + //Session::revalidate ( getNet() ); + ltraceout(160); + return; + } + } + cerr << Bug("Cannot make a dogleg in %s at %s" + ,_getString().c_str(), getString(dogLegGCell).c_str()) << endl; + } + ltraceout(160); + } + + + bool AutoSegment::_check () const + { + bool coherency = true; + + coherency = coherency && checkInvalidated(); + coherency = coherency && checkPositions(); + coherency = coherency && checkConstraints(); + + return coherency; + } + + + string AutoSegment::_getString () const + { + string s = getSegment()->_getString(); + s.insert ( 1, "id: " ); + s.insert ( 4, getString(_id) ); + s.insert ( s.size()-1, (_isFixed )?" F":" -" ); + s.insert ( s.size()-1, (_strap )? "S": "-" ); + s.insert ( s.size()-1, (_isCanonical)? "C": "-" ); + s.insert ( s.size()-1, (_isCollapsed)? "c": "-" ); + s.insert ( s.size()-1, (_isGlobal) ? "g": "-" ); + s.insert ( s.size()-1, (_isTerminal) ? "t": "-" ); + s.insert ( s.size()-1, (_slackened) ? "S": "-" ); + s.insert ( s.size()-1, (_invalidated)? "i": "-" ); + return s; + } + + + Record* AutoSegment::_getRecord () const + { + Record* record = getSegment()->_getRecord (); + record->add ( getSlot ( "_gcell" , _gcell ) ); + record->add ( getSlot ( "_isHorizontal" , &_isHorizontal ) ); + record->add ( getSlot ( "_isFixed" , &_isFixed ) ); + record->add ( getSlot ( "_strap" , &_strap ) ); + record->add ( getSlot ( "_layerChange" , &_layerChange ) ); + record->add ( getSlot ( "_isCanonical" , &_isCanonical ) ); + record->add ( getSlot ( "_isCollapsed" , &_isCollapsed ) ); + record->add ( getSlot ( "_isGlobal" , &_isGlobal ) ); + record->add ( getSlot ( "_isTerminal" , &_isTerminal ) ); + record->add ( getSlot ( "_slackened" , &_slackened ) ); + record->add ( getSlot ( "_invalidated" , &_invalidated ) ); + record->add ( getSlot ( "_sourcePosition", &_sourcePosition ) ); + record->add ( getSlot ( "_targetPosition", &_targetPosition ) ); + return record; + } + + + AutoSegment* AutoSegment::create ( AutoContact* source + , AutoContact* target + , Segment* hurricaneSegment + ) + { + static Layer* verticalLayer = DataBase::getDB()->getTechnology()->getLayer ( "METAL3" ); + static Layer* horizontalLayer = DataBase::getDB()->getTechnology()->getLayer ( "METAL2" ); + + AutoSegment* segment; + Horizontal* horizontal; + Vertical* vertical; + + Contact* contact = dynamic_cast(hurricaneSegment->getSource()); + AutoContact* autoContact = Session::lookup(contact); + if ( !contact ) { + throw Error ( badSegmentSource, getString(hurricaneSegment).c_str() ); + if ( autoContact && ( autoContact != source ) ) + throw Error ( mismatchSegmentSource + , getString(hurricaneSegment).c_str() + , getString(contact).c_str() ); + } + + contact = dynamic_cast(hurricaneSegment->getTarget()); + autoContact = Session::lookup(contact); + if ( !contact ) { + throw Error ( badSegmentTarget, getString(hurricaneSegment).c_str() ); + if ( autoContact && ( autoContact != target ) ) + throw Error ( mismatchSegmentTarget + , getString(hurricaneSegment).c_str() + , getString(contact).c_str() ); + } + + Hook* hook = hurricaneSegment->getSourceHook(); + hook->detach (); + hook->attach ( source->getBodyHook() ); + + hook = hurricaneSegment->getTargetHook(); + hook->detach (); + hook->attach ( target->getBodyHook() ); + + if ( (horizontal = dynamic_cast(hurricaneSegment) ) ) { + if ( horizontal->getLayer() != horizontalLayer ) { + if ( !Session::getKatabatic()->isGMetal(horizontal->getLayer()) ) + cerr << Warning("Segment %s forced to %s." + ,getString(horizontal).c_str() + ,getString(horizontalLayer).c_str()) << endl; + horizontal->setLayer ( horizontalLayer ); + } + + segment = AutoHorizontal::create ( horizontal + , AutoSegment::Global + , false + , false + ); + } else if ( (vertical = dynamic_cast(hurricaneSegment)) ) { + if ( vertical->getLayer() != verticalLayer ) { + if ( !Session::getKatabatic()->isGMetal(vertical->getLayer()) ) + cerr << Warning("Segment %s forced to %s." + ,getString(vertical).c_str() + ,getString(verticalLayer).c_str()) << endl; + vertical->setLayer ( verticalLayer ); + } + + segment = AutoVertical::create ( vertical + , AutoSegment::Global + , false + , false + ); + } else { + throw Error ( badSegment, getString(source).c_str(), getString(target).c_str() ); + } + + ltrace(99) << "Creating " << segment << endl; + + return segment; + } + + + AutoSegment* AutoSegment::create ( AutoContact* source + , AutoContact* target + , unsigned int dir + , int type + , bool terminal + , bool collapsed + ) + { + //static Layer* verticalLayer = DataBase::getDB()->getTechnology()->getLayer ( "METAL3" ); + //static Layer* horizontalLayer = DataBase::getDB()->getTechnology()->getLayer ( "METAL2" ); + + static const Layer* horizontalLayer = Session::getRoutingLayer ( 1 ); + static const Layer* verticalLayer = Session::getRoutingLayer ( 2 ); + + GCell* gcell; + GCell* end; + AutoSegment* segment; + + if ( dir & Constant::Horizontal ) { + segment = AutoHorizontal::create ( source + , target + , horizontalLayer + , source->getY() + , DbU::lambda(2.0) + , type + , terminal + , collapsed + ); + if ( type == AutoSegment::Global ) { + if ( source->getGCell()->getX() < target->getGCell()->getX() ) { + gcell = source->getGCell()->getRight(); + end = target->getGCell(); + } else { + gcell = target->getGCell()->getRight(); + end = source->getGCell(); + } + for ( ; gcell != end ; gcell = gcell->getRight() ) { + if ( !gcell ) { + cerr << Error("AutoSegment::create() : NULL GCell.") << endl; + break; + } + gcell->addHSegment ( segment ); + } + } + } else if ( dir & Constant::Vertical ) { + segment = AutoVertical::create ( source + , target + , verticalLayer + , source->getX() + , DbU::lambda(2.0) + , type + , terminal + , collapsed + ); + if ( type == AutoSegment::Global ) { + if ( source->getGCell()->getY() < target->getGCell()->getY() ) { + gcell = source->getGCell()->getUp(); + end = target->getGCell(); + } else { + gcell = target->getGCell()->getUp(); + end = source->getGCell(); + } + for ( ; gcell != end ; gcell = gcell->getUp() ) { + if ( !gcell ) { + cerr << Error("AutoSegment::create() : NULL GCell.") << endl; + break; + } + gcell->addVSegment ( segment ); + } + } + } else + throw Error ( badSegment, getString(source).c_str(), getString(target).c_str() ); + + ltrace(99) << "create() " << segment << endl; + + return segment; + } + + + void AutoSegment::destroy () + { + _preDestroy (); + delete this; + } + + + bool AutoSegment::isTopologicalBound ( AutoSegment* seed + , bool superior + , bool isHorizontal ) + { + ltrace(80) << "isTopologicalBound() - " << seed << endl; + ltracein(80); + + set exploreds; + vector stack; + DbU::Unit axis; + + if ( superior ) axis = seed->getTargetU(); + else axis = seed->getSourceU(); + + ltrace(80) << "check for bound " << DbU::getValueString(axis) << endl; + + exploreds.insert ( seed->getAutoSource() ); + exploreds.insert ( seed->getAutoTarget() ); + + if ( seed->getLength() ) { + if ( superior ) stack.push_back ( seed->getAutoTarget() ); + else stack.push_back ( seed->getAutoSource() ); + } else { + stack.push_back ( seed->getAutoTarget() ); + stack.push_back ( seed->getAutoSource() ); + } + + while ( !stack.empty() ) { + AutoContact* currentContact = stack.back(); + stack.pop_back (); + + ltrace(80) << "Exploring: " << (void*)currentContact + << " " << currentContact << endl; + + exploreds.insert ( currentContact ); + + if ( currentContact->getAnchor() ) { ltraceout(80); return true; } + + forEach ( Component*, component, currentContact->getSlaveComponents() ) { + Segment* segment = dynamic_cast(*component); + if ( !segment ) continue; + + AutoSegment* autoSegment = Session::lookup ( segment ); + if ( !autoSegment ) continue; + + if ( !autoSegment->getLength() ) { + AutoContact* contact = autoSegment->getAutoSource(); + if ( contact && ( contact != currentContact ) ) { + if ( exploreds.find(contact) == exploreds.end() ) + stack.push_back ( contact ); + } + + contact = autoSegment->getAutoTarget(); + if ( contact && ( contact != currentContact ) ) { + if ( exploreds.find(contact) == exploreds.end() ) + stack.push_back ( contact ); + } + + continue; + } + + if ( autoSegment->isHorizontal() != isHorizontal ) continue; + + ltrace(80) << "| " << autoSegment << endl; + + if ( superior ) { + if ( autoSegment->getTargetU() > axis ) { ltraceout(80); return true; } + } else { + if ( autoSegment->getSourceU() < axis ) { ltraceout(80); return true; } + } + } + } + + ltraceout(80); + return false; + } + + + unsigned int AutoSegment::getPerpandicularState ( AutoContact* contact + , AutoSegment* source + , AutoSegment* current + , bool isHorizontalMaster + , const Layer* masterLayer ) + { + unsigned int state = 0; + + bool sourcePerpandicular = arePerpandiculars ( isHorizontalMaster, source ); + bool currentPerpandicular = arePerpandiculars ( isHorizontalMaster, current ); + bool contactAlignate + = (contact->isHAlignate() and current->isHorizontal() and isHorizontalMaster) + or (contact->isVAlignate() and !current->isHorizontal() and !isHorizontalMaster); + + if ( not currentPerpandicular and masterLayer and (masterLayer != current->getLayer()) ) + state |= ParallelAndLayerChange; + + if ( currentPerpandicular and !current->isCollapsed() ) + state |= PerpandicularAny; + + if ( sourcePerpandicular ) { + // Source segment is perpandicular to master. + if ( currentPerpandicular and !current->isCollapsed() ) + state |= PerpandicularIndirect; + } else { + // Source segment is parallel to master. + if ( not (currentPerpandicular and current->isCollapsed()) and not contactAlignate ) { + // Current segment is parallel OR expanded. + state |= ParallelOrExpanded; + } + } + + return state; + } + + + void AutoSegment::getTopologicalInfos ( AutoSegment* seed + , vector& collapseds + , vector& perpandiculars + , DbU::Unit& leftBound + , DbU::Unit& rightBound + ) + { + ltrace(80) << "getTopologicalInfos() - " << seed << endl; + + leftBound = DbU::Max; + rightBound = DbU::Min; + + AutoSegmentStack stack; + + stack.push ( seed->getAutoSource(), seed ); + stack.push ( seed->getAutoTarget(), seed ); + + while ( !stack.isEmpty() ) { + AutoContact* sourceContact = stack.getAutoContact (); + AutoSegment* sourceSegment = stack.getAutoSegment (); + + stack.pop (); + + DbU::Unit constraint; + + if ( seed->isHorizontal() ) constraint = sourceContact->getCBXMax(); + else constraint = sourceContact->getCBYMax(); + if ( constraint < leftBound ) leftBound = constraint; + + if ( seed->isHorizontal() ) constraint = sourceContact->getCBXMin(); + else constraint = sourceContact->getCBYMin(); + if ( constraint > rightBound ) rightBound = constraint; + + forEach ( Component*, component, sourceContact->getSlaveComponents() ) { + Segment* segment = dynamic_cast(*component); + if ( ( !segment ) || ( segment == sourceSegment->getSegment() ) ) continue; + + AutoSegment* currentSegment = Session::lookup ( segment ); + if ( !currentSegment ) { + cerr << Error("Can't lookup for %s.",getString(segment).c_str()) << endl; + continue; + } + + unsigned int state = getPerpandicularState ( sourceContact + , sourceSegment + , currentSegment + , seed ); + if ( state & PerpandicularAny ) { + ltrace(79) << "Perpandicular: " << currentSegment << endl; + perpandiculars.push_back ( currentSegment ); + } + if ( state & (PerpandicularIndirect + |ParallelOrExpanded + |ParallelAndLayerChange ) ) { + ltrace(79) << "Reject: " << currentSegment << endl; + continue; + } + + if ( !areAligneds(currentSegment,seed) ) { + collapseds.push_back ( currentSegment ); + ltrace(79) << "collapsed: " << currentSegment << endl; + } + + Component* opposite = segment->getOppositeAnchor ( sourceContact->getContact() ); + AutoContact* targetContact = Session::lookup(static_cast(opposite)); + if ( targetContact ) stack.push ( targetContact, currentSegment ); + } + } + } + + + int AutoSegment::getTerminalCount ( AutoSegment* seed, vector& collapseds ) + { + ltrace(80) << "getTerminalCount() - " << seed << " (+collapseds)" << endl; + + int count = 0; + for ( size_t i=0 ; i < collapseds.size() ; i++ ) { + if ( collapseds[i]->isTerminal() ) + count++; + } + if ( seed->getAutoSource()->isTerminal() ) count++; + if ( seed->getAutoTarget()->isTerminal() ) count++; + + return count; + } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/AutoSegments.cpp b/katabatic/src/AutoSegments.cpp new file mode 100644 index 00000000..1ba4c7f9 --- /dev/null +++ b/katabatic/src/AutoSegments.cpp @@ -0,0 +1,656 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./AutoSegments.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include "hurricane/Error.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" + + +namespace Katabatic { + + + using namespace std; + using Hurricane::tab; + using Hurricane::inltrace; + using Hurricane::ltracein; + using Hurricane::ltraceout; + using Hurricane::_TName; + using Hurricane::Error; + using Hurricane::ForEachIterator; + using Hurricane::Hook; + using Hurricane::Contact; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoSegmentStack". + + + void AutoSegmentStack::push ( AutoContact* contact, AutoSegment* segment ) + { + ltrace(80) << "Stacking " << contact << " + " << segment << endl; + + push_back(make_pair(contact,segment)); + } + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoSegments_OnContact". + + + AutoSegments_OnContact::Locator::Locator ( AutoSegment* master, Contact* contact ) + : AutoSegmentHL() + , _master(master) + , _element(NULL) + { + _hook = contact->getBodyHook()->getPreviousMasterHook(); + progress (); + } + + + AutoSegmentHL* AutoSegments_OnContact::Locator::getClone () const + { + return new Locator(*this); + } + + + AutoSegment* AutoSegments_OnContact::Locator::getElement () const + { + return _element; + } + + + bool AutoSegments_OnContact::Locator::isValid () const + { + return !_hook; + } + + + void AutoSegments_OnContact::Locator::progress () + { + ltrace(80) << "AutoSegments_OnContact::Locator::progress()" << endl; + + while ( _hook && !_hook->isMaster() ) { + _hook = _hook->getNextHook(); + _element = NULL; + + if ( _hook->isMaster() ) { _hook = NULL; break; } + + Segment* segment = dynamic_cast( _hook->getComponent() ); + if ( segment ) _element = Session::lookup ( segment ); + + if ( !_element || (_element == _master) ) continue; + + break; + } + } + + + string AutoSegments_OnContact::Locator::_getString () const + { + string s = "<" + _TName("AutoSegments_OnContact::Locator") + + getString(_element) + + ">"; + return s; + } + + + AutoSegmentHC* AutoSegments_OnContact::getClone () const + { + return new AutoSegments_OnContact(*this); + } + + + AutoSegmentHL* AutoSegments_OnContact::getLocator () const + { + return new Locator(_master,_contact); + } + + + string AutoSegments_OnContact::_getString () const + { + string s = "<" + _TName("AutoSegments_OnContact") + " " + + getString(_master) + + ">"; + return s; + } + + +// ------------------------------------------------------------------- +// Class : "AutoSegments_Collapsed". + + + AutoSegments_Collapsed::Locator::Locator ( AutoSegment* segment, bool withPerpand ) + : AutoSegmentHL() + , _withPerpand(withPerpand) + , _master(segment) + , _stack() + { + if ( not _master ) return; + + AutoContact* contact = segment->getAutoSource(); + if ( contact ) _stack.push ( contact, segment ); + + contact = segment->getAutoTarget(); + if ( contact ) _stack.push ( contact, segment ); + + progress (); + } + + + AutoSegmentHL* AutoSegments_Collapsed::Locator::getClone () const + { + return new Locator(*this); + } + + + bool AutoSegments_Collapsed::Locator::isValid () const + { + return !_stack.isEmpty(); + } + + + void AutoSegments_Collapsed::Locator::progress () + { + ltrace(80) << "AutoSegments_Collapsed::Locator::progress()" << endl; + + while ( !_stack.isEmpty() ) { + AutoContact* sourceContact = _stack.getAutoContact (); + AutoSegment* sourceSegment = _stack.getAutoSegment (); + + _stack.pop (); + + forEach ( Component*, component, sourceContact->getSlaveComponents() ) { + if ( *component == sourceSegment->getSegment() ) continue; + + Segment* segment = dynamic_cast(*component); + if ( !segment ) continue; + + AutoSegment* currentSegment = Session::lookup ( segment ); + if ( !currentSegment ) { + cerr << Error("Can't lookup for %s.",getString(segment).c_str()) << endl; + continue; + } + + unsigned int state = AutoSegment::getPerpandicularState ( sourceContact + , sourceSegment + , currentSegment + , _master + ); + if ( state & (AutoSegment::PerpandicularIndirect + |AutoSegment::ParallelOrExpanded + |AutoSegment::ParallelAndLayerChange ) ) { + ltrace(98) << "Reject: " << currentSegment << endl; + continue; + } + + AutoContact* targetContact = currentSegment->getOppositeAnchor ( sourceContact ); + if ( targetContact ) _stack.push ( targetContact, currentSegment ); + } + + if ( _stack.isEmpty() ) break; + if ( _stack.getAutoSegment() == _master ) continue; + if ( AutoSegment::areAligneds(_stack.getAutoSegment(),_master) || _withPerpand ) break; + } + } + + + string AutoSegments_Collapsed::Locator::_getString () const + { + string s = "<" + _TName("AutoSegments_Collapsed::Locator") + + ">"; + + return s; + } + + + AutoSegmentHC* AutoSegments_Collapsed::getClone () const + { + return new AutoSegments_Collapsed(*this); + } + + + AutoSegmentHL* AutoSegments_Collapsed::getLocator () const + { + return new Locator(_segment,_withPerpand); + } + + + AutoSegment* AutoSegments_Collapsed::Locator::getElement () const + { + return _stack.getAutoSegment(); + } + + + string AutoSegments_Collapsed::_getString () const + { + string s = "<" + _TName("AutoSegments_Collapsed") + " " + + getString(_segment) + + ">"; + return s; + } + + +// ------------------------------------------------------------------- +// Class : "AutoSegments_CollapsedPerpandicular". + + + AutoSegments_CollapsedPerpandicular::Locator::Locator ( AutoSegment* segment ) + : AutoSegmentHL() + , _master(segment) + , _stack() + , _perpandiculars() + { + ltrace(80) << "AutoSegments_CollapsedPerpandicular::Locator::Locator()" << endl; + ltrace(80) << " " << _master << endl; + + if ( not _master ) return; + + AutoContact* contact = segment->getAutoSource(); + if ( contact ) _stack.push ( contact, segment ); + + contact = segment->getAutoTarget(); + if ( contact ) _stack.push ( contact, segment ); + + progress (); + } + + + AutoSegment* AutoSegments_CollapsedPerpandicular::Locator::getElement () const + { + if ( _perpandiculars.empty() ) return NULL; + return _perpandiculars.back (); + } + + + void AutoSegments_CollapsedPerpandicular::Locator::progress () + { + ltrace(80) << "AutoSegments_CollapsedPerpandicular::Locator::progress()" << endl; + + if ( !_perpandiculars.empty() ) _perpandiculars.pop_back (); + if ( !_perpandiculars.empty() ) return; + + while ( !_stack.isEmpty() ) { + AutoContact* sourceContact = _stack.getAutoContact (); + AutoSegment* sourceSegment = _stack.getAutoSegment (); + + _stack.pop (); + + forEach ( Component*, component, sourceContact->getSlaveComponents() ) { + if ( *component == sourceSegment->getSegment() ) continue; + + Segment* segment = dynamic_cast(*component); + if ( !segment ) continue; + + AutoSegment* currentSegment = Session::lookup ( segment ); + if ( !currentSegment ) { + cerr << Error("Can't lookup for %s.",getString(segment).c_str()) << endl; + continue; + } + + ltrace(99) << " Try Perpandicular: " << currentSegment << endl; + unsigned int state = AutoSegment::getPerpandicularState ( sourceContact + , sourceSegment + , currentSegment + , _master + ); + + if ( state & AutoSegment::PerpandicularAny ) { + _perpandiculars.push_back ( currentSegment ); + ltrace(99) << "Stacked Perpandicular: " << currentSegment << endl; + } + if ( state & (AutoSegment::PerpandicularIndirect + |AutoSegment::ParallelOrExpanded + |AutoSegment::ParallelAndLayerChange ) ) + continue; + + ltrace(99) << "Stacked Opposite of: " << currentSegment << endl; + + AutoContact* targetContact = currentSegment->getOppositeAnchor ( sourceContact ); + if ( targetContact ) _stack.push ( targetContact, currentSegment ); + } + + if ( _stack.isEmpty() ) break; + if ( _stack.getAutoSegment() == _master ) continue; + if ( !_perpandiculars.empty() ) break; + } + } + + + AutoSegmentHL* AutoSegments_CollapsedPerpandicular::Locator::getClone () const + { + return new Locator(*this); + } + + + bool AutoSegments_CollapsedPerpandicular::Locator::isValid () const + { + return !_perpandiculars.empty(); + } + + + AutoSegmentHC* AutoSegments_CollapsedPerpandicular::getClone () const + { + return new AutoSegments_CollapsedPerpandicular(*this); + } + + + AutoSegmentHL* AutoSegments_CollapsedPerpandicular::getLocator () const + { + return new Locator(_segment); + } + + + string AutoSegments_CollapsedPerpandicular::Locator::_getString () const + { + string s = "<" + _TName("AutoSegments_CollapsedPerpandicular::Locator") + + ">"; + return s; + } + + + string AutoSegments_CollapsedPerpandicular::_getString () const + { + string s = "<" + _TName("AutoSegments_CollapsedPerpandicular") + " " + + getString(_segment) + + ">"; + return s; + } + + +// ------------------------------------------------------------------- +// Class : "AutoSegments_AnchorOnGCell". + + + AutoSegments_AnchorOnGCell::Locator::Locator ( GCell* fcell, bool sourceAnchor, unsigned int direction ) + : AutoSegmentHL() + , _sourceAnchor(sourceAnchor) + , _direction(direction) + , _itContact(fcell->getContacts()->begin()) + , _itEnd(fcell->getContacts()->end()) + , _hookLocator(NULL) + , _element(NULL) + { + progress (); + } + + + AutoSegments_AnchorOnGCell::Locator::~Locator () + { + if ( _hookLocator ) delete _hookLocator; + } + + + AutoSegment* AutoSegments_AnchorOnGCell::Locator::getElement () const + { + return _element; + } + + + AutoSegmentHL* AutoSegments_AnchorOnGCell::Locator::getClone () const + { + return new Locator(*this); + } + + + bool AutoSegments_AnchorOnGCell::Locator::isValid () const + { + return _element != NULL; + } + + + void AutoSegments_AnchorOnGCell::Locator::progress () + { + ltrace(80) << "AutoSegments_AnchorOnGCell::Locator::progress()" << endl; + ltracein(79); + + while ( true ) { + if ( _hookLocator == NULL ) { + if ( _itContact == _itEnd ) { + ltrace(79) << "No more AutoContacts" << endl; + ltraceout(79); + return; + } + + ltrace(79) << *_itContact << endl; + + _hookLocator = (*_itContact)->getBodyHook()->getSlaveHooks().getLocator(); + _itContact++; + } else { + _hookLocator->progress (); + } + + while ( _hookLocator->isValid() ) { + ltrace(79) << _hookLocator->getElement() << endl; + Hook* hook = dynamic_cast(_hookLocator->getElement()); + if ( hook ) { + _element = Session::lookup ( static_cast(hook->getComponent()) ); + if ( _element->isHorizontal() ) { + if ( _direction & Constant::Horizontal ) { ltraceout(79); return; } + } else + if ( _direction & Constant::Vertical ) { ltraceout(79); return; } + } + _hookLocator->progress(); + } + _hookLocator = NULL; + _element = NULL; + } + + ltraceout(79); + } + + + string AutoSegments_AnchorOnGCell::Locator::_getString () const + { + string s = "<" + _TName("AutoSegments_AnchorOnGCell::Locator") + + ">"; + return s; + } + + + AutoSegmentHC* AutoSegments_AnchorOnGCell::getClone () const + { + return new AutoSegments_AnchorOnGCell(*this); + } + + + AutoSegmentHL* AutoSegments_AnchorOnGCell::getLocator () const + { + return new Locator(_fcell,_sourceAnchor,_direction); + } + + + string AutoSegments_AnchorOnGCell::_getString () const + { + string s = "<" + _TName("AutoSegments_AnchorOnGCell") + " " + + getString(_fcell) + + ">"; + return s; + } + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoSegments_AnchoredBySource". + + +AutoSegments_AnchoredBySource::Locator::Locator ( AutoContact* sourceAnchor, unsigned int direction ) + : AutoSegmentHL() + , _direction(direction) + , _hookLocator(NULL) + , _element(NULL) +{ + _contactLocator = sourceAnchor->getCollapseds(_direction).getLocator(); + progress (); +} + + + AutoSegments_AnchoredBySource::Locator::~Locator () + { + if ( _hookLocator ) delete _hookLocator; + if ( _contactLocator ) delete _contactLocator; + } + + + AutoSegment* AutoSegments_AnchoredBySource::Locator::getElement () const + { + return _element; + } + + + AutoSegmentHL* AutoSegments_AnchoredBySource::Locator::getClone () const + { + return new Locator(*this); + } + + + bool AutoSegments_AnchoredBySource::Locator::isValid () const + { + return _element != NULL; + } + + + void AutoSegments_AnchoredBySource::Locator::progress () + { + ltrace(80) << "AutoSegments_AnchoredBySource::Locator::progress()" << endl; + ltracein(79); + + while ( true ) { + if ( _hookLocator == NULL ) { + if ( !_contactLocator->isValid() ) { + ltrace(79) << "No more AutoContacts" << endl; + ltraceout(79); + return; + } + + ltrace(79) << _contactLocator->getElement() << endl; + + _hookLocator = _contactLocator->getElement()->getBodyHook()->getSlaveHooks().getLocator(); + _contactLocator->progress (); + } else { + _hookLocator->progress (); + } + + while ( _hookLocator->isValid() ) { + ltrace(79) << _hookLocator->getElement() << endl; + Hook* hook = dynamic_cast(_hookLocator->getElement()); + if ( hook ) { + _element = Session::lookup ( static_cast(hook->getComponent()) ); + if ( _element->isHorizontal() ) { + if ( _direction & Constant::Horizontal ) { ltraceout(79); return; } + } else + if ( _direction & Constant::Vertical ) { ltraceout(79); return; } + } + _hookLocator->progress(); + } + _hookLocator = NULL; + _element = NULL; + } + + ltraceout(79); + } + + + AutoSegmentHL* AutoSegments_AnchoredBySource::getLocator () const + { + return new Locator(_sourceContact,_direction); + } + + + AutoSegmentHC* AutoSegments_AnchoredBySource::getClone () const + { + return new AutoSegments_AnchoredBySource(*this); + } + + + string AutoSegments_AnchoredBySource::Locator::_getString () const + { + string s = "<" + _TName("AutoSegments_AnchoredBySource::Locator") + + ">"; + return s; + } + + + string AutoSegments_AnchoredBySource::_getString () const + { + string s = "<" + _TName("AutoSegments_AnchoredBySource") + " " + + getString(_sourceContact) + + ">"; + return s; + } + + +// ------------------------------------------------------------------- +// Class : "AutoSegments_IsAccountable". + + + AutoSegmentHF* AutoSegments_IsAccountable::getClone () const + { + return new AutoSegments_IsAccountable(); + } + + + bool AutoSegments_IsAccountable::accept ( AutoSegment* segment ) const + { + return segment->isCanonical() && !segment->isCollapsed(); + } + + + string AutoSegments_IsAccountable::_getString () const + { + return ""; + } + + +// ------------------------------------------------------------------- +// Class : "AutoSegments_InDirection". + + + AutoSegmentHF* AutoSegments_InDirection::getClone () const + { + return new AutoSegments_InDirection(_direction); + } + + + bool AutoSegments_InDirection::accept ( AutoSegment* segment ) const + { + return ( segment->isHorizontal() && (_direction & Constant::Horizontal) ) + || ( segment->isVertical () && (_direction & Constant::Vertical ) ); + } + + + string AutoSegments_InDirection::_getString () const + { + return ""; + } + + + + + +// x-----------------------------------------------------------------x +// | Functions Definitions | +// x-----------------------------------------------------------------x + + +} // End of Katabatic namespace. diff --git a/katabatic/src/AutoVertical.cpp b/katabatic/src/AutoVertical.cpp new file mode 100644 index 00000000..42209c27 --- /dev/null +++ b/katabatic/src/AutoVertical.cpp @@ -0,0 +1,704 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./AutoVertical.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include +#include "hurricane/Bug.h" +#include "hurricane/Vertical.h" +#include "crlcore/RoutingGauge.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoVertical.h" +#include "katabatic/AutoHorizontal.h" + + +namespace { + + using namespace std; + using namespace Hurricane; + using namespace Katabatic; + + + void slacken ( AutoVertical* segment, bool fromSource ) + { + AutoContact* contact = NULL; + Point slackPoint; + if (fromSource) { + contact = segment->getAutoSource(); + slackPoint = Point ( segment->getSourceX(), segment->getSourceY() ); + } else { + contact = segment->getAutoTarget(); + slackPoint = Point ( segment->getTargetX(), segment->getTargetY() ); + } + if ( !contact ) return; + + forEach ( Horizontal*, ihorizontal, contact->getSlaveComponents().getSubSet() ) { + AutoSegment* autoHorizontal = Session::lookup ( *ihorizontal ); + if ( autoHorizontal ) { + autoHorizontal->invalidate (); + if ( autoHorizontal->isGlobal() ) return; + } + } + + size_t depth = Session::getRoutingGauge()->getLayerDepth ( segment->getLayer() ); + Layer* contactLayer = Session::getRoutingGauge()->getContactLayer ( depth - 1 ); + const Layer* slackLayer = Session::getRoutingGauge()->getRoutingLayer ( depth - 1 ); + + if ( fromSource ) segment->getSourceHook()->detach (); + else segment->getTargetHook()->detach (); + + AutoContact* contact1 = AutoContact::create ( contact->getGCell(), segment->getNet(), contactLayer ); + AutoContact* contact2 = AutoContact::create ( contact->getGCell(), segment->getNet(), contactLayer ); + + AutoSegment* vsegment = AutoVertical::create ( contact + , contact1 + , segment->getLayer() + , slackPoint.getX() + , DbU::lambda(2.0) + , AutoSegment::Local + , true // terminal + , false // collapsed + ); + + AutoSegment* hsegment = AutoHorizontal::create ( contact1 + , contact2 + , slackLayer + , slackPoint.getY() + , DbU::lambda(2.0) + , AutoSegment::Local + , false + , false + ); + + if ( fromSource ) + segment->getSourceHook()->attach ( contact2->getContact()->getBodyHook() ); + else + segment->getTargetHook()->attach ( contact2->getContact()->getBodyHook() ); + contact->restoreHConnexity ( slackPoint.getY(), true ); + + //contact->setHAlignate ( true ); + + hsegment->setSlackenStrap ( true ); + hsegment->setSlackened ( true ); + vsegment->setSlackened ( true ); + + ltrace(200) << "Session::slacken() new paral: " << vsegment << endl; + ltrace(200) << "Session::slacken() perpand: " << hsegment << endl; + ltrace(200) << "Session::slacken() original: " << segment << endl; + } + + +} // End of local namespace. + + +namespace Katabatic { + + + using std::min; + using std::max; + using Hurricane::ltracein; + using Hurricane::ltraceout; + using Hurricane::Error; + using Hurricane::Bug; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoVertical". + + + AutoVertical::AutoVertical ( Vertical* vertical + , int type + , bool terminal + , bool collapsed + ) + : AutoSegment(vertical,false,type,terminal,collapsed) + , _vertical(vertical) + { } + + + void AutoVertical::_postCreate () + { + AutoSegment::_postCreate (); + orient (); + setPositions (); + + AutoContact* source = getAutoSource(); + if ( source->isTerminal() ) source->setX ( _vertical->getX() ); + + AutoContact* target = getAutoTarget(); + if ( target->isTerminal() ) target->setX ( _vertical->getX() ); + + if ( source->getGCell() == target->getGCell() ) { + setGlobal ( false ); + } else { + GCell* gcell; + GCell* end; + + if ( source->getGCell()->getY() < target->getGCell()->getY() ) { + gcell = source->getGCell()->getUp(); + end = target->getGCell(); + } else { + gcell = target->getGCell()->getUp(); + end = source->getGCell(); + } + for ( ; gcell != end ; gcell = gcell->getUp() ) { + if ( !gcell ) { + cerr << Error("AutoSegment::create() : NULL GCell.") << endl; + break; + } + gcell->addVSegment ( this ); + } + } + } + + + void AutoVertical::_preDestroy () + { + ltrace(200) << "AutoVertical::_preDestroy() - " << (void*)this << endl; + ltrace(200) << " " << _getString() << endl; + ltracein(90); + + if ( not Session::doDestroyTool() ) { + AutoContact* source = getAutoSource(); + AutoContact* target = getAutoTarget(); + + if ( source and target and (source->getGCell() != target->getGCell()) ) { + GCell* gcell; + GCell* end; + + if ( source->getGCell()->getY() < target->getGCell()->getY() ) { + gcell = source->getGCell()->getUp(); + end = target->getGCell(); + } else { + gcell = target->getGCell()->getUp(); + end = source->getGCell(); + } + for ( ; gcell != end ; gcell = gcell->getUp() ) { + if ( !gcell ) { + cerr << Error("AutoSegment::_preDestroy() : NULL GCell.") << endl; + break; + } + gcell->removeVSegment ( this ); + } + } + } + + AutoSegment::_preDestroy (); + ltraceout(90); + } + + + AutoVertical::~AutoVertical () + { + if ( Session::doDestroyBaseSegment() and not Session::doDestroyTool() ) { + ltrace(200) << "~AutoVertical() - " << (void*)_vertical << endl; + _vertical->destroy (); + } + } + + + AutoVertical* AutoVertical::create ( Vertical* vertical + , int type + , bool terminal + , bool collapsed + ) + { + AutoSegment::_preCreate ( vertical->getSource(), vertical->getTarget() ); + AutoVertical* autoVertical = new AutoVertical ( vertical, type, terminal, collapsed ); + + autoVertical->_postCreate (); + return autoVertical; + } + + + AutoVertical* AutoVertical::create ( AutoContact* source + , AutoContact* target + , const Layer* layer + , DbU::Unit x + , DbU::Unit width + , int type + , bool terminal + , bool collapsed + ) + { + AutoSegment::_preCreate ( source, target ); + AutoVertical* autoVertical + = new AutoVertical ( Vertical::create ( source->getContact() + , target->getContact() + , layer + , x + , width ), type, terminal, collapsed ); + + autoVertical->_postCreate (); + return autoVertical; + } + + + Interval AutoVertical::getSourceConstraints ( bool native ) const + { + if ( native ) { + Box nativeBox ( getAutoSource()->getNativeConstraintBox() ); + return Interval ( nativeBox.getXMin(), nativeBox.getXMax() ); + } + return Interval ( getAutoSource()->getCBXMin(), getAutoSource()->getCBXMax() ); + } + + + Interval AutoVertical::getTargetConstraints ( bool native ) const + { + if ( native ) { + Box nativeBox ( getAutoTarget()->getNativeConstraintBox() ); + return Interval ( nativeBox.getXMin(), nativeBox.getXMax() ); + } + return Interval ( getAutoTarget()->getCBXMin(), getAutoTarget()->getCBXMax() ); + } + + + bool AutoVertical::getConstraints ( DbU::Unit& constraintMin, DbU::Unit& constraintMax ) const + { + AutoContact* contact = getAutoSource(); + constraintMin = contact->getCBXMin(); + constraintMax = contact->getCBXMax(); + + contact = getAutoTarget(); + constraintMin = max ( constraintMin, contact->getCBXMin() ); + constraintMax = min ( constraintMax, contact->getCBXMax() ); + + constraintMin = max ( constraintMin, getUserConstraints().getVMin() ); + constraintMax = min ( constraintMax, getUserConstraints().getVMax() ); + return true; + } + + + unsigned int AutoVertical::getDirection () const + { return Constant::Vertical; } + + + size_t AutoVertical::getGCells ( vector& gcells ) const + { + vector().swap ( gcells ); + gcells.push_back ( getAutoSource()->getGCell() ); + + GCell* gcell = gcells.front(); + GCell* end = getAutoTarget()->getGCell(); + + while ( gcell != end ) { + gcell = gcell->getUp (); + if ( !gcell ) break; + + gcells.push_back ( gcell ); + } + + return gcells.size(); + } + + + bool AutoVertical::_canSlacken () const + { + Interval sourceConstraints = Interval(getAutoSource()->getCBXMin(),getAutoSource()->getCBXMax()); + Interval targetConstraints = Interval(getAutoTarget()->getCBXMin(),getAutoTarget()->getCBXMax()); + + // Ugly: should uses topRightShrink from GCell. + sourceConstraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + targetConstraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + + // Ugly: GCell's track number is hardwired. + if ( sourceConstraints.getSize() / DbU::lambda(5.0) < 10 ) return true; + if ( targetConstraints.getSize() / DbU::lambda(5.0) < 10 ) return true; + + return false; + } + + + void AutoVertical::_slacken () + { + AutoContact* contact = getAutoSource(); + Interval constraints = Interval(contact->getCBXMin(),contact->getCBXMax()); + + constraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + + // Ugly: GCell's track number is hardwired. + if ( constraints.getSize() / DbU::lambda(5.0) < 10 ) ::slacken ( this, true ); + + contact = getAutoTarget (); + constraints = Interval(contact->getCBXMin(),contact->getCBXMax()); + constraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + + if ( constraints.getSize() / DbU::lambda(5.0) < 10 ) ::slacken ( this, false ); + + setSlackened ( true ); + } + + + bool AutoVertical::canDesalignate ( AutoContact* contact ) const + { return contact->canVDesalignate (); } + + + void AutoVertical::desalignate ( AutoContact* contact ) + { contact->vDesalignate(); } + + + void AutoVertical::alignate ( DbU::Unit axis ) + { + if ( _vertical->getX() == axis ) return; + + ltrace(159) << "alignate() " << this << " @X " << DbU::getLambda(axis) << endl; + + _vertical->setX ( axis ); + invalidate (); + + AutoContact* anchor = getAutoSource(); + anchor->invalidate (); + if ( anchor->isTerminal() ) anchor->setX ( axis ); + + anchor = getAutoTarget(); + anchor->invalidate (); + if ( anchor->isTerminal() ) anchor->setX ( axis ); + } + + + void AutoVertical::orient () + { + if ( _vertical->getTargetY() < _vertical->getSourceY() ) + _vertical->invert (); + } + + + void AutoVertical::setPositions () + { + _sourcePosition = _vertical->getSourceY() - Session::getExtensionCap(); + _targetPosition = _vertical->getTargetY() + Session::getExtensionCap(); + } + + + bool AutoVertical::checkPositions () const + { + bool coherency = true; + DbU::Unit sourcePosition = _vertical->getSourceY() - Session::getExtensionCap(); + DbU::Unit targetPosition = _vertical->getTargetY() + Session::getExtensionCap(); + + if ( _sourcePosition != sourcePosition ) { + cerr << Error ( "%s\n Source position incoherency: " + "Shadow: %s, real: %s." + , _getString().c_str() + , DbU::getValueString(_sourcePosition).c_str() + , DbU::getValueString( sourcePosition).c_str() + ) << endl; + coherency = false; + } + + if ( _targetPosition != targetPosition ) { + cerr << Error ( "%s\n Target position incoherency: " + "Shadow: %s, real: %s." + , _getString().c_str() + , DbU::getValueString(_targetPosition).c_str() + , DbU::getValueString( targetPosition).c_str() + ) << endl; + coherency = false; + } + + return coherency; + } + + + bool AutoVertical::checkConstraints () const + { + Interval sourceConstraints = Interval(getAutoSource()->getCBXMin(),getAutoSource()->getCBXMax()); + Interval targetConstraints = Interval(getAutoTarget()->getCBXMin(),getAutoTarget()->getCBXMax()); + + if ( !sourceConstraints.intersect(targetConstraints) ) { + cerr << Error ( "%p:%s\n Constraints incoherency: S:%p:%s, T:%p:%s" + , (void*)base() + , _getString().c_str() + , getAutoSource()->getContact() + , getString(sourceConstraints).c_str() + , getAutoSource()->getContact() + , getString(targetConstraints).c_str() + ) << endl; + return false; + } + + return true; + } + + + void AutoVertical::_computeTerminal () + { _computeTerminal(_vertical); } + + + void AutoVertical::moveULeft () + { + if ( not getAutoSource()->isCorner() or not getAutoTarget()->isCorner() ) return; + if ( not getAutoSource()->getGCell()->getLeft() ) return; + + Session::setInvalidateMask ( Session::RestoreVCon|Session::NetCanonize ); + Session::invalidate ( getNet() ); + + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + + forEach ( Horizontal*, isegment, autoSource->getSlaveComponents().getSubSet() ) { + AutoSegment* segment = Session::lookup ( *isegment ); + if ( segment->isLocal() ) { + segment->setGlobal ( true ); + continue; + } + + if ( segment->getAutoSource() == autoSource ) { + begin->addHSegment ( segment ); + } else { + if ( begin->getLeft() == segment->getAutoSource()->getGCell() ) { + segment->setGlobal ( false ); + segment->getAutoSource()->invalidate (); + } else + begin->getLeft()->removeHSegment ( segment ); + } + } + + forEach ( Horizontal*, isegment, autoTarget->getSlaveComponents().getSubSet() ) { + AutoSegment* segment = Session::lookup ( *isegment ); + if ( segment->isLocal() ) { + segment->setGlobal ( true ); + continue; + } + + if ( segment->getAutoSource() == autoTarget ) { + begin->addHSegment ( segment ); + } else { + if ( end->getLeft() == segment->getAutoSource()->getGCell() ) { + segment->setGlobal ( false ); + segment->getAutoSource()->invalidate (); + } else + end->getLeft()->removeHSegment ( segment ); + } + } + + if ( begin != end ) { + for ( GCell* gcell = begin->getUp() ; gcell != end ; gcell = gcell->getUp() ) + gcell->removeVSegment ( this ); + } + + begin = begin->getLeft(); + end = end ->getLeft(); + + autoSource->setGCell ( begin ); + autoTarget->setGCell ( end ); + if ( begin != end ) { + for ( GCell* gcell = begin->getUp() ; gcell != end ; gcell = gcell->getUp() ) + gcell->addVSegment ( this ); + } + + DbU::Unit x = begin->getUSide(Constant::Horizontal).getVMax(); + setAxis ( x, AxisSet); + + Session::revalidateTopology (); + } + + + void AutoVertical::moveURight () + { + ltrace(200) << "AutoVertical::moveURight()" << endl; + + if ( not getAutoSource()->isCorner() or not getAutoTarget()->isCorner() ) return; + if ( not getAutoSource()->getGCell()->getRight() ) return; + + Session::setInvalidateMask ( Session::RestoreVCon|Session::NetCanonize ); + Session::invalidate ( getNet() ); + + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + + forEach ( Horizontal*, isegment, autoSource->getSlaveComponents().getSubSet() ) { + AutoSegment* segment = Session::lookup ( *isegment ); + if ( segment->isLocal() ) { + segment->setGlobal ( true ); + continue; + } + + if ( segment->getAutoTarget() == autoSource ) { + begin->addHSegment ( segment ); + } else { + if ( begin->getRight() == segment->getAutoTarget()->getGCell() ) { + segment->setGlobal ( false ); + segment->getAutoTarget()->invalidate (); + } else + begin->getRight()->removeHSegment ( segment ); + } + } + + forEach ( Horizontal*, isegment, autoTarget->getSlaveComponents().getSubSet() ) { + AutoSegment* segment = Session::lookup ( *isegment ); + if ( segment->isLocal() ) { + segment->setGlobal ( true ); + continue; + } + + if ( segment->getAutoTarget() == autoTarget ) { + begin->addHSegment ( segment ); + } else { + if ( end->getRight() == segment->getAutoTarget()->getGCell() ) { + segment->setGlobal ( false ); + segment->getAutoTarget()->invalidate (); + } else + end->getRight()->removeHSegment ( segment ); + } + } + + if ( begin != end ) { + for ( GCell* gcell = begin->getUp() ; gcell != end ; gcell = gcell->getUp() ) + gcell->removeVSegment ( this ); + } + + begin = begin->getRight(); + end = end ->getRight(); + autoSource->setGCell ( begin ); + autoTarget->setGCell ( end ); + if ( begin != end ) { + for ( GCell* gcell = begin->getUp() ; gcell != end ; gcell = gcell->getUp() ) + gcell->addVSegment ( this ); + } + + DbU::Unit x = begin->getUSide(Constant::Horizontal).getVMin(); + setAxis ( x, AxisSet ); + + ltrace(200) << "Moved to axis: " << DbU::getValueString(x) << endl; + + Session::revalidateTopology (); + } + + + void AutoVertical::_makeDogLeg ( GCell* dogLegGCell, bool upLayer ) + { + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + unsigned int fragmentType = AutoSegment::Global; + unsigned int splittedType = AutoSegment::Global; + + Session::dogLegReset (); + + //DbU::Unit dogLegAxis = (detachSource)?dogLegGCell->getYMax():dogLegGCell->getY(); + DbU::Unit dogLegAxis = (dogLegGCell->getYMax() + dogLegGCell->getY()) / 2; + if ( isLocal() ) + dogLegAxis = (getSourceY() + getTargetY()) / 2; + + ltrace(159) << "Detaching Target AutoContact." << endl; + if ( end == dogLegGCell ) { + fragmentType = AutoSegment::Local; + } + if ( begin == dogLegGCell ) { + splittedType = AutoSegment::Local; + setGlobal ( false ); + } + + autoTarget->invalidate (); + autoTarget->setInvalidatedTopology ( true ); + + if ( dogLegGCell != end ) { + GCell* gcell = dogLegGCell; + do { + if ( gcell != begin ) + gcell->removeVSegment ( this ); + gcell = gcell->getUp (); + } while ( gcell && (gcell != end) ); + } + + Session::dogLeg ( this ); + + size_t depth = Session::getRoutingGauge()->getLayerDepth ( _vertical->getLayer() ); + Layer* contactLayer = Session::getRoutingGauge()->getContactLayer ( depth + ((upLayer)?0:-1) ); + const Layer* dogLegLayer = Session::getRoutingGauge()->getRoutingLayer ( depth + ((upLayer)?1:-1) ); + + _vertical->getTargetHook()->detach (); + AutoContact* dlContact1 = AutoContact::create ( dogLegGCell, _vertical->getNet(), contactLayer ); + AutoContact* dlContact2 = AutoContact::create ( dogLegGCell, _vertical->getNet(), contactLayer ); + AutoSegment* segment1 = AutoHorizontal::create ( dlContact1 + , dlContact2 + , dogLegLayer + , dogLegAxis + , DbU::lambda(2.0) + , AutoSegment::Local + , false + , false + ); + ltrace(200) << "New " << (void*)dlContact1->getContact() << ":" << dlContact1->getContact() << "." << endl; + ltrace(200) << "New " << (void*)dlContact2->getContact() << ":" << dlContact2->getContact() << "." << endl; + ltrace(200) << "Session::dogLeg() perpand: " << segment1 << endl; + Session::dogLeg ( segment1 ); + + _vertical->getTargetHook()->attach ( dlContact1->getContact()->getBodyHook() ); + AutoSegment* segment2 = AutoVertical::create ( dlContact2 + , autoTarget + , getLayer() + , getX() + , DbU::lambda(2.0) + , fragmentType + , false + , false + ); + segment2->setAxis ( getX(), AxisSet ); + ltrace(200) << "Session::dogLeg() new paral: " << segment2 << endl; + ltrace(200) << "Session::dogLeg() original: " << this << endl; + Session::dogLeg ( segment2 ); + + setGlobal ( (splittedType == AutoSegment::Global) ); + + if ( (splittedType == AutoSegment::Global) or ( fragmentType == AutoSegment::Global ) ) { + if ( splittedType == AutoSegment::Local ) autoSource->restoreHConnexity ( getX(), true ); + else autoTarget->restoreHConnexity ( getX(), true ); + } + + setTerminal ( false ); + segment2->setTerminal ( false ); + if ( autoSource->getAnchor() and not isGlobal() ) setTerminal ( true ); + if ( autoTarget->getAnchor() and not segment2->isGlobal() ) segment2->setTerminal ( true ); + + segment1->setSlackened ( true ); + segment2->setSlackened ( isSlackened() ); + + Session::invalidate ( getNet() ); + Session::revalidateTopology (); + } + + + string AutoVertical::_getString () const + { + string s = AutoSegment::_getString(); + return s; + } + + + Record* AutoVertical::_getRecord () const + { + Record* record = AutoSegment::_getRecord (); + record->add ( getSlot ( "_vertical", _vertical ) ); + return record; + } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/CMakeLists.txt b/katabatic/src/CMakeLists.txt new file mode 100644 index 00000000..be833270 --- /dev/null +++ b/katabatic/src/CMakeLists.txt @@ -0,0 +1,60 @@ + +if ( CHECK_DETERMINISM ) + add_definitions ( -DCHECK_DETERMINISM ) +endif ( CHECK_DETERMINISM ) + + include ( ${QT_USE_FILE} ) + + include_directories ( ${KATABATIC_SOURCE_DIR}/src + ${HURRICANE_INCLUDE_DIR} + ${CORIOLIS_INCLUDE_DIR} + ) + set ( includes katabatic/Configuration.h + katabatic/AutoContact.h katabatic/AutoContacts.h + katabatic/AutoSegment.h katabatic/AutoSegments.h + katabatic/AutoHorizontal.h + katabatic/AutoVertical.h + katabatic/Grid.h katabatic/GridCollections.h + katabatic/GridBox.h + katabatic/GCell.h katabatic/GCells.h + katabatic/GCellGrid.h + katabatic/Session.h + katabatic/KatabaticEngine.h + katabatic/GraphicKatabaticEngine.h + ) + set ( mocIncludes katabatic/GraphicKatabaticEngine.h ) + set ( cpps Configuration.cpp + AutoContact.cpp + AutoContacts.cpp + AutoSegment.cpp + AutoSegments.cpp + AutoHorizontal.cpp + AutoVertical.cpp + Grid.cpp + GCell.cpp + GCellGrid.cpp + PowerRails.cpp + Session.cpp + LayerAssign.cpp + LoadGrByNet.cpp + NetConstraints.cpp + NetOptimals.cpp + KatabaticEngine.cpp + GraphicKatabaticEngine.cpp + ) + qt4_wrap_cpp ( mocCpps ${mocIncludes} ) + + + add_library ( katabatic ${cpps} ${mocCpps} ) + target_link_libraries ( katabatic ${KNIK_LIBRARIES} + ${CORIOLIS_LIBRARIES} + ${HURRICANE_LIBRARIES} + ${HURRICANE_GRAPHICAL_LIBRARIES} + ${QT_LIBRARIES} + ${LEFDEF_LIBRARIES} + ${OA_LIBRARIES} + ) + install ( TARGETS katabatic DESTINATION /lib) + install ( FILES ${includes} + ${mocIncludes} DESTINATION /include/coriolis/katabatic ) + diff --git a/katabatic/src/Configuration.cpp b/katabatic/src/Configuration.cpp new file mode 100644 index 00000000..fb0aa992 --- /dev/null +++ b/katabatic/src/Configuration.cpp @@ -0,0 +1,165 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./Configuartion.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include "hurricane/Technology.h" +#include "hurricane/DataBase.h" +#include "katabatic/Configuration.h" + + + +namespace Katabatic { + + + using std::cerr; + using std::endl; + using std::ostringstream; + using Hurricane::tab; + using Hurricane::inltrace; + using Hurricane::Technology; + using Hurricane::DataBase; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::Configuration". + + + Configuration::Configuration () { } + Configuration::~Configuration () { } + + +// ------------------------------------------------------------------- +// Class : "Katabatic::ConfigurationConcrete". + + + ConfigurationConcrete::ConfigurationConcrete ( const RoutingGauge* rg ) + : Configuration() + , _rg (NULL) + , _extensionCap (DbU::lambda(1.5)) + , _saturateRatio (0.80) + , _globalThreshold (29*DbU::lambda(50.0)) // Ugly: direct uses of SxLib gauge. + { + if ( rg ) _rg = rg->getClone(); + + _gmetalh = DataBase::getDB()->getTechnology()->getLayer("gmetalh"); + _gmetalv = DataBase::getDB()->getTechnology()->getLayer("gmetalv"); + _gcontact = DataBase::getDB()->getTechnology()->getLayer("gcontact"); + } + + + ConfigurationConcrete::~ConfigurationConcrete () + { + ltrace(89) << "About to delete attribute _rg (RoutingGauge)." << endl; + _rg->destroy (); + } + + + bool ConfigurationConcrete::isGMetal ( const Layer* layer ) const + { + if ( !layer ) return false; + if ( ( layer != _gmetalh ) + && ( layer != _gmetalv ) + && ( layer != _gcontact ) ) + return false; + + return true; + } + + + size_t ConfigurationConcrete::getDepth () const + { return _rg->getDepth(); } + + + size_t ConfigurationConcrete::getLayerDepth ( const Layer* layer ) const + { return _rg->getLayerDepth(layer); } + + + RoutingGauge* ConfigurationConcrete::getRoutingGauge () const + { return _rg; } + + + RoutingLayerGauge* ConfigurationConcrete::getLayerGauge ( size_t depth ) const + { return _rg->getLayerGauge(depth); } + + + const Layer* ConfigurationConcrete::getRoutingLayer ( size_t depth ) const + { return _rg->getRoutingLayer(depth); } + + + Layer* ConfigurationConcrete::getContactLayer ( size_t depth ) const + { return _rg->getContactLayer(depth); } + + + DbU::Unit ConfigurationConcrete::getExtensionCap () const + { return _extensionCap; } + + + float ConfigurationConcrete::getSaturateRatio () const + { return _saturateRatio; } + + + DbU::Unit ConfigurationConcrete::getGlobalThreshold () const + { return _globalThreshold; } + + + void ConfigurationConcrete::setSaturateRatio ( float ratio ) + { _saturateRatio = ratio; } + + + void ConfigurationConcrete::setGlobalThreshold ( DbU::Unit threshold ) + { _globalThreshold = threshold; } + + + string ConfigurationConcrete::_getTypeName () const + { + return "ConfigurationConcrete"; + } + + + string ConfigurationConcrete::_getString () const + { + ostringstream os; + + os << "<" << _getTypeName() << " " << _rg->getName() << ">"; + + return os.str(); + } + + + Record* ConfigurationConcrete::_getRecord () const + { + Record* record = new Record ( _getString() ); + record->add ( getSlot ( "_rg" , _rg ) ); + record->add ( getSlot ( "_gmetalh" , _gmetalh ) ); + record->add ( getSlot ( "_gmetalv" , _gmetalv ) ); + record->add ( getSlot ( "_gcontact" , _gcontact ) ); + record->add ( getSlot ( "_saturateRatio" , _saturateRatio ) ); + record->add ( DbU::getValueSlot ( "_globalThreshold" , &_globalThreshold ) ); + + return ( record ); + } + + + +} // End of katabatic namespace. diff --git a/katabatic/src/GCell.cpp b/katabatic/src/GCell.cpp new file mode 100644 index 00000000..e9f2dc8c --- /dev/null +++ b/katabatic/src/GCell.cpp @@ -0,0 +1,999 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./GCell.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include +#include +#include +#include +#include + +#include "hurricane/Bug.h" +#include "hurricane/Warning.h" +#include "hurricane/Layer.h" +#include "hurricane/Horizontal.h" +#include "hurricane/Vertical.h" +#include "crlcore/RoutingGauge.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/GCell.h" +#include "katabatic/GCellGrid.h" +#include "katabatic/Session.h" + + +namespace Katabatic { + + + using namespace std; + using Hurricane::roundfp; + using Hurricane::tab; + using Hurricane::ltracein; + using Hurricane::ltraceout; + using Hurricane::inltrace; + using Hurricane::ForEachIterator; + using Hurricane::Warning; + using Hurricane::Bug; + using Hurricane::Horizontal; + using Hurricane::Vertical; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::GCell::CompareByDensity". + + + GCell::CompareByDensity::CompareByDensity ( unsigned int depth ) + : _depth(depth) + { } + + + bool GCell::CompareByDensity::operator() ( GCell* lhs, GCell* rhs ) + { + float difference = roundfp ( lhs->getDensity(_depth) - rhs->getDensity(_depth) ); + if ( difference != 0.0 ) return (difference > 0.0); + + //int difference = floatCompare ( lhs->getDensity(_depth), rhs->getDensity(_depth) ); + //if ( abs(difference) > 1000 ) return difference > 0; + + if ( lhs->getIndex() < rhs->getIndex() ) return true; + return false; + } + + +// ------------------------------------------------------------------- +// Class : "Katabatic::GCell". + + + const Name GCell::_goName = "Katabatic::GCell"; + DbU::Unit GCell::_topRightShrink = 0; + size_t GCell::_allocateds = 0; + + + GCell::GCell ( GCellGrid* gcellGrid, unsigned int index, const Box& box ) + : ExtensionGo (gcellGrid->getCell()) + , _gcellGrid (gcellGrid) + , _index (index) + , _vsegments () + , _hsegments () + , _contacts () + , _box (box) + , _depth (Session::getRoutingGauge()->getDepth()) + , _pinDepth (0) + , _blockages (new float [_depth]) + , _cDensity (0.0) + , _densities (new float [_depth]) + , _saturateDensities (new float [_depth]) + , _segmentCount (0) + , _routedSegmentCount(0) + , _saturated (false) + , _invalid (true) + { + for ( size_t i=0 ; i<_depth ; i++ ) { + _blockages [i] = 0.0; + _densities [i] = 0.0; + _saturateDensities[i] = 0.0; + + if ( Session::getRoutingGauge()->getLayerGauge(i)->getType() == Constant::PinOnly ) + ++_pinDepth; + } + + _allocateds++; + } + + + void GCell::_postCreate () + { + ltrace(90) << "GCell::_postCreate() - " << (void*)this << " " << this << endl; + ltracein(90); + + ExtensionGo::_postCreate (); + + ltraceout(90); + } + + + GCell* GCell::create ( GCellGrid* gcellGrid, unsigned int index, Box box ) + { + if ( !_topRightShrink ) + _topRightShrink = 1 /*DbU::lambda(0.0)*/; + + GCell* gcell = new GCell ( gcellGrid, index, box.inflate(0 + ,0 + ,-_topRightShrink + ,-_topRightShrink) ); + + gcell->_postCreate (); + + return gcell; + } + + + GCell::~GCell () + { + ltrace(90) << "GCell::~GCell()" << endl; + + delete [] _densities; + delete [] _saturateDensities; + + _allocateds--; + } + + + void GCell::_preDestroy () + { + ltrace(90) << "GCell::_preDestroy() - " << (void*)this << " " << this << endl; + ExtensionGo::_preDestroy (); + } + + + bool GCell::isSaturated ( unsigned int depth ) const + { return getDensity(depth) > Session::getSaturateRatio(); } + + + bool GCell::isAboveDensity ( float threshold ) const + { + if (_invalid) const_cast(this)->updateDensity(); + float difference = roundfp ( getDensity() - threshold ); + + //int difference = floatDifference(getDensity(),threshold,10000); + ltrace(190) << "GCell:isAboveDensity() " << threshold << " diff:" << difference << endl; + return (difference > 0.0); + } + + + bool GCell::areDensityConnex ( GCell* a, GCell* b ) + { + ltrace(190) << "GCell:areDensityConnex()" << endl; + + for ( unsigned int i=1 ; igetDepth() ; i++ ) { // Ugly: hard-coded skip METAL1. + //int highDiffa = floatDifference(a->_densities[i],0.6,10000); + //int highDiffb = floatDifference(b->_densities[i],0.6,10000); + + float highDiffa = roundfp ( a->_densities[i] - 0.6 ); + float highDiffb = roundfp ( b->_densities[i] - 0.6 ); + ltrace(190) << "Compare depth " << i + << " " << a->_densities[i] << "," << highDiffa + << " & " << b->_densities[i] << "," << highDiffb << endl; + + if ( (highDiffa > 0) and (highDiffb > 0) ) { + ltrace(190) << "GCell::areDensityConnex() Neighboring high saturated GCell (depth:" << i + << " " << a->_densities[i] << " & " << b->_densities[i] << ")" << endl; + return true; + } + } + return false; + } + + + void GCell::getDensities ( float* densities ) const + { + if (_invalid) const_cast(this)->updateDensity(); + + for ( unsigned int i=0 ; i<_depth ; i++ ) { + densities[i] = _densities[i]; + } + } + + + const Name& GCell::getStaticName () + { return _goName; } + + + size_t GCell::getAllocateds () + { return _allocateds; } + + + DbU::Unit GCell::getTopRightShrink () + { return _topRightShrink; } + + + const Name& GCell::getName () const + { return _goName; } + + + unsigned int GCell::getRow () const + { return _gcellGrid->getRow ( _index ); } + + + unsigned int GCell::getColumn () const + { return _gcellGrid->getColumn ( _index ); } + + + GCell* GCell::getLeft () const + { return getGCellGrid()->getGCellLeft(this); } + + + GCell* GCell::getRight () const + { return getGCellGrid()->getGCellRight(this); } + + + GCell* GCell::getUp () const + { return getGCellGrid()->getGCellUp(this); } + + + GCell* GCell::getDown () const + { return getGCellGrid()->getGCellDown(this); } + + + Interval GCell::getUSide ( unsigned int direction ) const + { + Interval side; + switch ( direction ) { + default: + case Constant::Horizontal: side = Interval(_box.getXMin(),_box.getXMax()); break; + case Constant::Vertical: side = Interval(_box.getYMin(),_box.getYMax()); break; + } + return side; + } + + + AutoSegments GCell::getHStartSegments () + { + return new AutoSegments_AnchorOnGCell (this,true,Constant::Horizontal); + } + + + AutoSegments GCell::getVStartSegments () + { + return new AutoSegments_AnchorOnGCell (this,true,Constant::Vertical); + } + + + AutoSegments GCell::getHStopSegments () + { + return new AutoSegments_AnchorOnGCell (this,false,Constant::Horizontal); + } + + + AutoSegments GCell::getVStopSegments () + { + return new AutoSegments_AnchorOnGCell (this,false,Constant::Vertical); + } + + + float GCell::getHCapacity () const + { + return (float)( _box.getHeight() / DbU::lambda(5.0) + 1 ); + } + + + float GCell::getVCapacity () const + { + return (float)( _box.getWidth () / DbU::lambda(5.0) + 1 ); + } + + + float GCell::getDensity ( bool update ) const + { + if (_invalid and update) const_cast(this)->updateDensity(); + + float density = 0.0; + for ( size_t i=0 ; i<_depth ; i++ ) + density += _densities[i]; + +#if defined(CHECK_DETERMINISM) + cerr << "Order: Sum density " << setprecision(9) << density << endl; + + density /= (float)(_depth-_pinDepth); + cerr << "Order: density " << setprecision(9) << density << endl; + + int intdensity = (int)roundfp(density); + cerr << "Order: rounded density *100 " << setprecision(9) << intdensity << endl; + + density = ((float)(intdensity)) / 100.0; + cerr << "Order: rounded density /100 " << setprecision(9) << density << endl; + + return density; +#else + return roundfp ( density/((float)(_depth-_pinDepth)) ); +#endif + } + + + float GCell::getMaxHVDensity ( bool update ) const + { + if (_invalid and update) const_cast(this)->updateDensity(); + + size_t hplanes = 0; + size_t vplanes = 0; + float hdensity = 0.0; + float vdensity = 0.0; + + for ( size_t i=0 ; i<_depth ; i++ ) { + if ( i%2 ) { hdensity += _densities[i]; ++hplanes; } + else { vdensity += _densities[i]; ++vplanes; } + } + + if (hplanes) hdensity /= hplanes; + if (vplanes) vdensity /= vplanes; + + return (hdensity > vdensity) ? hdensity : vdensity; + } + + + float GCell::getStiffness () const + { + if ( _segmentCount == 0 ) return 0.0; + return roundfp ( (float)_routedSegmentCount / (float)_segmentCount ); + } + + + void GCell::incSegmentCount ( int count ) + { + if ( (count < 0) and ((unsigned int)abs(count) > _segmentCount) ) + _segmentCount = 0; + else + _segmentCount += count; + } + + + void GCell::incRoutedCount ( int count ) + { + if ( (count < 0) and ((unsigned int)abs(count) > _routedSegmentCount) ) + _routedSegmentCount = 0; + else + _routedSegmentCount += count; + } + + + void GCell::addBlockage ( unsigned int depth, float length ) + { + if ( depth >= _depth ) return; + + _blockages[depth] += length; + _invalid = true; + + //cerr << "GCell:addBlockage() " + // << depth << ":" << _blockages[depth] << endl; + } + + + void GCell::removeContact ( AutoContact* ac ) + { + size_t begin = 0; + size_t end = _contacts.size(); + bool found = false; + + for ( ; not found and (begin < end) ; begin++ ) { + if ( _contacts[begin] == ac ) { + _contacts[begin] = _contacts[end-1]; + found = true; + } + } + + if (found) { + ltrace(200) << "remove " << (void*)ac->base() << ":" << ac + << " from " << this << endl; + _contacts.pop_back(); + } else { + cerr << Bug("%p:%s do not belong to %s." + ,ac->base(),getString(ac).c_str(),_getString().c_str()) << endl; + } + +#if 0 + vector::iterator it = _contacts.begin (); + vector::iterator end = _contacts.end (); + for ( ; it != end ; it++ ) + if ( *it == ac ) *it = *(--end); + _contacts.pop_back (); +#endif + } + + + void GCell::removeHSegment ( AutoSegment* segment ) + { + size_t end = _hsegments.size(); + size_t begin = 0; + + for ( ; begin < end ; begin++ ) { + if ( _hsegments[begin] == segment ) { + swap ( _hsegments[begin], _hsegments[--end] ); + } + } + + if ( _hsegments.size() == end ) { + cerr << Bug("%p %s do not go through %s." + ,(void*)segment + ,getString(segment).c_str() + ,_getString().c_str()) << endl; + return; + } + + if ( _hsegments.size() - end > 1 ) + cerr << Bug("%p %s has multiple occurrences of %s." + ,(void*)segment + ,_getString().c_str() + ,getString(segment).c_str()) << endl; + + _hsegments.erase ( _hsegments.begin() + end, _hsegments.end() ); + } + + + void GCell::removeVSegment ( AutoSegment* segment ) + { + size_t end = _vsegments.size(); + size_t begin = 0; + + for ( ; begin < end ; begin++ ) { + if ( _vsegments[begin] == segment ) { + swap ( _vsegments[begin], _vsegments[--end] ); + } + } + + if ( _vsegments.size() == end ) { + cerr << Bug("%p %s do not go through %s." + ,(void*)segment + ,getString(segment).c_str() + ,_getString().c_str()) << endl; + return; + } + + if ( _vsegments.size() - end > 1 ) + cerr << Bug("%p %s has multiple occurrences of %s." + ,(void*)segment + ,_getString().c_str() + ,getString(segment).c_str()) << endl; + + _vsegments.erase ( _vsegments.begin() + end, _vsegments.end() ); + } + + + void GCell::updateContacts () + { + vector::iterator it = _contacts.begin (); + vector::iterator end = _contacts.end (); + for ( ; it != end ; it++ ) (*it)->updateGeometry (); + } + + + size_t GCell::updateDensity () + { + if ( !_invalid ) return (_saturated) ? 1 : 0; + + _saturated = false; + + for ( size_t i=0 ; i<_vsegments.size() ; i++ ) { + if ( _vsegments[i] == NULL ) + cerr << "NULL Autosegment at index " << i << endl; + } + + sort ( _hsegments.begin(), _hsegments.end(), AutoSegment::CompareByDepthLength() ); + sort ( _vsegments.begin(), _vsegments.end(), AutoSegment::CompareByDepthLength() ); + +#if defined(CHECK_DETERMINISM) + cerr << "Order: Update density " << this << endl; + for ( size_t i=0 ; i<_hsegments.size() ; i++ ) cerr << "Order: " << _hsegments[i] << endl; + for ( size_t i=0 ; i<_vsegments.size() ; i++ ) cerr << "Order: " << _vsegments[i] << endl; +#endif + + float hcapacity = getHCapacity (); + float vcapacity = getVCapacity (); + float ccapacity = hcapacity * vcapacity * 4; + DbU::Unit hpenalty = 0 /*_box.getWidth () / 3*/; + DbU::Unit vpenalty = 0 /*_box.getHeight() / 3*/; + DbU::Unit uLengths1 [ _depth ]; + float fLengths1 [ _depth ]; + float fLengths2 [ _depth ]; + + for ( size_t i=0 ; i<_depth ; i++ ) { + fLengths1[i] = 0.0; + fLengths2[i] = 0.0; + } + + // Compute wirelength associated to contacts (in DbU::Unit converted to float). + set processeds; + vector::iterator it = _contacts.begin(); + vector::iterator end = _contacts.end (); + for ( ; it != end ; it++ ) { + for ( size_t i=0 ; i<_depth ; i++ ) uLengths1[i] = 0; + (*it)->getLengths ( uLengths1, processeds ); + for ( size_t i=0 ; i<_depth ; i++ ) { + fLengths1[i] += (float)uLengths1[i]; + switch ( Session::getRoutingGauge()->getLayerDirection(i) ) { + case Constant::Horizontal: fLengths2[i] += (float)(uLengths1[i]+hpenalty); break; + case Constant::Vertical: fLengths2[i] += (float)(uLengths1[i]+vpenalty); break; + } + } + } + + // Transform the wirelength in density (divide by track length, one + // occupied track count for "one"). + for ( size_t i=0 ; i<_depth ; i++ ) { + switch ( Session::getRoutingGauge()->getLayerDirection(i) ) { + case Constant::Horizontal: + fLengths1[i] /= (float)_box.getWidth (); + fLengths2[i] /= (float)_box.getWidth (); + break; + case Constant::Vertical: + fLengths1[i] /= (float)_box.getHeight(); + fLengths2[i] /= (float)_box.getHeight(); + break; + } + } + + // Add the "pass through" horizontal segments. + if ( _hsegments.size() ) { + const Layer* layer = _hsegments[0]->getLayer(); + size_t depth = Session::getRoutingGauge()->getLayerDepth(layer); + size_t count = 0; + for ( size_t i=0 ; i<_hsegments.size() ; i++ ) { + if ( layer != _hsegments[i]->getLayer() ) { + fLengths1[depth] += (float)count; + fLengths2[depth] += (float)count; + + count = 0; + layer = _hsegments[i]->getLayer(); + depth = Session::getRoutingGauge()->getLayerDepth(layer); + } + count++; + } + if ( count ) { + fLengths1[depth] += (float)count; + fLengths2[depth] += (float)count; + } + } + + // Add the "pass through" vertical segments. + if ( _vsegments.size() ) { + const Layer* layer = _vsegments[0]->getLayer(); + size_t depth = Session::getRoutingGauge()->getLayerDepth(layer); + size_t count = 0; + for ( size_t i=0 ; i<_vsegments.size() ; i++ ) { + if ( layer != _vsegments[i]->getLayer() ) { + fLengths1[depth] += (float)count; + fLengths2[depth] += (float)count; + + count = 0; + layer = _vsegments[i]->getLayer(); + depth = Session::getRoutingGauge()->getLayerDepth(layer); + } + count++; + } + if ( count ) { + fLengths1[depth] += (float)count; + fLengths2[depth] += (float)count; + } + } + + // Add the blockages. + for ( size_t i=0 ; i<_depth ; i++ ) { + fLengths1[i] += _blockages[i]; + fLengths2[i] += _blockages[i]; + } + + // Normalize: 0 < d < 1.0 (divide by H/V capacity). + for ( size_t i=0 ; i<_depth ; i++ ) { + switch ( Session::getRoutingGauge()->getLayerDirection(i) ) { + case Constant::Horizontal: + fLengths1[i] /= hcapacity; + fLengths2[i] /= hcapacity; + break; + case Constant::Vertical: + fLengths1[i] /= vcapacity; + fLengths2[i] /= vcapacity; + break; + } + if ( fLengths1[i] > 1.0 ) { + _saturated = true; + //fLengths[i] = 1.0; + } + _densities [i] = fLengths1[i]; + _saturateDensities[i] = fLengths2[i]; + } + + _cDensity = ( (float)_contacts.size() ) / ccapacity; + _invalid = false; + + for ( size_t i=0 ; i<_depth ; i++ ) { + _densities [i] = roundfp ( _densities [i] ); + _saturateDensities[i] = roundfp ( _saturateDensities[i] ); + } + _cDensity = roundfp (_cDensity ); + + checkDensity (); + +#if defined(CHECK_DETERMINISM) + float gdensity = getDensity(); + cerr << "Order: [" << getIndex() << "] " + << getVectorString(_densities,_depth) + << " " << setprecision(9) << gdensity << endl; +#endif + + //_segmentCount = _hsegments.size() + _vsegments.size() + processeds.size(); + + return ( _saturated ) ? 1 : 0 ; + } + + + size_t GCell::checkDensity () const + { + if ( _invalid ) const_cast(this)->updateDensity (); + + if ( !Session::getDemoMode() && Session::getWarnGCellOverload() ) { + for ( size_t i=0 ; i<_depth ; i++ ) { + if ( _densities[i] > 1.0 ) { + cerr << Warning("%s @%dx%d overloaded in %s (M2:%.2f M3:%.2f M4:%.2f M5:%.2f)" + ,_getString().c_str() + ,getColumn() + ,getRow() + ,getString(Session::getRoutingGauge()->getRoutingLayer(i)->getName()).c_str() + ,_densities[1] + ,_densities[2] + ,_densities[3] + ,_densities[4] + ) + << endl; + } + } + } + + return ( _saturated ) ? 1 : 0 ; + } + + + bool GCell::hasFreeTrack ( size_t depth ) const + { + if (_invalid) const_cast(this)->updateDensity(); + +#if DEPRECATED + float capacity; + vector::const_iterator isegment; + vector::const_iterator iend; + + switch ( Session::getRoutingGauge()->getLayerDirection(depth) ) { + case Constant::Horizontal: + iend = _hsegments.end (); + isegment = _hsegments.begin (); + capacity = getHCapacity (); + break; + case Constant::Vertical: + iend = _vsegments.end (); + isegment = _vsegments.begin (); + capacity = getVCapacity (); + break; + } + + size_t count = 0; + for ( ; (isegment != iend) ; isegment++ ) { + unsigned int segmentDepth = Session::getRoutingGauge()->getLayerDepth((*isegment)->getLayer()); + if ( segmentDepth < depth ) continue; + if ( segmentDepth > depth ) break; + count++; + } + + return (capacity - 1.0) >= (float)count; +#endif + + float capacity = 0.0; + switch ( Session::getRoutingGauge()->getLayerDirection(depth) ) { + case Constant::Horizontal: capacity = getHCapacity(); break; + case Constant::Vertical: capacity = getVCapacity(); break; + } + + ltrace(200) << "| hasFreeTrack [" << getIndex() << "] depth:" << depth << " " + << Session::getRoutingGauge()->getRoutingLayer(depth)->getName() + << " " << (_saturateDensities[depth]*capacity) << " vs. " << capacity + << endl; + + return (_saturateDensities[depth]*capacity + 1.0 <= capacity); + } + + + bool GCell::stepDesaturate ( unsigned int depth, set& globalNets ) + { +#if defined(CHECK_DETERMINISM) + cerr << "Order: stepDesaturate [" << getIndex() << "] depth:" << depth << endl; +#endif + + updateDensity (); + + //float density = _densities[depth]; + //float densityUp = _densities[depth+2]; + + if ( !isSaturated(depth) ) return false; + + float capacity; + vector::iterator isegment; + vector::iterator iend; + + switch ( Session::getRoutingGauge()->getLayerDirection(depth) ) { + case Constant::Horizontal: + iend = _hsegments.end (); + isegment = _hsegments.begin (); + capacity = getHCapacity (); + break; + case Constant::Vertical: + iend = _vsegments.end (); + isegment = _vsegments.begin (); + capacity = getVCapacity (); + break; + } + + for ( ; (isegment != iend) ; isegment++ ) { + unsigned int segmentDepth = Session::getRoutingGauge()->getLayerDepth((*isegment)->getLayer()); + + if ( segmentDepth < depth ) continue; + if ( segmentDepth > depth ) break; + + globalNets.insert ( (*isegment)->getNet() ); +#if defined(CHECK_DETERMINISM) + cerr << "Order: Move up " << (*isegment) << endl; +#endif + //cerr << "Move up " << (*isegment) << endl; + (*isegment)->changeDepth ( depth+2, false, false ); + + updateDensity (); + + return true; + } + + return false; + } + + + void GCell::desaturate ( unsigned int depth, set& globalNets ) + { + updateDensity (); + + float density = _densities[depth]; + float densityUp = _densities[depth+2]; + + if ( density < Session::getSaturateRatio() ) return; + + float capacity; + vector::iterator isegment; + vector::iterator iend; + + switch ( Session::getRoutingGauge()->getLayerDirection(depth) ) { + case Constant::Horizontal: + iend = _hsegments.end (); + isegment = _hsegments.begin (); + capacity = getHCapacity (); + break; + default: + case Constant::Vertical: + iend = _vsegments.end (); + isegment = _vsegments.begin (); + capacity = getHCapacity (); + break; + } + + unsigned int overload = (unsigned int)( ( density - Session::getSaturateRatio() ) * capacity ); + unsigned int displaced = 0; + + for ( ; (isegment != iend) && (displaced < overload) ; isegment++ ) { + unsigned int segmentDepth = Session::getRoutingGauge()->getLayerDepth((*isegment)->getLayer()); + + if ( segmentDepth < depth ) continue; + if ( segmentDepth > depth ) break; + + globalNets.insert ( (*isegment)->getNet() ); + (*isegment)->changeDepth ( depth+2, false, false ); + + displaced++; + } + + float desaturated = density - ((float)(displaced)) / capacity; + + cmess2 << " - GCell [" << getIndex() << "] @" << getColumn() << "x" << getRow() + << ":" << setprecision(4) << density + << " -> " << desaturated + << " [displaced:" << displaced + << " cap:" << capacity + << " M+2: " << densityUp + << " -> " << (densityUp + ((float)(displaced)) / capacity) << "]." + << endl; + } + + + bool GCell::checkEdgeSaturation ( float threshold ) const + { + unsigned int edgeUpUsage = 0; + unsigned int edgeRightUsage = 0; + float edgeUpSaturation = 0.0; + float edgeRightSaturation = 0.0; + + if ( getUp() ) { + // Up Edge Density. + edgeUpUsage = _vsegments.size(); + for ( size_t icontact=0 ; icontact < _contacts.size() ; icontact++ ) { + forEach ( Hook*, ihook, _contacts[icontact]->getBodyHook()->getSlaveHooks() ) { + if ( dynamic_cast(*ihook) == NULL ) continue; + + Segment* segment = dynamic_cast((*ihook)->getComponent()); + if ( not segment ) continue; + + AutoSegment* autoSegment = Session::lookup ( segment ); + if ( not autoSegment or autoSegment->isLocal() ) continue; + + edgeUpUsage++; + } + } + edgeUpSaturation = (float)edgeUpUsage/((float)getVCapacity()*2.0); + } + + if ( getRight() ) { + // Right Edge Density. + edgeRightUsage = _vsegments.size(); + for ( size_t icontact=0 ; icontact < _contacts.size() ; icontact++ ) { + forEach ( Hook*, ihook, _contacts[icontact]->getBodyHook()->getSlaveHooks() ) { + if ( dynamic_cast(*ihook) == NULL ) continue; + + Segment* segment = dynamic_cast((*ihook)->getComponent()); + if ( not segment ) continue; + + AutoSegment* autoSegment = Session::lookup ( segment ); + if ( not autoSegment or autoSegment->isLocal() ) continue; + + edgeRightUsage++; + } + } + edgeRightSaturation = (float)edgeRightUsage/((float)getHCapacity()*2.0); + } + + bool overload = false; + if ( (edgeUpSaturation > threshold) or (edgeRightSaturation > threshold) ) { + overload = true; + + cerr << Warning("In %s, (over %.2f) ", _getString().c_str(), threshold); + + ostringstream message; + message << setprecision(3); + if ( edgeUpSaturation > threshold ) + message << "up edge: " << edgeUpUsage << "/" << (getVCapacity()*2.0) + << " " << edgeUpSaturation; + if ( edgeRightSaturation > threshold ) { + if ( message.str().size() ) message << " & "; + message << "right edge: " << edgeRightUsage << "/" << (getVCapacity()*2.0) + << " " << edgeRightSaturation; + } + + cerr << message.str() << "." << endl; + } + + return overload; + } + + + Box GCell::getBoundingBox () const + { + return _box; + } + + + void GCell::translate ( const DbU::Unit&, const DbU::Unit& ) + { + cerr << Warning("Calling GCell::translate() on %s is likely a bug." + ,_getString().c_str()) << endl; + } + + + string GCell::_getString () const + { + Box box = getBoundingBox (); + + ostringstream s; + s << "<" << _getTypeName() << " [" << _index << "] " + << DbU::getValueString(box.getXMin()) << ":" << DbU::getValueString(box.getYMin()) << " " + << DbU::getValueString(box.getXMax()) << ":" << DbU::getValueString(box.getYMax()) << " " + << setprecision(9) +#if not defined(CHECK_DETERMINISM) + << getDensity(false) +#endif + << " S:" << _routedSegmentCount << "/" << _segmentCount + << ">"; + + return s.str(); + } + + + Record* GCell::_getRecord () const + { + Record* record = new Record ( _getString() ); + record->add ( getSlot ( "_gcellGrid" , _gcellGrid ) ); + record->add ( getSlot ( "_index" , &_index ) ); + record->add ( getSlot ( "_vsegments" , &_vsegments ) ); + record->add ( getSlot ( "_hsegments" , &_hsegments ) ); + record->add ( getSlot ( "_contacts" , &_contacts ) ); + record->add ( getSlot ( "_box" , &_box ) ); + record->add ( getSlot ( "_depth" , &_depth ) ); + record->add ( getSlot ( "_saturated" , _saturated ) ); + record->add ( getSlot ( "_segmentCount" , _segmentCount ) ); + record->add ( getSlot ( "_routedSegmentCount", _routedSegmentCount ) ); + record->add ( getSlot ( "_invalid" , _invalid ) ); + + for ( size_t depth=0 ; depth<_depth ; ++depth ) { + record->add ( getSlot ( "_blockages[]", &_blockages[depth] ) ); + } + + for ( size_t depth=0 ; depth<_depth ; ++depth ) { + record->add ( getSlot ( "_densities[]", &_densities[depth] ) ); + } + + for ( size_t depth=0 ; depth<_depth ; ++depth ) { + record->add ( getSlot ( "_saturateDensities[]", &_saturateDensities[depth] ) ); + } + + return record; + } + + + void GCell::_xmlWrite ( ostream& o ) const + { + char line[1024]; + + snprintf ( line, 1024 + , "" + , getColumn() + , getRow() + , DbU::getLambda(getX()) + , DbU::getLambda(getY()) + , getDensity() + , _cDensity + ); + + o << line; + } + + +// ------------------------------------------------------------------- +// Utilities. + + + string getVectorString ( float* v, size_t size ) + { + ostringstream s; + + s << setprecision(9); + for ( size_t i=0 ; i() + , _katabatic(ktbt) + { } + + + void GCellGrid::_postCreate () + { + KnikEngine::KnikEngine* knik; + knik = KnikEngine::get ( getCell() ); + if ( !knik ) + throw Error ( missingKnikEngine, "GCellGrid::_postCreate()", getString(getCell()).c_str() ); + + vector knikGraduations; + + knik->getHorizontalCutLines ( knikGraduations ); + for ( size_t i=0 ; igetVerticalCutLines ( knikGraduations ); + for ( size_t i=0 ; i_postCreate (); + return grid; + } + + + GCellGrid::~GCellGrid () + { } + + + void GCellGrid::_preDestroy () + { + ltrace(90) << "GCellGrid::_preDestroy()" << endl; + ltracein(90); + + vector::iterator it = _gcells.begin(); + vector::iterator end = _gcells.end (); + for ( ; it != end ; it++ ) (*it)->destroy (); + + ltraceout(90); + } + + + Cell* GCellGrid::getCell () const + { + return _katabatic->getCell(); + } + + + void GCellGrid::updateContacts ( bool openSession ) + { + if ( openSession ) Session::open ( _katabatic ); + + forEach ( GCell*, gcell, getGCells() ) + gcell->updateContacts (); + + if ( openSession ) Session::close (); + } + + + size_t GCellGrid::updateDensity () + { + size_t saturateds = 0; + forEach ( GCell*, gcell, getGCells() ) { + saturateds += gcell->updateDensity (); + } + return saturateds; + } + + + size_t GCellGrid::checkDensity () const + { + size_t saturateds = 0; + forEach ( GCell*, gcell, const_cast(this)->getGCells() ) { + saturateds += gcell->checkDensity (); + } + return saturateds; + } + + + bool GCellGrid::checkEdgeSaturation ( float threshold ) const + { + bool overload = false; + forEach ( GCell*, gcell, const_cast(this)->getGCells() ) { + overload = gcell->checkEdgeSaturation(threshold) or overload; + } + return overload; + } + + + string GCellGrid::_getTypeName () const + { + return _TName("GCellGrid"); + } + + + string GCellGrid::_getString () const + { + return "<" + _getTypeName() + " " + + getString(getRows()) + "x" + getString(getColumns()) + ">"; + } + + + void GCellGrid::_xmlWrite ( ostream& o ) + { + updateDensity (); + + o << "getName() << "\">" << endl; + o << "" << endl; + o << "" << endl; + + unsigned int row = 0; + forEach ( GCell*, gcell, getGCells() ) { + if ( gcell->getRow() > row ) { + o << endl; + o << "" << endl; + row = gcell->getRow(); + } + + o << " "; gcell->_xmlWrite ( o ); o << endl; + } + + o << "" << endl; + } + + + Record* GCellGrid::_getRecord () const + { + Record* record = Grid::_getRecord (); + record->add ( getSlot ( "_katabatic", _katabatic ) ); + return record; + } + + + +} // End of Katabatic namespace. diff --git a/katabatic/src/GraphicKatabaticEngine.cpp b/katabatic/src/GraphicKatabaticEngine.cpp new file mode 100644 index 00000000..55a5d4b3 --- /dev/null +++ b/katabatic/src/GraphicKatabaticEngine.cpp @@ -0,0 +1,229 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul Chaput | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./GraphicKatabaticEngine.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +namespace Katabatic { + + + using namespace std; + using Hurricane::Error; + using Hurricane::Warning; + using Hurricane::Breakpoint; + using Hurricane::DebugSession; + using Hurricane::Net; + using Hurricane::Graphics; + using Hurricane::ColorScale; + using CRL::AllianceFramework; + + + size_t GraphicKatabaticEngine::_references = 0; + GraphicKatabaticEngine* GraphicKatabaticEngine::_singleton = NULL; + + + void GraphicKatabaticEngine::initKatabaticAc ( CellWidget* widget ) + { + //cerr << "GraphicKatabaticEngine::initKatabaticGo()" << endl; + } + + + void GraphicKatabaticEngine::drawKatabaticAc ( CellWidget* widget + , const Go* go + , const BasicLayer* basicLayer + , const Box& box + , const Transformation& transformation + ) + { } + + + void GraphicKatabaticEngine::initKatabaticGCell ( CellWidget* widget ) + { + widget->getDrawingPlanes().setPen ( Qt::NoPen ); + } + + + void GraphicKatabaticEngine::drawKatabaticGCell ( CellWidget* widget + , const Go* go + , const BasicLayer* basicLayer + , const Box& box + , const Transformation& transformation + ) + { + const GCell* gcell = static_cast(go); + + QPainter& painter = widget->getPainter(); + painter.setBrush + ( Graphics::getColorScale(ColorScale::Fire).getBrush((size_t)(gcell->getMaxHVDensity()*255.0) + ,widget->getDarkening()) ); + painter.drawRect ( widget->dbuToDisplayRect(gcell->getBoundingBox()) ); + } + + + KatabaticEngine* GraphicKatabaticEngine::create ( const RoutingGauge* rg, Cell* cell ) + { + KatabaticEngine* ktbt = KatabaticEngine::get ( cell ); + if ( !ktbt ) + ktbt = KatabaticEngine::create ( rg, cell ); + else + cerr << Warning("%s already has a Katabatic engine.",getString(cell).c_str()) << endl; + + return ktbt; + } + + + void GraphicKatabaticEngine::run () + { + static vector routingNets; + + emit cellPreModificated (); + + AllianceFramework* af = AllianceFramework::get (); + KatabaticEngine* ktbt = create ( af->getRoutingGauge(), _viewer->getCell() ); + + //DebugSession::addToTrace ( _viewer->getCell(), "sel" ); + + ktbt->loadGlobalRouting ( LoadGrByNet, routingNets ); + emit cellPostModificated (); + + //Breakpoint::stop ( 0, "Point d'arret:
      LayerAssingByTrunk()
    " + // "Assignment des layers, methode globale." ); + emit cellPreModificated (); + ktbt->layerAssign ( LayerAssignByTrunk ); + emit cellPostModificated (); + + //throw ( "Rend-toi t'est cerné" ); + } + + + void GraphicKatabaticEngine::closeRoute () + { + emit cellPreModificated (); + KatabaticEngine* ktbt = KatabaticEngine::get ( _viewer->getCell() ); + + ktbt->destroy (); + emit cellPostModificated (); + } + + + void GraphicKatabaticEngine::addToMenu ( CellViewer* viewer ) + { + assert ( _viewer == NULL ); + + _viewer = viewer; + + QMenu* prMenu = _viewer->findChild("viewer.menuBar.placeAndRoute"); + if ( !prMenu ) { + QMenuBar* menuBar = _viewer->findChild("viewer.menuBar"); + if ( !menuBar ) { + cerr << Warning("GraphicKatabaticEngine::addToMenu() - No MenuBar in parent widget.") << endl; + return; + } + prMenu = menuBar->addMenu ( tr("P&&R") ); + prMenu->setObjectName ( "viewer.menuBar.placeAndRoute" ); + } + + QAction* fRouteAction = _viewer->findChild("viewer.menuBar.placeAndRoute.finalRoute"); + if ( fRouteAction ) + cerr << Warning("GraphicKatabaticEngine::addToMenu() - Katabatic final router already hooked in.") << endl; + else { + fRouteAction = new QAction ( tr("Katabatic - &Final Route"), _viewer ); + fRouteAction->setObjectName ( "viewer.menuBar.placeAndRoute.finalRoute" ); + fRouteAction->setStatusTip ( tr("Run the Katabatic final router") ); + fRouteAction->setVisible ( true ); + prMenu->addAction ( fRouteAction ); + + QAction* fCloseRouteAction = new QAction ( tr("Close Routing"), _viewer ); + fCloseRouteAction->setObjectName ( "viewer.menuBar.placeAndRoute.closeRoute" ); + fCloseRouteAction->setStatusTip ( tr("Closing Routing") ); + fCloseRouteAction->setVisible ( true ); + prMenu->addAction ( fCloseRouteAction ); + + connect ( fCloseRouteAction, SIGNAL(triggered()), this, SLOT(closeRoute()) ); + connect ( fRouteAction , SIGNAL(triggered()), this, SLOT(run()) ); + } + + connect ( this, SIGNAL(cellPreModificated ()), _viewer->getCellWidget(), SLOT(cellPreModificate ()) ); + connect ( this, SIGNAL(cellPostModificated()), _viewer->getCellWidget(), SLOT(cellPostModificate()) ); + } + + + const Name& GraphicKatabaticEngine::getName () const + { + return KatabaticEngine::staticGetName (); + } + + + GraphicKatabaticEngine* GraphicKatabaticEngine::grab () + { + if ( !_references ) { + _singleton = new GraphicKatabaticEngine (); + } + _references++; + + return _singleton; + } + + + size_t GraphicKatabaticEngine::release () + { + _references--; + if ( !_references ) { + delete _singleton; + _singleton = NULL; + } + return _references; + } + + + GraphicKatabaticEngine::GraphicKatabaticEngine () + : GraphicTool() + , _viewer(NULL) + { + addDrawGo ( "Katabatic::Ac" , initKatabaticAc , drawKatabaticAc ); + addDrawGo ( "Katabatic::GCell", initKatabaticGCell, drawKatabaticGCell ); + } + + + GraphicKatabaticEngine::~GraphicKatabaticEngine () + { } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/Grid.cpp b/katabatic/src/Grid.cpp new file mode 100644 index 00000000..1da6c3c2 --- /dev/null +++ b/katabatic/src/Grid.cpp @@ -0,0 +1,134 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./Grid.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +# include +# include +# include + +# include "katabatic/Grid.h" + + +namespace Katabatic { + + + using namespace std; + using namespace Hurricane; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::BaseGrid::Axis". + + + void BaseGrid::Axis::sort () + { + std::sort ( _graduations.begin(), _graduations.end() ); + } + + + unsigned int BaseGrid::Axis::getGraduationNumber ( DbU::Unit position, bool& onGraduation ) const + { + vector::const_iterator it = lower_bound ( _graduations.begin() + , _graduations.end() + , position+1 + ); + unsigned int index = distance ( _graduations.begin(), it ) - 1; + + onGraduation = ( _graduations[index] == position ); + + return index; + } + + + string BaseGrid::Axis::_getString () const + { + return "<" + _getTypeName() + " [" + + DbU::getValueString(_graduations.front()) + ":" + + DbU::getValueString(_graduations.back() ) + "] " + + getString(getSize()) + ">"; + } + + + string BaseGrid::Axis::_print () const + { + string repr = "["; + + vector::const_iterator it = _graduations.begin(); + vector::const_iterator end = _graduations.end(); + for ( ; it != end ; it++ ) { + repr += DbU::getValueString(*it); + if ( it+1 != end ) repr += ","; + } + repr += "]"; + + return repr; + } + + + Record* BaseGrid::Axis::_getRecord () const + { + Record* record = new Record ( _getString() ); + record->add ( getSlot ( "_graduations", &_graduations ) ); + + return record; + } + + +// ------------------------------------------------------------------- +// Class : "Katabatic::BaseGrid::Axis". + + + BaseGrid::BaseGrid () : _xGraduations() + , _yGraduations() + , _rows(0) + , _columns(0) + , _rawSize(0) + { } + + + void BaseGrid::_postCreate () + { } + + + BaseGrid::~BaseGrid () + { } + + + void BaseGrid::_preDestroy () + { } + + + Record* BaseGrid::_getRecord () const + { + Record* record = new Record ( _getString() ); + record->add ( getSlot ( "_xGraduations", &_xGraduations ) ); + record->add ( getSlot ( "_yGraduations", &_yGraduations ) ); + record->add ( getSlot ( "_rows" , &_rows ) ); + record->add ( getSlot ( "_columns" , &_columns ) ); + record->add ( getSlot ( "_rawSize" , &_rawSize ) ); + return record; + } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/KatabaticEngine.cpp b/katabatic/src/KatabaticEngine.cpp new file mode 100644 index 00000000..543755f3 --- /dev/null +++ b/katabatic/src/KatabaticEngine.cpp @@ -0,0 +1,913 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./KatabaticEngine.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include +#include + +#include "hurricane/DebugSession.h" +#include "hurricane/Bug.h" +#include "hurricane/Error.h" +#include "hurricane/Warning.h" +#include "hurricane/DataBase.h" +#include "hurricane/Technology.h" +#include "hurricane/Layer.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/NetExternalComponents.h" +#include "hurricane/Cell.h" + +#include "crlcore/Utilities.h" +#include "crlcore/AllianceFramework.h" + +#include "katabatic/Session.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/GCell.h" +#include "katabatic/GCellGrid.h" +#include "katabatic/KatabaticEngine.h" + + +namespace { + + using namespace Hurricane; + + + struct NetCompareByName { + inline bool operator() ( const Net* lhs, const Net* rhs ) const; + }; + + inline bool NetCompareByName::operator() ( const Net* lhs, const Net* rhs ) const + { + return lhs->getName() < rhs->getName(); + } + + + bool isTopAndBottomConnected ( Segment* segment, set& layers ) + { + ltrace(88) << "* Potential Null Length: " << segment << endl; + ltracein(88); + + Contact* source = dynamic_cast(segment->getSource()); + Contact* target = dynamic_cast(segment->getTarget()); + + layers.clear (); + + if ( source ) { + forEach ( Hook*, ihook, source->getBodyHook()->getSlaveHooks() ) { + ltrace(88) << "* Slave: " << (*ihook)->getComponent() << endl; + if ( (*ihook)->getComponent() == segment ) continue; + layers.insert ( (*ihook)->getComponent()->getLayer() ); + } + } + + if ( target ) { + forEach ( Hook*, ihook, target->getBodyHook()->getSlaveHooks() ) { + ltrace(88) << "* Slave: " << (*ihook)->getComponent() << endl; + if ( (*ihook)->getComponent() == segment ) continue; + layers.insert ( (*ihook)->getComponent()->getLayer() ); + } + } + + size_t supplemental = (layers.find(segment->getLayer()) == layers.end()) ? 1 : 0; + if ( source->getAnchor() || target->getAnchor() ) supplemental++; + +#if 0 + bool bottomConnect = false; + bool topConnect = false; + + if ( source ) { + if ( segment->getLayer() != source->getLayer() ) { + if ( source->getLayer()->getTop() == segment->getLayer() ) { + bottomConnect = true; + ltrace(88) << "Source bottom connected: " << source << endl; + } else { + topConnect = true; + ltrace(88) << "Source top connected: " << source << endl; + } + } + forEach ( Hook*, ihook, source->getBodyHook()->getSlaveHooks() ) { + ltrace(88) << "* Slave: " << (*ihook)->getComponent() << endl; + if ( (*ihook)->getComponent() == segment ) continue; + if ( (*ihook)->getComponent()->getLayer() == segment->getLayer() ) { + if ( bottomConnect ) topConnect = true; + else bottomConnect = true; + break; + } + } + } + + if ( target ) { + if ( segment->getLayer() != target->getLayer() ) { + if ( target->getLayer()->getTop() == segment->getLayer() ) { + bottomConnect = true; + ltrace(88) << "Target bottom connected: " << target << endl; + } else { + topConnect = true; + ltrace(88) << "Target top connected: " << target << endl; + } + } + forEach ( Hook*, ihook, target->getBodyHook()->getSlaveHooks() ) { + ltrace(88) << "* Slave: " << (*ihook)->getComponent() << endl; + if ( (*ihook)->getComponent() == segment ) continue; + if ( (*ihook)->getComponent()->getLayer() == segment->getLayer() ) { + if ( bottomConnect ) topConnect = true; + else bottomConnect = true; + break; + } + } + } +#endif + + ltraceout(88); + + //return topConnect && bottomConnect; + return layers.size()+supplemental > 2; + } + + +} // End of anonymous namespace. + + +namespace Katabatic { + + + using namespace std; + + using Hurricane::tab; + using Hurricane::ltracein; + using Hurricane::ltraceout; + using Hurricane::inltrace; + using Hurricane::DebugSession; + using Hurricane::ForEachIterator; + using Hurricane::Bug; + using Hurricane::Error; + using Hurricane::Warning; + using Hurricane::DataBase; + using Hurricane::Technology; + using Hurricane::Layer; + using Hurricane::BasicLayer; + using Hurricane::NetExternalComponents; + using CRL::AllianceFramework; + + +// ------------------------------------------------------------------- +// Global Variables. + + + const char* missingKTBT = + "%s :\n\n" + " Cell %s do not have any Katabatic (or not yet created).\n"; + + const char* badMethod = + "%s :\n\n" + " No method id %ud (Cell %s).\n"; + + const char* lookupFailed = + "Katabatic::Extension::getDatas(Segment*) :\n\n" + " Cannot find AutoSegment associated to %s (internal error).\n"; + + + +// ------------------------------------------------------------------- +// Class : "Katabatic::KatabaticEngine". + + + Name KatabaticEngine::_toolName = "Katabatic"; + + + KatabaticEngine* KatabaticEngine::get ( const Cell* cell ) + { + return static_cast(ToolEngine::get(cell,staticGetName())); + } + + + const Name& KatabaticEngine::staticGetName () + { + return _toolName; + } + + + const Name& KatabaticEngine::getName () const + { + return _toolName; + } + + + KatabaticEngine::KatabaticEngine ( const RoutingGauge* gauge, Cell* cell ) + : ToolEngine (cell) + , _timer () + , _state (StateCreation) + , _destroyBaseContact(true) + , _destroyBaseSegment(false) + , _demoMode (false) + , _warnGCellOverload (false) + , _configuration (gauge) + , _gcellGrid (NULL) + , _routingNets () + { } + + + void KatabaticEngine::_postCreate () + { + ToolEngine::_postCreate (); + } + + + void KatabaticEngine::createDetailedGrid () + { + _gcellGrid = GCellGrid::create ( this ); + Session::revalidate (); + } + + + KatabaticEngine* KatabaticEngine::create ( const RoutingGauge* gauge, Cell* cell ) + { + ltrace(90) << "KatabaticEngine::create() - " << cell << endl; + + KatabaticEngine* katabatic = new KatabaticEngine ( gauge, cell ); + + katabatic->_postCreate (); + + return katabatic; + } + + + KatabaticEngine::~KatabaticEngine () + { } + + + void KatabaticEngine::_preDestroy () + { + ltrace(90) << "Katabatic::_preDestroy ()" << endl; + ltracein(90); + + if ( getState() < Katabatic::StateGutted ) + setState ( Katabatic::StatePreDestroying ); + + _gutKatabatic (); + _state = StateGutted; + + ltrace(89) << "About to delete base class ToolEngine." << endl; + ToolEngine::_preDestroy (); + + ltrace(89) << "Exiting Katabatic::_preDestroy()." << endl; + ltraceout(90); + + cmess2 << " - GCells := " << GCell::getAllocateds() << endl; + cmess2 << " - AutoContacts := " << AutoContact::getAllocateds() << endl; + cmess2 << " - AutoSegments := " << AutoSegment::getAllocateds() << endl; + cmess2 << " - SegmentEnds := " << AutoContact::getSegmentEndAllocateds() << endl; + } + + + void KatabaticEngine::_gutKatabatic () + { + Session::open ( this ); + + _destroyBaseContact = false; + _destroyBaseSegment = false; + + if ( _state == StateDriving ) { + ltracein(90); + ltrace(90) << "Saving AutoContacts/AutoSegments." << endl; + + cmess1 << " o Driving Hurricane data-base." << endl; + cmess1 << " - AutoSegments := " << AutoSegment::getAllocateds() << endl; + cmess1 << " - AutoContacts := " << AutoContact::getAllocateds() << endl; + + forEach ( Net*, inet, _cell->getNets() ) + _saveNet ( *inet ); + + //_autoContactLut.clear (); + + ltraceout(90); + } + + if ( _state < StateGutted ) { + ltrace(90) << "Gutting Katabatic." << endl; + _state = StateGutted; + _destroyBaseContact = true; + + _destroyAutoSegments (); + _destroyAutoContacts (); + + if ( _gcellGrid ) { + _gcellGrid->destroy (); + _gcellGrid = NULL; + } + } + + Session::close (); + } + + + AutoSegment* KatabaticEngine::_lookup ( Segment* segment ) const + { + AutoSegmentLut::const_iterator it = _autoSegmentLut.find ( segment ); + if ( it == _autoSegmentLut.end() ) return NULL; + + return (*it).second; + } + + + void KatabaticEngine::_link ( AutoSegment* autoSegment ) + { + if ( _state > StateActive ) return; + _autoSegmentLut [ autoSegment->getSegment() ] = autoSegment; + } + + + void KatabaticEngine::_unlink ( AutoSegment* autoSegment ) + { + if ( _state > StateDriving ) return; + + AutoSegmentLut::iterator it = _autoSegmentLut.find ( autoSegment->getSegment() ); + if ( it != _autoSegmentLut.end() ) + _autoSegmentLut.erase ( it ); + } + + + AutoContact* KatabaticEngine::_lookup ( Contact* contact ) const + { + AutoContactLut::const_iterator it = _autoContactLut.find ( contact ); + if ( it == _autoContactLut.end() ) { + return NULL; + } + return (*it).second; + } + + + void KatabaticEngine::_link ( AutoContact* autoContact ) + { + if ( _state > StateActive ) return; + _autoContactLut [ autoContact->base() ] = autoContact; + } + + + void KatabaticEngine::_unlink ( AutoContact* autoContact ) + { + if ( _state > StateActive ) return; + + AutoContactLut::iterator it = _autoContactLut.find ( autoContact->getContact() ); + if ( it != _autoContactLut.end() ) + _autoContactLut.erase ( it ); + } + + + void KatabaticEngine::xmlWriteGCellGrid ( const string& fileName ) + { + ofstream file ( fileName.c_str() ); + + xmlWriteGCellGrid ( file ); + + file.close (); + } + + + void KatabaticEngine::xmlWriteGCellGrid ( ostream& o ) + { + if ( _gcellGrid ) + _gcellGrid->_xmlWrite ( o ); + else + cerr << Error("Cannot dump GCellGrid: not allocated yet.") << endl; + } + + + void KatabaticEngine::startMeasures () + { + _timer.resetIncrease (); + _timer.start (); + } + + + void KatabaticEngine::stopMeasures () + { + _timer.stop (); + } + + + void KatabaticEngine::printMeasures () const + { + cmess1 << " - Done in " << Timer::getStringTime(_timer.getCombTime()) + << " [+" << Timer::getStringMemory(_timer.getIncrease()) << "]." << endl; + cmess1 << " (raw measurements : " << _timer.getCombTime() + << "s [+" << (_timer.getIncrease()>>10) << "Ko/" + << (_timer.getMemorySize()>>10) << "Ko])" << endl; + } + + + bool KatabaticEngine::_check ( const char* message ) const + { + bool coherency = true; + if ( message ) + cerr << " o checking Katabatic DB (" << message << ")." << endl; + + AutoSegmentLut::const_iterator it = _autoSegmentLut.begin (); + AutoSegmentLut::const_iterator end = _autoSegmentLut.end (); + for ( ; it != end ; it++ ) + coherency = coherency && it->second->_check(); + + vector::const_iterator itGCell = _gcellGrid->getGCellVector()->begin(); + vector::const_iterator endGCell = _gcellGrid->getGCellVector()->end(); + for ( ; itGCell != endGCell ; itGCell++ ) { + vector::const_iterator itAutoContact = (*itGCell)->getContacts()->begin(); + vector::const_iterator endAutoContact = (*itGCell)->getContacts()->end(); + for ( ; itAutoContact != endAutoContact ; itAutoContact++ ) { + (*itAutoContact)->checkTopology (); + } + } + + if ( message ) + cerr << " - completed." << endl; + + return coherency; + } + + + void KatabaticEngine::refresh ( bool openSession ) + { + if ( _gcellGrid ) _gcellGrid->updateContacts ( openSession ); + } + + + void KatabaticEngine::_destroyAutoSegments () + { + ltrace(90) << "Katabatic::_destroyAutoSegments ()" << endl; + + size_t expandeds = 0; + + AutoSegmentLut::iterator it = _autoSegmentLut.begin (); + AutoSegmentLut::iterator end = _autoSegmentLut.end (); + for ( ; it != end ; it++ ) { + if ( !it->second->isCollapsed() ) expandeds++; + it->second->destroy (); + } + if ( _state == StateDriving ) + cerr << " - Expandeds := " << expandeds << endl; + + _autoSegmentLut.clear (); + } + + + void KatabaticEngine::_destroyAutoContacts () + { + ltrace(90) << "Katabatic::_destroyAutoContacts ()" << endl; + + AutoContactLut::iterator it = _autoContactLut.begin (); + AutoContactLut::iterator end = _autoContactLut.end (); + for ( ; it != end ; it++ ) + it->second->destroy (); + + _autoContactLut.clear (); + } + + + Configuration* KatabaticEngine::getConfiguration () + { return &_configuration; } + + + void KatabaticEngine::loadGlobalRouting ( unsigned int method, vector& nets ) + { + if ( _state < StateGlobalLoaded ) + throw Error ("KatabaticEngine::loadGlobalRouting() : global routing not present yet."); + + if ( _state > StateGlobalLoaded ) + throw Error ("KatabaticEngine::loadGlobalRouting() : global routing already loaded."); + + AllianceFramework* af = AllianceFramework::get (); + if ( nets.empty() ) { + forEach ( Net*, net, _cell->getNets() ) { + if ( net->getType() == Net::Type::POWER ) continue; + if ( net->getType() == Net::Type::GROUND ) continue; + if ( net->getType() == Net::Type::CLOCK ) continue; + if ( af->isOBSTACLE(net->getName()) ) continue; + _routingNets.push_back ( *net ); + } + } else { + vector::iterator it = nets.begin(); + for ( ; it != nets.end() ; it++ ) { + if ( ( (*it)->getType() == Net::Type::POWER ) + || ( (*it)->getType() == Net::Type::GROUND ) + || ( (*it)->getType() == Net::Type::CLOCK ) + || ( af->isOBSTACLE((*it)->getName()) ) ) { + cerr << Warning("%s is not a routable net, removed from set.",getString(*it).c_str()) << endl; + } else + _routingNets.push_back ( *it ); + } + } + + switch ( method ) { + case LoadGrByNet: _loadGrByNet(); break; + case LoadGrByGCell: + default: + throw Error ( badMethod + , "Katabatic::loadGlobalRouting()" + , method + , getString(_cell).c_str() + ); + } + + _state = StateActive; + } + + + void KatabaticEngine::finalizeLayout () + { + ltrace(90) << "Katabatic::finalizeLayout()" << endl; + if ( _state > StateDriving ) return; + + _state = StateDriving; + + startMeasures (); + _gutKatabatic (); + stopMeasures (); + printMeasures (); + + _state = StateGutted; + } + + + void KatabaticEngine::_alignate ( Net* net ) + { + DebugSession::open ( net, 99 ); + + ltrace(100) << "Katabatic::_alignate ( " << net << " )" << endl; + ltracein(99); + + //cmess2 << " - " << getString(net) << endl; + + set exploredSegments; + vector unexploreds; + vector aligneds; + + forEach ( Component*, icomponent, net->getComponents() ) { + Segment* segment = dynamic_cast(*icomponent); + if ( segment ) { + AutoSegment* seedSegment = Session::lookup ( segment ); + if ( seedSegment ) unexploreds.push_back ( seedSegment ); + } + } + sort ( unexploreds.begin(), unexploreds.end(), AutoSegment::CompareCanonical() ); + + for ( size_t i=0 ; igetSegment()) == exploredSegments.end() ) { + ltrace(99) << "New chunk from: " << seedSegment << endl; + aligneds.push_back ( seedSegment ); + + forEach ( AutoSegment*, collapsed, seedSegment->getCollapseds() ) { + ltrace(99) << "Aligned: " << *collapsed << endl; + aligneds.push_back ( *collapsed ); + exploredSegments.insert ( collapsed->getSegment() ); + } + + ltracein(99); + sort ( aligneds.begin(), aligneds.end(), AutoSegment::CompareCanonical() ); + + ltrace(99) << "Seed: " << (void*)aligneds[0]->base() << " " << aligneds[0] << endl; + for ( size_t j=1 ; jbase()) << " " << aligneds[j] << endl; + } + + ltrace(159) << "Align on " << aligneds[0] + << " " << DbU::getLambda(aligneds[0]->getAxis()) << endl; + aligneds[0]->setAxis ( aligneds[0]->getAxis(), Realignate|AxisSet ); + aligneds.clear (); + + ltraceout(99); + } + } + + ltraceout(99); + + DebugSession::close (); + } + + + void KatabaticEngine::_canonize ( Net* net ) + { + DebugSession::open ( net, 99 ); + + ltrace(100) << "Katabatic::_canonize ( " << net << " )" << endl; + ltracein(99); + + //cmess2 << " - " << getString(net) << endl; + + set exploredSegments; + vector unexploreds; + vector aligneds; + + forEach ( Component*, icomponent, net->getComponents() ) { + Segment* segment = dynamic_cast(*icomponent); + if ( segment ) { + AutoSegment* seedSegment = Session::lookup ( segment ); + if ( seedSegment ) + unexploreds.push_back ( seedSegment ); + } + } + sort ( unexploreds.begin(), unexploreds.end(), AutoSegment::CompareCanonical() ); + + for ( size_t i=0 ; igetSegment()) == exploredSegments.end() ) { + ltrace(99) << "New chunk from: " << (void*)seedSegment->base() << ":" << seedSegment << endl; + aligneds.push_back ( seedSegment ); + + bool isCanonicalLocal = seedSegment->isLocal(); + forEach ( AutoSegment*, collapsed, seedSegment->getCollapseds() ) { + ltrace(99) << "Aligned: " << (void*)collapsed->base() << ":" << *collapsed << endl; + aligneds.push_back ( *collapsed ); + exploredSegments.insert ( collapsed->getSegment() ); + + if ( collapsed->isGlobal() ) isCanonicalLocal = false; + } + + ltracein(99); + sort ( aligneds.begin(), aligneds.end(), AutoSegment::CompareCanonical() ); + + aligneds[0]->setCanonical ( true ); + aligneds[0]->setCanonicalLocal ( isCanonicalLocal ); + ltrace(99) << "Canonical: " << (void*)aligneds[0]->base() << ":" << aligneds[0] << endl; + + for ( size_t j=1 ; jsetCanonical ( false ); + ltrace(99) << "Secondary: " << (void*)(aligneds[j]->base()) << ":" << aligneds[j] << endl; + } + + ltrace(159) << "Align on " << aligneds[0] + << " " << DbU::getLambda(aligneds[0]->getAxis()) << endl; + aligneds[0]->setAxis ( aligneds[0]->getAxis(), Realignate|AxisSet ); + aligneds.clear (); + ltraceout(99); + } + } + + ltraceout(99); + + DebugSession::close (); + } + + + void KatabaticEngine::_computeNetTerminals ( Net* net ) + { + DebugSession::open ( net, 88 ); + + ltrace(100) << "Katabatic::_computeNetTerminals ( " << net << " )" << endl; + ltracein(99); + + vector segments; + forEach ( Segment*, segment, net->getSegments() ) { + AutoSegment* autoSegment = Session::lookup ( *segment ); + if ( !autoSegment ) continue; + if ( autoSegment->isInvalidated() ) autoSegment->_computeTerminal(); + } + + ltraceout(99); + + DebugSession::close (); + } + + + void KatabaticEngine::_saveNet ( Net* net ) + { + DebugSession::open ( net, 88 ); + + ltrace(90) << "Katabatic::_saveNet() " << net << endl; + ltracein(90); + + vector autoContacts; + + forEach ( Contact*, icontact, net->getContacts() ) { + AutoContact* autoContact = Session::lookup ( *icontact ); + if ( autoContact ) + autoContacts.push_back ( autoContact ); + } + + ltrace(90) << "Breaking/Deleting AutoContacts." << endl; + vector::iterator it = autoContacts.begin(); + for ( ; it != autoContacts.end() ; it++ ) { + ltrace(90) << "Examining " << (void*)*it << " " << (*it) << endl; + ltracein(90); + ltrace(90) << "In " << (void*)((*it)->getGCell()) << " - " + << (*it)->getGCell() << endl; + + (*it)->breakUp (); + // AutoContacts are destroyed through the tool. + //(*it)->destroy (); + + ltraceout(90); + } + + + ltrace(90) << "Deleting zero-length segments." << endl; + + vector nullSegments; + set connectedLayers; + + forEach ( Segment*, segment, net->getSegments() ) { + if ( segment->getLength() ) { + if ( net->isExternal() ) { + NetExternalComponents::setExternal ( *segment ); + } + continue; + } + + if ( not isTopAndBottomConnected(*segment,connectedLayers) ) { + nullSegments.push_back ( *segment ); + ltrace(90) << "* Null Length: " << *segment << endl; + } + } + + setDestroyBaseSegment ( true ); + for ( size_t i = 0 ; i < nullSegments.size() ; i++ ) { + Contact* source = dynamic_cast(nullSegments[i]->getSource()); + Contact* target = dynamic_cast(nullSegments[i]->getTarget()); + + if ( source->getAnchor() ) { + if ( target->getAnchor() ) { + continue; + //cerr << Bug("Both source & target are anchored while deleting zero-length segment:\n" + // " %s.",getString(nullSegments[i]).c_str()) << endl; + } else + swap ( source, target ); + } + + ltrace(90) << "Deleting: " << nullSegments[i] << endl; + if ( isTopAndBottomConnected(nullSegments[i],connectedLayers) ) { + ltrace(90) << "Deletion cancelled, no longer top or bottom connected." << endl; + continue; + } + + ltrace(90) << "* Source: " << (void*)source << " " << source << endl; + ltrace(90) << "* Target: " << (void*)target << " " << target << endl; + + const Layer* layer = DataBase::getDB()->getTechnology() + ->getViaBetween ( *connectedLayers.begin(), *connectedLayers.rbegin() ); + + ltrace(90) << *connectedLayers.begin() << " + " << *connectedLayers.rbegin() << endl; + ltrace(90) << "* Shrink layer: " << layer << endl; + if ( !layer ) { + cerr << Error("NULL contact layer while deleting %s." + ,getString(nullSegments[i]).c_str()) << endl; + continue; + } + + Session::lookup ( nullSegments[i] )->destroy (); + + vector slaveHooks; + Hook* masterHook = source->getBodyHook()->getPreviousMasterHook(); + + while ( masterHook->getNextHook() != source->getBodyHook() ) { + slaveHooks.push_back ( masterHook->getNextHook() ); + ltrace(90) << "* detach: " + << (void*)masterHook->getNextHook()->getComponent() + << " " << masterHook->getNextHook()->getComponent() << endl; + masterHook->getNextHook()->detach (); + } + source->destroy (); + + masterHook = target->getBodyHook (); + for ( size_t j=0 ; j < slaveHooks.size() ; j++ ) { + slaveHooks[j]->attach ( masterHook ); + } + + ltrace(90) << (void*)target << " " << target << " setLayer: " << layer << endl; + target->setLayer ( layer ); + } + setDestroyBaseSegment ( false ); + + ltraceout(90); + DebugSession::close (); + } + + + void KatabaticEngine::_check ( Net* net ) const + { + ltrace(200) << "Checking " << net << endl; + ltracein(200); + forEach ( Segment*, isegment, net->getComponents().getSubSet() ) { + AutoSegment* autoSegment = _lookup ( *isegment ); + ltrace(200) << autoSegment << endl; + if ( autoSegment ) { + AutoContact* autoContact = autoSegment->getAutoSource(); + ltrace(200) << autoContact << endl; + if ( autoContact ) autoContact->checkTopology (); + + autoContact = autoSegment->getAutoTarget(); + ltrace(200) << autoContact << endl; + if ( autoContact ) autoContact->checkTopology (); + } + } + ltraceout(200); + } + + + void KatabaticEngine::_print ( Net* net ) const + { + cerr << "Order: Components of " << net << endl; + + vector segments; + forEach ( Segment*, isegment, net->getComponents().getSubSet() ) { + AutoSegment* autoSegment = _lookup ( *isegment ); + if ( autoSegment ) + segments.push_back ( autoSegment ); + } + + sort ( segments.begin(), segments.end(), AutoSegment::CompareCanonical() ); + + Interval constraints; + for ( size_t i=0 ; igetConstraints ( constraints ); + cerr << "Order: " << i + << " " << segments[i]->isCanonical() + << " " << segments[i]->isCollapsed() + << " " << setw(6) << DbU::getValueString(segments[i]->getSourceU()) + << " " << setw(6) << DbU::getValueString(segments[i]->getLength()) + << " " << segments[i]->isGlobal() + << " " << segments[i]->isTerminal() + << " " << segments[i]->isHorizontal() + << " " << setw(6) << DbU::getValueString(segments[i]->getAxis()) + << " " << segments[i]->isFixed() + << " [" << DbU::getValueString(constraints.getVMin()) + << ":" << DbU::getValueString(constraints.getVMax()) + << "] " << segments[i] + << endl; + } + } + + + void KatabaticEngine::_print () const + { +#if defined(CHECK_DETERMINISM) + cerr << "Order: Nets components." << endl; +#endif + + vector nets; + forEach ( Net*, inet, getCell()->getNets() ) { + nets.push_back ( *inet ); + } + + sort ( nets.begin(), nets.end(), NetCompareByName() ); + +#if defined(CHECK_DETERMINISM) + for ( size_t i=0 ; igetName () << " " << _configuration.getRoutingGauge()->getName() << ">"; + + return ( os.str() ); + } + + + Record* KatabaticEngine::_getRecord () const + { + Record* record = ToolEngine::_getRecord (); + record->add ( getSlot ( "_demoMode" , _demoMode ) ); + record->add ( getSlot ( "_state" , _state ) ); + record->add ( getSlot ( "_configuration" , &_configuration ) ); + record->add ( getSlot ( "_gcellGrid" , _gcellGrid ) ); + record->add ( getSlot ( "_routingNets" , &_routingNets ) ); + record->add ( getSlot ( "_autoContactLut" , &_autoContactLut ) ); + record->add ( getSlot ( "_autoSegmentLut" , &_autoSegmentLut ) ); + + return ( record ); + } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/LayerAssign.cpp b/katabatic/src/LayerAssign.cpp new file mode 100644 index 00000000..c499a145 --- /dev/null +++ b/katabatic/src/LayerAssign.cpp @@ -0,0 +1,282 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./LayerAssign.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include +#include + +#include "hurricane/Bug.h" +#include "hurricane/Warning.h" +#include "hurricane/DebugSession.h" +#include "hurricane/Net.h" +#include "hurricane/NetExternalComponents.h" +#include "hurricane/Layer.h" +#include "hurricane/RoutingPad.h" +#include "hurricane/Pad.h" +#include "hurricane/Plug.h" +#include "hurricane/Instance.h" +#include "hurricane/Vertical.h" +#include "hurricane/Horizontal.h" + +#include "crlcore/RoutingGauge.h" + +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/GCellGrid.h" +#include "katabatic/KatabaticEngine.h" + + +namespace Katabatic { + + using Hurricane::DebugSession; + using Hurricane::ltracein; + using Hurricane::ltraceout; + using Hurricane::ForEachIterator; + using Hurricane::Warning; + + + void KatabaticEngine::_splitContactsOfNet ( Net* net ) + { + DebugSession::open ( net, 90 ); + + ltrace(100) << "Katabatic::_splitContactsOfNet ( " << net << " )" << endl; + ltracein(99); + + Session::invalidate ( net ); + set globalContacts; + + forEach ( Segment*, isegment, net->getSegments() ) { + if ( ( (*isegment)->getLayer() == Session::getRoutingLayer(3) ) + || ( (*isegment)->getLayer() == Session::getRoutingLayer(4) ) ) { + AutoContact* contact = Session::lookup ( dynamic_cast((*isegment)->getSource()) ); + if ( contact ) globalContacts.insert ( contact ); + + contact = Session::lookup ( dynamic_cast((*isegment)->getTarget()) ); + if ( contact ) globalContacts.insert ( contact ); + } + } + + set::iterator it = globalContacts.begin(); + for ( ; it != globalContacts.end() ; it++ ) { + (*it)->split (); + } + + ltraceout(99); + + DebugSession::close (); + } + + + void KatabaticEngine::_desaturate ( unsigned int depth, set& globalNets ) + { + if ( depth+2 >= Session::getRoutingGauge()->getDepth() ) { + cerr << Warning("Katabatic::_desaturate(): %s, no remaining upper layers." + ,getString(Session::getRoutingGauge()->getRoutingLayer(depth)->getName()).c_str() + ) << endl; + return; + } + + cmess1 << " o Desaturate layer " + << Session::getRoutingGauge()->getRoutingLayer(depth)->getName() << endl; + + vector gcells = *(_gcellGrid->getGCellVector()); + + bool optimized = true; + while ( optimized ) { + optimized = false; + sort ( gcells.begin(), gcells.end(), GCell::CompareByDensity(depth) ); + for ( size_t i=0 ; iisSaturated ( depth ) ) break; + + optimized = gcells[i]->stepDesaturate ( depth, globalNets ); + if ( optimized ) break; + } + } + } + + + void KatabaticEngine::_layerAssignByLength ( Net* net, unsigned long& total, unsigned long& global, set& globalNets ) + { + DebugSession::open ( net, 90 ); + + ltrace(100) << "Katabatic::_layerAssignByLength ( " << net << " )" << endl; + ltracein(99); + + bool isGlobal = false; + set globalContacts; + + forEach ( Segment*, isegment, net->getSegments() ) { + total++; + if ( (*isegment)->getLength() > getGlobalThreshold() ) { + if ( !isGlobal ) { + isGlobal = true; + globalNets.insert ( net ); + //cmess2 << " - " << getString(net) << endl; + } + + global++; + if ( (*isegment)->getLayer() == Session::getRoutingLayer(1) ) (*isegment)->setLayer ( Session::getRoutingLayer(3) ); + if ( (*isegment)->getLayer() == Session::getRoutingLayer(2) ) (*isegment)->setLayer ( Session::getRoutingLayer(4) ); + } + } + + ltraceout(99); + + DebugSession::close (); + } + + + void KatabaticEngine::_layerAssignByLength ( unsigned long& total, unsigned long& global, set& globalNets ) + { + cmess1 << " o Assign Layer (simple wirelength)." << endl; + + for ( size_t i=0 ; i < _routingNets.size() ; i++ ) + _layerAssignByLength ( _routingNets[i], total, global, globalNets ); + } + + + void KatabaticEngine::_layerAssignByTrunk ( Net* net, unsigned long& total, unsigned long& global, set& globalNets ) + { + DebugSession::open ( net, 90 ); + + ltrace(100) << "Katabatic::_layerAssignByTrunk ( " << net << " )" << endl; + ltracein(99); + + bool isGlobal = false; + unsigned long netGlobal = 0; + unsigned long netTotal = 0; + set globalContacts; + + forEach ( Segment*, isegment, net->getSegments() ) { + netTotal++; + + if ( (*isegment)->getLength() > getGlobalThreshold() ) { + isGlobal = true; + netTotal = 0; + globalNets.insert ( net ); + break; + } + } + + if ( isGlobal ) { + //cmess2 << " - " << getString(net) << endl; + + forEach ( Segment*, isegment, net->getSegments() ) { + netTotal++; + + AutoSegment* autoSegment = Session::lookup ( *isegment ); + if ( autoSegment && !autoSegment->isTerminal() ) { + netGlobal++; + + ltrace(99) << "Migrate to M4/M5: " << autoSegment << endl; + if ( autoSegment->isHorizontal() ) autoSegment->setLayer ( Session::getRoutingLayer(3) ); + if ( autoSegment->isVertical () ) autoSegment->setLayer ( Session::getRoutingLayer(4) ); + } + } + } + + total += netTotal; + global += netGlobal; + + ltraceout(99); + + DebugSession::close (); + } + + + void KatabaticEngine::_layerAssignByTrunk ( unsigned long& total, unsigned long& global, set& globalNets ) + { + cmess1 << " o Assign Layer (whole net trunk)." << endl; + + for ( size_t i=0 ; i < _routingNets.size() ; i++ ) + _layerAssignByTrunk ( _routingNets[i], total, global, globalNets ); + } + + + void KatabaticEngine::layerAssign ( unsigned int method ) + { + set globalNets; + + unsigned long total = 0; + unsigned long global = 0; + + startMeasures (); + Session::open ( this ); + + switch ( method ) { + case LayerAssignByLength: _layerAssignByLength(total,global,globalNets); break; + case LayerAssignByTrunk: _layerAssignByTrunk (total,global,globalNets); break; + case NoNetLayerAssign: break; + default: + stopMeasures (); + Session::close (); + throw Error ( badMethod + , "Katabatic::layerAssign()" + , method + , getString(_cell).c_str() + ); + } + + set::iterator inet = globalNets.begin(); + for ( ; inet != globalNets.end() ; inet++ ) + _splitContactsOfNet ( *inet ); + globalNets.clear (); + + Session::revalidate (); + + for ( int i=0 ; i < 3 ; i++ ) { + _desaturate ( 1, globalNets ); + _desaturate ( 2, globalNets ); + + globalNets.clear (); + + Session::revalidate (); + if ( !_gcellGrid->updateDensity () ) break; + } + //refresh ( false ); + +#if defined(CHECK_DATABASE) + _check ( "after layer assignment" ); +#endif +#if defined(CHECK_DETERMINISM) + for ( size_t i=0 ; i < _routingNets.size() ; i++ ) + _print ( _routingNets[i] ); +#endif + + Session::setWarnGCellOverload ( true ); + _gcellGrid->checkDensity (); + + Session::close (); + + stopMeasures (); + printMeasures (); + + cmess2 << " - Total segments : " << total << endl; + cmess2 << " - Global segments : " << global << endl; + cmess2 << " - Ratio : " + << ((float)global/(float)total)*100.0 << "%." << endl; + } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/LoadGrByNet.cpp b/katabatic/src/LoadGrByNet.cpp new file mode 100644 index 00000000..bca0d66e --- /dev/null +++ b/katabatic/src/LoadGrByNet.cpp @@ -0,0 +1,2378 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./LoadGrByNet.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include +#include + +#include "hurricane/Bug.h" +#include "hurricane/Error.h" +#include "hurricane/Warning.h" +#include "hurricane/DebugSession.h" +#include "hurricane/Layer.h" +#include "hurricane/Technology.h" +#include "hurricane/DataBase.h" +#include "hurricane/Net.h" +#include "hurricane/NetExternalComponents.h" +#include "hurricane/RoutingPad.h" +#include "hurricane/RoutingPads.h" +#include "hurricane/Pad.h" +#include "hurricane/Plug.h" +#include "hurricane/Instance.h" +#include "hurricane/Vertical.h" +#include "hurricane/Horizontal.h" + +#include "crlcore/RoutingGauge.h" + +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/GCellGrid.h" +#include "katabatic/KatabaticEngine.h" + + +namespace { + + /*! \defgroup loadGlobalRouting 2. Global Routing Loading (internal) + * + * This module documents how the global routing built by \c Knik is + * loaded into the \c Katabatic data-base. It is intented for developpers + * only. + */ + + //! \addtogroup loadGlobalRouting + //! \{ + + /*! \enum GCellConfiguration::Topology + * set of flags used to build the topology of a GCell. + * \see GCellConfiguration::_topology + */ + + /*! \var GCellConfiguration::GLOBAL_VERTICAL_END + * The GCell has exactly one global, which is either from the north + * or south side. + */ + + /*! \var GCellConfiguration::GLOBAL_HORIZONTAL_END + * The GCell has exactly one global, which is either from the east + * or west side. + */ + + /*! \var GCellConfiguration::GLOBAL_HORIZONTAL + * The GCell has exactly two global, which are east \& west + * (straight horizontal). + */ + + /*! \var GCellConfiguration::GLOBAL_VERTICAL + * The GCell has exactly two global, which are north \& south + * (straight vertical). + */ + + /*! \var GCellConfiguration::GLOBAL_BEND + * The GCell has exactly two global, which are perpandicular. + * For example : east \& south. + */ + + /*! \var GCellConfiguration::GLOBAL_FORK + * The GCell has three or four globals. + */ + + /*! \var GCellConfiguration::GLOBAL_END + * Mask value : the GCell has one global, either vertical or horizontal. + */ + + /*! \var GCellConfiguration::GLOBAL_SPLIT + * Mask value used by some functions as a mask argument to + * _GCell_GlobalContacts() tell if AutoContact must be splitted or not. + * + */ + + + /*! \union GCellConfiguration::UState + * \brief State of the GCellConfiguration (\b internal). + * + * This union allows the GCellConfiguration to be accessed as + * separate fields : + *
      + *
    • \b UState.fields.globals : number of \b GLOBAL AutoSegment. + *
    • \b UState.fields.L1 : number of terminal in \e metal1. + *
    • \b UState.fields.L2 : number of terminal in \e metal2. + *
    • \b UState.fields.L3 : number of terminal in \e metal3. + *
    + * And as a unique integer value : + *
      + *
    • \b UState.state : composite variable, to be used in \c switches. + *
    + * This implementation mixing \c union and \c struct should be portable, + * I've faith in compilers :-) + * + * \see GCellConfiguration. + */ + + + /*! \class GCellConfiguration + * \brief Build the wiring for a Net inside a GCell (\b internal). + * + * \see \ref buildRules. + */ + + /*! \var UState GCellConfiguration::_state; + * An integer value summarizing the state of the \c GCell. It counts + * global wires, and \c Plug/Pin by layer. + */ + + /*! \var unsigned int GCellConfiguration::_topology; + * An integer value summarizing the topology of the globals AutoSegment + * of the GCell. + * + * \see Topology, _GCell_GlobalContacts(). + */ + + /*! \var Net* GCellConfiguration::_net; + * The current \c Net we are building (guessed from the \c fromSplitter). + */ + + /*! \var CGell* GCellConfiguration::_gcell; + * The \c GCell in which we are (guessed from the \c GCell). + */ + + /*! \var unsigned int GCellConfiguration::_fromHook; + * By which side of the \c GCell are we coming in. + */ + + /*! \var AutoContact* GCellConfiguration::_sourceContact; + * The AutoContact from the previously processed \c GCell. + */ + + /*! \var AutoContact* GCellConfiguration::_southWestContact; + * The South West AutoContact of the current \c GCell. + */ + + /*! \var AutoContact* GCellConfiguration::_northEastContact; + * The North East AutoContact of the current \c GCell. + * (may be equal to _southWestContact, if there's only one AutoContact). + */ + + /*! \var Hook* GCellConfiguration::_east; + * The SplitterContact of the east side of the \c GCell (may be \c NULL + * if none is present). + */ + + /*! \var Hook* GCellConfiguration::_west; + * The SplitterContact of the west side of the \c GCell (may be \c NULL + * if none is present). + */ + + /*! \var Hook* GCellConfiguration::_north; + * The SplitterContact of the north side of the \c GCell (may be \c NULL + * if none is present). + */ + + /*! \var Hook* GCellConfiguration::_south; + * The SplitterContact of the south side of the \c GCell (may be \c NULL + * if none is present). + */ + + /*! \var vector GCellConfiguration::_routingPads; + * The table of \c RoutingPad associated to \c Plug/Pin. + */ + + /*! \function GCellConfiguration::GCellConfiguration ( GCellGrid* gcellGrid, Hook* fromHook, AutoContact* sourceContact=NULL ) + * \param gcellGrid The \c GCell where we are. + * \param fromHook From where do we enter the \c GCell. + * \param sourceContact The global routing AutoContact from the previously + * processed \c GCell. May be \c NULL for the first + * \c GCell of a \c Net. + * + * Constructor (see \ref secUsingGCell). + */ + + /*! \function unsigned int GCellConfiguration::getStateG () const; + * \return The composite state value. + */ + + /*! \function void GCellConfiguration::construct ( ForkStack& forks ); + * Build the GCell wires (see \ref secUsingGCell). + */ + + /*! \function void GCellConfiguration::_GCell_GlobalContacts ( bool split, AutoContact* southWestContact=NULL, AutoContact* northEastContact=NULL ); + * create AutoContact needed for global wiring. If \e split is + * \False one contact is created and set into both _southWestContact + * _northEastContact. Otherwise two separated contacts are created. + * + * \see GCellConfiguration::_topology, Topology. + */ + + /*! \function AutoContact* GCellConfiguration::_GCell_rp_L2H ( RoutingPad* rp, AutoContact* target=NULL, bool hcollapse=false ) + * \param rp Source RoutingPad. + * \param target Ending AutoContact (created if needed). + * \param hcollapse collapse the horizontal AutoSegment. + * + * Draw horizontal AutoSegment from the center of a RoutingPad. + * \image html GCellConfiguration-10.png "_GCell_rp_L2H" + * \image latex GCellConfiguration-10.pdf "_GCell_rp_L2H" width=0.2\textwidth + */ + + /*! \function AutoContact* GCellConfiguration::_GCell_rp_L2H_L3V ( RoutingPad* rp, AutoContact* target=NULL, bool hcollapse=false, bool vcollapse=false ) + * \param rp Source RoutingPad. + * \param target Ending AutoContact (created if needed). + * \param hcollapse collapse the horizontal AutoSegment. + * \param vcollapse collapse the vertical AutoSegment. + * + * Draw a simple bend from the center of a RoutingPad. The horizontal + * AutoSegment comes first (starting from the source). Both AutoSegments + * are flagged as \e terminal. + * \image html GCellConfiguration-11.png "_GCell_rp_L2H_L3V" + * \image latex GCellConfiguration-11.pdf "_GCell_rp_L2H_L3V" width=0.2\textwidth + */ + + /*! \function AutoContact* GCellConfiguration::_GCell_rp_StairCaseH ( RoutingPad* rp1, RoutingPad* rp2 ) + * + * Draw an horizontal staircase (\b HVH) between two RoutingPad. + * \image html GCellConfiguration-12.png "_GCell_rp_StairCaseH" + * \image latex GCellConfiguration-12.pdf "_GCell_rp_StairCaseH" width=0.4\textwidth + */ + + /*! \function AutoContact* GCellConfiguration::_GCell_rp_StairCaseV ( RoutingPad* rp1, RoutingPad* rp2 ) + * Draw a vertical staircase (\b VHV) between two RoutingPad. + * \image html GCellConfiguration-13.png "_GCell_rp_StairCaseV" + * \image latex GCellConfiguration-13.pdf "_GCell_rp_StairCaseV" width=0.1\textwidth + */ + + /*! \function AutoContact* GCellConfiguration::_GCell_L3V_L2H ( AutoContact* source, AutoContact* target=NULL, bool hcollapse=false, bool vcollapse=false, bool terminal=false ) + * \param source The starting AutoContact. + * \param target The ending AutoContact (created if needed). + * \param hcollapse collapse the horizontal AutoSegment. + * \param vcollapse collapse the vertical AutoSegment. + * \param terminal collapse the horizontal AutoSegment. + * + * Draw a simple bend source to target AutoContact. If target is \e NULL, create + * the target. The \e terminal parameter will apply to both horizontal \& vertical + * AutoSegment. The horizontal AutoSegment comes first. + * \image html GCellConfiguration-15.png "_GCell_L3V_L2H" + * \image latex GCellConfiguration-15.pdf "_GCell_L3V_L2H" width=0.2\textwidth + */ + + /*! \function AutoContact* GCellConfiguration::_GCell_L2H_L3V ( AutoContact* source, AutoContact* target=NULL, bool hcollapse=false, bool vcollapse=false, bool terminal=false ) + * \param source The starting AutoContact. + * \param target The ending AutoContact (created if needed). + * \param hcollapse collapse the horizontal AutoSegment. + * \param vcollapse collapse the vertical AutoSegment. + * \param terminal collapse the horizontal AutoSegment. + * + * Draw a simple bend source to target AutoContact. If target is \e NULL, create + * the target. The \e terminal parameter will apply to both horizontal \& vertical + * AutoSegment. The vertical AutoSegment comes first. + * \image html GCellConfiguration-16.png "_GCell_L2H_L3V" + * \image latex GCellConfiguration-16.pdf "_GCell_L2H_L3V" width=0.2\textwidth + */ + + /*! \function void GCellConfiguration::_GCell_1G_1L1 () + * Optimized topology for one \e metal1 terminal and one global AutoSegment. + */ + + /*! \function void GCellConfiguration::_GCell_1G_xL1 () + * + * Topology for one global AutoSegment and any number of \e metal1 terminals. + * \image html GCellConfiguration-3.png "_GCell_1G_xL1" + * \image latex GCellConfiguration-3.pdf "_GCell_1G_xL1" width=0.8\textwidth + */ + + /*! \function void GCellConfiguration::_GCell_xG_xL1_xL3 () + * + * Topology for two or more global AutoSegment and any number of \e metal1 or + * \e metal3 terminals. They share the same topology since they are are both + * vertical and connected through \e metal2. + * + * Building rules : + *
      + *
    • Global AutoContact are always splitted except when in the + * \e Bend topology. + *
    • Local terminal AutoSegment are always attached to the South + * West AutoContact except in the Straight Horizontal + * topology or when there is no South global segment. + *
    + * + * \image html GCellConfiguration-14.png "Straight Horizontal" + * \image html GCellConfiguration-21.png "Straight Vertical \& Fork (L1 horizontal)" + * \image html GCellConfiguration-22.png "Forks (L1 horizontal)" + * \image html GCellConfiguration-23.png "Forks (L1 vertical)" + * \image html GCellConfiguration-24.png "Bend" + * \image latex GCellConfiguration-14.pdf "Straight Horizontal" width=0.4\textwidth + * \image latex GCellConfiguration-21.pdf "Straight Vertical (L1 horizontal)" width=0.8\textwidth + * \image latex GCellConfiguration-22.pdf "Forks (L1 horizontal)" width=0.8\textwidth + * \image latex GCellConfiguration-23.pdf "Forks (L1 vertical)" width=0.8\textwidth + * \image latex GCellConfiguration-24.pdf "Bend" width=0.4\textwidth + */ + + /*! \function void GCellConfiguration::_GCell_xG_xL2() + * + * Topology for any global AutoSegment and any number of \e metal2 terminals. + * + * Building rules : + *
      + *
    • Global AutoContact are always splitteds, except for the + * \e Bend and \e End topology. + *
    • Anchor the local connecting AutoContact on the biggest + * \RoutingPad, except for the Straight Horizontal + * and the \e End (horizontal) topology. In thoses cases, + * uses the leftmost or rightmost \RoutingPad. + *
    • Prefers vertical AutoSegment to start from the \RoutingPad, + * this needs East and/or West global to be present. + *
    + * + * \image html GCellConfiguration-30.png "Straight H/V" + * \image html GCellConfiguration-31.png "Forks with East \& West" + * \image html GCellConfiguration-32.png "Forks without East or West" + * \image html GCellConfiguration-33.png "Complete Fork" + * \image html GCellConfiguration-34.png "All Bends" + * \image html GCellConfiguration-35.png "East or West End" + * \image html GCellConfiguration-36.png "North or South End" + * \image latex GCellConfiguration-30.pdf "Straight H/V" width=0.95\textwidth + * \image latex GCellConfiguration-31.pdf "Forks with East \& West" width=0.95\textwidth + * \image latex GCellConfiguration-32.pdf "Forks without East or West" width=0.95\textwidth + * \image latex GCellConfiguration-33.pdf "Complete Fork" width=0.48\textwidth + * \image latex GCellConfiguration-34.pdf "All Bends" width=0.48\textwidth + * \image latex GCellConfiguration-35.pdf "East or West End" width=0.95\textwidth + * \image latex GCellConfiguration-36.pdf "North or South End" width=0.48\textwidth + */ + + /*! \function void GCellConfiguration::_GCell_xG_1L1_1L2 () + * + * Topology for one or more global AutoSegment, one \e metal1 and one + * \e metal2 terminals. + * + * Building rules : + *
      + *
    • Global AutoContact are always splitted except when in the + * \e Bend or \e End topology. + *
    • Local terminal AutoSegment are always attached to an + * AutoContact with one vertical global, the South West + * whenever possible (South global present). + *
    + * + * \image html GCellConfiguration-40.png "End H/V" + * \image html GCellConfiguration-41.png "Straight H/V" + * \image html GCellConfiguration-42.png "Forks without East or West" + * \image html GCellConfiguration-43.png "Forks without North or South" + * \image html GCellConfiguration-44.png "Complete Fork" + * \image html GCellConfiguration-45.png "Any Bend" + * \image latex GCellConfiguration-40.pdf "End H/V" width=0.95\textwidth + * \image latex GCellConfiguration-41.pdf "Straight H/V" width=0.95\textwidth + * \image latex GCellConfiguration-42.pdf "Forks without East or West" width=0.95\textwidth + * \image latex GCellConfiguration-43.pdf "Forks without North or South" width=0.95\textwidth + * \image latex GCellConfiguration-44.pdf "Complete Fork" width=0.48\textwidth + * \image latex GCellConfiguration-45.pdf "Any Bend" width=0.48\textwidth + */ + + + /*! \class SortRpByX + * \brief \c RoutingPad \b Compare functor (\b internal) + */ + + /*! \function inline SortRpByX::SortRpByX ( bool decreasing ); + * \param decreasing Tells if the sort is done in decreasing order. + * + * This object is a \c Compare functor for the \c sort \c algorithm + * over \c STL container made of \c RoutingPad pointers. If \c decreasing + * is false the container elements will be sorted by increasing X + * coordinates. Otherwise the sort is decreasing. + * + * See GCellConfiguration class. + */ + + + /*! \class SortRpByY + * \brief \c RoutingPad \b Compare functor (\b internal) + */ + /*! \function inline SortRpByY::SortRpByY ( bool decreasing ); + * \param decreasing Tells if the sort is done in decreasing order. + * + * This object is a \c Compare functor for the \c sort \c algorithm + * over \c STL container made of \c RoutingPad pointers. If \c decreasing + * is false the container elements will be sorted by increasing Y + * coordinates. Otherwise the sort is decreasing. + * + * See GCellConfiguration class. + */ + + + /* \function RoutingPad* lookupOrCreate ( Plug* plug ); + * \param plug A net's plug. + * \return A RoutingPad associated to the plug. + * + * create a \RoutingPad for the plug or find an already created + * one. To keep track + */ + + /* \function RoutingPad* getRoutingPad ( Plug* plug, const Box& boundingBox ); + * \param plug A net's plug. + * \param boundingBox An area. + * \return A RoutingPad associated to the plug. + * + * creates a RoutingPad built on plug. Select the best external + * component of the master net to uses : the largest component + * in the highest layer in the given boundingBox area. + * + * If no component is found under the boundingBox area a + * warning is issued and a component outside the area will be + * used. + */ + + /* \function RoutingPad* getRoutingPad ( Pin* pin ); + * \param pin A net's pin. + * \return A RoutingPad associated to the pin. + * + * Unlike for the RoutingPad from a plug, there is no choice + * for the external component : it's the pin itself. + */ + + /* \function bool arePerpandicular ( unsigned int dir1, unsigned int dir2 ); + * \param dir1 First direction. + * \param dir2 Second direction. + * \return \True if the two direction are perpandiculars. As it proceed + * with bits operators first and second direction could contains + * other flags than \HORIZONTAL and \VERTICAL. + */ + + /* \function unsigned int areOppositeSPs ( SplitterContact* spc1, SplitterContact* spc2 ); + * \param spc1 First SplitterContact. + * \param spc2 Second SplitterContact. + * \return \True if the two SplitterContact are from the opposites Fences + * of a Nimbox. + */ + + /* \function Point getEastPosition ( RoutingPad* rp ); + * \return Between the source and target point, the one with the greatest + * X coordinate (source, if equal). + */ + + /* \function Point getWestPosition ( RoutingPad* rp ); + * \return Between the source and target point, the one with the lowest + * X coordinate (target, if equal). + */ + + /* \function Point getNorthPosition ( RoutingPad* rp ); + * \return Between the source and target point, the one with the greatest + * Y coordinate (source, if equal). + */ + + /* \function Point getSouthPosition ( RoutingPad* rp ); + * \return Between the source and target point, the one with the lowest + * Y coordinate (target, if equal). + */ + + /*! \function void singleGCell ( KatabaticEngine* ktbt, Net* net ); + * \param ktbt A Katabatic \ToolEngine (gives the grid). + * \param net The net for which to build the topology. + * + * This function handle the special case where a whole net + * is included inside only one GCell. + * + * \important For the time being we assumes that the net is a two + * terminal net only. If this is not the case the topology + * will be incomplete an so the routing. + */ + + + /*! \class ForkStack + * \brief Stack of \c Hook / AutoContact (\b internal). + * + * A simple stack of pair of \c Hook / AutoContact. It's used + * to handle the recursivity while building a Net's initial wiring in + * _loadNetGlobalRouting(). + */ + + /*! \function void ForkStack::push ( Hook* from, AutoContact* contact ); + * Stack a new pair of \c Hook / AutoContact. + */ + + /*! \function void ForkStack::pop (); + * Pop an element. The popped element is \b not returned, it's contents are lost. + */ + + /*! \function Hook* ForkStack::getFrom () const; + * \return The \c Hook on top of the stack. \c NULL if + * the stack is empty. + */ + + /*! \function Contact* ForkStack::getContact () const; + * \return The \c Contact on top of the stack. \c NULL if + * the stack is empty. + */ + + //! \} + + + /*! \defgroup buildRules 1. Rules for building wires (internal) + * + * + * \section secACConf AutoContact configurations. + * + * In this section we details how an AutoContact resise itself, and + * introduce some terminology. + * + * First we distinguish two kinds of segments attached to an AutoContact, + * segments that crosses the GCell boundary are considered as global + * and others are locals. + * + * As globals AutoSegments crosses the GCell boundaries, when their + * extention is adjusted by the AutoContact we have the guarantee that + * they will span from the border of the GCell to the AutoContact. + * The AutoContact relies strongly on this hypothesis. + * + * The configuration of an AutoContact is computed in two stages : + *
      + *
    1. We compute the smallest box enclosing all the intersections of + * global segments axis, this box is drawn in red in the figures + * below. We refers this box as the "Junction Box". + * In some cases the enclosing box is not sufficent to make additionnal + * connections with the local segments (see figures G2.1 and G3.1), + * only in those case we take them in account in the junction box. + *
    2. In the second stage we extend the local segments to reach the + * skeleton made by globals segments. In most cases, we do not have + * choices for the extension, but in G4.3 and G4.4. + *
    + * + * orientation meaning : (west, east, south and north) + *
      + *
    • For global segments, it indicates which side of the GCell it + * crosses. + *
    • For local segments, it tells it's relative position to the + * junction box. An horizontal segment will be south if it's axis + * is inferior to the YMin of the junction box and north otherwise. + * In the same way a vertical segment will be west if is axis is + * inferior to the XMin of the junction box and east otherwise. + *
    + * + * \image html AutoContactG1-1.png "One Global Routing" + * \image html AutoContactG2-1.png "Two Global Routing" + * \image html AutoContactG3-1.png "Three Global Routing" + * \image html AutoContactG3-2.png "Three Global Routing" + * \image html AutoContactG4-1.png "Four Global Routing" + * \image html AutoContactG4-2.png "Four Global Routing" + * \image html AutoContactG4-3.png "Four Global Routing" + * \image latex AutoContactG1-1.pdf "One Global Routing" width=0.3\textwidth + * \image latex AutoContactG2-1.pdf "Two Global Routing" width=0.8\textwidth + * \image latex AutoContactG3-1.pdf "Three Global Routing" width=0.8\textwidth + * \image latex AutoContactG3-2.pdf "Three Global Routing" width=0.8\textwidth + * \image latex AutoContactG4-1.pdf "Four Global Routing" width=0.8\textwidth + * \image latex AutoContactG4-2.pdf "Four Global Routing" width=0.8\textwidth + * \image latex AutoContactG4-3.pdf "Four Global Routing" width=0.8\textwidth + * + * + * The "four sides" box problem : + * + * In cases G4.3 and G4.4 we must uses three sides of the junction box + * to perform the connection. To minimize wirelength we uses the two small + * sides and one of the long size. Which one is the question... For the + * moment we systematically choose the lower one (that is west or south). + * A problem arises when, by displacing segments, the router change which + * side is the shortest one. A Solution to this problem is proposed + * in \ref ssecFaultyAutoContact. + * + * + * \section secSegStruct Routing Segments Organisation. + * + * Router movements : + *
      + *
    • Horizontal segments : only translated vertically, + * extensions are not changed, the segment do not + * shrink neither grow. + *
    • Vertical segments : only translated horizontally. + * Extensions remains the same. + *
    + * + * Autocontact adjustements : + * + * When an horizontal segment is vertically moved, vertical ones + * that are linked to it through AutoContact must have their + * extension adapted : either shrinked or elongated. + * + * \image html AutoContact-2.png "Segment Structure" + * \image html AutoContact-3.png "Segment Displacement" + * \image latex AutoContact-2.pdf "Segment Structure" width=0.5\textwidth + * \image latex AutoContact-3.pdf "Segment Displacement" width=0.5\textwidth + * + * + * \subsection ssecFaultyAutoContact AutoContact Geometry restrictions. + * + * \important The property we want to emphasis here is that whenever a + * segment is moved by the router the size of it's + * source or target extensions must not change. Only the + * extensions of segments perpandicularly connected to it will + * change. + * Unfortunatly, not all topologies will ensure that property. + * The following figures shows all those invalid topologies, and + * their correct counterparts. We are looking here from an AutoContact + * point of view : how does the AutoContact resizes when an AutoSegment + * moves. + * + * First case + * + * Three globals (\b G1, \b G2, \b G3) and one local + * (\b L1). \b L1 is perpandicular to \b G1 and \b G3. According to the + * AutoContact sizing specification, \b L1 will be extended to reach + * either \b G1 or \b G3, according to it's relative position from + * \b G2. Problem arises when the router moves \b L1 and crosses the + * position of \b G2. In the figure below, \b L1 is moved up so it + * will extend to \b G3 instead of \b G1. So \b L1 horizontal size + * will change as it is moved. + * + * \image html AutoContactG3-3.png "Three Globals : Problem" + * \image latex AutoContactG3-3.pdf "Three Globals : Problem" width=0.8\textwidth + * + * To avoid the problem, simply split \b AC1 in two AutoContact (\b AC-SW \& + * \b AC-NE). This way, \b L1 will always be extented to reach the same + * global AutoSegment (here : \b G1). + * + * \image html AutoContactG3-4.png "Three Globals : Solution" + * \image latex AutoContactG3-4.pdf "Three Globals : Solution" width=0.8\textwidth + * + * Second case + * + * Four globals (\b G1 to \b G4). This is the + * four side box problem (see \ref secACConf). To minimize wirelength, + * the \b AC1 AutoContact will uses only three side of the junction box : + * the two shortest and one of the longest. The problem shows when \b G3 + * is moved to the right changing shortest and longest sides. + * \b G2 is then shrinked (which is not a problem because it's perpandicular + * to \b G3), and \b G3 is extended, which is the problem. + * + * \image html AutoContactG4-4.png "Four Globals : Problem" + * \image latex AutoContactG4-4.pdf "Four Globals : Problem" width=0.8\textwidth + * + * As for the first case, we choose to split the \b AC1 AutoContact in two + * (\b AC-SW \& \b AC-NE) and link them with one local AutoSegment (horizontal). + * We arbitrarily group the globals in a South West AutoContact + * (\b AC-SW) and North East AutoContact (\b AC-NE). The connexion + * between them is horizontal because there is slighly more horizontal + * resources. + * + * \image html AutoContactG4-5.png "Four Globals : Solution" + * \image latex AutoContactG4-5.pdf "Four Globals : Solution" width=0.8\textwidth + * + * \important We now can express a more synthetic building rule : an AutoContact + * must never contain more than two global segments. + * This rule allow a simpler managment mechanism for the AutoContact + * self sizing procedure (i.e. : speedup). + * + * + * \subsection ssecFaultyTopologies Topologies Leading to Gaps. + * + * First Case + * + * The figure "incomplete AutoContact 1" shows how two contiguous local + * AutoSegments could lead to a gap in the AutoContact generated + * geometry. The local AutoSegment \b L2 is the only vertical component of + * the red AutoContact, thus it's source point will be moved to ensure + * the vertical connection between \b G1 and \b G2. In the other hand, + * the target of \b L2 is bound by the horizontal position of \b L1. + * So, if \b G2 (or \b G1) is moved above \b L1 a gap will appear whithin the + * AutoContact geometry. + * + * \image html GCellConfiguration-1.png "incomplete AutoContact 1" + * \image latex GCellConfiguration-1.pdf "incomplete AutoContact 1" width=0.8\textwidth + * + * To avoid this problem, the red AutoContact have to be split in two + * AutoContacts linked together though a third local AutoSegment \b L3, + * as shown on figure "Correct topology". Note that, in this figure we + * present an unlikely case : most of the time \b L3 will have a zero + * size, and if not, would uses the same track as \b L2. The \b L3 AutoSegment + * will have the correct length because is source moves with \b G2 and it's + * target with \b G1 (or the other way around, according to the relative + * horizontal positions of \b G1 and \b G2). Another point to note is that + * there can only be (at most) two global horizontal AutoSegment, one on + * left and one on the right. And finally, one say that we could have + * suppressed the \b L2 AutoSegment, but in this case it would forces + * the alignement of either \b G1 or \b G2 with \b L1, which could be a + * severe constraint. + * + * \image html GCellConfiguration-2.png "Correct Topology 1" + * \image latex GCellConfiguration-2.pdf "Correct Topology 1" width=0.8\textwidth + * + * Second Case + * + * The following figure "Invalid Configuration 2" illustrate the problem + * that arises when a local AutoSegment is used to connect more than two + * vertical AutoSegments. In other words, is not a mere "dog leg" (double bend). + * This implies that on a least one supporting AutoContact there is more + * than one vertical AutoSegment attached (\e AC2 in our case). + * + * As per definition, the \e L4 AutoSegment has it's source X position sets + * by \e AC1 and it's target X position sets by \e AC2. On \e AC1 there will + * be no problems : the X position is given by \e L3 and we always can + * extend \e L4 to reach it. On the other end, for \e AC2, as the connexity + * is ensured only by extending/shrinking the AutoSegment target X position + * we will never be able to reach both \e L7 \& L6 as they are on either + * side of \e L3. Only one of them will be reached, \e L6 or \e L7 + * depending on how the AutoContact will expand. + * + * To avoid this problem, we introduce the AutoContact horizontal and/or + * vertical locking. For instance, when an AutoContact is vertically + * locked (says \e AC2), then \e L6 \& \e L7 will be kept at the same + * X coordinate. Note that this is not done by the AutoContact itself + * but rather by declaring \e L6 \& \e L7 as collapsed (as if they where + * connected through a collapsed horizontal AutoSegment). + * + * \image html GCellConfiguration-20.png "incomplete Topology 2 (detail)" + * \image latex GCellConfiguration-20.pdf "incomplete Topology 2 (detail)" width=0.8\textwidth + * + * \image html GCellConfiguration-18.png "incomplete Topology 2 (context)" + * \image latex GCellConfiguration-18.pdf "incomplete Topology 2 (context)" width=0.8\textwidth + * + * \image html GCellConfiguration-19.png "Correct Topology 2" + * \image latex GCellConfiguration-19.pdf "Correct Topology 2" width=0.8\textwidth + * + * For more details about the AutoSegment collapsing whereabouts, see + * \ref collapseCanonical. + * + * + * \section secLegalCatalog Catalog of Legal Topologies. + * + * Summarize the set of legal topologies regarding the following + * rules : + *
      + *
    • Rule 1 : An AutoContact must have at least one + * horizontal and one vertical attached to it. With the only + * expeption of those anchored on RoutingPad. + *
    • Rule 2 : An AutoContact must never have more than + * two global AutoSegment. With the only exception of + * AutoContacts with exactly three globals (and no locals). + *
    • Rule 3 : When the side of a Junction Box is made + * of a local AutoSegment, perpandicular AutoSegments must be + * locked together. + *
    • Rule 4 : AutoContact with two globals and any number + * of local must be lockeds in at least one direction. + *
    + * + * Topologies for Dog-Leg (no-fork). + * + * First figure illustrate why rule 1 is needed. Second, the dog + * leg general case, and the latest how to circumvent rule 1 by + * collapsing \b L2. + * + * \image html LegalConstruct-1.png "Legal Construct : dog leg" + * \image latex LegalConstruct-1.pdf "Legal Construct : dog leg" width=0.8\textwidth + * + * Topologies for Elementary Local Fork. + * + * Illustrate how to build local fork, according to the number of global + * AutoSegments part of the fork. First and second case with the side of + * the Junction Box made of a global AutoSegment : no constraint. + * Third case : the side of the Junction Box is made of a local + * AutoSegment, then perpandicular AutoSegment on \b AC2 must be + * linked (here : vertical link) in compliance with Rule 3. + * + * \image html LegalConstruct-2.png "Legal Construct : elementary local fork" + * \image latex LegalConstruct-2.pdf "Legal Construct : elementary local fork" width=0.8\textwidth + * + * Topologies for Global Fork (3 branches). + * + * To comply with Rule 2, we must split the AutoContact in two : + * the South West (\b AC-SW) and North East (\b AC-NE). Whenever it's possible + * we join them through an horizontal AutoSegment. It's not possible if either + * \b G2 or \b G3 is missing. + * + * \image html LegalConstruct-4.png "Legal Construct : Global fork (3 branches, 1)" + * \image html LegalConstruct-5.png "Legal Construct : Global fork (3 branches, 2)" + * \image latex LegalConstruct-4.pdf "Legal Construct : Global fork (3 branches, 1)" width=0.8\textwidth + * \image latex LegalConstruct-5.pdf "Legal Construct : Global fork (3 branches, 2)" width=0.8\textwidth + * + * Topology for Global Fork (4 branches). + * + * Only one possibility, as shown in the figure below. Two AutoContact + * \b AC-SW \& \b AC-NE, and one horizontal AutoSegment. + * + * \image html LegalConstruct-6.png "Legal Construct : Global fork (4 branches)" + * \image latex LegalConstruct-6.pdf "Legal Construct : Global fork (4 branches)" width=0.8\textwidth + * + * \important If there are local connections inside a global fork, the local + * AutoSegment \b L1 will be replaced by a more complex topology. + * + * + * \section secGCellConfiguration Using GCellConfiguration + * + * After the global routing stage, the final router needs to achieve + * the routing topology in each GCell, for each Net. + * This wiring must connect the global wires (that crosses the + * GCell boundary) with any number of local terminals. + * + * This object is the atomic action of a recursive walk through + * the \c GCells of a \c Net. The recursivity is handled through + * a stack : see \c ForkStack. + * + * This classes uses a dictionnary of pre-defined shapes to build + * the interconnect. The dictionnary relies on the following + * hypothesis : + *
      + *
    1. The GCell is one slice height. This implies + * that in almost all cases, internal terminals in the same + * layer can be ordered form left to right. + *
    2. If there is two or more horizontal terminals, they are + * most likely aligned. + *
    3. If there is two or more vertical terminals they are + * not on top of each other, but rather side by side + *
    4. If there are terminals in layer other than M1, we must + * route through it. + *
    + * + * + * \section secUsingGCell Using a GCellConfiguration object + * + * Obviously, we need the Nimbus global routing structure to be present, as we + * uses \c Splitter to progress through the global routing. Using a + * GCellConfiguration is simple enough : + * + *
      + *
    • create a new GCellConfiguration. At this time we must + * supply the \c GCell to be processed, the \Splitter from which the + * \c GCell is entered and optionally a source AutoContact (from the + * previously processed \c GCell). The constructor go through the + * Net's ring inside the \GCell, finding \SplitterContact, \Plug and + * \Pin. Location of \SplitterContact are stored according to + * their positions (east/west/north/south), \RoutingPad are created + * for each \c Plug/Pin and stored into a \vector. The \c _state and + * \c _topology values are also computed, summarizing respectively + * the number of globals and locals (by layers) and the geometry of + * globals (end, straight, bend, fork) + * + *
    • The second step is to call the construct() method. \c construct() + * works in three steps : + * + *
        + *
      1. Draw the internal wiring of the \c GCell, using the appropriate + * \c _GCell_xG_xLx() fonction. + * + * Calls \c _GCell_GlobalContacts(), which create the south west + * (\c _southWestContact ) AutoContact and, if needed the north east + * one (\c _northEastContact ). If only \c _southWestContact is created, + * \c _northEastContact is set to the same value (i.e. is never \NULL). + * Those AutoContacts will supply the support for global \c AutoSegment + * (AutoSegment that goes to and from this \c GCell ). + * + * If the \c GCell has no internal terminal, then only global wiring + * has to be created, and no \c _GCell_xG_xLx() function is + * to be call. All we have to do is to call the \c _GCell_GlobalContacts(). + * function. And in the case we go through the GCell in straight line + * (aligned \c Splitter) we don't even do that. + * + *
      2. Draw the global routing from to previous \c GCell to the + * current one. That is from \c _sourceContact to \c _southWestContact + * or \c _northEastContact according to where we came from. + * + *
      3. Stack the pair of \c SplitterContact/AutoContact into + * the forks stack, except the one we come from (tagged by + * the \c _fromSP ). Here again, we stack either \c _southWestContact + * or \c _northEastContact according to where we came from. + *
      + *
    + */ + + + using namespace std; + using namespace CRL; + using namespace Hurricane; + using namespace Katabatic; + + + // --------------------------------------------------------------- + // Local Enum/Types. + + + enum SegmentSide { SegmentSouth = (1<<0) + , SegmentNorth = (1<<1) + , SegmentWest = (1<<2) + , SegmentEast = (1<<3) + }; + + + // --------------------------------------------------------------- + // Local Variables. + + + const char* invalidGCell = + "Katabatic::GCellConfiguration () :\n\n" + " No GCell under point.\n"; + + const char* mismatchGCell = + "Katabatic::GCellConfiguration () :\n\n" + " Contacts under two different GCells.\n"; + + const char* missingGCell = + "Katabatic::GCellConfiguration () :\n\n" + " No Contact in GCell.\n"; + + + map __routingPadAutoSegments; + + + // --------------------------------------------------------------- + // LoadGrByNet Local Classes. + + + struct NetCompareByName { + inline bool operator() ( const Net* lhs, const Net* rhs ) const; + }; + + inline bool NetCompareByName::operator() ( const Net* lhs, const Net* rhs ) const + { + return lhs->getName() < rhs->getName(); + } + + + // --------------------------------------------------------------- + // LoadGrByNet Local Functions. + + + void lookupClear () + { + __routingPadAutoSegments.clear (); + } + + + void setIsRoutingPadSmall ( RoutingPad* rp, bool& hsmall, bool& vsmall, bool& punctual ) + { + Point source = rp->getSourcePosition(); + Point target = rp->getTargetPosition(); + + DbU::Unit width = abs ( target.getX() - source.getX() ); + DbU::Unit height = abs ( target.getY() - source.getY() ); + + hsmall = ( width < DbU::lambda(15.0)); + vsmall = ( height < DbU::lambda(15.0)); + punctual = (width == 0) && (height == 0); + } + + + Hook* getSegmentOppositeHook ( Hook* hook ) + { + Segment* segment = static_cast( hook->getComponent() ); + return segment->getOppositeHook ( hook ); + } + + + unsigned int getSegmentHookType ( Hook* hook ) + { + Horizontal* horizontal = dynamic_cast( hook->getComponent() ); + if ( horizontal ) { + if ( horizontal->getSourceX() > horizontal->getTargetX() ) + cerr << Warning("Bad orientation of %s",getString(horizontal).c_str()) << endl; + + if ( dynamic_cast(hook) ) + return SegmentEast; + return SegmentWest; + } + Vertical* vertical = dynamic_cast( hook->getComponent() ); + if ( vertical->getSourceY() > vertical->getTargetY() ) + cerr << Warning("Bad orientation of %s",getString(vertical).c_str()) << endl; + + if ( dynamic_cast(hook) ) + return SegmentNorth; + return SegmentSouth; + } + + + // --------------------------------------------------------------- + // Class : "SortRpByX". + + + class SortRpByX { + public: + inline SortRpByX ( bool decreasing ); + inline bool operator() ( RoutingPad* rp1, RoutingPad* rp2 ); + protected: + bool _decreasing; + }; + + + inline SortRpByX::SortRpByX ( bool decreasing ) + : _decreasing(decreasing) + { } + + + inline bool SortRpByX::operator() ( RoutingPad* rp1, RoutingPad* rp2 ) + { + DbU::Unit x1 = rp1->getCenter().getX(); + DbU::Unit x2 = rp2->getCenter().getX(); + + if ( x1 == x2 ) return false; + return _decreasing xor ( x1 < x2 ); + } + + + // --------------------------------------------------------------- + // Class : "SortRpByY". + + + class SortRpByY { + public: + inline SortRpByY ( bool decreasing ); + inline bool operator() ( RoutingPad* rp1, RoutingPad* rp2 ); + protected: + bool _decreasing; + }; + + + inline SortRpByY::SortRpByY ( bool decreasing ) + : _decreasing(decreasing) + { } + + + inline bool SortRpByY::operator() ( RoutingPad* rp1, RoutingPad* rp2 ) + { + DbU::Unit y1 = rp1->getCenter().getY(); + DbU::Unit y2 = rp2->getCenter().getY(); + + if ( y1 == y2 ) return false; + return _decreasing xor ( y1 < y2 ); + } + + + // --------------------------------------------------------------- + // Class : "ForkStack". + + + class ForkStack { + public: + inline void push ( Hook* from, AutoContact* contact ); + inline void pop (); + inline Hook* getFrom () const; + inline AutoContact* getContact () const; + private: + struct Element { + Hook* _from; + AutoContact* _contact; + inline Element ( Hook* from, AutoContact* contact ); + }; + private: + list _stack; + }; + + + inline ForkStack::Element::Element ( Hook* from, AutoContact* contact ) : _from(from), _contact(contact) {} + inline void ForkStack::pop () { if ( !_stack.empty() ) _stack.pop_back(); } + inline Hook* ForkStack::getFrom () const { return _stack.empty() ? NULL : _stack.back()._from; } + inline AutoContact* ForkStack::getContact () const { return _stack.empty() ? NULL : _stack.back()._contact; } + + + inline void ForkStack::push ( Hook* from, AutoContact* contact ) + { + ltrace(80) << " Stacking " << (void*)from << " " << from << " + " << contact << endl; + _stack.push_back(Element(from,contact)); + } + + + // --------------------------------------------------------------- + // Class : "GGellConfiguration". + + + class GCellConfiguration { + + public: + // Methods. + GCellConfiguration ( GCellGrid* gcellGrid + , Hook* fromHook + , AutoContact* sourceContact=NULL ); + void construct ( ForkStack& forks ); + inline unsigned int getStateG () const; + inline GCell* getGCell () const; + static bool _GCell_rp_AutoContacts ( GCell* gcell + , RoutingPad* rp + , AutoContact*& source + , AutoContact*& target + , bool haccess ); + static AutoContact* _GCell_rp_Access ( GCell* gcell + , RoutingPad* rp + , bool haccess + , bool forceVSmall ); + static AutoContact* _GCell_rp_L2H ( GCell* gcell + , RoutingPad* rp + , AutoContact* target =NULL + , bool hcollapse=false ); + static AutoContact* _GCell_rp_L2H_L3V ( GCell* gcell + , RoutingPad* rp + , AutoContact* target =NULL + , bool hcollapse=false + , bool vcollapse=false ); + static void _GCell_rp_StairCaseH ( GCell* gcell + , RoutingPad* rp1 + , RoutingPad* rp2 ); + static void _GCell_rp_StairCaseV ( GCell* gcell + , RoutingPad* rp1 + , RoutingPad* rp2 ); + static AutoContact* _GCell_L3V_L2H ( GCell* gcell + , Net* net + , AutoContact* source + , AutoContact* target =NULL + , bool hcollapse=false + , bool vcollapse=false + , bool terminal =false ); + static AutoContact* _GCell_L2H_L3V ( GCell* gcell + , Net* net + , AutoContact* source + , AutoContact* target =NULL + , bool hcollapse=false + , bool vcollapse=false + , bool terminal =false ); + protected: + // Internal Methods. + void _GCell_GlobalContacts ( bool split + , AutoContact* southWestContact=NULL + , AutoContact* northEastContact=NULL ); + void _GCell_1G_1L1 (); + void _GCell_1G_xL1 (); + void _GCell_xG_xL1_xL3 (); + void _GCell_xG_1L1_1L2 (); + void _GCell_xG_xL2 (); + void _GCell_1G_1L3 (); + void _GCell_xG_xL3 (); + + protected: + // State Values. + enum State { GCELL_0G = 0 + , GCELL_2G = 2 + , GCELL_3G = 3 + , GCELL_4G = 4 + , GCELL_0G_2L1 = 0+(2<<3) + , GCELL_1G_1L1 = 1+(1<<3) + , GCELL_1G_2L1 = 1+(2<<3) + , GCELL_1G_3L1 = 1+(3<<3) + , GCELL_1G_4L1 = 1+(4<<3) + , GCELL_1G_1L2 = 1+(1<<6) + , GCELL_1G_2L2 = 1+(2<<6) + , GCELL_1G_3L2 = 1+(3<<6) + , GCELL_1G_4L2 = 1+(4<<6) + , GCELL_1G_1L3 = 1+(1<<9) + , GCELL_1G_2L3 = 1+(2<<9) + , GCELL_1G_3L3 = 1+(3<<9) + , GCELL_1G_4L3 = 1+(4<<9) + , GCELL_1G_1L1_1L2 = 1+(1<<3)+(1<<6) + , GCELL_1G_1L1_1L3 = 1+(1<<3)+(1<<9) + , GCELL_2G_1L1 = 2+(1<<3) + , GCELL_2G_2L1 = 2+(2<<3) + , GCELL_2G_3L1 = 2+(3<<3) + , GCELL_2G_4L1 = 2+(4<<3) + , GCELL_2G_1L2 = 2+(1<<6) + , GCELL_2G_2L2 = 2+(2<<6) + , GCELL_2G_3L2 = 2+(3<<6) + , GCELL_2G_4L2 = 2+(4<<6) + , GCELL_2G_1L3 = 2+(1<<9) + , GCELL_2G_2L3 = 2+(2<<9) + , GCELL_2G_3L3 = 2+(3<<9) + , GCELL_2G_4L3 = 2+(4<<9) + , GCELL_2G_1L1_1L2 = 2+(1<<3)+(1<<6) + , GCELL_3G_1L1 = 3+(1<<3) + , GCELL_3G_2L1 = 3+(2<<3) + , GCELL_3G_3L1 = 3+(3<<3) + , GCELL_3G_4L1 = 3+(4<<3) + , GCELL_3G_1L2 = 3+(1<<6) + , GCELL_3G_1L3 = 3+(1<<9) + , GCELL_3G_2L3 = 3+(2<<9) + , GCELL_3G_3L3 = 3+(3<<9) + , GCELL_3G_4L3 = 3+(4<<9) + , GCELL_4G_1L1 = 4+(1<<3) + , GCELL_4G_2L1 = 4+(2<<3) + , GCELL_4G_1L3 = 4+(1<<9) + }; + + protected: + // Topologies Flags/Values. + enum Topology { GLOBAL_VERTICAL_END = (1<<0) + , GLOBAL_HORIZONTAL_END = (1<<1) + , GLOBAL_HORIZONTAL = (1<<2) + , GLOBAL_VERTICAL = (1<<3) + , GLOBAL_BEND = (1<<4) + , GLOBAL_FORK = (1<<5) + , GLOBAL_END = GLOBAL_VERTICAL_END | GLOBAL_HORIZONTAL_END + , GLOBAL_SPLIT = GLOBAL_HORIZONTAL | GLOBAL_VERTICAL | GLOBAL_FORK + }; + + protected: + // State Attribute. + union UState { + unsigned int state; + struct { + unsigned int globals : 3; + unsigned int L1 : 3; + unsigned int L2 : 3; + unsigned int L3 : 3; + } fields; + }; + + // Attributes. + protected: + UState _state; + unsigned int _topology; + Net* _net; + GCell* _gcell; + AutoContact* _sourceContact; + AutoContact* _southWestContact; + AutoContact* _northEastContact; + Hook* _fromHook; + Hook* _east; + Hook* _west; + Hook* _north; + Hook* _south; + vector _routingPads; + }; + + + inline unsigned int GCellConfiguration::getStateG () const { return _state.fields.globals; } + inline GCell* GCellConfiguration::getGCell () const { return _gcell; } + + + GCellConfiguration::GCellConfiguration ( GCellGrid* gcellGrid + , Hook* fromHook + , AutoContact* sourceContact ) + : _state() + , _topology(0) + , _gcell(NULL) + , _sourceContact(sourceContact) + , _southWestContact(NULL) + , _northEastContact(NULL) + , _fromHook(fromHook) + , _east(NULL) + , _west(NULL) + , _north(NULL) + , _south(NULL) + , _routingPads() + { + ltrace(99) << "GCellConfiguration::GCellConfiguration ()" << endl; + ltracein(99); + ltrace(99) << getString(fromHook) << endl; + ltrace(99) << sourceContact << endl; + + Segment* fromSegment = static_cast ( _fromHook->getComponent() ); + + _net = fromSegment->getNet (); + _state.state = 0; + + forEach ( Hook*, hook, fromHook->getHooks() ) { + Segment* toSegment = dynamic_cast(hook->getComponent()); + if ( toSegment ) { + switch ( getSegmentHookType(*hook) ) { + case SegmentWest: _west = *hook; break; + case SegmentEast: _east = *hook; break; + case SegmentSouth: _south = *hook; break; + case SegmentNorth: _north = *hook; break; + } + _state.fields.globals++; + } else { + RoutingPad* rp = dynamic_cast(hook->getComponent()); + + if ( rp ) { + const Layer* layer = rp->getLayer(); + if ( layer == Session::getRoutingLayer(0) ) _state.fields.L1++; // M1 V + else if ( layer == Session::getRoutingLayer(1) ) _state.fields.L2++; // M2 H + else if ( layer == Session::getRoutingLayer(2) ) _state.fields.L3++; // M3 V + else if ( layer == Session::getRoutingLayer(3) ) _state.fields.L2++; // M4 H + else if ( layer == Session::getRoutingLayer(4) ) _state.fields.L3++; // M5 V + else { + cerr << Warning ( "Terminal layer %s of %s is not managed yet (ignored)." + , getString(layer->getName()).c_str() + , getString(rp).c_str() ) + << endl; + continue; + } + + ltrace(99) << "RoutingPad " << rp << endl; + _routingPads.push_back ( rp ); + } else { + Contact* contact = dynamic_cast(hook->getComponent()); + if ( contact ) { + GCell* gcell = gcellGrid->getGCell ( contact->getCenter() ); + ltrace(99) << gcell << " guessed from " << contact << endl; + if ( !gcell ) + throw Error ( invalidGCell ); + if ( !_gcell ) _gcell = gcell; + else if ( _gcell != gcell ) { + throw Error ( mismatchGCell ); + } + } + } + } + } + + if (_state.fields.globals == 1) { + if ( _north || _south ) _topology |= GLOBAL_VERTICAL_END; + else _topology |= GLOBAL_HORIZONTAL_END; + } else if (_state.fields.globals == 2) { + if ( _east && _west ) _topology |= GLOBAL_HORIZONTAL; + else if ( _north && _south ) _topology |= GLOBAL_VERTICAL; + else _topology |= GLOBAL_BEND; + } else { + _topology |= GLOBAL_FORK; + } + + ltraceout(99); + + if ( !_gcell ) throw Error ( missingGCell ); + } + + + void GCellConfiguration::construct ( ForkStack& forks ) + { + ltrace(99) << "GCellConfiguration::construct () [" << _state.state << "] in " << _gcell << endl; + ltracein(99); + + bool straightLine = false; + + switch ( _state.state ) { + case GCELL_1G_1L1: _GCell_1G_1L1 (); break; + case GCELL_1G_2L1: + case GCELL_1G_3L1: + case GCELL_1G_4L1: _GCell_1G_xL1 (); break; + case GCELL_1G_1L2: + case GCELL_1G_2L2: + case GCELL_1G_3L2: + case GCELL_1G_4L2: _GCell_xG_xL2 (); break; + case GCELL_1G_1L3: _GCell_1G_1L3 (); break; + case GCELL_1G_2L3: + case GCELL_1G_3L3: + case GCELL_1G_4L3: _GCell_xG_xL3 (); break; + case GCELL_1G_1L1_1L2: _GCell_xG_1L1_1L2 (); break; + case GCELL_1G_1L1_1L3: _GCell_1G_xL1 (); break; + case GCELL_2G_1L1: + case GCELL_2G_2L1: + case GCELL_2G_3L1: + case GCELL_2G_4L1: + case GCELL_3G_1L1: + case GCELL_3G_2L1: + case GCELL_3G_3L1: + case GCELL_3G_4L1: + case GCELL_3G_2L3: + case GCELL_3G_3L3: + case GCELL_3G_4L3: + case GCELL_4G_1L1: + case GCELL_4G_2L1: _GCell_xG_xL1_xL3 (); break; + case GCELL_2G_1L2: + case GCELL_2G_2L2: + case GCELL_2G_3L2: + case GCELL_2G_4L2: + case GCELL_3G_1L2: _GCell_xG_xL2 (); break; + case GCELL_2G_1L3: + case GCELL_2G_2L3: + case GCELL_2G_3L3: + case GCELL_2G_4L3: + case GCELL_3G_1L3: _GCell_xG_xL3 (); break; + case GCELL_2G_1L1_1L2: _GCell_xG_1L1_1L2 (); break; + case GCELL_2G: + if ( (_east && _west) || (_north && _south) ) { + straightLine = true; + break; + } + case GCELL_3G: + _GCell_GlobalContacts ( false ); + break; + case GCELL_4G: + _GCell_GlobalContacts ( true ); + AutoSegment::create ( _southWestContact + , _northEastContact + , Constant::Horizontal + , AutoSegment::Local + , false + , false + ); + break; + default: + cerr << Bug("Unmanaged Configuration [%d] = [%d+%d+%d+%d] %s" + ,_state.state + ,_state.fields.globals + ,_state.fields.L1 + ,_state.fields.L2 + ,_state.fields.L3 + ,_net->_getString().c_str() + ) << endl; + _GCell_GlobalContacts ( false ); + } + + if ( straightLine ) { + cerr << Error("Straight aligned segments (ignored)") << endl; + ltraceout(99); + return; + } + + if ( _sourceContact ) { + AutoContact* targetContact + = ( getSegmentHookType(_fromHook) & (SegmentNorth|SegmentEast) ) + ? _northEastContact : _southWestContact ; + AutoSegment* globalSegment = AutoSegment::create ( _sourceContact + , targetContact + , static_cast( _fromHook->getComponent() ) + ); + + if ( globalSegment->isHorizontal() + and ( (Session::getRoutingGauge()->getLayerDepth(_sourceContact->getLayer()->getBottom()) > 1) + or (Session::getRoutingGauge()->getLayerDepth(targetContact ->getLayer()->getBottom()) > 1)) ) { + globalSegment->setLayer ( Session::getRoutingLayer(3) ); + ltrace(99) << "Source:" << _sourceContact << endl; + ltrace(99) << "Target:" << targetContact << endl; + ltrace(99) << "Moving up global:" << globalSegment << endl; + } + + if ( _state.fields.globals < 2 ) { + ltraceout(99); + return; + } + } else + _fromHook = NULL; + + if ( _east && (_fromHook != _east) ) { + Hook* toHook = getSegmentOppositeHook ( _east ); + ltrace(99) << "Pushing " << getString(toHook) << endl; + ltrace(99) << "Pushing " << _northEastContact << endl; + forks.push ( toHook, _northEastContact ); + } + if ( _west && (_fromHook != _west) ) { + Hook* toHook = getSegmentOppositeHook ( _west ); + ltrace(99) << "Pushing " << getString(toHook) << endl; + ltrace(99) << "Pushing " << _southWestContact << endl; + forks.push ( toHook, _southWestContact ); + } + if ( _north && (_fromHook != _north) ) { + Hook* toHook = getSegmentOppositeHook ( _north ); + ltrace(99) << "Pushing " << getString(toHook) << endl; + ltrace(99) << "Pushing " << _northEastContact << endl; + forks.push ( toHook, _northEastContact ); + } + if ( _south && (_fromHook != _south) ) { + Hook* toHook = getSegmentOppositeHook ( _south ); + ltrace(99) << "Pushing " << getString(toHook) << endl; + ltrace(99) << "Pushing " << _southWestContact << endl; + forks.push ( toHook, _southWestContact ); + } + + ltraceout(99); + } + + + void GCellConfiguration::_GCell_GlobalContacts ( bool split + , AutoContact* southWestContact + , AutoContact* northEastContact + ) + { + ltrace(99) << "GlobalContacts(" << split << ")" << endl; + + if ( southWestContact ) + _southWestContact = southWestContact; + else { + _southWestContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); + } + + if ( split ) { + if ( northEastContact ) + _northEastContact = northEastContact; + else { + _northEastContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); + } + } else + _northEastContact = _southWestContact; + } + + + bool GCellConfiguration::_GCell_rp_AutoContacts ( GCell* gcell + , RoutingPad* rp + , AutoContact*& source + , AutoContact*& target + , bool haccess + ) + { + ltrace(99) << "_GCell_rp_AutoContacts()" << endl; + ltracein(99); + + const Layer* rpLayer = Session::getContactLayer(0); + Point sourcePosition = rp->getSourcePosition(); + Point targetPosition = rp->getTargetPosition(); + unsigned int direction = Session::getRoutingGauge()->getLayerDirection(rp->getLayer()); + + source = target = NULL; + + // Non-M1 terminal. + if ( rp->getLayer() != Session::getRoutingLayer(0) ) { + map::iterator irp = __routingPadAutoSegments.find ( rp ); + if ( irp != __routingPadAutoSegments.end() ) { + source = irp->second->getAutoSource(); + target = irp->second->getAutoTarget(); + } else { + // Non-M1 Fixed protection. + if ( sourcePosition.getX() > targetPosition.getX() ) swap ( sourcePosition, targetPosition ); + if ( sourcePosition.getY() > targetPosition.getY() ) swap ( sourcePosition, targetPosition ); + + GCell* sourceGCell = Session::getKatabatic()->getGCellGrid()->getGCell ( sourcePosition ); + GCell* targetGCell = Session::getKatabatic()->getGCellGrid()->getGCell ( targetPosition ); + + source = AutoContact::fromRp ( sourceGCell + , rp + , rp->getLayer() + , sourcePosition + , DbU::lambda(1.0), DbU::lambda(1.0) + , true + ); + + target = AutoContact::fromRp ( targetGCell + , rp + , rp->getLayer() + , targetPosition + , DbU::lambda(1.0), DbU::lambda(1.0) + , true + ); + + unsigned int segmentType + = (sourceGCell == targetGCell) ? AutoSegment::Local : AutoSegment::Global; + + AutoSegment* segment = AutoSegment::create ( source + , target + , direction + , segmentType + , true + , false + ); + segment->setFixed ( true ); + __routingPadAutoSegments.insert ( make_pair(rp,segment) ); + + // Associate a M2 fixed protection to punctual M3 terminals. + if ( ( rp->getLayer() == Session::getRoutingLayer(2) ) + and ( sourcePosition == targetPosition ) ) { + AutoContact* sourceM2 = AutoContact::fromRp ( sourceGCell + , rp + , Session::getContactLayer(1) + , sourcePosition + , DbU::lambda(1.0), DbU::lambda(1.0) + , true + ); + + AutoContact* targetM2 = AutoContact::fromRp ( sourceGCell + , rp + , Session::getContactLayer(1) + , targetPosition + , DbU::lambda(1.0), DbU::lambda(1.0) + , true + ); + + AutoSegment* segmentM2 = AutoSegment::create ( sourceM2 + , targetM2 + , Constant::Horizontal + , AutoSegment::Local + , true + , false + ); + segmentM2->setFixed ( true ); + } + } + + if ( not (haccess xor (direction == Constant::Horizontal)) ) { + ltraceout(99); + return true; + } + } + + // Punctual M1. + if ( ( rp->getLayer() == Session::getRoutingLayer(0) ) + and ( sourcePosition == targetPosition ) ) { + map::iterator irp = __routingPadAutoSegments.find ( rp ); + if ( irp == __routingPadAutoSegments.end() ) { + GCell* sourceGCell = Session::getKatabatic()->getGCellGrid()->getGCell ( sourcePosition ); + + source = AutoContact::fromRp ( sourceGCell + , rp + , Session::getContactLayer(0) + , sourcePosition + , DbU::lambda(1.0), DbU::lambda(1.0) + , true + ); + + target = AutoContact::fromRp ( sourceGCell + , rp + , Session::getContactLayer(0) + , targetPosition + , DbU::lambda(1.0), DbU::lambda(1.0) + , true + ); + + AutoSegment* segment = AutoSegment::create ( source + , target + , Constant::Horizontal + , AutoSegment::Local + , true + , false + ); + segment->setFixed ( true ); + __routingPadAutoSegments.insert ( make_pair(rp,segment) ); + } + } + + if ( rp->getLayer() != Session::getRoutingLayer(0) ) + rpLayer = Session::getContactLayer(1); + + source = target = AutoContact::fromRp ( gcell + , rp + , rpLayer + , rp->getCenter() + , DbU::lambda(1.0), DbU::lambda(1.0) + ); + ltraceout(99); + return false; + } + + + AutoContact* GCellConfiguration::_GCell_rp_Access ( GCell* gcell, RoutingPad* rp, bool haccess, bool forceVSmall ) + { + ltrace(99) << "_GCell_rp_Access()" << endl; + ltracein(99); + + AutoContact* rpContactSource; + AutoContact* rpContactTarget; + bool hsmall; + bool vsmall; + bool punctual; + + setIsRoutingPadSmall ( rp, hsmall, vsmall, punctual ); + vsmall = vsmall || forceVSmall; + + _GCell_rp_AutoContacts ( gcell, rp, rpContactSource, rpContactTarget, haccess ); + + if ( not haccess and hsmall ) { + AutoContact* subContact1 = AutoContact::create ( gcell, rp->getNet(), Session::getContactLayer(1) ); + AutoSegment::create ( rpContactSource + , subContact1 + , Constant::Horizontal + , AutoSegment::Local + , true + , false + ); + rpContactSource = subContact1; + } + + ltraceout(99); + + return rpContactSource; + } + + + AutoContact* GCellConfiguration::_GCell_rp_L2H ( GCell* gcell, RoutingPad* rp, AutoContact* target, bool hcollapse ) + { + ltrace(99) << "rp_L2H " << rp << endl; + + AutoContact* rpContactSource; + AutoContact* rpContactTarget; + unsigned int segmentType = AutoSegment::Local; + + if ( _GCell_rp_AutoContacts(gcell,rp,rpContactSource,rpContactTarget,true) ) { + if ( gcell->getIndex() > rpContactSource->getGCell()->getIndex() ) + swap ( rpContactSource, rpContactTarget ); + if ( gcell->getIndex() != rpContactSource->getGCell()->getIndex() ) + segmentType = AutoSegment::Global; + } + + if ( !target ) + target = AutoContact::create ( gcell, rp->getNet(), Session::getContactLayer(1) ); + + AutoSegment::create ( rpContactSource, target, Constant::Horizontal, segmentType, true, hcollapse ); + + return target; + } + + + AutoContact* GCellConfiguration::_GCell_rp_L2H_L3V ( GCell* gcell, RoutingPad* rp, AutoContact* target, bool hcollapse, bool vcollapse ) + { + ltrace(99) << "rp_L2H+L3V " << rp << endl; + ltracein(99); + + AutoContact* source = _GCell_rp_L2H ( gcell, rp, NULL, hcollapse ); + + if ( !target ) { + target = AutoContact::create ( gcell, rp->getNet(), Session::getContactLayer(1) ); + } + + AutoSegment::create ( source, target, Constant::Vertical, AutoSegment::Local, true, vcollapse ); + + ltraceout(99); + + return target; + } + + + void GCellConfiguration::_GCell_rp_StairCaseH ( GCell* gcell, RoutingPad* rp1, RoutingPad* rp2 ) + { + ltrace(99) << "_GCell_rp_StairCaseH()" << endl; + + if ( rp1->getCenter().getX() > rp2->getCenter().getX() ) + swap ( rp1, rp2 ); + + AutoContact* rp1ContactSource; + AutoContact* rp1ContactTarget; + AutoContact* rp2ContactSource; + AutoContact* rp2ContactTarget; + const Layer* viaLayer; + + _GCell_rp_AutoContacts ( gcell, rp1, rp1ContactSource, rp1ContactTarget, true ); + _GCell_rp_AutoContacts ( gcell, rp2, rp2ContactSource, rp2ContactTarget, true ); + + if ( rp1ContactTarget->getY() == rp2ContactSource->getY() ) { + ltrace(99) << "Aligned horizontal routing pads : straight wire" << endl; + + viaLayer = rp1->getLayer (); + AutoSegment::create ( rp1ContactTarget + , rp2ContactSource + , Constant::Horizontal + , AutoSegment::Local + , true + ); + return; + } + + viaLayer = Session::getContactLayer(1); + + AutoContact* subContact1 = AutoContact::create ( gcell, rp1->getNet(), Session::getContactLayer(1) ); + AutoContact* subContact2 = AutoContact::create ( gcell, rp1->getNet(), Session::getContactLayer(1) ); + + AutoSegment::create ( rp1ContactTarget, subContact1 , Constant::Vertical , AutoSegment::Local, true ); + AutoSegment::create ( subContact1 , subContact2 , Constant::Horizontal, AutoSegment::Local, true ); + AutoSegment::create ( subContact1 , rp2ContactSource, Constant::Vertical , AutoSegment::Local, true ); + } + + + void GCellConfiguration::_GCell_rp_StairCaseV ( GCell* gcell, RoutingPad* rp1, RoutingPad* rp2 ) + { + ltrace(99) << "_GCell_rp_StairCaseV()" << endl; + + if ( rp1->getCenter().getY() > rp2->getCenter().getY() ) + swap ( rp1, rp2 ); + + AutoContact* rp1ContactSource; + AutoContact* rp1ContactTarget; + AutoContact* rp2ContactSource; + AutoContact* rp2ContactTarget; + const Layer* viaLayer; + + _GCell_rp_AutoContacts ( gcell, rp1, rp1ContactSource, rp1ContactTarget, false ); + _GCell_rp_AutoContacts ( gcell, rp2, rp2ContactSource, rp2ContactTarget, false ); + + if ( rp1ContactTarget->getX() == rp2ContactSource->getX() ) { + ltrace(99) << "Aligned vertical routing pads : straight wire" << endl; + + viaLayer = rp1->getLayer (); + AutoSegment::create ( rp1ContactTarget + , rp2ContactSource + , Constant::Vertical + , AutoSegment::Local + , true + ); + return; + } + + viaLayer = Session::getContactLayer(1); + + AutoContact* subContact1 = AutoContact::create ( gcell, rp1->getNet(), Session::getContactLayer(1) ); + AutoContact* subContact2 = AutoContact::create ( gcell, rp1->getNet(), Session::getContactLayer(1) ); + + AutoSegment::create ( rp1ContactTarget, subContact1 , Constant::Horizontal, AutoSegment::Local, true ); + AutoSegment::create ( subContact1 , subContact2 , Constant::Vertical , AutoSegment::Local, true ); + AutoSegment::create ( subContact2 , rp2ContactSource, Constant::Horizontal, AutoSegment::Local, true ); + } + + + AutoContact* GCellConfiguration::_GCell_L3V_L2H ( GCell* gcell + , Net* net + , AutoContact* source + , AutoContact* target + , bool hcollapse + , bool vcollapse + , bool terminal ) + { + AutoContact* subContact = AutoContact::create ( gcell, net, Session::getContactLayer(1) ); + + AutoSegment::create ( source, subContact, Constant::Vertical, AutoSegment::Local, terminal, vcollapse ); + + if ( !target ) + target = AutoContact::create ( gcell, net, Session::getContactLayer(1) ); + + AutoSegment::create ( subContact, target, Constant::Horizontal, AutoSegment::Local, terminal, hcollapse ); + + return target; + } + + + AutoContact* GCellConfiguration::_GCell_L2H_L3V ( GCell* gcell + , Net* net + , AutoContact* source + , AutoContact* target + , bool hcollapse + , bool vcollapse + , bool terminal ) + { + AutoContact* subContact = AutoContact::create ( gcell, net, Session::getContactLayer(1) ); + + AutoSegment::create ( source, subContact, Constant::Horizontal, AutoSegment::Local, terminal, hcollapse ); + + if ( !target ) { + target = AutoContact::create ( gcell, net, Session::getContactLayer(1) ); + } + + AutoSegment::create ( subContact, target, Constant::Vertical, AutoSegment::Local, terminal, vcollapse ); + + return target; + } + + + void GCellConfiguration::_GCell_1G_1L1 () + { + ltrace(99) << "_GCell_1G_1L1() [Managed Configuration - Optimized] " << _topology << endl; + ltracein(99); + + Hook* globalHook = NULL; + if ( _east ) globalHook = _east; + else if ( _west ) globalHook = _west; + else if ( _north ) globalHook = _north; + else if ( _south ) globalHook = _south; + + //Segment* globalSegment = dynamic_cast(globalHook->getComponent()); + //DbU::Unit length = (globalSegment) ? globalSegment->getLength() : 0; + + AutoContact* rpContact = _GCell_rp_Access ( _gcell + , _routingPads[0] + , (_topology & GLOBAL_HORIZONTAL_END) + , false //(length > DbU::lambda(50.0*2)) + ); + _GCell_GlobalContacts ( false, rpContact ); + + ltraceout(99); + } + + + void GCellConfiguration::_GCell_1G_xL1 () + { + ltrace(99) << "_GCell_1G_" << _state.fields.L1 << "L1() [Managed Configuration]" << endl; + ltracein(99); + + AutoContact* subContact = NULL; + if ( _topology & GLOBAL_VERTICAL_END ) { + ltrace(99) << "Global Vertical End" << endl; + + _southWestContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); + //_southWestContact->setHAlignate ( true ); + + sort ( _routingPads.begin(), _routingPads.end(), SortRpByX(false) ); // increasing X. + for ( unsigned int i = 0 ; i < _routingPads.size() ; i++ ) { + subContact = _GCell_rp_Access ( _gcell, _routingPads[i], true, false ); + AutoSegment::create ( _southWestContact, subContact, Constant::Horizontal, AutoSegment::Local, true, false ); + } + } else { + ltrace(99) << "Global Horizontal End" << endl; + + if ( _east ) sort ( _routingPads.begin(), _routingPads.end(), SortRpByX(false) ); // increasing X. + else sort ( _routingPads.begin(), _routingPads.end(), SortRpByX(true ) ); // decreasing X. + + for ( unsigned int i = 0 ; i < _routingPads.size() ; i++ ) { + _southWestContact = _GCell_rp_Access ( _gcell, _routingPads[i], true, false ); + _southWestContact->setHAlignate ( true ); + + if ( i ) + AutoSegment::create ( subContact, _southWestContact, Constant::Horizontal, AutoSegment::Local, true, false ); + + subContact = _southWestContact; + } + } + + _northEastContact = _southWestContact; + + ltraceout(99); + } + + + void GCellConfiguration::_GCell_xG_1L1_1L2 () + { + ltrace(99) << "_GCell_xG_1L1_1L2() [Managed Configuration]" << endl; + ltracein(99); + + RoutingPad* rpL1; + RoutingPad* rpL2; + if ( _routingPads[0]->getLayer() == Session::getRoutingLayer(0) ) { + rpL1 = _routingPads[0]; + rpL2 = _routingPads[1]; + } else { + rpL1 = _routingPads[1]; + rpL2 = _routingPads[0]; + } + ltrace(99) << "rpL1 := " << rpL1 << endl; + ltrace(99) << "rpL2 := " << rpL2 << endl; + + AutoContact* rpL1ContactSource; + AutoContact* rpL1ContactTarget; + AutoContact* rpL2ContactSource; + AutoContact* rpL2ContactTarget; + + _GCell_rp_AutoContacts ( _gcell, rpL1, rpL1ContactSource, rpL1ContactTarget, true ); + AutoContact* subContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create ( rpL1ContactSource, subContact, Constant::Horizontal, AutoSegment::Local, true ); + + _GCell_rp_AutoContacts ( _gcell, rpL2, rpL2ContactSource, rpL2ContactTarget, false ); + AutoSegment::create ( rpL2ContactSource, subContact, Constant::Vertical, AutoSegment::Local, true ); + + if ( _state.fields.globals > 0 ) { + _GCell_rp_AutoContacts ( _gcell, rpL2, _southWestContact, subContact, (_south == NULL) ); + if ( _state.fields.globals > 2 ) { + _GCell_rp_AutoContacts ( _gcell, rpL2, _northEastContact, subContact, (_north == NULL) ); + } else + _northEastContact = _southWestContact; + } + + ltraceout(99); + } + + + void GCellConfiguration::_GCell_xG_xL1_xL3 () + { + ltrace(99) << "_GCell_xG_" << _state.fields.L1 + << "L1_" << _state.fields.L3 + << "L3() [G:" << _state.fields.globals << " Managed Configuration]" << endl; + ltracein(99); + ltrace(99) << "_topology: " << _topology << endl; + ltrace(99) << "_north: " << _north << endl; + ltrace(99) << "_south: " << _south << endl; + ltrace(99) << "_east: " << _east << endl; + ltrace(99) << "_west: " << _west << endl; + + bool hsmall = false; + bool vsmall = false; + bool punctual = false; + AutoSegment* segment = NULL; + + sort ( _routingPads.begin(), _routingPads.end(), SortRpByX(false) ); // increasing X. + if ( _topology & GLOBAL_HORIZONTAL ) { + AutoContact* subContact1 = NULL; + AutoContact* subContact2 = NULL; + for ( unsigned int i = 0 ; i < _routingPads.size() ; i++ ) { + subContact1 = _GCell_rp_Access ( _gcell, _routingPads[i], true, false ); + subContact1->setHAlignate ( true ); + + if ( i ) { + segment = AutoSegment::create ( subContact1 + , subContact2 + , Constant::Horizontal + , AutoSegment::Local + , true + , false ); + segment->setStrap ( true ); + } else + _southWestContact = subContact1; + + subContact2 = subContact1; + } + _northEastContact = subContact1; + } else { + ltrace(99) << "Not straight horizontal " << _south << endl; + + _GCell_GlobalContacts ( _topology & GLOBAL_SPLIT ); + AutoContact* localContact = (_south) ? _southWestContact : _northEastContact; + //localContact->setHAlignate ( true ); + + for ( unsigned int i = 0 ; i < _routingPads.size() ; i++ ) { + AutoContact* rpContact = _GCell_rp_Access ( _gcell, _routingPads[i], true, false ); + segment = AutoSegment::create ( rpContact + , localContact + , Constant::Horizontal + , AutoSegment::Local + , true + , false ); + setIsRoutingPadSmall ( _routingPads[i], hsmall, vsmall, punctual ); + if ( not vsmall ) segment->setStrap ( true ); + } + + if ( _topology & (GLOBAL_VERTICAL|GLOBAL_FORK) ) { + ltrace(99) << "Global Vertical/Global fork " << _south << endl; + + unsigned int direction = (not _south or not _north) ? Constant::Vertical : Constant::Horizontal; + segment = AutoSegment::create ( _southWestContact + , _northEastContact + , direction + , AutoSegment::Local + , false + , false + ); + segment->setStrap ( true ); + + if ( direction == Constant::Vertical ) { + if ( !_south ) _northEastContact->setVAlignate ( true ); + else _southWestContact->setVAlignate ( true ); + } + } + } + + ltraceout(99); + } + + + void GCellConfiguration::_GCell_xG_xL2 () + { + ltrace(99) << "_GCell_" + << _state.fields.globals << "G_" + << _state.fields.L2 << "L2() [Managed Configuration - x]" << endl; + ltracein(99); + + unsigned int lastRP = _routingPads.size() - 1; + RoutingPad* biggestRP = _routingPads[lastRP]; + + sort ( _routingPads.begin(), _routingPads.end(), SortRpByX(false) ); // increasing X. + + for ( unsigned int i = 0 ; i < lastRP ; i++ ) { + _GCell_rp_StairCaseH ( _gcell, _routingPads[i], _routingPads[i+1] ); + if ( _routingPads[i]->getBoundingBox().getWidth() + > biggestRP->getBoundingBox().getWidth() ) + biggestRP = _routingPads[i]; + } + + RoutingPad* leftRP = biggestRP; + RoutingPad* rightRP = biggestRP; + + switch ( _topology ) { + case GLOBAL_VERTICAL_END: break; + case GLOBAL_HORIZONTAL_END: + if ( _west ) leftRP = _routingPads[0]; + if ( _east ) leftRP = _routingPads[lastRP]; + rightRP = leftRP; + break; + case GLOBAL_HORIZONTAL: + leftRP = _routingPads[0]; + rightRP = _routingPads[lastRP]; + break; + case GLOBAL_VERTICAL: break; + case GLOBAL_BEND: break; + case GLOBAL_FORK: break; + } + + AutoContact* subContact; + if ( leftRP == rightRP ) { + _GCell_rp_AutoContacts ( _gcell, leftRP, _southWestContact, _northEastContact, (_south == NULL) && (_north == NULL) ); + //_northEastContact = _southWestContact; + } else { + ltrace(99) << "Using separate global contacts" << endl; + _GCell_rp_AutoContacts ( _gcell, leftRP , _southWestContact, subContact, (_south == NULL) ); + _GCell_rp_AutoContacts ( _gcell, rightRP, subContact, _northEastContact, (_north == NULL) ); + ltrace(99) << "leftRp: " << leftRP->getCenter() << " " << leftRP << endl; + ltrace(99) << "rightRp: " << rightRP->getCenter() << " " << rightRP << endl; + } + + ltraceout(99); + } + + + void GCellConfiguration::_GCell_1G_1L3 () + { + ltrace(99) << "_GCell_1G_1L3() [Optimised Configuration]" << endl; + ltracein(99); + + bool useEnds = (_north != NULL) or (_south != NULL); + + _GCell_rp_AutoContacts ( _gcell + , _routingPads[0] + , _southWestContact + , _northEastContact + , not useEnds + ); + + ltrace(99) << "_southWest: " << _southWestContact << endl; + ltrace(99) << "_northEast: " << _northEastContact << endl; + + if ( useEnds ) { + ltrace(99) << "Using Ends" << endl; + if ( _north != NULL ) { + ltrace(99) << _gcell << endl; + ltrace(99) << "Using _northEast, _north: " << _north << endl; + ltrace(99) << " _south: " << _south << endl; + _southWestContact = _northEastContact; + } + + //AutoContact* subContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); + //AutoSegment::create ( _southWestContact, subContact, Constant::Horizontal, AutoSegment::Local, true ); + + //_southWestContact = _northEastContact = subContact; + } else { + if ( _routingPads[0]->getBoundingBox().getHeight() < DbU::lambda(15) ) { + AutoContact* subContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create ( _southWestContact, subContact, Constant::Vertical, AutoSegment::Local, true ); + + _southWestContact = _northEastContact = subContact; + } + } + ltraceout(99); + } + + + void GCellConfiguration::_GCell_xG_xL3 () + { + ltrace(99) << "_GCell_xG_" << _state.fields.L3 + << "L3() [Managed Configuration]" << endl; + ltracein(99); + + AutoContact* unusedContact; + + if ( _south ) sort ( _routingPads.begin(), _routingPads.end(), SortRpByY(false) ); // increasing Y. + else sort ( _routingPads.begin(), _routingPads.end(), SortRpByY(true ) ); // decreasing Y. + + for ( unsigned int i = 1 ; i < _routingPads.size() ; i++ ) { + _GCell_rp_StairCaseV ( _gcell, _routingPads[i-1], _routingPads[i] ); + } + + if ( _west or _south ) { + _GCell_rp_AutoContacts ( _gcell, _routingPads[0], _southWestContact, unusedContact, false ); + // _southWestContact = AutoContact::fromRp ( _gcell + // , _routingPads[0] + // , Session::getContactLayer(1) + // , _routingPads[0]->getCenter() + // , DbU::lambda(1.0), DbU::lambda(1.0) + // ); + } + + if ( _west and not _south ) { + AutoContact* subContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); + + AutoSegment::create ( subContact, _southWestContact, Constant::Vertical, AutoSegment::Local, true ); + _southWestContact = subContact; + } + + if ( _east or _north ) { + _GCell_rp_AutoContacts ( _gcell, _routingPads[0], unusedContact, _northEastContact, false ); + // _northEastContact = AutoContact::fromRp ( _gcell + // , _routingPads[_routingPads.size()-1] + // , Session::getContactLayer(1) + // , _routingPads[_routingPads.size()-1]->getCenter() + // , DbU::lambda(1.0), DbU::lambda(1.0) + // ); + } + + if ( _east and not _north ) { + AutoContact* subContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); + + AutoSegment::create ( subContact, _northEastContact, Constant::Vertical, AutoSegment::Local, true ); + _northEastContact = subContact; + } + + if ( !_southWestContact ) _southWestContact = _northEastContact; + if ( !_northEastContact ) _northEastContact = _southWestContact; + + ltraceout(99); + } + + + void singleGCell ( KatabaticEngine* ktbt, Net* net ) + { + ltrace(99) << "singleGCell () " << net << endl; + ltracein(99); + + vector routingPads; + + forEach ( RoutingPad*, irp, net->getRoutingPads() ) { + routingPads.push_back ( *irp ); + } + + if ( routingPads.size() < 2 ) { + cerr << Error("For %s, less than two Plugs/Pins (%d)." + ,getString(net).c_str() + ,routingPads.size()) << endl; + ltraceout(99); + return; + } + + if ( routingPads.size() > 2 ) { + cerr << Error("For %s, more than two Plugs/Pins (%d) in single GCell." + ,getString(net).c_str() + ,routingPads.size()) << endl; + ltraceout(99); + return; + } + + GCell* gcell = ktbt->getGCellGrid()->getGCell ( routingPads[0]->getCenter() + , routingPads[1]->getCenter() ); + + if ( !gcell ) { + cerr << Error("No GCell under %s.",getString(routingPads[0]).c_str()) << endl; + ltraceout(99); + return; + } + + ltrace(80) << "singleGCell " << gcell << endl; + + AutoContact* dummy = NULL; + AutoContact* source = NULL; + AutoContact* target = NULL; + GCellConfiguration::_GCell_rp_AutoContacts ( gcell, routingPads[0], source, dummy, true ); + GCellConfiguration::_GCell_rp_AutoContacts ( gcell, routingPads[1], target, dummy, true ); + + // AutoContact* source = AutoContact::fromRp ( gcell + // , routingPads[0] + // , Session::getContactLayer(0) + // , routingPads[0]->getCenter() + // , DbU::lambda(1.0), DbU::lambda(1.0) + // ); + // AutoContact* target = AutoContact::fromRp ( gcell + // , routingPads[1] + // , Session::getContactLayer(0) + // , routingPads[1]->getCenter() + // , DbU::lambda(1.0), DbU::lambda(1.0) + // ); + + Box sourceBox = source->getNativeConstraintBox (); + Box targetBox = target->getNativeConstraintBox (); + + if ( ( sourceBox.getYMax() < targetBox.getYMin() ) + || ( sourceBox.getYMin() > targetBox.getYMax() ) ) { + AutoContact* subContact1 = AutoContact::create ( gcell, net, Session::getContactLayer(1) ); + AutoSegment::create ( source, subContact1, Constant::Vertical, AutoSegment::Local, true ); + + AutoContact* subContact2 = AutoContact::create ( gcell, net, Session::getContactLayer(1) ); + AutoSegment::create ( target, subContact2, Constant::Vertical, AutoSegment::Local, true ); + + AutoSegment::create ( subContact1, subContact2, Constant::Horizontal, AutoSegment::Local, false ); + } else + AutoSegment::create ( source, target, Constant::Horizontal, AutoSegment::Local, true ); + + ltraceout(99); + } + + +} // End of anonymous namespace. + + + + +namespace Katabatic { + + + using Hurricane::DebugSession; + using Hurricane::Error; + using Hurricane::Warning; + using Hurricane::Bug; + + + void KatabaticEngine::_loadGrByNet () + { + cmess1 << " o Loading Nets global routing from Knik." << endl; + + startMeasures (); + Session::open ( this ); + + sort ( _routingNets.begin(), _routingNets.end(), NetCompareByName() ); + for ( size_t i=0 ; i < _routingNets.size() ; i++ ) + _loadNetGlobalRouting ( _routingNets[i] ); + + Session::revalidate (); + + for ( size_t i=0 ; i < _routingNets.size() ; i++ ) + _toOptimals ( _routingNets[i] ); + + Session::revalidate (); + +#if defined(CHECK_DATABASE) + _check ( "after Katabatic loading" ); +#endif + + _print (); + //_gcellGrid->checkEdgeSaturation ( 0.60 ); + Session::close (); + + stopMeasures (); + printMeasures (); + } + + + void KatabaticEngine::_loadNetGlobalRouting ( Net* net ) + { + DebugSession::open ( net, 80 ); + + ltrace(100) << "Katabatic::_loadNetGlobalRouting ( " << net << " )" << endl; + ltracein(99); + + cmess2 << " - " << net << endl; + + ForkStack forks; + Hook* sourceHook = NULL; + AutoContact* sourceContact = NULL; + + lookupClear (); + + RoutingPads routingPads = net->getRoutingPads (); + if ( routingPads.getSize() < 2 ) { +#if 0 + if ( !getDemoMode() ) + cmess2 << Warning("Net \"%s\" have less than 2 plugs/pins (ignored)." + ,getString(net->getName()).c_str()) << endl; +#endif + ltraceout(99); + return; + } + + ltracein(99); + Hook* startHook = NULL; + GCell* lowestGCell = NULL; + ltrace(99) << "Start RoutingPad Ring" << endl; + forEach ( RoutingPad*, startRp, routingPads ) { + forEach ( Hook*, ihook, startRp->getBodyHook()->getHooks() ) { + ltrace(99) << "Component " << ihook->getComponent() << endl; + Segment* segment = dynamic_cast(ihook->getComponent()); + + if ( segment ) { + GCellConfiguration gcellConf ( getGCellGrid(), *ihook, NULL ); + if ( gcellConf.getStateG() == 1 ) { + if ( !lowestGCell || (lowestGCell->getIndex() > gcellConf.getGCell()->getIndex()) ) { + ltrace(99) << "Starting from GCell " << gcellConf.getGCell() << endl; + lowestGCell = gcellConf.getGCell(); + startHook = *ihook; + } + break; + } + } + } + // Comment the next line to enable the lowest GCell search. + //if ( startHook ) break; + } + ltraceout(99); + + if ( !startHook ) { singleGCell ( this, net ); ltraceout(99); return; } + + GCellConfiguration startGCellConf ( getGCellGrid(), startHook, NULL ); + startGCellConf.construct ( forks ); + + sourceHook = forks.getFrom (); + sourceContact = forks.getContact (); + forks.pop (); + + while ( sourceHook ) { + GCellConfiguration gcellConf ( getGCellGrid(), sourceHook, sourceContact ); + gcellConf.construct ( forks ); + + sourceHook = forks.getFrom (); + sourceContact = forks.getContact (); + forks.pop (); + } + + lookupClear (); + + ltraceout(99); + + DebugSession::close (); + } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/NetConstraints.cpp b/katabatic/src/NetConstraints.cpp new file mode 100644 index 00000000..46e20205 --- /dev/null +++ b/katabatic/src/NetConstraints.cpp @@ -0,0 +1,367 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./NetConstraints.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include +#include + +#include "hurricane/DebugSession.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/Net.h" +#include "hurricane/NetExternalComponents.h" +#include "hurricane/RoutingPad.h" +#include "hurricane/Pad.h" +#include "hurricane/Plug.h" +#include "hurricane/Instance.h" +#include "hurricane/Vertical.h" +#include "hurricane/Horizontal.h" +#include "hurricane/Cell.h" + +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/Session.h" +#include "katabatic/KatabaticEngine.h" + + +namespace { + + + //! \addtogroup NetConstraints + //! \{ + + /*! \function void propagateConstraintFromRp ( RoutingPad* rp ) + * \param rp The \c RoutingPad starting point. + * + * Do a full constraint propagation starting from this \c RoutingPad. + */ + + /*! \function void propagateConstraint ( AutoContactStack& segmentStack, DbU::Unit constraintMin, DbU::Unit constraintMax, unsigned int direction ) + * \param segmentStack A vector of \c AutoSegment. + * \param constraintMin The interval lower bound. + * \param constraintMax The interval upper bound. + * \param direction The propagation direction. + * + * Propagate the constraint in the appropriate direction through the vector + * of \c AutoSegments and any other linked through collapse. + */ + + //! \} + + + using namespace std; + using namespace CRL; + using namespace Hurricane; + using namespace Katabatic; + + +// ----------------------------------------------------------------- +// Local Functions. + + + void propagateConstraint ( AutoContactStack& segmentStack + , DbU::Unit constraintMin + , DbU::Unit constraintMax + , unsigned int direction + ) + { + ltracein(99); + + while ( !segmentStack.isEmpty() ) { + AutoContact* sourceContact = segmentStack.getAutoContact (); + Segment* sourceSegment = segmentStack.getSegment (); + + segmentStack.pop (); + + if ( sourceContact->isAlignate(direction) ) { + ltrace(99) << "Apply to (source): " << (void*)sourceContact->base() << ":" << sourceContact << endl; + sourceContact->restrictConstraintBox ( constraintMin, constraintMax, direction ); + } + + AutoSegment* sourceAutoSegment = Session::lookup ( sourceSegment ); + + forEach ( Component*, icomponent, sourceContact->getSlaveComponents() ) { + if ( *icomponent == sourceSegment ) continue; + + Segment* targetSegment = dynamic_cast(*icomponent); + if ( !targetSegment ) continue; + + AutoSegment* targetAutoSegment = Session::lookup ( targetSegment ); + if ( !targetAutoSegment ) { + const BasicLayer* basicLayer = dynamic_cast(targetSegment->getLayer()); + if ( basicLayer && basicLayer->getMaterial() != BasicLayer::Material::metal ) + continue; + + cerr << Error("Can't lookup for ",getString(targetSegment).c_str()) << endl; + continue; + } + + AutoContact* targetContact = Session::lookup + ( dynamic_cast(targetAutoSegment->getOppositeAnchor(sourceContact->base())) ); + + if ( sourceAutoSegment && targetAutoSegment ) { + unsigned int state = AutoSegment::getPerpandicularState + ( sourceContact + , sourceAutoSegment + , targetAutoSegment + , (direction & Constant::Horizontal)?true:false + ); + + if ( !( state & (AutoSegment::PerpandicularIndirect + |AutoSegment::ParallelOrExpanded + |AutoSegment::ParallelAndLayerChange )) ) { + segmentStack.push ( targetContact, targetSegment ); + + if ( targetAutoSegment + && (targetAutoSegment->getDirection() == direction) + && targetContact->isAlignate(direction) ) { + ltrace(99) << "Apply to (target): " << (void*)targetContact->base() << ":" << targetContact << endl; + targetContact->restrictConstraintBox ( constraintMin, constraintMax, direction ); + } + continue; + } + } + + } + } + + ltraceout(99); + ltrace(99) << "Finished propagating." << endl; + } + + + void propagateConstraintFromRp ( RoutingPad* rp ) + { + ltrace(99) << "propagateConstraintFromRp() - " << (void*)rp << " " << rp << endl; + + forEach ( Component*, icomponent, rp->getSlaveComponents() ) { + ltrace(99) << "slave: " << *icomponent << endl; + AutoContact* contact = Session::lookup ( dynamic_cast(*icomponent) ); + if ( contact ) { + ltrace(99) << "Start slave: " << (void*)contact->getContact() << ":" << contact << endl; + + set collapsedContactsSet; + AutoContactStack collapsedContactsStack; + AutoContactStack verticalSegmentsStack; + AutoContactStack horizontalSegmentsStack; + + collapsedContactsStack.push ( contact, NULL ); + collapsedContactsSet.insert ( contact ); + + // Find all AutoContacts directly collapeds on the RoutingPad. + while ( !collapsedContactsStack.isEmpty() ) { + AutoContact* sourceContact = collapsedContactsStack.getAutoContact (); + Segment* sourceSegment = collapsedContactsStack.getSegment (); + Segment* segment; + + collapsedContactsStack.pop (); + + forEach ( Component*, icomponent2, sourceContact->getSlaveComponents() ) { + bool isHorizontal = true; + segment = dynamic_cast(*icomponent2); + if ( !segment && (segment = dynamic_cast(*icomponent2)) ) + isHorizontal = false; + if ( !segment || (segment == sourceSegment) ) continue; + + AutoSegment* autoSegment = Session::lookup ( segment ); + if ( !autoSegment ) { + const BasicLayer* basicLayer = dynamic_cast(segment->getLayer()); + if ( basicLayer && basicLayer->getMaterial() != BasicLayer::Material::metal ) + continue; + cerr << Error("Can't lookup for %s.",getString(segment).c_str()) << endl; + continue; + } + + ltrace(99) << "Examining: " << autoSegment << endl; + + AutoContact* targetContact = Session::lookup + ( dynamic_cast(autoSegment->getOppositeAnchor(sourceContact->base())) ); + + if ( targetContact ) { + if ( !autoSegment->isCollapsed() ) { + if ( isHorizontal ) { + ltrace(99) << "On horizontal stack " << (void*)segment << ":" << segment << endl; + horizontalSegmentsStack.push ( targetContact, segment ); + } else { + ltrace(99) << "On vertical stack " << (void*)segment << ":" << segment << endl; + verticalSegmentsStack.push ( targetContact, segment ); + } + } else { + ltrace(99) << "On collapsed stack " << (void*)segment << ":" << segment << endl; + collapsedContactsStack.push ( targetContact, segment ); + collapsedContactsSet.insert ( targetContact ); + } + } + } + } + + // compute constraint on all AutoContacts collapseds, + // then sets all the constraint Box to the intersection. + ltrace(99) << "Computing constraint:" << endl; + ltracein(99); + set::iterator it = collapsedContactsSet.begin(); + set::iterator end = collapsedContactsSet.end(); + ltrace(99) << *it << " " << (*it)->getConstraintBox() << endl; + Box constraintBox = (*it++)->getConstraintBox (); + for ( ; it != end ; it++ ) { + (*it)->intersectConstraintBox ( constraintBox ); + ltrace(99) << *it << " " << constraintBox << endl; + } + + if ( constraintBox.isEmpty() ) { + cerr << "[ERROR] incompatible segment collapse for " << rp << endl; + ltraceout(99); + break; + } + ltraceout(99); + + ltrace(99) << "Applying constraint " << constraintBox << " to:" << endl; + ltracein(99); + it = collapsedContactsSet.begin(); + for ( ; it != end ; it++ ) { + ltrace(99) << *it << endl; + (*it)->setConstraintBox ( constraintBox ); + } + ltraceout(99); + + // Propagate constraint through horizontally bound segments. + ltrace(99) << "Propagate constraint on horizontal segments" << endl; + propagateConstraint ( horizontalSegmentsStack + , constraintBox.getYMin() + , constraintBox.getYMax() + , Constant::Horizontal ); + + // Propagate constraint through vertically bound segments. + ltrace(99) << "Propagate constraint on vertical segments" << endl; + propagateConstraint ( verticalSegmentsStack + , constraintBox.getXMin() + , constraintBox.getXMax() + , Constant::Vertical ); + } + } + + ltrace(99) << "propagateConstraintFromRp() - Exit" << endl; + } + + +} // End of local namespace. + + + + +namespace Katabatic { + + + using Hurricane::Cell; + + + void KatabaticEngine::_computeNetConstraints ( Net* net ) + { + DebugSession::open ( net ); + + ltrace(100) << "Katabatic::_computeNetConstraints ( " << net << " )" << endl; + ltracein(99); + + //cmess2 << " - " << net << endl; + + vector routingPads; + forEach ( Component*, icomponent, net->getComponents() ) { + Contact* contact = dynamic_cast(*icomponent); + if ( contact ) { + AutoContact* autoContact = Session::lookup ( contact ); + if ( autoContact ) + autoContact->restoreNativeConstraintBox (); + } else { + RoutingPad* routingPad = dynamic_cast(*icomponent); + if ( routingPad ) routingPads.push_back ( routingPad ); + } + } + + for ( size_t i=0 ; i processeds; + forEach ( Segment*, isegment, net->getSegments() ) { + AutoSegment* autoSegment = Session::lookup ( *isegment ); + if ( !autoSegment ) continue; + autoSegment->toConstraintAxis ( &processeds ); + } + + ltraceout(99); + + DebugSession::close (); + } + + + void KatabaticEngine::_collapseNets ( Nets nets, unsigned int depth ) + { + forEach ( Net*, inet, nets ) + _collapseNet ( *inet, depth ); + } + + + void KatabaticEngine::_collapseNet ( const Name& name, unsigned int depth ) + { + Net* net = getCell()->getNet ( name ); + + if ( !net ) { + cerr << Error("No net %s in %s" + ,getString(name).c_str() + ,getString(getCell()).c_str()) << endl; + return; + } + + _collapseNet ( net ); + } + + + void KatabaticEngine::_collapseNet ( Net* net, unsigned int depth ) + { + ltrace(100) << "Katabatic::_collapseNet ( " << net << " )" << endl; + ltracein(99); + + forEach ( Component*, icomponent, net->getComponents() ) { + RoutingPad* routingPad = dynamic_cast(*icomponent); + if ( routingPad ) { + ltrace(99) << "RoutingPad " << routingPad << endl; + forEach ( Component*, islaveComponent, routingPad->getSlaveComponents() ) { + ltrace(99) << "SlaveComponent " << *islaveComponent << endl; + Segment* segment = dynamic_cast(*islaveComponent); + if ( segment ) { + AutoSegment* autoSegment = Session::lookup ( segment ); + if ( !autoSegment ) continue; + + if ( autoSegment->isLocal() ) { + ltrace(99) << "Collapsing " << autoSegment << endl; + autoSegment->collapse (); + } + } + } // islaveComponent. + } + } // icomponent. + + ltraceout(99); + } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/NetOptimals.cpp b/katabatic/src/NetOptimals.cpp new file mode 100644 index 00000000..2bcfbea1 --- /dev/null +++ b/katabatic/src/NetOptimals.cpp @@ -0,0 +1,105 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./NetOptimals.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include +#include + +#include "hurricane/DebugSession.h" +#include "hurricane/Net.h" +#include "hurricane/Segment.h" +#include "katabatic/Session.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/KatabaticEngine.h" + + +namespace Katabatic { + + + using namespace std; + using Hurricane::tab; + using Hurricane::ltracein; + using Hurricane::ltraceout; + using Hurricane::inltrace; + using Hurricane::ForEachIterator; + using Hurricane::Net; + using Hurricane::Segment; + using Hurricane::DebugSession; + + + void KatabaticEngine::_computeNetOptimals ( Net* net ) + { + DebugSession::open ( net, 88 ); + + ltrace(100) << "Katabatic::_computeNetOptimals ( " << net << " )" << endl; + ltracein(99); + + //cmess2 << " - " << net << endl; + + vector segments; + forEach ( Segment*, segment, net->getSegments() ) { + AutoSegment* autoSegment = Session::lookup ( *segment ); + if ( !autoSegment ) continue; + segments.push_back ( autoSegment ); + } + sort ( segments.begin(), segments.end(), AutoSegment::CompareCanonical() ); + + set processeds; + for ( size_t i=0 ; icomputeOptimal ( &processeds ); + + ltraceout(99); + + DebugSession::close (); + } + + + void KatabaticEngine::_toOptimals ( Net* net, bool onlyNew ) + { + DebugSession::open ( net, 88 ); + + ltrace(100) << "Katabatic::_toOptimals ( " << net << " )" << endl; + ltracein(99); + + //cmess2 << " - " << net << endl; + + vector segments; + forEach ( Segment*, segment, net->getSegments() ) { + AutoSegment* autoSegment = Session::lookup ( *segment ); + if ( not autoSegment ) continue; + segments.push_back ( autoSegment ); + } + sort ( segments.begin(), segments.end(), AutoSegment::CompareCanonical() ); + + set processeds; + for ( size_t i=0 ; itoOptimalAxis ( &processeds ); + + ltraceout(99); + + DebugSession::close (); + } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/PowerRails.cpp b/katabatic/src/PowerRails.cpp new file mode 100644 index 00000000..c972c662 --- /dev/null +++ b/katabatic/src/PowerRails.cpp @@ -0,0 +1,513 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./PowerRails.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include + +#include "hurricane/Warning.h" +#include "hurricane/DataBase.h" +#include "hurricane/Technology.h" +#include "hurricane/Horizontal.h" +#include "hurricane/Vertical.h" +#include "hurricane/Net.h" +#include "hurricane/NetExternalComponents.h" +#include "hurricane/Cell.h" +#include "hurricane/Instance.h" +#include "crlcore/RoutingLayerGauge.h" +#include "crlcore/RoutingGauge.h" +#include "katabatic/KatabaticEngine.h" + + +namespace { + + + using namespace std; + using namespace Hurricane; + + +// ------------------------------------------------------------------- +// Class : "::RailSegment". + + + class RailSegment { + public: + RailSegment ( DbU::Unit axis, DbU::Unit width ); + inline DbU::Unit getAxis () const; + inline DbU::Unit getMin () const; + inline DbU::Unit getMax () const; + inline const Interval& getSpan () const; + inline DbU::Unit getWidth () const; + void merge ( DbU::Unit ); + void doLayout ( Cell*, Net*, const Layer*, Constant::Direction ) const; + private: + DbU::Unit _axis; + DbU::Unit _width; + Interval _span; + }; + + + RailSegment::RailSegment ( DbU::Unit axis, DbU::Unit width ) + : _axis (axis) + , _width(width) + , _span () + { } + + + inline DbU::Unit RailSegment::getAxis () const { return _axis; } + inline DbU::Unit RailSegment::getMin () const { return _span.getVMin(); } + inline DbU::Unit RailSegment::getMax () const { return _span.getVMax(); } + inline const Interval& RailSegment::getSpan () const { return _span; } + inline DbU::Unit RailSegment::getWidth () const { return _width; } + inline void RailSegment::merge ( DbU::Unit bound ) { _span.merge(bound); } + + + void RailSegment::doLayout ( Cell* cell, Net* net, const Layer* layer, Constant::Direction direction ) const + { + Segment* segment = NULL; + + switch ( direction ) { + case Constant::Horizontal: + segment = Horizontal::create ( net + , layer + , _axis + , _width + , _span.getVMin() + , _span.getVMax() ); + break; + case Constant::Vertical: + segment = Vertical::create ( net + , layer + , _axis + , _width + , _span.getVMin() + , _span.getVMax() ); + break; + } + + if ( segment ) + NetExternalComponents::setExternal ( segment ); + } + + +// ------------------------------------------------------------------- +// Class : "::PowerRail". + + + class PowerRail { + public: + struct CompareByAxis : binary_function { + bool operator() ( const PowerRail* lhs, const PowerRail* rhs ); + }; + public: + PowerRail ( Net::Type, const Layer*, Constant::Direction, DbU::Unit axis ); + ~PowerRail (); + inline Net::Type getType () const; + inline const Layer* getLayer () const; + inline DbU::Unit getAxis () const; + void merge ( DbU::Unit width, DbU::Unit min, DbU::Unit max ); + void doLayout ( Cell*, Net* powerNet, Net* groundNet ) const; + private: + Net::Type _type; + const Layer* _layer; + Constant::Direction _direction; + DbU::Unit _axis; + list _segments; + }; + + + PowerRail::PowerRail ( Net::Type type, const Layer* layer, Constant::Direction direction, DbU::Unit axis ) + : _type (type) + , _layer (layer) + , _direction(direction) + , _axis (axis) + , _segments () + { } + + + PowerRail::~PowerRail () + { + while ( !_segments.empty() ) { + delete _segments.front (); + _segments.pop_front (); + } + } + + + inline Net::Type PowerRail::getType () const { return _type; } + inline const Layer* PowerRail::getLayer () const { return _layer; } + inline DbU::Unit PowerRail::getAxis () const { return _axis; } + + + void PowerRail::merge ( DbU::Unit width, DbU::Unit min, DbU::Unit max ) + { + RailSegment* inserted = NULL; + + list::iterator isegment = _segments.begin(); + for ( ; (isegment != _segments.end()) && !inserted ; isegment++ ) { + if ( (*isegment)->getWidth() != width ) continue; + + if ( (*isegment)->getMin() > max ) { + inserted = new RailSegment ( _axis, width ); + inserted->merge ( min ); + inserted->merge ( max ); + _segments.insert ( isegment, inserted ); + + break; + } + if ( (*isegment)->getMax() < min ) { + continue; + } + + inserted = *isegment; + (*isegment)->merge ( min ); + (*isegment)->merge ( max ); + + list::iterator imerge = isegment; + if ( imerge != _segments.end() ) imerge++; + + while ( imerge != _segments.end() ) { + if ( (*imerge)->getMin() > (*isegment)->getMax() ) break; + + (*isegment)->merge ( (*imerge)->getMax() ); + + delete *imerge; + _segments.erase ( imerge ); + imerge = isegment; + imerge++; + } + + break; + } + + if ( !inserted ) { + inserted = new RailSegment ( _axis, width ); + inserted->merge ( min ); + inserted->merge ( max ); + _segments.insert ( _segments.end(), inserted ); + } + } + + + void PowerRail::doLayout ( Cell* cell, Net* powerNet, Net* groundNet ) const + { + //const Layer* layer = DataBase::getDB()->getTechnology()->getLayer("METAL1"); + + Net* railNet = (_type == Net::Type::POWER) ? powerNet : groundNet; + + list::const_iterator isegment = _segments.begin(); + for ( ; isegment != _segments.end() ; isegment++ ) + (*isegment)->doLayout ( cell, railNet, _layer, _direction ); + } + + + bool PowerRail::CompareByAxis::operator() ( const PowerRail* lhs, const PowerRail* rhs ) + { return lhs->getAxis() < rhs->getAxis(); } + + +// ------------------------------------------------------------------- +// Class : "::PowerPlane". + + + class PowerPlane { + public: + PowerPlane ( const Layer* ); + ~PowerPlane (); + inline const Layer* getLayer () const; + size_t find ( DbU::Unit axis, Constant::Direction ) const; + void merge ( Net::Type, Constant::Direction, DbU::Unit axis, DbU::Unit width, DbU::Unit min, DbU::Unit max ); + void doLayout ( Cell* cell, Net* powerNet, Net* groundNet ) const; + private: + const Layer* _layer; + vector _hrails; + vector _vrails; + }; + + + PowerPlane::PowerPlane ( const Layer* layer ) + : _layer (layer) + , _hrails() + , _vrails() + { } + + + PowerPlane::~PowerPlane () + { + while ( !_hrails.empty() ) { + delete _hrails.back(); + _hrails.pop_back (); + } + while ( !_vrails.empty() ) { + delete _vrails.back(); + _vrails.pop_back (); + } + } + + + size_t PowerPlane::find ( DbU::Unit axis, Constant::Direction direction ) const + { + PowerRail bound(Net::Type::GROUND,NULL,Constant::Horizontal,axis); + + if ( direction == Constant::Horizontal ) { + vector::const_iterator it + = lower_bound(_hrails.begin(),_hrails.end(),&bound,PowerRail::CompareByAxis()); + return it - _hrails.begin(); + } + + vector::const_iterator it + = lower_bound(_vrails.begin(),_vrails.end(),&bound,PowerRail::CompareByAxis()); + return it - _vrails.begin(); + } + + + void PowerPlane::merge ( Net::Type type + , Constant::Direction direction + , DbU::Unit axis + , DbU::Unit width + , DbU::Unit rmin + , DbU::Unit rmax + ) + { + vector* rails; + + switch ( direction ) { + case Constant::Vertical : rails = &_vrails; break; + case Constant::Horizontal: + default: + rails = &_hrails; break; + } + + size_t i = find ( axis, direction ); + if ( ( i == rails->size() ) || ( (*rails)[i]->getAxis() != axis ) ) { + PowerRail* rail = new PowerRail (type,_layer,direction,axis); + rail->merge ( width, rmin, rmax ); + rails->push_back ( rail ); + sort ( rails->begin(), rails->end(), PowerRail::CompareByAxis() ); + } else { + if ( (*rails)[i]->getType() != type ) { + cerr << Error("Short between power rails at %d.",DbU::getValueString(axis).c_str()) << endl; + return; + } + (*rails)[i]->merge ( width, rmin, rmax ); + } + } + + + void PowerPlane::doLayout ( Cell* cell, Net* powerNet, Net* groundNet ) const + { + for ( size_t i=0 ; i<_hrails.size() ; i++ ) + _hrails[i]->doLayout ( cell, powerNet, groundNet ); + + for ( size_t i=0 ; i<_vrails.size() ; i++ ) + _vrails[i]->doLayout ( cell, powerNet, groundNet ); + } + + +// ------------------------------------------------------------------- +// Class : "::PowerRail". + + + class PowerGrid { + public: + PowerGrid ( Cell* ); + ~PowerGrid (); + PowerPlane* getPlane ( const Layer* ); + void merge ( const Transformation&, Horizontal* ); + void merge ( const Transformation&, Vertical* ); + void doLayout () const; + private: + Cell* _cell; + Net* _powerNet; + Net* _groundNet; + map _planes; + }; + + + PowerGrid::PowerGrid ( Cell* cell ) + : _cell (cell) + , _powerNet (NULL) + , _groundNet(NULL) + , _planes () + { + forEach ( Net*, inet, _cell->getNets() ) { + if ( (inet->getType() == Net::Type::POWER) ) { + if ( !inet->isExternal() ) { + cerr << Warning("Ignoring non-external power net %s." + ,getString(*inet).c_str()) << endl; + continue; + } + _powerNet = *inet; + break; + } + } + if ( !_powerNet ) + cerr << Error("Missing POWER net in Cell %s.",getString(_cell->getName()).c_str()) << endl; + + forEach ( Net*, inet, _cell->getNets() ) { + if ( inet->getType() == Net::Type::GROUND ) { + if ( !inet->isExternal() ) { + cerr << Warning("Ignoring non-external ground net %s." + ,getString(*inet).c_str()) << endl; + continue; + } + _groundNet = *inet; + break; + } + } + if ( !_groundNet ) + cerr << Error("Missing GROUND net in Cell %s.",getString(_cell->getName()).c_str()) << endl; + } + + + PowerGrid::~PowerGrid () + { + map::iterator iplane = _planes.begin(); + for ( ; iplane != _planes.end() ; iplane++ ) + delete iplane->second; + } + + + PowerPlane* PowerGrid::getPlane ( const Layer* layer ) + { + map::iterator iplane = _planes.find(layer); + if ( iplane != _planes.end() ) + return iplane->second; + + PowerPlane* plane = new PowerPlane ( layer ); + _planes.insert ( make_pair(layer,plane) ); + + return plane; + } + + + void PowerGrid::merge ( const Transformation& transformation, Horizontal* horizontal ) + { + PowerPlane* plane = getPlane ( horizontal->getLayer() ); + + Point source = horizontal->getSourcePosition(); + Point target = horizontal->getTargetPosition(); + transformation.applyOn ( source ); + transformation.applyOn ( target ); + + if ( source.getX() > target.getX() ) swap ( source, target ); + plane->merge ( horizontal->getNet()->getType() + , Constant::Horizontal + , source.getY() + , horizontal->getWidth() + , source.getX() + , target.getX() + ); + } + + + void PowerGrid::merge ( const Transformation& transformation, Vertical* vertical ) + { + PowerPlane* plane = getPlane ( vertical->getLayer() ); + + Point source = vertical->getSourcePosition(); + Point target = vertical->getTargetPosition(); + transformation.applyOn ( source ); + transformation.applyOn ( target ); + + if ( source.getY() > target.getY() ) swap ( source, target ); + plane->merge ( vertical->getNet()->getType() + , Constant::Vertical + , source.getX() + , vertical->getWidth() + , source.getY() + , target.getY() + ); + } + + + void PowerGrid::doLayout () const + { + map::const_iterator iplane = _planes.begin (); + for ( ; iplane != _planes.end() ; iplane++ ) + iplane->second->doLayout ( _cell, _powerNet, _groundNet ); + } + + + void copyUpPowerRails ( const Transformation& pathTransf + , Cell* instanceCell + , PowerGrid& powerGrid + ) + { + forEach ( Net*, inet, instanceCell->getNets() ) { + switch ( inet->getType() ) { + case Net::Type::POWER: + case Net::Type::GROUND: + break; + default: + continue; + } + + forEach ( Component*, icomponent, inet->getComponents() ) { + if ( !NetExternalComponents::isExternal(*icomponent) ) continue; + + Horizontal* horizontal = dynamic_cast(*icomponent); + if ( horizontal ) + powerGrid.merge ( pathTransf, horizontal ); + else { + Vertical* vertical = dynamic_cast(*icomponent); + if ( vertical ) + powerGrid.merge ( pathTransf, vertical ); + } + } + } + + forEach ( Instance*, iinstance, instanceCell->getInstances() ) { + + Transformation instanceTransf = iinstance->getTransformation(); + pathTransf.applyOn ( instanceTransf ); + + copyUpPowerRails ( instanceTransf, iinstance->getMasterCell(), powerGrid ); + } + } + + +} // End of local namespace. + + +namespace Katabatic { + + + using Hurricane::Point; + using Hurricane::Horizontal; + using Hurricane::Net; + using Hurricane::Cell; + using Hurricane::Instance; + + + void KatabaticEngine::makePowerRails () + { + PowerGrid powerGrid ( getCell() ); + + Transformation topTransformation; // ID. + copyUpPowerRails ( topTransformation, getCell(), powerGrid ); + + powerGrid.doLayout (); + } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/Session.cpp b/katabatic/src/Session.cpp new file mode 100644 index 00000000..49a1f6a2 --- /dev/null +++ b/katabatic/src/Session.cpp @@ -0,0 +1,438 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Module : "./Session.cpp" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#include +#include + +#include "hurricane/Error.h" +#include "hurricane/Horizontal.h" +#include "hurricane/Vertical.h" +#include "hurricane/Cell.h" +#include "hurricane/UpdateSession.h" +#include "crlcore/RoutingGauge.h" +#include "katabatic/Session.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/GCellGrid.h" +#include "katabatic/KatabaticEngine.h" + + +namespace { + + + const char* reopenSession = + "Session::open() :\n\n" + " Session already open for %s (internal error)."; + + const char* openSessionError = + "%s :\n\n" + " Session has not been opened (internal error)."; + + +} // End of local namespace. + + + + +namespace Katabatic { + + + using namespace std; + using Hurricane::tab; + using Hurricane::ltracein; + using Hurricane::ltraceout; + using Hurricane::inltrace; + using Hurricane::Error; + using Hurricane::ForEachIterator; + using Hurricane::UpdateSession; + using Hurricane::Horizontal; + using Hurricane::Vertical; + using Hurricane::Cell; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::Session". + + + Session* Session::_session = NULL; + + + Session* Session::get ( const char* message ) + { + if ( not _session and message ) + throw Error ( openSessionError, message ); + return _session; + } + + + Session::Session ( KatabaticEngine* ktbt ) + : _katabatic (ktbt) + , _technology (ktbt->getRoutingGauge()->getTechnology()) + , _routingGauge (ktbt->getRoutingGauge()) + , _autoContacts () + , _autoSegments () + , _revalidateds () + , _dogLegs () + , _netInvalidateds () + , _netRevalidateds () + , _invalidateMask (0) + { } + + + void Session::_postCreate () + { + UpdateSession::open (); + _session = this; + } + + + Session::~Session () + { } + + + size_t Session::_preDestroy () + { + size_t count = 0; + if ( _katabatic->getState() <= StateActive ) { + _revalidate (); + + if ( _katabatic->getGCellGrid() ) + _katabatic->getGCellGrid()->updateDensity (); + } + UpdateSession::close(); + + return count; + } + + + bool Session::_doDestroyBaseContact () { return _katabatic->doDestroyBaseContact(); } + bool Session::_doDestroyBaseSegment () { return _katabatic->doDestroyBaseSegment(); } + bool Session::_doDestroyTool () { return _katabatic->doDestroyTool(); } + Configuration* Session::_getConfiguration () { return _katabatic->getConfiguration(); } + + + void Session::_splitContacts () + { + ltrace(110) << "Katabatic::Session::_splitContacts()" << endl; + ltracein(110); + + for ( size_t i=0; i<_autoContacts.size() ; i++ ) + _autoContacts[i]->split (); + + ltraceout(110); + } + + + void Session::_restoreVCon () + { + ltrace(110) << "Katabatic::Session::_restoreVCon()" << endl; + ltracein(110); + + for ( size_t i=0; i<_autoContacts.size() ; i++ ) { + DbU::Unit y = DbU::Max; + forEach ( Horizontal*, isegment, _autoContacts[i]->getSlaveComponents().getSubSet() ) { + y = isegment->getY(); + } + _autoContacts[i]->restoreVConnexity ( y, true ); + } + + ltraceout(110); + } + + + void Session::_restoreHCon () + { + ltrace(110) << "Katabatic::Session::_restoreHCon()" << endl; + ltracein(110); + + for ( size_t i=0; i<_autoContacts.size() ; i++ ) { + DbU::Unit x = DbU::Max; + forEach ( Vertical*, isegment, _autoContacts[i]->getSlaveComponents().getSubSet() ) { + x = isegment->getX(); + } + _autoContacts[i]->restoreHConnexity ( x, true ); + } + + ltraceout(110); + } + + + void Session::_canonize () + { + ltrace(110) << "Katabatic::Session::_canonize()" << endl; + ltracein(110); + + set exploredSegments; + vector aligneds; + + sort ( _autoSegments.begin(), _autoSegments.end(), AutoSegment::CompareCanonical() ); + + for ( size_t i=0 ; i<_autoSegments.size() ; i++ ) { + AutoSegment* seedSegment = _autoSegments[i]; + + if ( exploredSegments.find(seedSegment->getSegment()) == exploredSegments.end() ) { + ltrace(110) << "New chunk from: " << seedSegment << endl; + aligneds.push_back ( seedSegment ); + + bool isCanonicalLocal = seedSegment->isLocal(); + forEach ( AutoSegment*, collapsed, seedSegment->getCollapseds() ) { + ltrace(110) << "Aligned: " << *collapsed << endl; + aligneds.push_back ( *collapsed ); + exploredSegments.insert ( collapsed->getSegment() ); + + if ( collapsed->isGlobal() ) isCanonicalLocal = false; + } + + ltracein(110); + sort ( aligneds.begin(), aligneds.end(), AutoSegment::CompareCanonical() ); + + if ( aligneds.size() > 1 ) { + if ( not AutoSegment::CompareCanonical() ( aligneds[0], aligneds[1] ) ) { + cerr << "Ambiguous canonization: " << aligneds[0]->base() << endl; + cerr << "Ambiguous canonization: " << aligneds[1]->base() << endl; + } + } + + aligneds[0]->setCanonical ( true ); + aligneds[0]->setCanonicalLocal ( isCanonicalLocal ); + ltrace(110) << "Canonical: " << aligneds[0] << endl; + + for ( size_t j=1 ; jsetCanonical ( false ); + ltrace(110) << "Secondary: " << aligneds[j] << endl; + } + + ltrace(159) << "Align @" << DbU::getLambda(aligneds[0]->getAxis()) + << " on " << aligneds[0] << endl; + + aligneds[0]->setAxis ( aligneds[0]->getAxis(), Realignate ); + aligneds.clear (); + ltraceout(110); + } + } + + ltraceout(110); + } + + + void Session::_revalidateTopology () + { + ltrace(110) << "Katabatic::Session::_revalidateTopology()" << endl; + ltracein(110); + + if ( not _netInvalidateds.empty() ) { + set::iterator inet = _netInvalidateds.begin(); + + if ( _invalidateMask & NetSplitContacts ) { + _splitContacts (); + _invalidateMask &= ~NetSplitContacts; + } + + if ( _invalidateMask & RestoreVCon ) { + _restoreVCon (); + _invalidateMask &= ~RestoreVCon; + } + + if ( _invalidateMask & RestoreHCon ) { + _restoreVCon (); + _invalidateMask &= ~RestoreHCon; + } + + if ( _invalidateMask & NetCanonize ) { + for ( ; inet != _netInvalidateds.end() ; inet++ ) { + ltrace(110) << "Katabatic::Session::_revalidateTopoplogy(Net*)" << *inet << endl; + + _katabatic->_computeNetConstraints ( *inet ); + _katabatic->_computeNetOptimals ( *inet ); + _katabatic->_computeNetTerminals ( *inet ); + } + _canonize (); + + for ( size_t i=0 ; i<_autoSegments.size() ; ++i ) { + if ( _autoSegments[i]->isUnsetAxis() + and _autoSegments[i]->isCanonical() ) { + _autoSegments[i]->toOptimalAxis (); + } + } + _invalidateMask &= ~NetCanonize; + } + } + + ltraceout(110); + } + + + size_t Session::_revalidate () + { + ltrace(110) << "Katabatic::Session::revalidate()" << endl; + ltracein(110); + + size_t count = 0; + + _revalidateTopology (); + _netRevalidateds.clear (); + _netRevalidateds.swap ( _netInvalidateds ); + + ltrace(110) << "AutoContacts Revalidate (after canonize)." << endl; + for ( size_t i=0 ; i < _autoContacts.size() ; i++, count++ ) + _autoContacts[i]->revalidate (); + _autoContacts.clear (); + + ltrace(110) << "AutoSegments Revalidate (after canonize)." << endl; + for ( size_t i=0 ; i < _autoSegments.size() ; i++, count++ ) + _autoSegments[i]->revalidate (); + _revalidateds.clear (); + _autoSegments.swap ( _revalidateds ); + _dogLegs.clear (); + + ltrace(110) << "AutoSegments/AutoContacts queued deletion." << endl; + bool destroySegment = _katabatic->setDestroyBaseSegment ( true ); + bool destroyContact = _katabatic->setDestroyBaseContact ( true ); + set::iterator isegment = _destroyedSegments.begin(); + for ( ; isegment != _destroyedSegments.end() ; isegment++ ) { + AutoContact* source = (*isegment)->getAutoSource(); + AutoContact* target = (*isegment)->getAutoTarget(); + (*isegment)->destroy (); + if (source and source->canDestroy(true)) source->destroy (); + if (target and target->canDestroy(true)) target->destroy (); + } + _katabatic->setDestroyBaseSegment ( destroySegment ); + _katabatic->setDestroyBaseContact ( destroyContact ); + set().swap ( _destroyedSegments ); + + ltraceout(110); + + return count; + } + + + Session* Session::open ( KatabaticEngine* ktbt ) + { + ltrace(110) << "Session::open()" << endl; + + if ( _session ) { + if ( _session->_katabatic != ktbt ) + throw Error ( reopenSession, getString(_session->getKatabatic()).c_str() ); + + return _session; + } + + Session* session = new Session ( ktbt ); + session->_postCreate (); + + return session; + } + + + size_t Session::close () + { + ltrace(110) << "Session::close()" << endl; + ltracein(110); + + if ( !_session ) throw Error ( openSessionError, "Session::Close()" ); + + size_t count = _session->_preDestroy (); + + delete _session; + _session = NULL; + + ltraceout(110); + + return count; + } + + + bool Session::getDemoMode () + { return get("getDemoMode()")->_katabatic->getDemoMode(); } + + + float Session::getSaturateRatio () + { return get("getSaturateRatio()")->_katabatic->getSaturateRatio(); } + + + bool Session::getWarnGCellOverload () + { return get("getWarnGCellOverload()")->_katabatic->getWarnGCellOverload(); } + + + void Session::setWarnGCellOverload ( bool state ) + { get("getWarnGCellOverload()")->_katabatic->setWarnGCellOverload(state); } + + + DbU::Unit Session::getExtensionCap () + { return getConfiguration()->getExtensionCap(); } + + + const Layer* Session::getRoutingLayer ( size_t depth ) + { return getConfiguration()->getRoutingLayer(depth); } + + + const Layer* Session::getContactLayer ( size_t depth ) + { return getConfiguration()->getContactLayer(depth); } + + + void Session::link ( AutoContact* autoContact ) + { return get("link(AutoContact*)")->_katabatic->_link ( autoContact ); } + + + void Session::link ( AutoSegment* autoSegment ) + { return get("link(AutoSegment*)")->_katabatic->_link ( autoSegment ); } + + + void Session::unlink ( AutoContact* autoContact ) + { return get("unlink(AutoContact*)")->_katabatic->_unlink ( autoContact ); } + + + void Session::unlink ( AutoSegment* autoSegment ) + { return get("unlink(AutoSegment*)")->_katabatic->_unlink ( autoSegment ); } + + + AutoContact* Session::lookup ( Contact* contact ) + { return get("lookup(Contact*)")->_katabatic->_lookup ( contact ); } + + + AutoSegment* Session::lookup ( Segment* segment ) + { return get("lookup(Segment*)")->_katabatic->_lookup ( segment ); } + + + string Session::_getString () const + { + return "<" + _getTypeName() + " " + + getString(_katabatic->getCell()->getName()) + + ">"; + } + + + Record* Session::_getRecord () const + { + Record* record = new Record ( _getString() ); + record->add ( getSlot ( "_katabatic" , _katabatic ) ); + record->add ( getSlot ( "_autoContacts", &_autoContacts ) ); + record->add ( getSlot ( "_autoSegments", &_autoSegments ) ); + return record; + } + + +} // End of Katabatic namespace. diff --git a/katabatic/src/katabatic/AutoContact.h b/katabatic/src/katabatic/AutoContact.h new file mode 100644 index 00000000..e77176e9 --- /dev/null +++ b/katabatic/src/katabatic/AutoContact.h @@ -0,0 +1,359 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./AutoContact.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#ifndef __KATABATIC_AUTOCONTACT__ +#define __KATABATIC_AUTOCONTACT__ + +#include + +#include "hurricane/Contact.h" +#include "hurricane/ExtensionGo.h" + +namespace Hurricane { + class RoutingPad; +} + +#include "katabatic/AutoContacts.h" +#include "katabatic/GCell.h" + + +namespace Katabatic { + + + using std::cerr; + using std::endl; + using Hurricane::tab; + using Hurricane::inltrace; + using Hurricane::Name; + using Hurricane::Net; + using Hurricane::Component; + using Hurricane::Components; + using Hurricane::Layer; + using Hurricane::Contact; + using Hurricane::RoutingPad; + using Hurricane::ExtensionGo; + + class GCell; + class KatabaticEngine; + + + +// ------------------------------------------------------------------- +// Class : "Katabatic::VirtualContacts". + + + class VirtualContacts { + public: + // Methods. + inline VirtualContacts (); + inline Box getBoundingBox () const; + void merge ( const Point& , const Layer* ); + inline void clear (); + + public: + // Sub-Class. + class VC { + public: + inline VC ( const Point& , const Layer* ); + inline const Point& getPoint () const; + inline const Layer* getLayer () const; + void merge ( const Layer* layer ); + friend bool operator== ( const VC& lhs, const VC& rhs ); + protected: + Point _point; + const Layer* _layer; + }; + + protected: + // Attributes. + Box _boundingBox; + vector _vcs; + }; + + +// Inline Functions. + inline VirtualContacts::VirtualContacts () : _boundingBox(), _vcs() {} + inline Box VirtualContacts::getBoundingBox () const { return _boundingBox; } + inline void VirtualContacts::clear () { _vcs.clear(); _boundingBox.makeEmpty(); } + inline VirtualContacts::VC::VC ( const Point& p, const Layer* l ) : _point(p), _layer(l) {} + inline const Point& VirtualContacts::VC::getPoint () const { return _point; } + inline const Layer* VirtualContacts::VC::getLayer () const { return _layer; } + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoContact". + + + class AutoContact : public ExtensionGo { + + public: + static AutoContact* fromRp ( GCell* gcell + , RoutingPad* routingPad + , const Layer* layer + , Point point + , DbU::Unit width + , DbU::Unit height + , bool fixed=false + ); + public: + // Constructor & Destructor. + static AutoContact* create ( GCell* gcell + , Net* net + , const Layer* layer + , bool hAlignate=false + , bool vAlignate=false + ); + static AutoContact* create ( GCell* gcell + , RoutingPad* rp + , const Layer* layer + , const DbU::Unit dx + , const DbU::Unit dy + , const DbU::Unit width + , const DbU::Unit height + , bool hAlignate=false + , bool vAlignate=false + , bool fixed=false + ); + public: + // Wrapped Contact Accessors. + inline Hook* getBodyHook (); + inline Hook* getAnchorHook (); + inline Component* getAnchor () const; + inline Net* getNet () const; + inline const Layer* getLayer () const; + inline DbU::Unit getX () const; + inline DbU::Unit getY () const; + inline DbU::Unit getDx () const; + inline DbU::Unit getDy () const; + inline Point getCenter () const; + inline Point getPosition () const; + inline DbU::Unit getWidth () const; + inline DbU::Unit getHalfWidth () const; + inline DbU::Unit getHeight () const; + inline DbU::Unit getHalfHeight () const; + inline Components getSlaveComponents () const; + // Wrapped Contact Modifiers. + inline void setLayer ( const Layer* ); + inline void setWidth ( DbU::Unit ); + inline void setHeight ( DbU::Unit ); + inline void setSizes ( DbU::Unit width, DbU::Unit height ); + inline void setX ( DbU::Unit ); + inline void setY ( DbU::Unit ); + inline void setPosition ( DbU::Unit width, DbU::Unit height ); + inline void setPosition ( const Point& ); + inline void setDx ( DbU::Unit ); + inline void setDy ( DbU::Unit ); + inline void setOffset ( DbU::Unit dx, DbU::Unit dy ); + virtual void translate ( const DbU::Unit& tx, const DbU::Unit& ty ); + // Accessors. + static size_t getSegmentEndAllocateds (); + static size_t getAllocateds (); + static const Name& getStaticName (); + virtual const Name& getName () const; + inline size_t getId () const; + inline Contact* base () const; + inline Contact* getContact () const; + virtual Box getBoundingBox () const; + inline GCell* getGCell () const; + unsigned int getMinDepth () const; + bool canDestroy ( bool error=false ) const; + inline bool isInvalidated () const; + inline bool isCorner () const; + inline bool isFixed () const; + inline bool isTerminal () const; + bool isAlignate ( unsigned int direction ) const; + inline bool isHAlignate () const; + inline bool isVAlignate () const; + bool isHExtended (); + bool isVExtended (); + bool canGoOutsideGCell ( const AutoSegment* ); + bool canHDesalignate (); + bool canVDesalignate (); + bool canMoveUp ( AutoSegment* moved ) const; + void getLengths ( DbU::Unit* lengths, set& ); + Box getNativeConstraintBox () const; + Interval getUConstraints ( unsigned int direction ) const; + inline DbU::Unit getCBXMin () const; + inline DbU::Unit getCBXMax () const; + inline DbU::Unit getCBYMin () const; + inline DbU::Unit getCBYMax () const; + inline Box getConstraintBox () const; + Box& intersectConstraintBox ( Box& box ) const; + // Modifiers. + inline void setInvalidated ( bool state ); + inline void setCorner ( bool state ); + inline void setFixed ( bool state ); + inline void setTerminal ( bool state ); + inline void setHAlignate ( bool state ); + inline void setVAlignate ( bool state ); + void computeAlignate (); + void invalidate (); + void revalidate (); + void updateGeometry (); + inline void setInvalidatedTopology ( bool state ); + void revalidateTopology (); + void checkTopology (); + void setGCell ( GCell* ); + inline void setCBXMin ( DbU::Unit xMin ); + inline void setCBXMax ( DbU::Unit xMax ); + inline void setCBYMin ( DbU::Unit yMin ); + inline void setCBYMax ( DbU::Unit yMax ); + void setConstraintBox ( const Box& box ); + void restrictConstraintBox ( DbU::Unit constraintMin + , DbU::Unit constraintMax + , unsigned int direction ); + void restoreNativeConstraintBox (); + void breakUp (); + void split (); + bool hDesalignate (); + bool vDesalignate (); + void restoreHConnexity ( DbU::Unit x, bool split=false ); + void restoreVConnexity ( DbU::Unit y, bool split=false ); + // Collections. + AutoContacts getCollapseds ( unsigned int direction ); + // Inspector Management. + Record* _getRecord () const; + virtual string _getString () const; + virtual string _getTypeName () const { return "Katabatic::AutoContact"; }; + + private: + // Internal: Attributes. + static size_t _maxId; + static size_t _allocateds; + static const Name _goName; + protected: + size_t _id; + Contact* _contact; + GCell* _gcell; + bool _invalid; + bool _invalidTopology; + bool _isTerminal; + bool _fixed; + bool _hAlignate; + bool _vAlignate; + bool _isCorner; + int _dxMin : 8; + int _dxMax : 8; + int _dyMin : 8; + int _dyMax : 8; + VirtualContacts _subContacts; + + protected: + // Constructors & Destructors. + AutoContact ( GCell* gcell + , Contact* contact + , bool hAlignate=false + , bool vAlignate=false + ); + virtual ~AutoContact (); + virtual void _postCreate (); + virtual void _preDestroy (); + private: + AutoContact ( const AutoContact& ); + AutoContact& operator= ( const AutoContact& ); + + protected: + inline int _getDeltaMin ( DbU::Unit x, DbU::Unit xMin ); + inline int _getDeltaMax ( DbU::Unit x, DbU::Unit xMin, DbU::Unit xMax ); + }; + + +// Wrapped Contact Inline Functions. + inline Hook* AutoContact::getBodyHook () { return _contact->getBodyHook(); } + inline Hook* AutoContact::getAnchorHook () { return _contact->getAnchorHook(); } + inline Component* AutoContact::getAnchor () const { return _contact->getAnchor(); } + inline Net* AutoContact::getNet () const { return _contact->getNet(); } + inline const Layer* AutoContact::getLayer () const { return _contact->getLayer(); } + inline DbU::Unit AutoContact::getX () const { return _contact->getX(); } + inline DbU::Unit AutoContact::getY () const { return _contact->getY(); } + inline DbU::Unit AutoContact::getDx () const { return _contact->getDx(); } + inline DbU::Unit AutoContact::getDy () const { return _contact->getDy(); } + inline Point AutoContact::getCenter () const { return _contact->getCenter(); } + inline Point AutoContact::getPosition () const { return _contact->getPosition(); } + inline DbU::Unit AutoContact::getWidth () const { return _contact->getWidth(); } + inline DbU::Unit AutoContact::getHalfWidth () const { return _contact->getHalfWidth(); } + inline DbU::Unit AutoContact::getHeight () const { return _contact->getHeight(); } + inline DbU::Unit AutoContact::getHalfHeight () const { return _contact->getHalfHeight(); } + inline Components AutoContact::getSlaveComponents () const { return _contact->getSlaveComponents(); } + inline void AutoContact::setLayer ( const Layer* layer ) { return _contact->setLayer(layer); } + inline void AutoContact::setWidth ( DbU::Unit w ) { return _contact->setWidth(w); } + inline void AutoContact::setHeight ( DbU::Unit h ) { return _contact->setHeight(h); } + inline void AutoContact::setSizes ( DbU::Unit w, DbU::Unit h ) { return _contact->setSizes(w,h); } + inline void AutoContact::setX ( DbU::Unit x ) { return _contact->setX(x); } + inline void AutoContact::setY ( DbU::Unit y ) { return _contact->setY(y); } + inline void AutoContact::setPosition ( DbU::Unit x, DbU::Unit y ) { return _contact->setPosition(x,y); } + inline void AutoContact::setPosition ( const Point& p ) { return _contact->setPosition(p); } + inline void AutoContact::setDx ( DbU::Unit dx ) { return _contact->setDx(dx); } + inline void AutoContact::setDy ( DbU::Unit dy ) { return _contact->setDy(dy); } + inline void AutoContact::setOffset ( DbU::Unit dx, DbU::Unit dy ) { return _contact->setOffset(dx,dy); } +// Inline Functions. + inline size_t AutoContact::getId () const { return _id; } + inline Contact* AutoContact::base () const { return _contact; } + inline Contact* AutoContact::getContact () const { return _contact; } + inline GCell* AutoContact::getGCell () const { return _gcell; } + inline bool AutoContact::isInvalidated () const { return _invalid; } + inline bool AutoContact::isCorner () const { return _isCorner; } + inline bool AutoContact::isFixed () const { return _fixed; } + inline bool AutoContact::isTerminal () const { return _isTerminal; } + inline bool AutoContact::isHAlignate () const { return _hAlignate; } + inline bool AutoContact::isVAlignate () const { return _vAlignate; } + inline DbU::Unit AutoContact::getCBXMin () const { return DbU::lambda(_dxMin) + _gcell->getX(); } + inline DbU::Unit AutoContact::getCBXMax () const { return DbU::lambda(_dxMax) + _gcell->getX(); } + inline DbU::Unit AutoContact::getCBYMin () const { return DbU::lambda(_dyMin) + _gcell->getY(); } + inline DbU::Unit AutoContact::getCBYMax () const { return DbU::lambda(_dyMax) + _gcell->getY(); } + inline Box AutoContact::getConstraintBox () const { return Box(getCBXMin(),getCBYMin(),getCBXMax(),getCBYMax()); } + inline void AutoContact::setInvalidated ( bool state ) { _invalid = state; } + inline void AutoContact::setInvalidatedTopology ( bool state ) { _invalidTopology = state; } + inline void AutoContact::setCorner ( bool state ) { _isCorner = state; } + inline void AutoContact::setFixed ( bool state ) { _fixed = state; } + inline void AutoContact::setTerminal ( bool state ) { _isTerminal = state; } + inline void AutoContact::setHAlignate ( bool state ) { _hAlignate = state; } + inline void AutoContact::setVAlignate ( bool state ) { _vAlignate = state; } + inline void AutoContact::setCBXMin ( DbU::Unit xMin ) { _dxMin = _getDeltaMin(xMin,_gcell->getX()); } + inline void AutoContact::setCBXMax ( DbU::Unit xMax ) { _dxMax = _getDeltaMax(xMax,_gcell->getX(),_gcell->getXMax()); } + inline void AutoContact::setCBYMin ( DbU::Unit yMin ) { _dyMin = _getDeltaMin(yMin,_gcell->getY()); } + inline void AutoContact::setCBYMax ( DbU::Unit yMax ) { _dyMax = _getDeltaMax(yMax,_gcell->getY(),_gcell->getYMax()); } + inline int AutoContact::_getDeltaMin ( DbU::Unit x, DbU::Unit xMin ) { if (xxMax) x=xMax; return (int)DbU::getLambda(x-xMin); } + +//templateinline void Swap ( Type& a, Type& b ) { Type swp = a; a = b; b = swp; } + templateinline void order ( Type& a, Type& b ) { if (a>b) swap(a,b); } + + inline DbU::Unit setInBound ( DbU::Unit lower, DbU::Unit upper, DbU::Unit& value ) + { + if ( lower > value ) value = lower; + if ( upper < value ) value = upper; + + return value; + } + + +} // End of Katabatic namespace. + + +INSPECTOR_P_SUPPORT(Katabatic::AutoContact); + + +#endif // __KATABATIC_AUTOCONTACT__ diff --git a/katabatic/src/katabatic/AutoContacts.h b/katabatic/src/katabatic/AutoContacts.h new file mode 100644 index 00000000..dd1113f8 --- /dev/null +++ b/katabatic/src/katabatic/AutoContacts.h @@ -0,0 +1,165 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./AutoContacts.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + + + +#ifndef __KATABATIC_AUTOCONTACTS__ +#define __KATABATIC_AUTOCONTACTS__ + +#include +#include +#include + +#include "hurricane/Collection.h" + +namespace Hurricane { + class Contact; + class Segment; +} + + +namespace Katabatic { + + + using std::map; + using std::list; + using std::pair; + using std::string; + using Hurricane::Locator; + using Hurricane::Collection; + using Hurricane::GenericLocator; + using Hurricane::GenericCollection; + using Hurricane::GenericFilter; + using Hurricane::Contact; + using Hurricane::Segment; + + class AutoContact; + class AutoSegment; + + +// ------------------------------------------------------------------- +// Collections. + + + typedef Hurricane::Locator AutoContactHL; + typedef Hurricane::Collection AutoContactHC; + typedef GenericCollection AutoContacts; + typedef GenericLocator AutoContactLocator; + typedef GenericFilter AutoContactFilter; + typedef map AutoContactLut; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoContactStack". + + + class AutoContactStack : protected list > { + public: + inline bool isEmpty () const; + inline size_t getSize () const; + void push ( AutoContact*, Segment* ); + inline void pop (); + inline AutoContact* getAutoContact () const; + inline Segment* getSegment () const; + }; + + + inline bool AutoContactStack::isEmpty () const { return empty(); } + inline size_t AutoContactStack::getSize () const { return size(); } + inline void AutoContactStack::pop () { if ( !empty() ) pop_back(); } + inline AutoContact* AutoContactStack::getAutoContact () const { return empty() ? NULL : back().first; } + inline Segment* AutoContactStack::getSegment () const { return empty() ? NULL : back().second; } + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoContacts_Collapsed". + + + class AutoContacts_Collapsed : public AutoContactHC { + + public: + // Sub-Class: Locator. + class Locator : public AutoContactHL { + public: + inline Locator ( AutoContact*, unsigned int direction ); + inline Locator ( const Locator& ); + virtual AutoContact* getElement () const; + virtual AutoContactHL* getClone () const; + virtual bool isValid () const; + virtual void progress (); + virtual string _getString () const; + protected: + unsigned int _direction; + AutoContactStack _stack; + }; + + public: + // AutoContacts_Collapsed Methods. + inline AutoContacts_Collapsed ( AutoContact*, unsigned int direction ); + inline AutoContacts_Collapsed ( const AutoContacts_Collapsed& ); + virtual AutoContactHC* getClone () const; + virtual AutoContactHL* getLocator () const; + virtual string _getString () const; + + public: + // AutoContacts_Collapsed Attributes. + AutoContact* _contact; + unsigned int _direction; + }; + + + AutoContacts_Collapsed::Locator::Locator ( AutoContact* contact + , unsigned int direction ) + : AutoContactHL() + , _stack() + { + _stack.push(contact,NULL); + } + + + AutoContacts_Collapsed::Locator::Locator ( const Locator &locator ) + : AutoContactHL() + , _stack(locator._stack) + { } + + + AutoContacts_Collapsed::AutoContacts_Collapsed ( AutoContact* contact, unsigned int direction ) + : AutoContactHC() + , _contact(contact) + , _direction(direction) + { } + + + AutoContacts_Collapsed::AutoContacts_Collapsed ( const AutoContacts_Collapsed& autocontacts ) + : AutoContactHC() + , _contact(autocontacts._contact) + , _direction(autocontacts._direction) + { } + + +} // End of Katabatic namespace. + + +#endif // __KATABATIC_AUTOCONTACTS__ diff --git a/katabatic/src/katabatic/AutoHorizontal.h b/katabatic/src/katabatic/AutoHorizontal.h new file mode 100644 index 00000000..3ee7a10b --- /dev/null +++ b/katabatic/src/katabatic/AutoHorizontal.h @@ -0,0 +1,119 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./AutoHorizontal.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#ifndef __KATABATIC_AUTOHORIZONTAL__ +#define __KATABATIC_AUTOHORIZONTAL__ + +#include "hurricane/Horizontal.h" +#include "katabatic/AutoSegment.h" + + +namespace Katabatic { + + +// ------------------------------------------------------------------- +// Class : "AutoHorizontal". + + + class AutoHorizontal : public AutoSegment { + using AutoSegment::_computeTerminal; + + public: + // Constructors. + static AutoHorizontal* create ( Horizontal* horizontal + , int type + , bool terminal=false + , bool collapsed=false + ); + static AutoHorizontal* create ( AutoContact* source + , AutoContact* target + , const Layer* layer + , DbU::Unit y + , DbU::Unit width + , int type + , bool terminal=false + , bool collapsed=false + ); + // Predicates. + virtual bool canDesalignate ( AutoContact* ) const; + virtual bool _canSlacken () const; + // Accessors. + virtual Segment* base () { return _horizontal; }; + virtual Segment* base () const { return _horizontal; }; + virtual Segment* getSegment () { return _horizontal; }; + virtual Segment* getSegment () const { return _horizontal; }; + virtual Horizontal* getHorizontal () { return _horizontal; }; + virtual DbU::Unit getSourceU () const { return _horizontal->getSourceX(); }; + virtual DbU::Unit getTargetU () const { return _horizontal->getTargetX(); }; + virtual DbU::Unit getDuSource () const { return _horizontal->getDxSource(); }; + virtual DbU::Unit getDuTarget () const { return _horizontal->getDxTarget(); }; + virtual Interval getSpanU () const { return Interval(_horizontal->getSourceX(),_horizontal->getTargetX()); }; + virtual bool getConstraints ( DbU::Unit& min , DbU::Unit& max ) const; + virtual Interval getSourceConstraints ( bool native=false ) const; + virtual Interval getTargetConstraints ( bool native=false ) const; + virtual unsigned int getDirection () const; + virtual size_t getGCells ( vector& ) const; + // Modifiers. + virtual void setDuSource ( DbU::Unit du ) { _horizontal->setDxSource(du); }; + virtual void setDuTarget ( DbU::Unit du ) { _horizontal->setDxTarget(du); }; + virtual void alignate ( DbU::Unit axis ); + virtual void orient (); + virtual void setPositions (); + virtual bool checkPositions () const; + virtual bool checkConstraints () const; + virtual void _computeTerminal (); + virtual void moveURight (); + virtual void moveULeft (); + virtual void _makeDogLeg ( GCell*, bool upLayer ); + virtual void desalignate ( AutoContact* ); + virtual void _slacken (); + // Inspector Management. + virtual Record* _getRecord () const; + virtual string _getString () const; + virtual string _getTypeName () const { return "AutoHorizontal"; }; + + // Internal: Attributes. + protected: + Horizontal* _horizontal; + + // Internal: Constructors. + protected: + AutoHorizontal ( Horizontal* horizontal + , int type + , bool terminal + , bool collapsed ); + virtual ~AutoHorizontal (); + virtual void _postCreate (); + virtual void _preDestroy (); + private: + AutoHorizontal ( const AutoHorizontal& ); + AutoHorizontal& operator= ( const AutoHorizontal& ); + }; + + +} // End of Katabatic namespace. + + +#endif // __KATABATIC_AUTOHORIZONTAL__ diff --git a/katabatic/src/katabatic/AutoSegment.h b/katabatic/src/katabatic/AutoSegment.h new file mode 100644 index 00000000..64d3ad93 --- /dev/null +++ b/katabatic/src/katabatic/AutoSegment.h @@ -0,0 +1,478 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./AutoSegment.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#ifndef __KATABATIC_AUTOSEGMENT__ +#define __KATABATIC_AUTOSEGMENT__ + +#include +#include +#include +#include + +#include "hurricane/Interval.h" +#include "hurricane/Segment.h" +#include "hurricane/Components.h" +#include "hurricane/Contact.h" +namespace Hurricane { + class Layer; + class Horizontal; + class Vertical; + class Cell; +} + +#include "katabatic/GCell.h" +#include "katabatic/AutoSegments.h" +#include "katabatic/Session.h" + + +namespace Katabatic { + + + using std::set; + using std::cerr; + using std::endl; + using std::binary_function; + using Hurricane::tab; + using Hurricane::inltrace; + using Hurricane::Interval; + using Hurricane::Layer; + using Hurricane::Components; + using Hurricane::Horizontal; + using Hurricane::Vertical; + using Hurricane::Cell; + + + enum AutoSegmentFlags { Realignate=0x1, AxisSet=0x2 }; + + +// ------------------------------------------------------------------- +// Class : "AutoSegment". + + + class AutoSegment { + + public: + // Types. + typedef std::tr1::function< void(AutoSegment*) > RevalidateCb_t; + // Enumerations. + enum Type { Global = 1 + , Local = 2 + , Guess = 3 + }; + enum PerpandicularState { PerpandicularAny = (1<<0) + , PerpandicularIndirect = (1<<1) + , ParallelOrExpanded = (1<<2) + , ParallelAndLayerChange = (1<<3) + }; + + + public: + struct CompareId : public binary_function { + inline bool operator() ( const AutoSegment* lhs, const AutoSegment* rhs ) const; + }; + public: + struct CompareCanonical : public binary_function { + bool operator() ( const AutoSegment* lhs, const AutoSegment* rhs ) const; + }; + public: + struct CompareByDepthLength : public binary_function { + bool operator() ( AutoSegment* lhs, AutoSegment* rhs ) const; + }; + + public: + // Utilities. + static bool isTopologicalBound ( AutoSegment* seed + , bool superior + , bool isHorizontal + ); + static inline bool arePerpandiculars ( AutoSegment* a, AutoSegment* b ); + static inline bool arePerpandiculars ( bool isHorizontalA, AutoSegment* b ); + static inline bool areAligneds ( AutoSegment* a, AutoSegment* b ); + static unsigned int getPerpandicularState ( AutoContact* contact + , AutoSegment* source + , AutoSegment* current + , bool isHorizontalMaster + , const Layer* masterLayer=NULL + ); + static inline unsigned int getPerpandicularState ( AutoContact* contact + , AutoSegment* source + , AutoSegment* current + , AutoSegment* master + ); + static void getTopologicalInfos ( AutoSegment* seed + , vector& collapseds + , vector& perpandiculars + , DbU::Unit& leftBound + , DbU::Unit& rightBound + ); + static int getTerminalCount ( AutoSegment* seed + , vector& collapseds + ); + static inline int getTerminalCount ( AutoSegment* seed ); + static size_t getAllocateds () { return _allocateds; }; + static inline unsigned long getMaxId (); + // Constructors & Destructor. + static AutoSegment* create ( AutoContact* source + , AutoContact* target + , Segment* hurricaneSegment + ); + static AutoSegment* create ( AutoContact* source + , AutoContact* target + , unsigned int dir + , int type + , bool terminal=false + , bool collapsed=false + ); + void destroy (); + // Wrapped Segment Functions. + virtual Segment* base () = 0; + virtual Segment* base () const = 0; + virtual Segment* getSegment () = 0; + virtual Segment* getSegment () const = 0; + virtual Horizontal* getHorizontal () { return NULL; }; + virtual Vertical* getVertical () { return NULL; }; + inline Cell* getCell () const; + inline Net* getNet () const; + inline const Layer* getLayer () const; + inline Box getBoundingBox () const; + inline Hook* getSourceHook (); + inline Hook* getTargetHook (); + inline Contact* getSource () const; + inline Contact* getTarget () const; + inline Component* getOppositeAnchor ( Component* ) const; + inline Components getAnchors () const; + virtual DbU::Unit getX () const; + virtual DbU::Unit getY () const; + inline DbU::Unit getWidth () const; + inline DbU::Unit getLength () const; + inline DbU::Unit getSourcePosition () const; + inline DbU::Unit getTargetPosition () const; + inline DbU::Unit getSourceX () const; + inline DbU::Unit getSourceY () const; + inline DbU::Unit getTargetX () const; + inline DbU::Unit getTargetY () const; + inline void invert (); + // Predicates. + inline bool isHorizontal () const; + inline bool isVertical () const; + inline bool isInvalidated () const; + inline bool isGlobal () const; + inline bool isLocal () const; + inline bool isCanonicalLocal () const; + inline bool isTerminal () const; + inline bool isCollapsed () const; + inline bool isCanonical () const; + inline bool isFixed () const; + inline bool isStrap () const; + bool isCanonicalStrap () const; + inline bool isLayerChange () const; + inline bool isAccountable () const; + inline bool isUnsetAxis () const; + inline bool isSlackened () const; + inline bool isSlackenStrap () const; + inline bool allowOutsideGCell () const; + bool canDesalignate (); + virtual bool canDesalignate ( AutoContact* ) const = 0; + bool canMoveUp ( bool propagate=false ); + bool canPivotUp ( bool propagate=false ); + bool canSlacken ( bool propagate=false ); + virtual bool _canSlacken () const = 0; + bool canGoOutsideGCell () const; + // Accessors. + inline unsigned long getId () const; + virtual unsigned int getDirection () const = 0; + inline GCell* getGCell () const; + virtual size_t getGCells ( vector& ) const = 0; + inline AutoContact* getAutoSource () const; + inline AutoContact* getAutoTarget () const; + AutoContact* getOppositeAnchor ( AutoContact* ) const; + size_t getAlignedContacts ( map& ); + size_t getPerpandicularsBound ( set& ); + inline DbU::Unit getAxis () const; + virtual DbU::Unit getSourceU () const = 0; + virtual DbU::Unit getTargetU () const = 0; + virtual DbU::Unit getDuSource () const = 0; + virtual DbU::Unit getDuTarget () const = 0; + inline DbU::Unit getOrigin () const; + inline DbU::Unit getExtremity () const; + virtual Interval getSpanU () const = 0; + Interval getMinSpanU (); + virtual Interval getSourceConstraints ( bool native=false ) const = 0; + virtual Interval getTargetConstraints ( bool native=false ) const = 0; + virtual bool getConstraints ( DbU::Unit& min, DbU::Unit& max ) const = 0; + inline bool getConstraints ( Interval& i ) const; + inline const Interval& getUserConstraints () const; + virtual DbU::Unit getSlack () const; + inline DbU::Unit getOptimalMin () const; + inline DbU::Unit getOptimalMax () const; + Interval& getOptimal ( Interval& i ) const; + virtual DbU::Unit getCost ( DbU::Unit axis ) const; + virtual AutoSegment* getCanonical ( DbU::Unit& min , DbU::Unit& max ); + inline AutoSegment* getCanonical ( Interval& i ); + // Collections & Filters. + AutoSegments getOnSourceContact ( unsigned int direction ); + AutoSegments getOnTargetContact ( unsigned int direction ); + AutoSegments getCollapseds ( bool withPerpand=false ); + AutoSegments getCollapsedPerpandiculars (); + static AutoSegmentFilter getIsAccountable () { return new AutoSegments_IsAccountable(); }; + // Static Modifiers. + static void setDestroyMode ( bool ); + // Modifiers. + inline void setGlobal ( bool ); + inline void setCanonicalLocal ( bool ); + inline void setCanonical ( bool ); + inline void setTerminal ( bool ); + inline void setFixed ( bool ); + inline void setStrap ( bool ); + inline void setLayerChange ( bool ); + inline void setSlackened ( bool ); + inline void setSlackenStrap ( bool ); + void setAllowOutsideGCell ( bool state, bool propagate=false ); + void _setAllowOutsideGCell ( bool ); + inline void setLayer ( const Layer* layer ); + void setAxis ( DbU::Unit axis + , unsigned int flags=AxisSet + , set* processeds=NULL ); + virtual void setDuSource ( DbU::Unit du ) = 0; + virtual void setDuTarget ( DbU::Unit du ) = 0; + virtual void orient () = 0; + virtual void setPositions () = 0; + virtual bool checkPositions () const = 0; + virtual bool checkConstraints () const = 0; + inline void mergeUserConstraints ( const Interval& ); + inline void resetUserConstraints (); + virtual void invalidate (); + void revalidate (); + bool collapse (); + bool expand (); + bool toConstraintAxis ( set* processeds=NULL ); + bool toOptimalAxis ( set* processeds=NULL ); + virtual void alignate ( DbU::Unit axis ) = 0; + inline void setOptimalMin ( DbU::Unit min ); + inline void setOptimalMax ( DbU::Unit max ); + void computeOptimal ( set* processeds=NULL ); + void _computeTerminal ( Segment* ); + virtual void _computeTerminal () = 0; + virtual bool checkInvalidated () const; + AutoSegment* canonize (); + void changeDepth ( unsigned int depth + , bool propagate =false + , bool standAlone=true + ); + void _changeDepth ( unsigned int depth, bool withNeighbors ); + bool moveUp ( bool propagate=false ); + virtual void moveULeft () = 0; + virtual void moveURight () = 0; + void slacken ( bool propagate=false ); + virtual void _slacken () = 0; + bool canDogLeg ( Interval ); + void makeDogLeg ( Interval, bool upLayer, bool& leftDogleg ); + void makeDogLeg ( GCell*, bool upLayer ); + virtual void _makeDogLeg ( GCell*, bool upLayer ) = 0; + virtual void desalignate ( AutoContact* ) = 0; + void desalignate (); + bool _check () const; + // Inspector Management. + virtual Record* _getRecord () const = 0; + virtual string _getString () const = 0; + virtual string _getTypeName () const = 0; + + protected: + // Internal: Static Attributes. + static size_t _allocateds; + static bool _destroyBase; + static bool _destroyTool; + static unsigned long _maxId; + // Internal: Attributes. + GCell* _gcell; + bool _isUnsetAxis; + bool _invalidated; + bool _isHorizontal; + bool _isGlobal; + bool _isCanonicalLocal; + bool _isTerminal; + bool _isCollapsed; + bool _isCanonical; + bool _isFixed; + bool _strap; + bool _layerChange; + bool _slackened; + bool _slackenStrap; + bool _allowOutsideGCell; + const unsigned long _id; + unsigned int _optimalMin : 8; + unsigned int _optimalMax : 8; + DbU::Unit _sourcePosition; + DbU::Unit _targetPosition; + Interval _userConstraints; + + // Internal: Constructors & Destructors. + protected: + AutoSegment ( Segment* segment + , bool isHorizontal + , int type + , bool terminal + , bool collapsed + ); + virtual ~AutoSegment (); + static void _preCreate ( Component* source, Component* target ); + static void _preCreate ( AutoContact* source, AutoContact* target ); + virtual void _postCreate (); + virtual void _preDestroy (); + private: + AutoSegment ( const AutoSegment& ); + AutoSegment& operator= ( const AutoSegment& ); + private: + inline void setInvalidated ( bool state ); + void _invalidate (); + + }; + + +// Inline Functions. + inline unsigned long AutoSegment::getId () const { return _id; } + inline Cell* AutoSegment::getCell () const { return getSegment()->getCell(); } + inline Net* AutoSegment::getNet () const { return getSegment()->getNet(); } + inline const Layer* AutoSegment::getLayer () const { return getSegment()->getLayer(); } + inline Box AutoSegment::getBoundingBox () const { return getSegment()->getBoundingBox(); } + inline Hook* AutoSegment::getSourceHook () { return getSegment()->getSourceHook(); } + inline Hook* AutoSegment::getTargetHook () { return getSegment()->getTargetHook(); } + inline Contact* AutoSegment::getSource () const { return static_cast(getSegment()->getSource()); } + inline Contact* AutoSegment::getTarget () const { return static_cast(getSegment()->getTarget()); } + inline Component* AutoSegment::getOppositeAnchor ( Component* anchor ) const { return getSegment()->getOppositeAnchor(anchor); }; + inline DbU::Unit AutoSegment::getSourcePosition () const { return _sourcePosition; } + inline DbU::Unit AutoSegment::getTargetPosition () const { return _targetPosition; } + inline DbU::Unit AutoSegment::getSourceX () const { return getSegment()->getSourceX(); } + inline DbU::Unit AutoSegment::getSourceY () const { return getSegment()->getSourceY(); } + inline DbU::Unit AutoSegment::getTargetX () const { return getSegment()->getTargetX(); } + inline DbU::Unit AutoSegment::getTargetY () const { return getSegment()->getTargetY(); } + inline DbU::Unit AutoSegment::getWidth () const { return getSegment()->getWidth(); } + inline DbU::Unit AutoSegment::getLength () const { return getSegment()->getLength(); } + inline void AutoSegment::invert () { getSegment()->invert(); } + inline GCell* AutoSegment::getGCell () const { return _gcell; } + inline AutoContact* AutoSegment::getAutoSource () const { return Session::lookup(getSource()); } + inline AutoContact* AutoSegment::getAutoTarget () const { return Session::lookup(getTarget()); } + inline bool AutoSegment::getConstraints ( Interval& i ) const { return getConstraints(i.getVMin(),i.getVMax()); } + inline AutoSegment* AutoSegment::getCanonical ( Interval& i ) { return getCanonical(i.getVMin(),i.getVMax()); } + inline DbU::Unit AutoSegment::getAxis () const { return _isHorizontal?getSegment()->getY():getSegment()->getX(); } + inline DbU::Unit AutoSegment::getOrigin () const { return _isHorizontal?_gcell->getY():_gcell->getX(); } + inline DbU::Unit AutoSegment::getExtremity () const { return _isHorizontal?_gcell->getYMax():_gcell->getXMax(); } + inline DbU::Unit AutoSegment::getOptimalMin () const { return DbU::lambda(_optimalMin) + getOrigin(); } + inline DbU::Unit AutoSegment::getOptimalMax () const { return DbU::lambda(_optimalMax) + getOrigin(); } + inline const Interval& AutoSegment::getUserConstraints () const { return _userConstraints; } + + inline bool AutoSegment::isInvalidated () const { return _invalidated; } + inline bool AutoSegment::isHorizontal () const { return _isHorizontal; } + inline bool AutoSegment::isVertical () const { return !_isHorizontal; } + inline bool AutoSegment::isGlobal () const { return _isGlobal; } + inline bool AutoSegment::isCanonicalLocal () const { return _isCanonicalLocal; } + inline bool AutoSegment::isLocal () const { return !_isGlobal; } + inline bool AutoSegment::isTerminal () const { return _isTerminal; } + inline bool AutoSegment::isCollapsed () const { return _isCollapsed; } + inline bool AutoSegment::isCanonical () const { return _isCanonical; } + inline bool AutoSegment::isFixed () const { return _isFixed; } + inline bool AutoSegment::isStrap () const { return _strap; } + inline bool AutoSegment::isLayerChange () const { return _layerChange; } + inline bool AutoSegment::isAccountable () const { return _isCanonical && !_isCollapsed; } + inline bool AutoSegment::isUnsetAxis () const { return _isUnsetAxis; } + inline bool AutoSegment::isSlackened () const { return _slackened; } + inline bool AutoSegment::isSlackenStrap () const { return _slackenStrap; } + inline bool AutoSegment::allowOutsideGCell () const { return _allowOutsideGCell; } + + inline void AutoSegment::setLayer ( const Layer* layer ) { invalidate(); getSegment()->setLayer(layer); } + inline void AutoSegment::setInvalidated ( bool state ) { _invalidated = state; } + inline void AutoSegment::setGlobal ( bool state ) { _isGlobal = state; } + inline void AutoSegment::setCanonicalLocal ( bool state ) { _isCanonicalLocal = state; } + inline void AutoSegment::setTerminal ( bool state ) { _isTerminal = state; } + inline void AutoSegment::setFixed ( bool state ) { _isFixed = state; } + inline void AutoSegment::setStrap ( bool state ) { _strap = state; } + inline void AutoSegment::setLayerChange ( bool state ) { _layerChange = state; } + inline void AutoSegment::setSlackened ( bool state ) { _slackened = state; } + inline void AutoSegment::setSlackenStrap ( bool state ) { _slackenStrap = state; } + inline void AutoSegment::setOptimalMin ( DbU::Unit min ) { _optimalMin = (unsigned int)DbU::getLambda(min-getOrigin()); } + inline void AutoSegment::setOptimalMax ( DbU::Unit max ) { _optimalMax = (unsigned int)DbU::getLambda(max-getOrigin()); } + inline void AutoSegment::mergeUserConstraints ( const Interval& constraints ) { _userConstraints.intersection(constraints); } + inline void AutoSegment::resetUserConstraints () { _userConstraints = Interval(false); } + + + inline bool AutoSegment::CompareId::operator() ( const AutoSegment* lhs, const AutoSegment* rhs ) const + { return lhs->getId() < rhs->getId(); } + + inline void AutoSegment::setCanonical ( bool state ) + { + if ( _isCanonical != state ) { + //ltrace(159) << "canonical:" << state << " " << (void*)this << " " << _getString() << endl; + _isCanonical = state; + } + } + + inline unsigned long AutoSegment::getMaxId () + { return _maxId; } + + inline bool AutoSegment::arePerpandiculars ( AutoSegment* a, AutoSegment* b ) + { return a->isHorizontal() != b->isHorizontal(); } + + inline bool AutoSegment::arePerpandiculars ( bool isHorizontalA, AutoSegment* b ) + { return isHorizontalA != b->isHorizontal(); } + + inline bool AutoSegment::areAligneds ( AutoSegment* a, AutoSegment* b ) + { return a->isHorizontal() == b->isHorizontal(); } + + inline unsigned int AutoSegment::getPerpandicularState ( AutoContact* contact + , AutoSegment* source + , AutoSegment* current + , AutoSegment* master ) + { + return getPerpandicularState ( contact, source, current, master->isHorizontal(), master->getLayer() ); + } + + + inline int AutoSegment::getTerminalCount ( AutoSegment* seed ) + { + ltrace(80) << "getTerminalCount() - " << seed << endl; + + vector collapseds; + vector perpandiculars; + DbU::Unit leftBound; + DbU::Unit rightBound; + + getTopologicalInfos ( seed + , collapseds + , perpandiculars + , leftBound + , rightBound + ); + + return getTerminalCount ( seed, collapseds ); + } + + +} // End of Katabatic namespace. + + +INSPECTOR_P_SUPPORT(Katabatic::AutoSegment); + + +# endif // __KATABATIC_AUTOSEGMENT__ diff --git a/katabatic/src/katabatic/AutoSegments.h b/katabatic/src/katabatic/AutoSegments.h new file mode 100644 index 00000000..d8562cbd --- /dev/null +++ b/katabatic/src/katabatic/AutoSegments.h @@ -0,0 +1,471 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./AutoSegments.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#ifndef __KATABATIC_AUTOSEGMENTS_H__ +#define __KATABATIC_AUTOSEGMENTS_H__ + +#include +#include +#include +#include +#include "hurricane/Collection.h" +#include "hurricane/DbU.h" +#include "hurricane/Box.h" + +namespace Hurricane { + class Hook; + class Component; + class Contact; + class Segment; + class Net; +} + + +namespace Katabatic { + + + using std::string; + using std::pair; + using std::list; + using std::vector; + using std::map; + + using Hurricane::Record; + using Hurricane::DbU; + using Hurricane::Box; + using Hurricane::Hook; + using Hurricane::Component; + using Hurricane::Contact; + using Hurricane::Segment; + using Hurricane::Net; + using Hurricane::Filter; + using Hurricane::Locator; + using Hurricane::Collection; + using Hurricane::GenericFilter; + using Hurricane::GenericLocator; + using Hurricane::GenericCollection; + + class AutoContact; + class AutoSegment; + class GCell; + + +// ------------------------------------------------------------------- +// Collections. + + + typedef Hurricane::Filter AutoSegmentHF; + typedef Hurricane::Locator AutoSegmentHL; + typedef Hurricane::Collection AutoSegmentHC; + typedef GenericCollection AutoSegments; + typedef GenericLocator AutoSegmentLocator; + typedef GenericFilter AutoSegmentFilter; + typedef map AutoSegmentLut; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoSegmentStack". + + + class AutoSegmentStack : protected list > { + public: + inline bool isEmpty () const; + inline size_t getSize () const; + void push ( AutoContact*, AutoSegment* ); + inline void pop (); + inline AutoContact* getAutoContact () const; + inline AutoSegment* getAutoSegment () const; + }; + + + inline bool AutoSegmentStack::isEmpty () const { return empty(); }; + inline size_t AutoSegmentStack::getSize () const { return size(); }; + inline void AutoSegmentStack::pop () { if ( !empty() ) pop_back(); }; + inline AutoContact* AutoSegmentStack::getAutoContact () const { return empty() ? NULL : back().first; }; + inline AutoSegment* AutoSegmentStack::getAutoSegment () const { return empty() ? NULL : back().second; }; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoSegments_OnContact". + + + class AutoSegments_OnContact : public AutoSegmentHC { + + public: + // Sub-Class: Locator. + class Locator : public AutoSegmentHL { + public: + Locator ( AutoSegment* master, Contact* contact ); + inline Locator ( const Locator& ); + virtual AutoSegment* getElement () const; + virtual AutoSegmentHL* getClone () const; + virtual bool isValid () const; + virtual void progress (); + virtual string _getString () const; + protected: + AutoSegment* _master; + Hook* _hook; + AutoSegment* _element; + }; + + public: + // AutoSegments_OnContact Methods. + inline AutoSegments_OnContact ( AutoSegment* master, Contact* contact ); + inline AutoSegments_OnContact ( const AutoSegments_OnContact& ); + virtual AutoSegmentHC* getClone () const; + virtual AutoSegmentHL* getLocator () const; + virtual string _getString () const; + + protected: + // AutoSegments_OnContact Attributes. + AutoSegment* _master; + Contact* _contact; + }; + + + inline AutoSegments_OnContact::Locator::Locator ( const Locator &locator ) + : AutoSegmentHL() + , _master(locator._master) + , _hook(locator._hook) + , _element(locator._element) + { } + + + inline AutoSegments_OnContact::AutoSegments_OnContact ( AutoSegment* master, Contact* contact ) + : AutoSegmentHC() + , _master(master) + , _contact(contact) + { } + + + inline AutoSegments_OnContact::AutoSegments_OnContact ( const AutoSegments_OnContact& segments ) + : AutoSegmentHC() + , _master(segments._master) + , _contact(segments._contact) + { } + + +// ------------------------------------------------------------------- +// Class : "AutoSegments_Collapsed". + + + class AutoSegments_Collapsed : public AutoSegmentHC { + + public: + // Sub-Class: Locator. + class Locator : public AutoSegmentHL { + public: + inline Locator ( AutoSegment* segment , bool withPerpand ); + inline Locator ( const Locator &locator ); + virtual AutoSegment* getElement () const; + virtual AutoSegmentHL* getClone () const; + virtual bool isValid () const; + virtual void progress (); + virtual string _getString () const; + protected: + bool _withPerpand; + AutoSegment* _master; + AutoSegmentStack _stack; + }; + + public: + // AutoSegments_Collapsed Methods. + AutoSegments_Collapsed ( AutoSegment*, bool withPerpand=false ); + AutoSegments_Collapsed ( const AutoSegments_Collapsed& ); + virtual AutoSegmentHC* getClone () const; + virtual AutoSegmentHL* getLocator () const; + virtual string _getString () const; + + protected: + // AutoSegments_Collapsed Attributes. + bool _withPerpand; + AutoSegment* _segment; + }; + + + inline AutoSegments_Collapsed::Locator::Locator ( const Locator &locator ) + : AutoSegmentHL() + , _withPerpand(locator._withPerpand) + , _master(locator._master) + , _stack(locator._stack) + { } + + + inline AutoSegments_Collapsed::AutoSegments_Collapsed ( AutoSegment* segment, bool withPerpand ) + : AutoSegmentHC() + , _withPerpand(withPerpand) + , _segment(segment) + { } + + + inline AutoSegments_Collapsed::AutoSegments_Collapsed ( const AutoSegments_Collapsed& autosegments ) + : AutoSegmentHC() + , _withPerpand(autosegments._withPerpand) + , _segment(autosegments._segment) + { } + + +// ------------------------------------------------------------------- +// Class : "AutoSegments_CollapsedPerpandicular". + + + class AutoSegments_CollapsedPerpandicular : public AutoSegmentHC { + + public: + // Sub-Class: Locator. + class Locator : public AutoSegmentHL { + public: + Locator ( AutoSegment* segment ); + inline Locator ( const Locator& ); + virtual AutoSegment* getElement () const; + virtual AutoSegmentHL* getClone () const; + virtual bool isValid () const; + virtual void progress (); + virtual string _getString () const; + protected: + AutoSegment* _master; + AutoSegmentStack _stack; + vector _perpandiculars; + }; + + public: + // AutoSegments_CollapsedPerpandicular Methods. + inline AutoSegments_CollapsedPerpandicular ( AutoSegment* segment ); + inline AutoSegments_CollapsedPerpandicular ( const AutoSegments_CollapsedPerpandicular& ); + virtual AutoSegmentHC* getClone () const; + virtual AutoSegmentHL* getLocator () const; + virtual string _getString () const; + + protected: + // AutoSegments_CollapsedPerpandicular Attributes. + AutoSegment* _segment; + }; + + + inline AutoSegments_CollapsedPerpandicular::Locator::Locator ( const Locator& locator ) + : AutoSegmentHL() + , _master(locator._master) + , _stack(locator._stack) + , _perpandiculars() + { } + + + inline AutoSegments_CollapsedPerpandicular::AutoSegments_CollapsedPerpandicular + ( AutoSegment* segment ) + : AutoSegmentHC() + , _segment(segment) + { } + + + inline AutoSegments_CollapsedPerpandicular::AutoSegments_CollapsedPerpandicular + ( const AutoSegments_CollapsedPerpandicular& autosegments ) + : AutoSegmentHC() + , _segment(autosegments._segment) + { } + + +// ------------------------------------------------------------------- +// Class : "AutoSegments_AnchorOnGCell". + + + class AutoSegments_AnchorOnGCell : public AutoSegmentHC { + + public: + // Sub-Class: Locator. + class Locator : public AutoSegmentHL { + public: + Locator ( GCell* fcell, bool sourceAnchor, unsigned int direction ); + inline Locator ( const Locator& ); + virtual ~Locator (); + virtual AutoSegment* getElement () const; + virtual AutoSegmentHL* getClone () const; + virtual bool isValid () const; + virtual void progress (); + virtual string _getString () const; + protected: + bool _sourceAnchor; + unsigned int _direction; + vector::const_iterator _itContact; + vector::const_iterator _itEnd; + Hurricane::Locator* _hookLocator; + AutoSegment* _element; + }; + + public: + // AutoSegments_CollapsedPerpandicular Methods. + inline AutoSegments_AnchorOnGCell ( GCell* fcell, bool sourceAnchor, unsigned int direction ); + inline AutoSegments_AnchorOnGCell ( const AutoSegments_AnchorOnGCell& ); + virtual AutoSegmentHC* getClone () const; + virtual AutoSegmentHL* getLocator () const; + virtual string _getString () const; + + public: + // AutoSegments_CollapsedPerpandicular Attributes. + GCell* _fcell; + unsigned int _direction; + bool _sourceAnchor; + }; + + + inline AutoSegments_AnchorOnGCell::Locator::Locator ( const Locator &locator ) + : AutoSegmentHL() + , _sourceAnchor(locator._sourceAnchor) + , _direction(locator._direction) + , _itContact(locator._itContact) + , _itEnd(locator._itEnd) + , _hookLocator(locator._hookLocator->getClone()) + , _element(locator._element) + { } + + + inline AutoSegments_AnchorOnGCell::AutoSegments_AnchorOnGCell + ( GCell* fcell, bool sourceAnchor, unsigned int direction ) + : AutoSegmentHC() + , _fcell(fcell) + , _direction(direction) + , _sourceAnchor(sourceAnchor) + { } + + + inline AutoSegments_AnchorOnGCell::AutoSegments_AnchorOnGCell + ( const AutoSegments_AnchorOnGCell& autosegments ) + : AutoSegmentHC() + , _fcell(autosegments._fcell) + , _direction(autosegments._direction) + , _sourceAnchor(autosegments._sourceAnchor) + { } + + +// ------------------------------------------------------------------- +// Class : "AutoSegments_AnchoredBySource". + + + class AutoSegments_AnchoredBySource : public AutoSegmentHC { + + public: + // Sub-Class: Locator. + class Locator : public AutoSegmentHL { + public: + Locator ( AutoContact* sourceAnchor, unsigned int direction ); + inline Locator ( const Locator& ); + virtual ~Locator (); + virtual AutoSegment* getElement () const; + virtual AutoSegmentHL* getClone () const; + virtual bool isValid () const; + virtual void progress (); + virtual string _getString () const; + protected: + unsigned int _direction; + Hurricane::Locator* _contactLocator; + Hurricane::Locator* _hookLocator; + AutoSegment* _element; + }; + + // Constructors. + public: + // AutoSegments_AnchoredBySource Methods. + inline AutoSegments_AnchoredBySource ( AutoContact* sourceContact, unsigned int direction ); + inline AutoSegments_AnchoredBySource ( const AutoSegments_AnchoredBySource& ); + virtual AutoSegmentHC* getClone () const; + virtual AutoSegmentHL* getLocator () const; + virtual string _getString () const; + + protected: + // AutoSegments_AnchoredBySource Attributes. + unsigned int _direction; + AutoContact* _sourceContact; + + }; + + + inline AutoSegments_AnchoredBySource::Locator::Locator ( const Locator &locator ) + : AutoSegmentHL() + , _direction(locator._direction) + , _contactLocator(locator._contactLocator->getClone()) + , _hookLocator(locator._hookLocator->getClone()) + , _element(locator._element) + { } + + + inline AutoSegments_AnchoredBySource::AutoSegments_AnchoredBySource + ( AutoContact* sourceContact, unsigned int direction ) + : AutoSegmentHC() + , _direction(direction) + , _sourceContact(sourceContact) + { } + + + inline AutoSegments_AnchoredBySource::AutoSegments_AnchoredBySource + ( const AutoSegments_AnchoredBySource& autosegments ) + : AutoSegmentHC() + , _direction(autosegments._direction) + , _sourceContact(autosegments._sourceContact) + { } + + +// ------------------------------------------------------------------- +// Class : "AutoSegments_IsAccountable". + + + class AutoSegments_IsAccountable : public AutoSegmentHF { + public: + virtual AutoSegmentHF* getClone () const; + virtual bool accept ( AutoSegment* ) const; + virtual string _getString () const; + }; + + +// ------------------------------------------------------------------- +// Class : "AutoSegments_InDirection". + + + class AutoSegments_InDirection : public AutoSegmentHF { + public: + inline AutoSegments_InDirection ( unsigned int direction ); + inline AutoSegments_InDirection ( const AutoSegments_InDirection& ); + virtual AutoSegmentHF* getClone () const; + virtual bool accept ( AutoSegment* segment ) const; + virtual string _getString () const; + protected: + unsigned int _direction; + }; + + + inline AutoSegments_InDirection::AutoSegments_InDirection ( unsigned int direction ) + : AutoSegmentHF() + , _direction(_direction) + {} + + + inline AutoSegments_InDirection::AutoSegments_InDirection ( const AutoSegments_InDirection& filter ) + : AutoSegmentHF() + , _direction(filter._direction) + {} + + +} // End of Katabatic namespace. + + +# endif diff --git a/katabatic/src/katabatic/AutoVertical.h b/katabatic/src/katabatic/AutoVertical.h new file mode 100644 index 00000000..38b9788f --- /dev/null +++ b/katabatic/src/katabatic/AutoVertical.h @@ -0,0 +1,119 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./AutoVertical.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#ifndef __KATABATIC_AUTOVERTICAL__ +#define __KATABATIC_AUTOVERTICAL__ + +#include "hurricane/Vertical.h" +#include "katabatic/AutoSegment.h" + + +namespace Katabatic { + + +// ------------------------------------------------------------------- +// Class : "AutoVertical". + + + class AutoVertical : public AutoSegment { + using AutoSegment::_computeTerminal; + + public: + // Constructors. + static AutoVertical* create ( Vertical* vertical + , int type + , bool terminal=false + , bool collapsed=false + ); + static AutoVertical* create ( AutoContact* source + , AutoContact* target + , const Layer* layer + , DbU::Unit x + , DbU::Unit width + , int type + , bool terminal=false + , bool collapsed=false + ); + // Predicates. + virtual bool _canSlacken () const; + virtual bool canDesalignate ( AutoContact* ) const; + // Accessors. + virtual Segment* base () { return _vertical; }; + virtual Segment* base () const { return _vertical; }; + virtual Segment* getSegment () { return _vertical; }; + virtual Segment* getSegment () const { return _vertical; }; + virtual Vertical* getVertical () { return _vertical; }; + virtual DbU::Unit getSourceU () const { return _vertical->getSourceY(); }; + virtual DbU::Unit getTargetU () const { return _vertical->getTargetY(); }; + virtual DbU::Unit getDuSource () const { return _vertical->getDySource(); }; + virtual DbU::Unit getDuTarget () const { return _vertical->getDyTarget(); }; + virtual Interval getSpanU () const { return Interval(_vertical->getSourceY(),_vertical->getTargetY()); }; + virtual bool getConstraints ( DbU::Unit& min, DbU::Unit& max ) const; + virtual Interval getSourceConstraints ( bool native=false ) const; + virtual Interval getTargetConstraints ( bool native=false ) const; + virtual unsigned int getDirection () const; + virtual size_t getGCells ( vector& ) const; + // Modifiers. + virtual void setDuSource ( DbU::Unit du ) { _vertical->setDySource(du); }; + virtual void setDuTarget ( DbU::Unit du ) { _vertical->setDyTarget(du); }; + virtual void alignate ( DbU::Unit axis ); + virtual void orient (); + virtual void setPositions (); + virtual bool checkPositions () const; + virtual bool checkConstraints () const; + virtual void _computeTerminal (); + virtual void moveURight (); + virtual void moveULeft (); + virtual void _makeDogLeg ( GCell*, bool upLayer ); + virtual void desalignate ( AutoContact* ); + virtual void _slacken (); + // Inspector Management. + virtual Record* _getRecord () const; + virtual string _getString () const; + virtual string _getTypeName () const { return "AutoVertical"; }; + + protected: + // Internal: Attributes. + Vertical* _vertical; + + // Constructors. + protected: + AutoVertical ( Vertical* vertical + , int type + , bool terminal + , bool collapsed ); + virtual ~AutoVertical (); + virtual void _postCreate (); + virtual void _preDestroy (); + private: + AutoVertical ( const AutoVertical& ); + AutoVertical& operator= ( const AutoVertical& ); + }; + + +} // End of Katabatic namespace. + + +#endif // __KATABATIC_AUTOHORIZONTAL__ diff --git a/katabatic/src/katabatic/Configuration.h b/katabatic/src/katabatic/Configuration.h new file mode 100644 index 00000000..7f227225 --- /dev/null +++ b/katabatic/src/katabatic/Configuration.h @@ -0,0 +1,132 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | 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 + + +#ifndef __KATABATIC_CONFIGURATION__ +#define __KATABATIC_CONFIGURATION__ + +#include + +#include "hurricane/DbU.h" +namespace Hurricane { + class Layer; +} + +#include "crlcore/RoutingGauge.h" +namespace CRL { + class RoutingLayerGauge; +} + + +namespace Katabatic { + + + using std::string; + using Hurricane::Record; + using Hurricane::Layer; + using Hurricane::DbU; + using CRL::RoutingGauge; + using CRL::RoutingLayerGauge; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::Configuration" (decorator). + + + class Configuration { + public: + // Constructor & Destructor. + Configuration (); + virtual ~Configuration (); + // Methods. + virtual bool isGMetal ( const Layer* ) const = 0; + virtual size_t getDepth () const = 0; + virtual size_t getLayerDepth ( const Layer* ) const = 0; + virtual RoutingGauge* getRoutingGauge () const = 0; + virtual RoutingLayerGauge* getLayerGauge ( size_t depth ) const = 0; + virtual const Layer* getRoutingLayer ( size_t depth ) const = 0; + virtual Layer* getContactLayer ( size_t depth ) const = 0; + virtual DbU::Unit getExtensionCap () const = 0; + virtual float getSaturateRatio () const = 0; + virtual DbU::Unit getGlobalThreshold () const = 0; + virtual void setSaturateRatio ( float ) = 0; + virtual void setGlobalThreshold ( DbU::Unit ) = 0; + virtual Record* _getRecord () const = 0; + virtual string _getString () const = 0; + virtual string _getTypeName () const = 0; + private: + Configuration ( const Configuration& ); + Configuration& operator= ( const Configuration& ); + }; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::ConfigurationConcrete". + + + class ConfigurationConcrete : public Configuration { + public: + // Constructor & Destructor. + ConfigurationConcrete ( const RoutingGauge* ); + virtual ~ConfigurationConcrete (); + // Methods. + virtual bool isGMetal ( const Layer* ) const; + virtual size_t getDepth () const; + virtual size_t getLayerDepth ( const Layer* ) const; + virtual RoutingGauge* getRoutingGauge () const; + virtual RoutingLayerGauge* getLayerGauge ( size_t depth ) const; + virtual const Layer* getRoutingLayer ( size_t depth ) const; + virtual Layer* getContactLayer ( size_t depth ) const; + virtual DbU::Unit getExtensionCap () const; + virtual float getSaturateRatio () const; + virtual DbU::Unit getGlobalThreshold () const; + virtual void setSaturateRatio ( float ); + virtual void setGlobalThreshold ( DbU::Unit ); + virtual Record* _getRecord () const; + virtual string _getString () const; + virtual string _getTypeName () const; + + protected: + // Attributes. + const Layer* _gmetalh; + const Layer* _gmetalv; + const Layer* _gcontact; + RoutingGauge* _rg; + DbU::Unit _extensionCap; + float _saturateRatio; + DbU::Unit _globalThreshold; + private: + ConfigurationConcrete ( const ConfigurationConcrete& ); + ConfigurationConcrete& operator= ( const ConfigurationConcrete& ); + }; + + +} // End of Katabatic namespace. + + +INSPECTOR_P_SUPPORT(Katabatic::Configuration); +INSPECTOR_P_SUPPORT(Katabatic::ConfigurationConcrete); + + +#endif // __KATABATIC_CONFIGURATION__ diff --git a/katabatic/src/katabatic/ContactWrapper.h b/katabatic/src/katabatic/ContactWrapper.h new file mode 100644 index 00000000..e7f25904 --- /dev/null +++ b/katabatic/src/katabatic/ContactWrapper.h @@ -0,0 +1,113 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./ContactWrapper.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#ifndef __KATABATIC_CONTACT_WRAPPER__ +#define __KATABATIC_CONTACT_WRAPPER__ + + +#include "hurricane/Contact.h" + + +namespace Katabatic { + + using Hurricane::Hook; + using Hurricane::Component; + using Hurricane::DbU; + using Hurricane::Point; + using Hurricane::Layer; + using Hurricane::Contact; + + +// ------------------------------------------------------------------- +// Template Class : "Katabatic::ContactWrapper". + + template + class ContactWrapper { + public: + // Accessors. + inline BaseContact* getBase (); + inline Hook* getBodyHook (); + inline Hook* getAnchorHook (); + inline Component* getAnchor () const; + inline DbU::Unit getDx () const; + inline DbU::Unit getDy () const; + inline DbU::Unit getWidth () const; + inline DbU::Unit getHalfWidth () const; + inline DbU::Unit getHeight () const; + inline DbU::Unit getHalfHeight () const; + public: + // Modifiers. + inline void setLayer ( const Layer* ); + inline void setWidth ( DbU::Unit ); + inline void setHeight ( DbU::Unit ); + inline void setSizes ( DbU::Unit width, Dbu::Unit height ); + inline void setX ( DbU::Unit ); + inline void setY ( DbU::Unit ); + inline void setPosition ( DbU::Unit width, Dbu::Unit height ); + inline void setPosition ( const Point& ); + inline void setDx ( DbU::Unit ); + inline void setDy ( DbU::Unit ); + inline void setOffset ( DbU::Unit dx, Dbu::Unit dy ); + protected: + // Attribute. + BaseContact* _contact; + protected: + // Constructor & Destructors. + inline ContactWrapper ( BaseContact* ); + private: + ContactWrapper& ContactWrapper ( const ContactWrapper& ); + ContactWrapper& operator= ( const ContactWrapper& ); + }; + + +// Inline Functions. + inline BaseContact* ContactWrapper::getBase () { return _contact; } + inline Hook* ContactWrapper::getBodyHook () { return _contact->getBodyHook(); } + inline Hook* ContactWrapper::getAnchorHook () { return _contact->getAnchorHook(); } + inline Component* ContactWrapper::getAnchor () const { return _contact->getAnchor(); } + inline DbU::Unit ContactWrapper::getDx () const { return _contact->getDx(); } + inline DbU::Unit ContactWrapper::getDy () const { return _contact->getDy(); } + inline DbU::Unit ContactWrapper::getWidth () const { return _contact->getWidth(); } + inline DbU::Unit ContactWrapper::getHalfWidth () const { return _contact->getHalfWidth(); } + inline DbU::Unit ContactWrapper::getHeight () const { return _contact->getHeight(); } + inline DbU::Unit ContactWrapper::getHalfHeight () const { return _contact->getHalfHeight(); } + inline void ContactWrapper::setLayer ( const Layer* layer ) { return _contact->setLayer(layer); } + inline void ContactWrapper::setWidth ( DbU::Unit w ) { return _contact->setWidth(w); } + inline void ContactWrapper::setHeight ( DbU::Unit h ) { return _contact->setHeight(h); } + inline void ContactWrapper::setSizes ( DbU::Unit w, Dbu::Unit h ) { return _contact->setSizes(w,h); } + inline void ContactWrapper::setX ( DbU::Unit x ) { return _contact->setX(x); } + inline void ContactWrapper::setY ( DbU::Unit y ) { return _contact->setY(y); } + inline void ContactWrapper::setPosition ( DbU::Unit x, Dbu::Unit y ) { return _contact->setPosition(x,y); } + inline void ContactWrapper::setPosition ( const Point& p ) { return _contact->setPosition(p); } + inline void ContactWrapper::setDx ( DbU::Unit dx ) { return _contact->setDx(dx); } + inline void ContactWrapper::setDy ( DbU::Unit dy ) { return _contact->setDy(dy); } + inline void ContactWrapper::setOffset ( DbU::Unit dx, Dbu::Unit dy ) { return _contact->setOffset(dx,dy); } + inline ContactWrapper::ContactWrapper ( BaseContact* contact ) : _contact(contact) { } + + +} // End of Katabatic namespace. + + +#endif // __KATABATIC_CONTACT_WRAPPER__ diff --git a/katabatic/src/katabatic/GCell.h b/katabatic/src/katabatic/GCell.h new file mode 100644 index 00000000..d6ea6c31 --- /dev/null +++ b/katabatic/src/katabatic/GCell.h @@ -0,0 +1,254 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./GCell.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#ifndef __KATABATIC_GCELL__ +#define __KATABATIC_GCELL__ + +#include +#include +#include +#include + +#include "hurricane/DbU.h" +#include "hurricane/Point.h" +#include "hurricane/Box.h" +#include "hurricane/Interval.h" +#include "hurricane/ExtensionGo.h" +namespace Hurricane { + class Name; +} + +#include "crlcore/RoutingLayerGauge.h" +#include "katabatic/AutoSegments.h" + + +namespace Katabatic { + + + using std::set; + using std::vector; + using std::ostream; + using std::binary_function; + using Hurricane::_TName; + using Hurricane::Record; + using Hurricane::Name; + using Hurricane::DbU; + using Hurricane::Point; + using Hurricane::Box; + using Hurricane::Interval; + using Hurricane::ExtensionGo; + + class GCellGrid; + class AutoContact; + class AutoSegment; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::GCell". + + + class GCell : public ExtensionGo { + + public: + class CompareByDensity : public binary_function { + public: + CompareByDensity ( unsigned int depth ); + bool operator() ( GCell* lhs, GCell* rhs ); + private: + unsigned int _depth; + }; + + public: + // Static Utilities. + static bool areDensityConnex ( GCell* a, GCell* b ); + // Static Accessors. + static size_t getAllocateds (); + static DbU::Unit getTopRightShrink (); + static const Name& getStaticName (); + virtual const Name& getName () const; + // Accessors. + inline bool isSaturated () const; + bool isSaturated ( unsigned int depth ) const; + inline bool isValid () const; + bool isAboveDensity ( float threshold ) const; + bool hasFreeTrack ( size_t depth ) const; + inline GCellGrid* getGCellGrid () const; + inline unsigned int getDepth () const; + inline unsigned int getIndex () const; + unsigned int getRow () const; + unsigned int getColumn () const; + void getDensities ( float* ) const; + virtual void translate ( const DbU::Unit&, const DbU::Unit& ); + virtual Box getBoundingBox () const; + inline Point getCenter () const; + inline DbU::Unit getX () const; + inline DbU::Unit getY () const; + inline DbU::Unit getXMax () const; + inline DbU::Unit getYMax () const; + Interval getUSide ( unsigned int ) const; + GCell* getLeft () const; + GCell* getRight () const; + GCell* getUp () const; + GCell* getDown () const; + float getHCapacity () const; + float getVCapacity () const; + inline float getCDensity ( bool update=true ) const; + inline float getDensity ( unsigned int depth, bool update=true ) const; + float getDensity ( bool update=true ) const; + float getMaxHVDensity ( bool update=true ) const; + float getStiffness () const; + inline unsigned int getSegmentCount () const; + inline unsigned int getRoutedCount () const; + inline vector* getVSegments (); + inline vector* getHSegments (); + inline vector* getContacts (); + AutoSegments getHStartSegments (); + AutoSegments getVStartSegments (); + AutoSegments getHStopSegments (); + AutoSegments getVStopSegments (); + inline AutoSegments getStartSegments ( unsigned int direction ); + inline AutoSegments getStopSegments ( unsigned int direction ); + size_t checkDensity () const; + bool checkEdgeSaturation ( float threshold ) const; + // Modifiers. + void incSegmentCount ( int count ); + void incRoutedCount ( int count ); + void addBlockage ( unsigned int depth, float ); + inline void addVSegment ( AutoSegment* ); + inline void addHSegment ( AutoSegment* ); + inline void addContact ( AutoContact* ); + void removeVSegment ( AutoSegment* ); + void removeHSegment ( AutoSegment* ); + void removeContact ( AutoContact* ); + void updateContacts (); + size_t updateDensity (); + void desaturate ( unsigned int depth, set& ); + bool stepDesaturate ( unsigned int depth, set& ); + inline void invalidate (); + // Inspector Management. + Record* _getRecord () const; + string _getString () const; + inline string _getTypeName () const; + void _xmlWrite ( ostream& o ) const; + + private: + // Static Attributes. + static const Name _goName; + static size_t _allocateds; + static DbU::Unit _topRightShrink; + // Attributes. + GCellGrid* _gcellGrid; + unsigned int _index; + vector _vsegments; + vector _hsegments; + vector _contacts; + Box _box; + size_t _depth; + size_t _pinDepth; + float* _blockages; + float _cDensity; + float* _densities; + float* _saturateDensities; + unsigned int _segmentCount; + unsigned int _routedSegmentCount; + bool _saturated; + bool _invalid; + + protected: + // Constructors & Destructors. + GCell ( GCellGrid* gcellGrid + , unsigned int index + , const Box& box + ); + inline ~GCell (); + inline void _postCreate (); + inline void _preDestroy (); + static GCell* create ( GCellGrid* gcellGrid + , unsigned int index + , Box box + ); + private: + GCell ( const GCell& ); + GCell& operator= ( const GCell& ); + + friend class GCellGrid; + }; + + +// Inline Functions. + inline bool GCell::isSaturated () const { return _saturated; } + inline bool GCell::isValid () const { return !_invalid; } + inline GCellGrid* GCell::getGCellGrid () const { return _gcellGrid; } + inline unsigned int GCell::getDepth () const { return _depth; } + inline unsigned int GCell::getIndex () const { return _index; } + inline Point GCell::getCenter () const { return _box.getCenter(); } + inline DbU::Unit GCell::getX () const { return _box.getXMin(); } + inline DbU::Unit GCell::getY () const { return _box.getYMin(); } + inline DbU::Unit GCell::getXMax () const { return _box.getXMax(); } + inline DbU::Unit GCell::getYMax () const { return _box.getYMax(); } + inline vector* GCell::getVSegments () { return &_vsegments; } + inline vector* GCell::getHSegments () { return &_hsegments; } + inline vector* GCell::getContacts () { return &_contacts; } + inline unsigned int GCell::getSegmentCount () const { return _segmentCount; } + inline unsigned int GCell::getRoutedCount () const { return _routedSegmentCount; } + inline string GCell::_getTypeName () const { return _TName("GCell"); } + inline void GCell::invalidate () { _invalid = true; } + + inline AutoSegments GCell::getStartSegments ( unsigned int direction ) + { return (direction&Constant::Horizontal) ? getHStartSegments() : getVStartSegments(); } + + inline AutoSegments GCell::getStopSegments ( unsigned int direction ) + { return (direction&Constant::Horizontal) ? getHStopSegments() : getVStopSegments(); } + + inline float GCell::getCDensity ( bool update ) const + { if (_invalid and update) const_cast(this)->updateDensity(); return _cDensity; } + + inline float GCell::getDensity ( unsigned int depth, bool update ) const + { if (_invalid and update) const_cast(this)->updateDensity(); return _densities[depth]; } + + inline void GCell::addVSegment ( AutoSegment* segment ) + { invalidate(); _vsegments.push_back(segment); } + + inline void GCell::addHSegment ( AutoSegment* segment ) + { invalidate(); _hsegments.push_back(segment); } + + inline void GCell::addContact ( AutoContact* contact ) + { invalidate(); _contacts.push_back(contact); } + + +// ------------------------------------------------------------------- +// Utilities. + + + string getVectorString ( float*, size_t ); + + +} // End of Katabatic namespace. + + +INSPECTOR_P_SUPPORT(Katabatic::GCell); + + +#endif // __KATABATIC_GCELL__ diff --git a/katabatic/src/katabatic/GCellGrid.h b/katabatic/src/katabatic/GCellGrid.h new file mode 100644 index 00000000..518edb14 --- /dev/null +++ b/katabatic/src/katabatic/GCellGrid.h @@ -0,0 +1,90 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./GCellGrid.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#ifndef __KATABATIC_GCELL_GRID__ +#define __KATABATIC_GCELL_GRID__ + +namespace Hurricane { + class Cell; +} + +#include "katabatic/Grid.h" +#include "katabatic/GCell.h" + + +namespace Katabatic { + + + using Hurricane::Cell; + using Hurricane::_TName; + + class KatabaticEngine; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::GCellGrid". + + + class GCellGrid : public Grid { + + public: + Cell* getCell () const; + void updateContacts ( bool openSession=true ); + size_t checkDensity () const; + size_t updateDensity (); + bool checkEdgeSaturation ( float threshold ) const; + void _xmlWrite ( ostream& ); + virtual Record* _getRecord () const; + virtual string _getString () const; + virtual string _getTypeName () const; + + // Attributes. + protected: + KatabaticEngine* _katabatic; + + // Constructors & Destructors. + protected: + GCellGrid ( KatabaticEngine* ); + virtual ~GCellGrid (); + void _postCreate (); + void _preDestroy (); + static GCellGrid* create ( KatabaticEngine* ); + private: + GCellGrid ( const GCellGrid& ); + GCellGrid& operator= ( const GCellGrid& ); + + // Friends. + friend class KatabaticEngine; + }; + + +} // End of Katabatic namespace. + + +INSPECTOR_P_SUPPORT(Katabatic::GCellGrid); + + + +#endif // __KATABATIC_GCELL_GRID__ diff --git a/katabatic/src/katabatic/GCells.h b/katabatic/src/katabatic/GCells.h new file mode 100644 index 00000000..ad6d8bb8 --- /dev/null +++ b/katabatic/src/katabatic/GCells.h @@ -0,0 +1,63 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./GCells.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + + + +#ifndef __KATABATIC_GCELLS__ +#define __KATABATIC_GCELLS__ + +#include "hurricane/Collections.h" + + +namespace Katabatic { + + + using Hurricane::Locator; + using Hurricane::Collection; + using Hurricane::GenericLocator; + using Hurricane::GenericCollection; + using Hurricane::GenericFilter; + + +// ------------------------------------------------------------------- +// Forward declarations. + + + class GCell; + + +// ------------------------------------------------------------------- +// Collections. + + + typedef GenericCollection GCells; + typedef GenericLocator GCellLocator; + typedef GenericFilter GCellFilter; + + +} // End of Katabatic namespace. + + +#endif // __KATABATIC_GCELLS__ diff --git a/katabatic/src/katabatic/GraphicKatabaticEngine.h b/katabatic/src/katabatic/GraphicKatabaticEngine.h new file mode 100644 index 00000000..79356620 --- /dev/null +++ b/katabatic/src/katabatic/GraphicKatabaticEngine.h @@ -0,0 +1,105 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul Chaput | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./GraphicKatabaticEngine.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + + +#ifndef __KATABATIC_GRAPHIC_KATABATIC_ENGINE__ +#define __KATABATIC_GRAPHIC_KATABATIC_ENGINE__ + +#include + +namespace Hurricane { + class Go; + class BasicLayer; + class Transformation; + class CellWidget; + class CellViewer; +} + +#include "crlcore/GraphicToolEngine.h" +namespace CRL { + class RoutingGauge; +} + +#include "katabatic/KatabaticEngine.h" + + +namespace Katabatic { + + using Hurricane::Go; + using Hurricane::Box; + using Hurricane::BasicLayer; + using Hurricane::Transformation; + using Hurricane::CellWidget; + using Hurricane::CellViewer; + using CRL::RoutingGauge; + using CRL::GraphicTool; + + +// ------------------------------------------------------------------- +// Class : "CRL::GraphicKatabaticEngine". + + + class GraphicKatabaticEngine : public GraphicTool { + Q_OBJECT; + + public: + static KatabaticEngine* create ( const RoutingGauge*, Cell* ); + static void initKatabaticAc ( CellWidget* ); + static void drawKatabaticAc ( CellWidget* + , const Go* + , const BasicLayer* + , const Box& + , const Transformation& + ); + static void initKatabaticGCell ( CellWidget* ); + static void drawKatabaticGCell ( CellWidget* + , const Go* + , const BasicLayer* + , const Box& + , const Transformation& + ); + static GraphicKatabaticEngine* grab (); + virtual const Name& getName () const; + virtual size_t release (); + virtual void addToMenu ( CellViewer* ); + public slots: + void run (); + void closeRoute (); + + protected: + static size_t _references; + static GraphicKatabaticEngine* _singleton; + CellViewer* _viewer; + protected: + GraphicKatabaticEngine (); + virtual ~GraphicKatabaticEngine (); + }; + + + +} // End of Katabatic namespace. + + +#endif // __KATABATIC_GRAPHIC_KATABATIC_ENGINE__ diff --git a/katabatic/src/katabatic/Grid.h b/katabatic/src/katabatic/Grid.h new file mode 100644 index 00000000..fb39af77 --- /dev/null +++ b/katabatic/src/katabatic/Grid.h @@ -0,0 +1,340 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./Grid.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#ifndef __KATABATIC_GRID__ +#define __KATABATIC_GRID__ + +#include +#include + +#include "hurricane/Point.h" +#include "hurricane/Box.h" +#include "hurricane/Collection.h" + + +namespace Katabatic { + + + using std::string; + using std::vector; + using Hurricane::_TName; + using Hurricane::Record; + using Hurricane::DbU; + using Hurricane::Point; + using Hurricane::Box; + using Hurricane::Collection; + using Hurricane::GenericCollection; + using Hurricane::getCollection; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::BaseGrid". + + + class BaseGrid { + + public: + class Axis; + public: + inline void destroy (); + // Accessors. + inline unsigned int getColumns () const; + inline unsigned int getRows () const; + inline unsigned int getRawSize () const; + inline unsigned int getIndex ( unsigned int c, unsigned int r ) const; + inline unsigned int getRow ( unsigned int ) const; + inline unsigned int getColumn ( unsigned int ) const; + inline const Axis& getXGrads () const; + inline const Axis& getYGrads () const; + // Inspector Managment. + virtual Record* _getRecord () const; + virtual string _getString () const = 0; + + public: + // Sub-Class Grid::Axis. + class Axis { + public: + // Modifiers. + inline void addGraduation ( DbU::Unit ); + void sort (); + // Accessors. + inline unsigned int getSize () const; + unsigned int getGraduationNumber ( DbU::Unit pos, bool& onGraduation ) const; + // Operators. + inline DbU::Unit& operator[] ( unsigned int i ); + // Inspector Management. + Record* _getRecord () const; + string _getString () const; + inline string _getTypeName () const; + string _print () const; + protected: + // Attributes. + vector _graduations; + }; + + protected: + // Attributes. + Axis _xGraduations; + Axis _yGraduations; + unsigned int _rows; + unsigned int _columns; + unsigned int _rawSize; + + // Constructors & Destructors. + protected: + BaseGrid (); + virtual ~BaseGrid (); + virtual void _postCreate (); + virtual void _preDestroy (); + private: + BaseGrid ( const BaseGrid& ); + BaseGrid& operator= ( const BaseGrid& ); + }; + + +// Inline Functions. + inline void BaseGrid::Axis::addGraduation ( DbU::Unit graduation ) { _graduations.push_back(graduation); } + inline unsigned int BaseGrid::Axis::getSize () const { return _graduations.size(); } + inline DbU::Unit& BaseGrid::Axis::operator[] ( unsigned int i ) { return _graduations[i]; } + inline string BaseGrid::Axis::_getTypeName () const { return _TName("BaseGrid::Axis"); } + + inline void BaseGrid::destroy () { _preDestroy(); delete this; } + inline unsigned int BaseGrid::getColumns () const { return _columns; }; + inline unsigned int BaseGrid::getRows () const { return _rows; }; + inline unsigned int BaseGrid::getRawSize () const { return getColumns() * getRows(); } + inline unsigned int BaseGrid::getIndex ( unsigned int c, unsigned int r ) const { return c+(r*getColumns()); } + inline unsigned int BaseGrid::getRow ( unsigned int i ) const { return i / getColumns(); } + inline unsigned int BaseGrid::getColumn ( unsigned int i ) const { return i % getColumns(); } + + inline const BaseGrid::Axis& BaseGrid::getXGrads () const { return _xGraduations; } + inline const BaseGrid::Axis& BaseGrid::getYGrads () const { return _yGraduations; } + + +// ------------------------------------------------------------------- +// Template Class : "Katabatic::Grid". + + + template + class Grid : public BaseGrid { + + public: + // Accessors. + inline GCellT* getGCell ( unsigned int index ) const; + inline GCellT* getGCell ( const Point p ) const; + inline GCellT* getGCell ( const Point p1, const Point p2 ) const; + inline GCellT* getGCellLeft ( const GCellT* gcell ) const; + inline GCellT* getGCellRight ( const GCellT* gcell ) const; + inline GCellT* getGCellUp ( const GCellT* gcell ) const; + inline GCellT* getGCellDown ( const GCellT* gcell ) const; + inline vector* getGCellVector (); + // Collections & Filters. + inline GenericCollection getGCells (); + inline GenericCollection getGCellsColumn ( unsigned int column + , unsigned int rowStart + , unsigned int rowStop ); + inline GenericCollection getGCellsRow ( unsigned int row + , unsigned int columnStart + , unsigned int columnStop ); + // Inspector Managment. + virtual Record* _getRecord () const; + + protected: + // Attributes. + vector _gcells; + + // Constructors & Destructors. + protected: + inline Grid (); + virtual ~Grid (); + private: + Grid ( const Grid& ); + Grid& operator= ( const Grid& ); + }; + + +} // End of Katabatic namespace. + + +#include "katabatic/GridCollections.h" +#include "katabatic/GridBox.h" + + +namespace Katabatic { + + +// Inline Functions. + + template + Grid::Grid () : BaseGrid() + , _gcells() + { } + + + template + Grid::~Grid () + { } + + + template + GCellT* Grid::getGCell ( unsigned int index ) const + { + if ( ( index < 0 ) || ( index >= _rawSize ) ) return NULL; + + return _gcells [ index ]; + } + + + template + GCellT* Grid::getGCell ( const Point p ) const + { + bool onColumn; + bool onRow; + + unsigned int column = _xGraduations.getGraduationNumber ( p.getX(), onColumn ); + unsigned int row = _yGraduations.getGraduationNumber ( p.getY(), onRow ); + + return getGCell ( getIndex(column,row) ); + } + + + template + GCellT* Grid::getGCell ( const Point p1, const Point p2 ) const + { + bool onColumn1; + bool onColumn2; + bool onRow1; + bool onRow2; + + unsigned int column1 = _xGraduations.getGraduationNumber ( p1.getX(), onColumn1 ); + unsigned int column2 = _xGraduations.getGraduationNumber ( p2.getX(), onColumn2 ); + unsigned int row1 = _yGraduations.getGraduationNumber ( p1.getY(), onRow1 ); + unsigned int row2 = _yGraduations.getGraduationNumber ( p2.getY(), onRow2 ); + + if ( row1 != row2 ) { + if ( onRow1 ) row1 = row2; + } + + if ( column1 != column2 ) { + if ( onColumn1 ) column1 = column2; + } + + return getGCell ( getIndex(column1,row1) ); + } + + + template + GCellT* Grid::getGCellLeft ( const GCellT* gcell) const + { + if ( !gcell ) return NULL; + + unsigned int index = gcell->getIndex(); + if ( !getColumn(index) ) return NULL; + + return getGCell ( index - 1 ); + } + + + template + GCellT* Grid::getGCellRight ( const GCellT* gcell) const + { + if ( !gcell ) return NULL; + + unsigned int index = gcell->getIndex(); + if ( getColumn(index) >= getColumns()-1 ) return NULL; + + return getGCell ( index + 1 ); + } + + + template + GCellT* Grid::getGCellUp ( const GCellT* gcell) const + { + if ( !gcell ) return NULL; + + unsigned int index = gcell->getIndex(); + if ( getRow(index) >= getRows()-1 ) return NULL; + + return getGCell ( index + getColumns() ); + } + + + template + GCellT* Grid::getGCellDown ( const GCellT* gcell) const + { + if ( !gcell ) return NULL; + + unsigned int index = gcell->getIndex(); + if ( !getRow(index) ) return NULL; + + return getGCell ( index - getColumns() ); + } + + + template + inline vector* Grid::getGCellVector () + { + return &_gcells; + } + + + template + inline GenericCollection Grid::getGCells () + { + return getCollection(_gcells); + } + + template + inline GenericCollection Grid::getGCellsColumn ( unsigned int column + , unsigned int rowStart + , unsigned int rowStop ) + { + return Grid_Column(this,column,rowStart,rowStop); + } + + template + inline GenericCollection Grid::getGCellsRow ( unsigned int row + , unsigned int columnStart + , unsigned int columnStop ) + { + return Grid_Row(this,row,columnStart,columnStop); + } + + + template + Record* Grid::_getRecord () const + { + Record* record = BaseGrid::_getRecord (); + record->add ( getSlot ( "_gcells", &_gcells ) ); + return record; + } + + +} // End of Katabatic namespace. + + +INSPECTOR_P_SUPPORT(Katabatic::BaseGrid::Axis); + + +#endif // __KATABATIC_GRID__ diff --git a/katabatic/src/katabatic/GridBox.h b/katabatic/src/katabatic/GridBox.h new file mode 100644 index 00000000..370281a1 --- /dev/null +++ b/katabatic/src/katabatic/GridBox.h @@ -0,0 +1,240 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./GridBox.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#ifndef __KATABATIC_GRID_BOX__ +#define __KATABATIC_GRID_BOX__ + +#ifndef __KATABATIC_GRID__ +#error "GridBox.h must be included only through Grid.h." +#endif + +#include + +#include "hurricane/Error.h" +#include "crlcore/RoutingLayerGauge.h" + + +namespace Katabatic { + + + using Hurricane::Error; + using std::min; + using std::max; + + +// ------------------------------------------------------------------- +// Template Class : "Katabatic::GridBox". + + + template + class GridBox { + + public: + static GridBox* create ( Grid* grid + , unsigned int columnMin + , unsigned int rowMin + , unsigned int columnMax + , unsigned int rowMax + ); + inline Grid* getGrid () const; + inline unsigned int getColumnMin () const; + inline unsigned int getColumnMax () const; + inline unsigned int getRowMin () const; + inline unsigned int getRowMax () const; + inline unsigned int getRows () const; + inline unsigned int getColumns () const; + inline Box getArea () const; + inline Point getCenter () const; + inline DbU::Unit getXMin () const; + inline DbU::Unit getYMin () const; + inline DbU::Unit getXMax () const; + inline DbU::Unit getYMax () const; + inline void getChannelBox ( unsigned int direction + , DbU::Unit& channelMin + , DbU::Unit& channelMax + , DbU::Unit& channelLeft + , DbU::Unit& channelRight + , bool inclusive=false + ) const; + inline GenericCollection getSlice ( unsigned int direction, unsigned int slice ); + inline GenericCollection getGCells (); + inline string _getTypeName () const; + inline string _getString () const; + inline Record* _getRecord () const; + + protected: + // Attributes. + Grid* _grid; + Box _area; + unsigned int _columnMin; + unsigned int _columnMax; + unsigned int _rowMin; + unsigned int _rowMax; + + protected: + // Constructors & Destructors. + GridBox ( Grid* grid + , unsigned int columnMin + , unsigned int rowMin + , unsigned int columnMax + , unsigned int rowMax + ); + private: + GridBox ( const GridBox& ); + GridBox& operator= ( const GridBox& ); + + }; + + + template inline Grid* GridBox::getGrid () const { return _grid; } + template inline unsigned int GridBox::getColumnMin () const { return _columnMin; } + template inline unsigned int GridBox::getColumnMax () const { return _columnMax; } + template inline unsigned int GridBox::getRowMin () const { return _rowMin; } + template inline unsigned int GridBox::getRowMax () const { return _rowMax; } + template inline unsigned int GridBox::getRows () const { return _rowMax - _rowMin; } + template inline unsigned int GridBox::getColumns () const { return _columnMax - _columnMin; } + template inline Box GridBox::getArea () const { return _area; } + template inline Point GridBox::getCenter () const { return _area.getCenter(); } + template inline DbU::Unit GridBox::getXMin () const { return _area.getXMin(); } + template inline DbU::Unit GridBox::getYMin () const { return _area.getYMin(); } + template inline DbU::Unit GridBox::getXMax () const { return _area.getXMax(); } + template inline DbU::Unit GridBox::getYMax () const { return _area.getYMax(); } + template inline GenericCollection + GridBox::getGCells () { return new Grid_Area(_grid,_columnMin,_rowMin,_columnMax,_rowMax); } + template inline string GridBox::_getTypeName () const { return "Katabatic::GridBox"; } + + + + + + template + GridBox::GridBox ( Grid* grid + , unsigned int columnMin + , unsigned int rowMin + , unsigned int columnMax + , unsigned int rowMax + ) + : _grid (grid) + , _columnMin(columnMin) + , _columnMax(columnMax) + , _rowMin (rowMin) + , _rowMax (rowMax) + { + GCellT* fcellBL = _grid->getGCell(_grid->getIndex(_columnMin ,_rowMin )); + GCellT* fcellTR = _grid->getGCell(_grid->getIndex(_columnMax-1,_rowMax-1)); + + _area = Box ( fcellBL->getX(), fcellBL->getY(), fcellTR->getXMax(), fcellTR->getYMax() ); + } + + + template + GridBox* GridBox::create ( Grid* grid + , unsigned int columnMin + , unsigned int rowMin + , unsigned int columnMax + , unsigned int rowMax + ) + { + columnMin = min ( columnMin, grid->getColumns() ); + rowMin = min ( rowMin , grid->getRows () ); + columnMax = min ( columnMax, grid->getColumns() ); + rowMax = min ( rowMax , grid->getRows () ); + + if ( (columnMin >= columnMax) || (rowMin >= rowMax) ) + throw Error("GridBox::create(): Empty GridBox requested <%u:%u %u:%u>." + ,columnMin,rowMin,columnMax,rowMax); + + return new GridBox ( grid, columnMin, rowMin, columnMax, rowMax ); + } + + + template + void GridBox::getChannelBox ( unsigned int direction + , DbU::Unit& channelMin + , DbU::Unit& channelMax + , DbU::Unit& channelLeft + , DbU::Unit& channelRight + , bool inclusive + ) const + { + if ( direction & Constant::Horizontal ) { + channelMin = getYMin() + DbU::lambda( inclusive?0:0.1 ); + channelMax = getYMax(); + channelLeft = getXMin() + DbU::lambda( inclusive?0:0.1 ); + channelRight = getXMax(); + } else { + channelMin = getXMin() + DbU::lambda( inclusive?0:0.1 ); + channelMax = getXMax(); + channelLeft = getYMin() + DbU::lambda( inclusive?0:0.1 ); + channelRight = getYMax(); + } + } + + + template + GenericCollection GridBox::getSlice ( unsigned int direction, unsigned int slice ) + { + if ( direction & Constant::Horizontal ) { + unsigned int columnMin = min ( _columnMin+slice , _columnMax ); + unsigned int columnMax = min ( _columnMin+slice+1, _columnMax ); + + return new Grid_Area ( _grid, columnMin, _rowMin, columnMax, _rowMax ); + } + + unsigned int rowMin = min ( _rowMin+slice , _rowMax ); + unsigned int rowMax = min ( _rowMin+slice+1, _rowMax ); + + return new Grid_Area ( _grid, _columnMin, rowMin, _columnMax, rowMax ); + } + + + template + string GridBox::_getString () const + { + return "<" + _getTypeName() + " " + + getString(getColumnMin()) + ":" + getString(getRowMin()) + " " + + getString(getColumnMax()) + ":" + getString(getRowMax()) + + ">"; + } + + + template + Record* GridBox::_getRecord () const + { + Record* record = new Record ( _getString() ); + record->add ( getSlot ( "_area" , &_area ) ); + record->add ( getSlot ( "_columnMin", &_columnMin ) ); + record->add ( getSlot ( "_columnMax", &_columnMax ) ); + record->add ( getSlot ( "_rowMin" , &_rowMin ) ); + record->add ( getSlot ( "_rowMax" , &_rowMax ) ); + + return record; + } + + +} // End of Katabatic namespace. + + +#endif // __KATABATIC_GRID_BOX__ diff --git a/katabatic/src/katabatic/GridCollections.h b/katabatic/src/katabatic/GridCollections.h new file mode 100644 index 00000000..2be7daa7 --- /dev/null +++ b/katabatic/src/katabatic/GridCollections.h @@ -0,0 +1,602 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./GridCollections.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + + + +#ifndef __KATABATIC_GRID_COLLECTIONS__ +#define __KATABATIC_GRID_COLLECTIONS__ + +#ifndef __KATABATIC_GRID__ +#error "GridCollections.h must be included only through Grid.h." +#endif + +#include "hurricane/Collection.h" + + +namespace Katabatic { + + + using Hurricane::_TName; + using Hurricane::Locator; + using Hurricane::Collection; + using Hurricane::GenericLocator; + using Hurricane::GenericCollection; + using Hurricane::GenericFilter; + + +// ------------------------------------------------------------------- +// Template Class : "Katabatic::Grid_Column". + + + template + class Grid_Column : public Collection { + + public: + // Sub-Class: Locator. + class Locator : public Hurricane::Locator { + public: + Locator ( const Grid* grid + , unsigned int start + , unsigned int stop ); + Locator ( const Locator& ); + virtual Hurricane::Locator* getClone () const; + virtual GCellT* getElement () const; + Grid* getGrid () const; + virtual bool isValid () const; + virtual void progress (); + virtual string _getString () const; + + protected: + const Grid* _grid; + unsigned int _index; + unsigned int _stop; + }; + + public: + // Grid_Column Methods. + Grid_Column ( const Grid* grid + , unsigned int column + , unsigned int rowStart + , unsigned int rowStop + ); + Grid_Column ( const Grid_Column& ); + virtual Collection* getClone () const; + virtual Hurricane::Locator* getLocator () const; + virtual string _getString () const; + + protected: + // Grid_Column Attributes. + const Grid* _grid; + unsigned int _start; + unsigned int _stop; + + }; + + +// Grid_Column Locator Part. + template + Grid_Column::Locator::Locator ( const Grid* grid + , unsigned int start + , unsigned int stop ) + : Hurricane::Locator() + , _grid(grid) + , _index(start) + , _stop(stop) + { } + + + template + Grid_Column::Locator::Locator ( const Locator& locator ) + : Hurricane::Locator() + , _grid(locator._grid) + , _index(locator._index) + , _stop(locator._stop) + { }; + + + template + GCellT* Grid_Column::Locator::getElement () const + { + return _grid->getGCell ( _index ); + } + + + template + void Grid_Column::Locator::progress () + { + _index += _grid->getColumns (); + } + + + template + Hurricane::Locator* Grid_Column::Locator::getClone () const + { + return new Locator(*this); + } + + + template + bool Grid_Column::Locator::isValid () const + { + return _index < _stop; + } + + + template + Grid* Grid_Column::Locator::getGrid () const + { + return _grid; + } + + + template + string Grid_Column::Locator::_getString () const + { + string s = "<" + _TName("Grid_Column::Locator") + + getString(_grid) + + ">"; + return s; + } + + +// Grid_Column Collection Part. + template + Grid_Column::Grid_Column ( const Grid* grid + , unsigned int column + , unsigned int rowStart + , unsigned int rowStop + ) + : Collection() + , _grid(grid) + , _start(grid->getIndex(column,rowStart)) + , _stop (grid->getIndex(column,rowStop)) + { + if ( ( column >= _grid->getColumns() ) + || ( rowStart >= _grid->getRows() ) + || ( rowStart >= rowStop ) ) { + _start = 1; + _stop = 0; + } else { + _start = grid->getIndex ( column, rowStart ); + _stop = grid->getIndex ( column, min(rowStop,grid->getRows()) ); + } + } + + + template + Grid_Column::Grid_Column ( const Grid_Column& gridColumn ) + : Collection() + , _grid(gridColumn._grid) + , _start(gridColumn._start) + , _stop(gridColumn._stop) + { } + + + template + Collection* Grid_Column::getClone () const + { + return new Grid_Column(*this); + } + + + template + Hurricane::Locator* Grid_Column::getLocator () const + { + return new Locator(_grid,_start,_stop); + } + + + template + string Grid_Column::_getString () const + { + string s = "<" + _TName("Grid_Column") + " " + + getString(_grid) + " " + + getString(_grid->getColumn(_start)) + " [" + + getString(_grid->getRow(_start)) + ":" + + getString(_grid->getRow(_stop)) + "]" + + ">"; + return s; + } + + +// ------------------------------------------------------------------- +// Remplate Class : "Grid_Row". + + + template + class Grid_Row : public Collection { + + public: + // Sub-Class : Locator. + class Locator : public Hurricane::Locator { + public: + Locator ( const Grid* grid + , unsigned int start + , unsigned int stop ); + Locator ( const Locator& ); + virtual GCellT* getElement () const; + virtual Hurricane::Locator* getClone () const; + virtual bool isValid () const; + virtual void progress (); + Grid* getGrid () const; + virtual string _getString () const; + protected: + const Grid* _grid; + unsigned int _index; + unsigned int _stop; + }; + + public: + // Grid_Row Methods. + Grid_Row ( const Grid* grid + , unsigned int row + , unsigned int columnStart + , unsigned int columnStop + ); + Grid_Row ( const Grid_Row& ); + virtual Collection* getClone () const; + virtual Hurricane::Locator* getLocator () const; + virtual string _getString () const; + + protected: + // Grid_Row Attributes. + const Grid* _grid; + unsigned int _start; + unsigned int _stop; + }; + + +// Grid_Column Locator Part. + template + Grid_Row::Locator::Locator ( const Grid* grid + , unsigned int start + , unsigned int stop ) + : Hurricane::Locator() + , _grid(grid) + , _index(start) + , _stop(stop) + { } + + + template + Grid_Row::Locator::Locator ( const Locator& locator ) + : Hurricane::Locator() + , _grid(locator._grid) + , _index(locator._index) + , _stop(locator._stop) + { } + + + template + GCellT* Grid_Row::Locator::getElement () const + { + return _grid->getGCell ( _index ); + } + + + template + Hurricane::Locator* Grid_Row::Locator::getClone () const + { + return new Locator(*this); + } + + + template + bool Grid_Row::Locator::isValid () const + { + return _index < _stop; + } + + + template + void Grid_Row::Locator::progress () + { + _index++; + } + + + template + Grid* Grid_Row::Locator::getGrid () const + { + return _grid; + } + + + template + string Grid_Row::Locator::_getString () const + { + string s = "<" + _TName("Grid_Row::Locator") + + getString(_grid) + + ">"; + + return s; + } + + +// Grid_Column Collection Part. + template + Grid_Row::Grid_Row ( const Grid* grid + , unsigned int row + , unsigned int columnStart + , unsigned int columnStop + ) + : Collection() + , _grid(grid) + { + if ( ( row >= _grid->getRows() ) + || ( columnStart >= _grid->getColumns() ) + || ( columnStart >= columnStop ) ) { + _start = 1; + _stop = 0; + } else { + _start = grid->getIndex ( columnStart, row ); + _stop = grid->getIndex ( min(columnStop,grid->getColumns()), row ); + } + } + + + template + Grid_Row::Grid_Row ( const Grid_Row& gridRow ) + : Collection() + , _grid(gridRow._grid) + , _start(gridRow._start) + , _stop(gridRow._stop) + { } + + + template + Collection* Grid_Row::getClone () const + { + return new Grid_Row(*this); + } + + + template + Hurricane::Locator* Grid_Row::getLocator () const + { + return new Locator(_grid,_start,_stop); + } + + + template + string Grid_Row::_getString () const + { + string s = "<" + _TName("Grid_Row") + " " + + getString(_grid) + " " + + getString(_grid->getRow(_start)) + " [" + + getString(_grid->getColumn(_start)) + ":" + + getString(_grid->getColumn(_stop)) + "]" + + ">"; + return s; + } + + +// ------------------------------------------------------------------- +// Template Class : "Grid_Area". + + + template + class Grid_Area : public Collection { + + public: + // Sub-Class : Locator. + class Locator : public Hurricane::Locator { + public: + Locator ( const Grid* grid + , unsigned int columnStart + , unsigned int rowStart + , unsigned int colummStop + , unsigned int rowStop ); + Locator ( const Locator& ); + ~Locator (); + virtual GCellT* getElement () const; + virtual Hurricane::Locator* getClone () const; + virtual bool isValid () const; + virtual void progress (); + virtual string _getString () const; + protected: + const Grid* _grid; + unsigned int _rowStart; + unsigned int _rowStop; + unsigned int _column; + unsigned int _columnStop; + Hurricane::Locator* _columnLocator; + }; + + public: + // Grid_Area Methods. + Grid_Area ( const Grid* grid + , unsigned int columnStart + , unsigned int rowStart + , unsigned int columnStop + , unsigned int rowStop + ); + Grid_Area ( const Grid_Area& ); + virtual Collection* getClone () const; + virtual Hurricane::Locator* getLocator () const; + virtual string _getString () const; + + public: + // Grid_Area Attributes. + const Grid* _grid; + unsigned int _columnStart; + unsigned int _columnStop; + unsigned int _rowStart; + unsigned int _rowStop; + }; + + +// Grid_Area Locator Part. + template + Grid_Area::Locator::Locator ( const Grid* grid + , unsigned int columnStart + , unsigned int rowStart + , unsigned int columnStop + , unsigned int rowStop + ) + : _grid(grid) + , _rowStart(rowStart) + , _rowStop(rowStop) + , _column(columnStart) + , _columnStop(columnStop) + { + _columnLocator = new typename Grid_Column::Locator ( _grid + , _grid->getIndex(_column,rowStart) + , _grid->getIndex(_column,rowStop ) ); + if ( !_columnLocator->isValid() ) _column = _columnStop; + } + + + template + Grid_Area::Locator::Locator ( const Locator& locator ) + : Hurricane::Locator() + , _grid(locator._grid) + , _rowStart(locator._rowStart) + , _rowStop(locator._rowStop) + , _column(locator._column) + , _columnStop(locator._columnStop) + , _columnLocator(_columnLocator->getClone()) + { } + + + template + Grid_Area::Locator::~Locator () + { + if (_columnLocator) delete _columnLocator; + } + + + template + Hurricane::Locator* Grid_Area::Locator::getClone () const + { + return new Locator(*this); + } + + + template + GCellT* Grid_Area::Locator::getElement () const + { + return _columnLocator->getElement(); + } + + + template + void Grid_Area::Locator::progress () + { + if ( !isValid() ) return; + + _columnLocator->progress(); + if ( !_columnLocator->isValid() ) { + delete _columnLocator; + _columnLocator = NULL; + + + _column += 1; + if ( !isValid() ) return; + + _columnLocator = new typename Grid_Column::Locator ( _grid + , _grid->getIndex(_column,_rowStart) + , _grid->getIndex(_column,_rowStop ) ); + } + } + + + template + bool Grid_Area::Locator::isValid () const + { + return _column < _columnStop; + } + + + template + string Grid_Area::Locator::_getString () const + { + string s = "<" + _TName("Grid_Area::Locator") + + getString(_grid) + + ">"; + return s; + } + + +// Grid_Area Collection Part. + template + Grid_Area::Grid_Area ( const Grid* grid + , unsigned int columnStart + , unsigned int rowStart + , unsigned int columnStop + , unsigned int rowStop + ) + : Collection() + , _grid(grid) + , _columnStart(columnStart) + , _columnStop(columnStop) + , _rowStart(rowStart) + , _rowStop(rowStop) + { } + + + template + Grid_Area::Grid_Area ( const Grid_Area& fcells ) + : Collection() + , _grid(fcells._grid) + , _columnStart(fcells._columnStart) + , _columnStop(fcells._columnStop) + , _rowStart(fcells._rowStart) + , _rowStop(fcells._rowStop) + { } + + + template + Collection* Grid_Area::getClone () const + { + return new Grid_Area(*this); + } + + + template + Hurricane::Locator* Grid_Area::getLocator () const + { + return new Locator(_grid,_columnStart,_rowStart,_columnStop,_rowStop); + } + + + template + string Grid_Area::_getString () const + { + string s = "<" + _TName("Grid_Area") + " " + + getString(_grid) + " " + + ">"; + return s; + } + + +} // End of Katabatic namespace. + + +#endif // __KATABATIC_GRID_COLLECTIONS__ diff --git a/katabatic/src/katabatic/KatabaticEngine.h b/katabatic/src/katabatic/KatabaticEngine.h new file mode 100644 index 00000000..055debef --- /dev/null +++ b/katabatic/src/katabatic/KatabaticEngine.h @@ -0,0 +1,258 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./KatabaticEngine.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#ifndef __KATABATIC_KATABATIC_ENGINE__ +#define __KATABATIC_KATABATIC_ENGINE__ + +#include +#include +#include +#include + +#include "hurricane/Timer.h" +#include "hurricane/DbU.h" +#include "hurricane/Nets.h" + +namespace Hurricane { + class Name; + class Layer; + class Cell; +} + +#include "crlcore/ToolEngine.h" + +namespace CRL { + class RoutingGauge; + class RoutingLayerGauge; +} + +#include "katabatic/Configuration.h" +#include "katabatic/AutoContacts.h" +#include "katabatic/AutoSegments.h" + + +namespace Katabatic { + + + using std::ostream; + using std::string; + using std::vector; + using std::set; + using Hurricane::Timer; + using Hurricane::Name; + using Hurricane::Layer; + using Hurricane::Net; + using Hurricane::Nets; + using Hurricane::Cell; + using CRL::RoutingGauge; + using CRL::RoutingLayerGauge; + using CRL::ToolEngine; + + class GCellGrid; + + +// ------------------------------------------------------------------- +// Enumerations + + + enum LoadGRMethod { LoadGrByNet = 1 + , LoadGrByGCell = 2 + }; + + enum LayerAssignMethod { LayerAssignByLength = 1 + , LayerAssignByTrunk = 2 + , NoNetLayerAssign = 3 + }; + + enum EngineState { StateCreation = 1 + , StateGlobalLoaded + , StateActive + , StateDriving + , StatePreDestroying + , StateGutted + }; + + +// ------------------------------------------------------------------- +// Class : "KatabaticEngine". + + + class KatabaticEngine : public ToolEngine { + + public: + // Constructor. + static KatabaticEngine* create ( const RoutingGauge*, Cell* ); + // Accessors. + static KatabaticEngine* get ( const Cell* ); + static const Name& staticGetName (); + inline bool doDestroyBaseContact () const; + inline bool doDestroyBaseSegment () const; + inline bool doDestroyTool () const; + virtual const Name& getName () const; + inline EngineState getState () const; + inline bool getDemoMode (); + inline bool getWarnGCellOverload (); + inline Configuration* getKatabaticConfiguration (); + virtual Configuration* getConfiguration (); + inline RoutingGauge* getRoutingGauge () const; + inline RoutingLayerGauge* getLayerGauge ( size_t depth ) const; + inline const Layer* getRoutingLayer ( size_t depth ) const ; + inline Layer* getContactLayer ( size_t depth ) const ; + inline GCellGrid* getGCellGrid () const; + inline const vector& getRoutingNets () const; + inline DbU::Unit getGlobalThreshold () const; + inline float getSaturateRatio () const; + inline DbU::Unit getExtensionCap () const; + void xmlWriteGCellGrid ( ostream& ); + void xmlWriteGCellGrid ( const string& ); + inline bool isGMetal ( const Layer* ) const; + // Modifiers. + inline void setState ( EngineState state ); + inline void setDemoMode ( bool ); + inline bool setDestroyBaseContact ( bool ); + inline bool setDestroyBaseSegment ( bool ); + inline void setWarnGCellOverload ( bool ); + inline void setGlobalThreshold ( DbU::Unit ); + inline void setSaturateRatio ( float ); + void startMeasures (); + void stopMeasures (); + void printMeasures () const; + void refresh ( bool openSession=true ); + void makePowerRails (); + virtual void createDetailedGrid (); + virtual void loadGlobalRouting ( unsigned int method, vector& ); + void layerAssign ( unsigned int method ); + // void computeNetConstraints (); + // void computeNetOptimals (); + virtual void finalizeLayout (); + // Internal Modifiers. + bool _check ( const char* message=NULL ) const; + void _check ( Net* ) const; + void _gutKatabatic (); + void _link ( AutoContact* ); + void _link ( AutoSegment* ); + void _unlink ( AutoContact* ); + void _unlink ( AutoSegment* ); + AutoContact* _lookup ( Contact* ) const; + AutoSegment* _lookup ( Segment* ) const; + void _destroyAutoSegments (); + void _destroyAutoContacts (); + void _loadGrByNet (); + void _loadNetGlobalRouting ( Net* ); + void _alignate ( Net* ); + void _canonize ( Net* ); + void _desaturate ( unsigned int depth, set& ); + void _layerAssignByLength ( unsigned long& total, unsigned long& global, set& ); + void _layerAssignByLength ( Net* , unsigned long& total, unsigned long& global, set& ); + void _layerAssignByTrunk ( unsigned long& total, unsigned long& global, set& ); + void _layerAssignByTrunk ( Net* , unsigned long& total, unsigned long& global, set& ); + void _splitContactsOfNet ( Net* ); + void _computeNetConstraints ( Net* ); + void _collapseNet ( const Name& , unsigned int depth=1 ); + void _collapseNet ( Net* , unsigned int depth=1 ); + void _collapseNets ( Nets , unsigned int depth=1 ); + void _computeNetOptimals ( Net* ); + void _computeNetTerminals ( Net* ); + void _toOptimals ( Net*, bool onlyNew=false ); + void _saveNet ( Net* ); + void _print () const; + void _print ( Net* ) const; + inline AutoContactLut& _getAutoContactLut (); + inline AutoSegmentLut& _getAutoSegmentLut (); + // Inspector Management. + virtual Record* _getRecord () const; + virtual string _getString () const; + virtual string _getTypeName () const; + + protected: + // Attributes. + static Name _toolName; + Timer _timer; + EngineState _state; + bool _destroyBaseContact; + bool _destroyBaseSegment; + bool _demoMode; + bool _warnGCellOverload; + ConfigurationConcrete _configuration; + GCellGrid* _gcellGrid; + vector _routingNets; + AutoSegmentLut _autoSegmentLut; + AutoContactLut _autoContactLut; + + protected: + // Constructors & Destructors. + KatabaticEngine ( const RoutingGauge*, Cell* ); + virtual ~KatabaticEngine (); + virtual void _postCreate (); + virtual void _preDestroy (); + private: + KatabaticEngine ( const KatabaticEngine& ); + KatabaticEngine& operator= ( const KatabaticEngine& ); + }; + + +// Inline Functions. + inline bool KatabaticEngine::doDestroyBaseContact () const { return _destroyBaseContact; } + inline bool KatabaticEngine::doDestroyBaseSegment () const { return _destroyBaseSegment; } + inline bool KatabaticEngine::doDestroyTool () const { return _state >= StateGutted; } + inline bool KatabaticEngine::setDestroyBaseContact ( bool state ) { bool p=_destroyBaseContact; _destroyBaseContact = state; return p; } + inline bool KatabaticEngine::setDestroyBaseSegment ( bool state ) { bool p=_destroyBaseSegment; _destroyBaseSegment = state; return p; } + inline Configuration* KatabaticEngine::getKatabaticConfiguration () { return &_configuration; } + inline bool KatabaticEngine::isGMetal ( const Layer* layer ) const { return _configuration.isGMetal(layer); } + inline void KatabaticEngine::setDemoMode ( bool mode ) { _demoMode = mode; } + inline void KatabaticEngine::setWarnGCellOverload ( bool mode ) { _warnGCellOverload = mode; } + inline void KatabaticEngine::setSaturateRatio ( float ratio ) { _configuration.setSaturateRatio(ratio); } + inline void KatabaticEngine::setGlobalThreshold ( DbU::Unit threshold ) { _configuration.setGlobalThreshold(threshold); } + inline bool KatabaticEngine::getDemoMode () { return _demoMode; } + inline bool KatabaticEngine::getWarnGCellOverload () { return _warnGCellOverload; } + inline EngineState KatabaticEngine::getState () const { return _state; } + inline RoutingGauge* KatabaticEngine::getRoutingGauge () const { return _configuration.getRoutingGauge(); } + inline RoutingLayerGauge* KatabaticEngine::getLayerGauge ( size_t depth ) const { return _configuration.getLayerGauge(depth); } + inline const Layer* KatabaticEngine::getRoutingLayer ( size_t depth ) const { return _configuration.getRoutingLayer(depth); } + inline Layer* KatabaticEngine::getContactLayer ( size_t depth ) const { return _configuration.getContactLayer(depth); } + inline GCellGrid* KatabaticEngine::getGCellGrid () const { return _gcellGrid; } + inline const vector& KatabaticEngine::getRoutingNets () const { return _routingNets; } + inline DbU::Unit KatabaticEngine::getGlobalThreshold () const { return _configuration.getGlobalThreshold(); } + inline float KatabaticEngine::getSaturateRatio () const { return _configuration.getSaturateRatio(); } + inline DbU::Unit KatabaticEngine::getExtensionCap () const { return _configuration.getExtensionCap(); } + inline AutoContactLut& KatabaticEngine::_getAutoContactLut () { return _autoContactLut; } + inline AutoSegmentLut& KatabaticEngine::_getAutoSegmentLut () { return _autoSegmentLut; } + inline void KatabaticEngine::setState ( EngineState state ) { _state = state; } + + + + +// ------------------------------------------------------------------- +// Global Variables. + + + extern const char* missingKTBT; + extern const char* badMethod; + + +} // End of Katabatic namespace. + + +#endif // __KATABATIC_KATABATIC_ENGINE__ diff --git a/katabatic/src/katabatic/SegmentWrapper.h b/katabatic/src/katabatic/SegmentWrapper.h new file mode 100644 index 00000000..767e492f --- /dev/null +++ b/katabatic/src/katabatic/SegmentWrapper.h @@ -0,0 +1,110 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./SegmentWrapper.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + +#ifndef __KATABATIC_SEGMENT_WRAPPER__ +#define __KATABATIC_SEGMENT_WRAPPER__ + + +#include "hurricane/Segment.h" + + +namespace Katabatic { + + using Hurricane::Hook; + using Hurricane::Component; + using Hurricane::DbU; + using Hurricane::Point; + using Hurricane::Layer; + using Hurricane::Segment; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::SegmentWrapper". + + class SegmentWrapper { + public: + // Accessors. + virtual Segment* getBase () = 0; + inline Hook* getSourceHook (); + inline Hook* getTargetHook (); + inline Hook* getOppositeHook ( const Hook* ); + inline Component* getSource () const; + inline Component* getTarget () const; + inline Component* getOppositeAnchor ( const Component* ); + inline Components getAnchors () const; + virtual DbU::Unit getX () const = 0; + virtual DbU::Unit getY () const = 0; + inline DbU::Unit getWidth () const; + inline DbU::Unit getHalfWidth () const; + inline DbU::Unit getLength () const; + virtual DbU::Unit getSourceX () const = 0; + virtual DbU::Unit getSourceY () const = 0; + virtual Point getSourcePosition () const = 0; + virtual DbU::Unit getTargetX () const = 0; + virtual DbU::Unit getTargetY () const = 0; + virtual Point getTargetPosition () const = 0; + public: + // Modifiers. + inline void setLayer ( const Layer* ); + inline void setWidth ( DbU::Unit ); + inline void invert (); + + protected: + // Constructor & Destructors. + inline SegmentWrapper ( Segment* ); + private: + SegmentWrapper& SegmentWrapper ( const SegmentWrapper& ); + SegmentWrapper& operator= ( const SegmentWrapper& ); + }; + + +// Inline Functions. + inline Hook* SegmentWrapper::getBodyHook () { return getBase()->getBodyHook(); } + inline Hook* SegmentWrapper::getAnchorHook () { return getBase()->getAnchorHook(); } + inline Component* SegmentWrapper::getAnchor () const { return getBase()->getAnchor(); } + inline DbU::Unit SegmentWrapper::getDx () const { return getBase()->getDx(); } + inline DbU::Unit SegmentWrapper::getDy () const { return getBase()->getDy(); } + inline DbU::Unit SegmentWrapper::getWidth () const { return getBase()->getWidth(); } + inline DbU::Unit SegmentWrapper::getHalfWidth () const { return getBase()->getHalfWidth(); } + inline DbU::Unit SegmentWrapper::getHeight () const { return getBase()->getHeight(); } + inline DbU::Unit SegmentWrapper::getHalfHeight () const { return getBase()->getHalfHeight(); } + inline void SegmentWrapper::setLayer ( const Layer* layer ) { return getBase()->setLayer(layer); } + inline void SegmentWrapper::setWidth ( DbU::Unit w ) { return getBase()->setWidth(w); } + inline void SegmentWrapper::setHeight ( DbU::Unit h ) { return getBase()->setHeight(h); } + inline void SegmentWrapper::setSizes ( DbU::Unit w, Dbu::Unit h ) { return getBase()->setSizes(w,h); } + inline void SegmentWrapper::setX ( DbU::Unit x ) { return getBase()->setX(x); } + inline void SegmentWrapper::setY ( DbU::Unit y ) { return getBase()->setY(y); } + inline void SegmentWrapper::setPosition ( DbU::Unit x, Dbu::Unit y ) { return getBase()->setPosition(x,y); } + inline void SegmentWrapper::setPosition ( const Point& p ) { return getBase()->setPosition(p); } + inline void SegmentWrapper::setDx ( DbU::Unit dx ) { return getBase()->setDx(dx); } + inline void SegmentWrapper::setDy ( DbU::Unit dy ) { return getBase()->setDy(dy); } + inline void SegmentWrapper::setOffset ( DbU::Unit dx, Dbu::Unit dy ) { return getBase()->setOffset(dx,dy); } + inline SegmentWrapper::SegmentWrapper ( BaseSegment* contact ) : getBase()(contact) { } + + +} // End of Katabatic namespace. + + +#endif // __KATABATIC_SEGMENT_WRAPPER__ diff --git a/katabatic/src/katabatic/Session.h b/katabatic/src/katabatic/Session.h new file mode 100644 index 00000000..3a6dd0f2 --- /dev/null +++ b/katabatic/src/katabatic/Session.h @@ -0,0 +1,227 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved +// +// =================================================================== +// +// $Id$ +// +// x-----------------------------------------------------------------x +// | | +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | =============================================================== | +// | C++ Header : "./Session.h" | +// | *************************************************************** | +// | U p d a t e s | +// | | +// x-----------------------------------------------------------------x + + + + +#ifndef __KATABATIC_SESSION__ +#define __KATABATIC_SESSION__ + +#include +#include +#include +#include +#include "hurricane/Commons.h" +#include "hurricane/DbU.h" + +namespace Hurricane { + class Layer; + class Technology; + class Net; + class Contact; + class Segment; +} + +namespace CRL { + class RoutingGauge; +} + + +namespace Katabatic { + + + using std::cerr; + using std::endl; + using std::string; + using std::vector; + using std::set; + using std::map; + using std::make_pair; + using Hurricane::tab; + using Hurricane::inltrace; + using Hurricane::_TName; + using Hurricane::Record; + using Hurricane::Layer; + using Hurricane::Technology; + using Hurricane::DbU; + using Hurricane::Net; + using Hurricane::Contact; + using Hurricane::Segment; + using CRL::RoutingGauge; + + class Configuration; + class AutoContact; + class AutoSegment; + class KatabaticEngine; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::Session". + + + class Session { + + public: + enum InvalidateType { NetSplitContacts = (1<<0) + , NetCanonize = (1<<1) + , RestoreHCon = (1<<2) + , RestoreVCon = (1<<3) + }; + + public: + // Static Methods. + static inline bool doDestroyBaseContact (); + static inline bool doDestroyBaseSegment (); + static inline bool doDestroyTool (); + static Session* get ( const char* message=NULL ); + static inline Technology* getTechnology (); + static inline const Configuration* getConfiguration (); + static inline RoutingGauge* getRoutingGauge (); + static inline KatabaticEngine* getKatabatic (); + static bool getDemoMode (); + static float getSaturateRatio (); + static bool getWarnGCellOverload (); + static DbU::Unit getExtensionCap (); + static const Layer* getRoutingLayer ( size_t ); + static const Layer* getContactLayer ( size_t ); + static inline size_t getSegmentStackSize (); + static inline size_t getContactStackSize (); + static inline const vector& getInvalidateds (); + static inline const vector& getRevalidateds (); + static inline const set& getDestroyeds (); + static inline const vector& getDogLegs (); + static inline const set& getNetsModificateds (); + static Session* open ( KatabaticEngine* ); + static size_t close (); + static void setWarnGCellOverload ( bool ); + static inline void dogLeg ( AutoSegment* ); + static inline void dogLegReset (); + static inline void revalidateTopology (); + static inline void setInvalidateMask ( unsigned int ); + static inline void invalidate ( Net* ); + static inline void invalidate ( AutoContact* ); + static inline void invalidate ( AutoSegment* ); + static inline size_t revalidate (); + static void link ( AutoContact* ); + static void link ( AutoSegment* ); + static void unlink ( AutoContact* ); + static void unlink ( AutoSegment* ); + static AutoContact* lookup ( Contact* ); + static AutoSegment* lookup ( Segment* ); + static inline void destroyRequest ( AutoSegment* ); + // Methods. + bool _doDestroyBaseContact (); + bool _doDestroyBaseSegment (); + bool _doDestroyTool (); + virtual Configuration* _getConfiguration (); + inline void _dogLeg ( AutoSegment* ); + inline void _dogLegReset (); + inline void _setInvalidateMask ( unsigned int ); + inline void _invalidate ( Net* ); + inline void _invalidate ( AutoContact* ); + inline void _invalidate ( AutoSegment* ); + inline void _destroyRequest ( AutoSegment* ); + void _splitContacts (); + void _restoreHCon (); + void _restoreVCon (); + void _canonize (); + void _revalidateTopology (); + size_t _revalidate (); + Record* _getRecord () const; + string _getString () const; + inline string _getTypeName () const; + + protected: + static Session* _session; + KatabaticEngine* _katabatic; + Technology* _technology; + RoutingGauge* _routingGauge; + vector _autoContacts; + vector _autoSegments; + vector _revalidateds; + vector _dogLegs; + set _netInvalidateds; + set _netRevalidateds; + set _destroyedSegments; + unsigned int _invalidateMask; + + // Constructors. + protected: + Session ( KatabaticEngine* ); + virtual ~Session (); + virtual void _postCreate (); + virtual size_t _preDestroy (); + private: + Session ( const Session& ); + Session& operator= ( const Session& ); + }; + + +// Inline Functions. + inline Technology* Session::getTechnology () { return get("getTechnology()")->_technology; } + inline RoutingGauge* Session::getRoutingGauge () { return get("getRoutingGauge()")->_routingGauge; } + inline bool Session::doDestroyBaseContact () { return get("doDestroyBaseContact()")->_doDestroyBaseContact(); } + inline bool Session::doDestroyBaseSegment () { return get("doDestroyBaseSegment()")->_doDestroyBaseSegment(); } + inline bool Session::doDestroyTool () { return get("doDestroyTool()")->_doDestroyTool(); } + inline const Configuration* Session::getConfiguration () { return get("getConfiguration()")->_getConfiguration(); } + inline KatabaticEngine* Session::getKatabatic () { return get("getKatabatic()")->_katabatic; } + inline void Session::revalidateTopology () { return get("revalidateTopology()")->_revalidateTopology(); } + inline size_t Session::revalidate () { return get("revalidate()")->_revalidate(); } + inline size_t Session::getSegmentStackSize () { return get("getSegmentStackSize()")->_autoSegments.size(); } + inline size_t Session::getContactStackSize () { return get("getContactStackSize()")->_autoContacts.size(); } + inline const vector& Session::getInvalidateds () { return get("getInvalidateds()")->_autoSegments; } + inline const vector& Session::getRevalidateds () { return get("getRevalidateds()")->_revalidateds; } + inline const set& Session::getDestroyeds () { return get("getDestroyeds()")->_destroyedSegments; } + inline const vector& Session::getDogLegs () { return get("getDogLegs()")->_dogLegs; } + inline const set& Session::getNetsModificateds () { return get("getNetsModificateds()")->_netRevalidateds; } + inline void Session::dogLegReset () { return get("dogLegReset()")->_dogLegReset (); } + inline void Session::setInvalidateMask ( unsigned int mask ) { return get("setInvalidateMask()")->_setInvalidateMask ( mask ); } + inline void Session::invalidate ( Net* net ) { return get("invalidate(Net*)")->_invalidate ( net ); } + inline void Session::invalidate ( AutoContact* autoContact ) { return get("invalidate(AutoContact*)")->_invalidate ( autoContact ); } + inline void Session::invalidate ( AutoSegment* autoSegment ) { return get("invalidate(AutoSegment*)")->_invalidate ( autoSegment ); } + inline void Session::dogLeg ( AutoSegment* autoSegment ) { return get("dogLeg(AutoSegment*)")->_dogLeg ( autoSegment ); } + inline void Session::destroyRequest ( AutoSegment* autoSegment ) { return get("destroyRequest(AutoSegment*)")->_destroyRequest ( autoSegment ); } + + inline void Session::_dogLeg ( AutoSegment* segment ) { _dogLegs.push_back(segment); } + inline void Session::_dogLegReset () { _dogLegs.clear(); } + inline void Session::_setInvalidateMask ( unsigned int mask ) { _invalidateMask |= mask; } + inline void Session::_invalidate ( AutoContact* contact ) { _autoContacts.push_back(contact); } + inline void Session::_invalidate ( AutoSegment* segment ) { _autoSegments.push_back(segment); } + inline void Session::_destroyRequest ( AutoSegment* segment ) { _destroyedSegments.insert(segment); } + inline string Session::_getTypeName () const { return _TName("Session"); } + + inline void Session::_invalidate ( Net* net ) { + ltrace(200) << "Session::invalidate(Net*) - " << net << endl; + _netInvalidateds.insert(net); + _invalidateMask |= NetCanonize; + } + + +} // End of Katabatic namespace. + + +INSPECTOR_P_SUPPORT(Katabatic::Session); + + +#endif // __KATABATIC_SESSION__