diff --git a/kite/CMakeLists.txt b/kite/CMakeLists.txt
new file mode 100644
index 00000000..fcd5deba
--- /dev/null
+++ b/kite/CMakeLists.txt
@@ -0,0 +1,50 @@
+PROJECT(KITE)
+
+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(Boost 1.33.1 COMPONENTS program_options REQUIRED)
+FIND_PACKAGE(Qt4 REQUIRED) # find and setup Qt4 for this project
+FIND_PACKAGE(Boost 1.33.1 REQUIRED)
+FIND_PACKAGE(LEFDEF REQUIRED)
+FIND_PACKAGE(HURRICANE REQUIRED)
+FIND_PACKAGE(CORIOLIS REQUIRED)
+FIND_PACKAGE(KNIK REQUIRED)
+FIND_PACKAGE(KATABATIC REQUIRED)
+
+SET_LIB_LINK_MODE()
+
+IF(CHECK_DATABASE)
+ ADD_DEFINITIONS(-DCHECK_DATABASE)
+ENDIF(CHECK_DATABASE)
+IF(CHECK_DETERMINISM)
+ ADD_DEFINITIONS(-DCHECK_DETERMINISM)
+ENDIF(CHECK_DETERMINISM)
+
+ADD_SUBDIRECTORY(src)
+ADD_SUBDIRECTORY(cmake_modules)
+IF(BUILD_DOC AND DOXYGEN_FOUND)
+ ADD_SUBDIRECTORY(doc)
+ENDIF(BUILD_DOC AND DOXYGEN_FOUND)
diff --git a/kite/cmake_modules/CMakeLists.txt b/kite/cmake_modules/CMakeLists.txt
new file mode 100644
index 00000000..0cb75c1c
--- /dev/null
+++ b/kite/cmake_modules/CMakeLists.txt
@@ -0,0 +1 @@
+install ( FILES FindKITE.cmake DESTINATION /share/cmake_modules )
diff --git a/kite/cmake_modules/FindKITE.cmake b/kite/cmake_modules/FindKITE.cmake
new file mode 100644
index 00000000..7ec9d910
--- /dev/null
+++ b/kite/cmake_modules/FindKITE.cmake
@@ -0,0 +1,47 @@
+# - Find the Kite includes and libraries.
+# The following variables are set if Coriolis is found. If KITE is not
+# found, KITE_FOUND is set to false.
+# KITE_FOUND - True when the Coriolis include directory is found.
+# KITE_INCLUDE_DIR - the path to where the Coriolis include files are.
+# KITE_LIBRARIES - The path to where the Coriolis library files are.
+
+
+SET(KITE_INCLUDE_PATH_DESCRIPTION "directory containing the Kite include files. E.g /usr/local/include/coriolis or /asim/coriolis/include/coriolis")
+
+SET(KITE_DIR_MESSAGE "Set the KITE_INCLUDE_DIR cmake cache entry to the ${KITE_INCLUDE_PATH_DESCRIPTION}")
+
+# don't even bother under WIN32
+IF(UNIX)
+
+ SET(KITE_DIR_SEARCH $ENV{CORIOLIS_TOP} $ENV{HURRICANE_TOP})
+ #
+ # Look for an installation.
+ #
+ FIND_PATH(KITE_INCLUDE_PATH NAMES kite/KiteEngine.h PATHS
+ # Look in other places.
+ ${KITE_DIR_SEARCH}
+ PATH_SUFFIXES include/coriolis
+ # Help the user find it if we cannot.
+ DOC "The ${KITE_INCLUDE_PATH_DESCRIPTION}"
+ )
+
+ FIND_LIBRARY(KITE_LIBRARY_PATH
+ NAMES kite
+ PATHS ${KITE_DIR_SEARCH}
+ PATH_SUFFIXES lib
+ # Help the user find it if we cannot.
+ DOC "The ${KITE_INCLUDE_PATH_DESCRIPTION}"
+ )
+
+ FIND_LIBRARY(KITE_STATIC_LIBRARY_PATH
+ NAMES kite-static
+ PATHS ${KITE_DIR_SEARCH}
+ PATH_SUFFIXES lib
+ # Help the user find it if we cannot.
+ DOC "The ${KITE_INCLUDE_PATH_DESCRIPTION}"
+ )
+
+ SET_LIBRARIES_PATH(KITE KITE)
+ HURRICANE_CHECK_LIBRARIES(KITE)
+
+ENDIF(UNIX)
diff --git a/kite/doc/ASIM-bigfonts.css b/kite/doc/ASIM-bigfonts.css
new file mode 100644
index 00000000..f8ec6823
--- /dev/null
+++ b/kite/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/kite/doc/ASIM.css b/kite/doc/ASIM.css
new file mode 100644
index 00000000..6d92a0c5
--- /dev/null
+++ b/kite/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/kite/doc/CMakeLists.txt b/kite/doc/CMakeLists.txt
new file mode 100644
index 00000000..7d6870ef
--- /dev/null
+++ b/kite/doc/CMakeLists.txt
@@ -0,0 +1,12 @@
+
+ set ( htmlInstallDir /share/doc/en/html/kite )
+ set ( latexInstallDir /share/doc/en/latex/kite )
+
+ add_custom_target ( doc ALL cd ${KITE_SOURCE_DIR}/doc && ${DOXYGEN_EXECUTABLE} doxyfile )
+
+ install ( DIRECTORY html/ DESTINATION ${htmlInstallDir} )
+# install ( FILES customHierarchy.html DESTINATION ${htmlInstallDir} )
+# install ( FILES customSummary.html DESTINATION ${htmlInstallDir} )
+
+ install ( DIRECTORY latex/ DESTINATION ${latexInstallDir} )
+ install ( FILES asimbook.cls DESTINATION ${latexInstallDir} )
diff --git a/kite/doc/Kite.dox b/kite/doc/Kite.dox
new file mode 100644
index 00000000..9e144a1e
--- /dev/null
+++ b/kite/doc/Kite.dox
@@ -0,0 +1,97 @@
+
+ // -*- C++ -*-
+
+
+ namespace Kite {
+
+ /*! \mainpage Detailed Router Documentation
+ *
+ * This documentation adresses two level of explanations :
+ *
+ *
+ * - The \b API description which explains how to use Kite,
+ * thoses parts as flagged as \b API.
+ *
- The internal description which details how Kite 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 Kite for their own purpose (my secret hope).
+ *
+ *
+ *
+ * \defgroup AlgorithmOverview Algorithm Overview (internal)
+ *
+ * The algorithm top-level is implemented in the \c NegociateWindow.
+ *
+ * First step : NegociateWindow::_loadRouting()
+ *
+ * - Load routing wires (\c AutoSegment) from \c KatabaticEngine
+ * inside the Kite \c GCell's. Then update the \c GCell's density.
+ *
- Sort the \c GCell's according to decreasing density (denser
+ * \c GCell's are to be routed first).
+ *
- Agglomerate clusters of contiguous GCell's whose density
+ * is superior to 0.7 to the seed GCell. See \c GCellRoutingSet
+ * for the mechanism.
+ *
+ * GCellRoutingSet receive an increasing order number. The higher
+ * the order the lower the density. This order is transmitted
+ * to the \c TrackSegment of the \c GCellRoutingSet to be taken into
+ * account by the track cost function.
+ *
+ *
+ * Second step : \c NegociateWindow::_runOnGCellRoutingSet()
+ *
+ * For each \c GCellRoutingSet in decreasing density, negociate the
+ * set of associated \c TrackSegment.
+ *
+ * - Build a \c RoutingEventQueue from the list of \c TrackSegment.
+ * The queue is responsible for allocating the \c RoutingEvent
+ * associated to each \c TrackSegment.
+ *
- The queue is sorted according to the "event level" then
+ * to the priority, which is for now the slack of the \c TrackSegment.
+ * That is, constrained \c TrackSegment are routed first.
+ *
- The queue is processed till it's empty (no unprocessed \c RoutingEvent
+ * remains).
+ *
+ * Processing a \c RoutingEvent is trying to insert a \c TrackSegment in
+ * a suitable Track. We proceed as follow :
+ *
+ * - The maximum ripup count for the to be inserted segment has
+ * been reached. Issue a severe warning and left unrouted
+ * this \c TrackSegment (for now).
+ *
- Compute the Tracks in which the \c TrackSegment can be inserted,
+ * then compute the insertion cost in each one. The candidates
+ * are ordered by the insertion cost.
+ *
- Now consider the lower cost \c Track. If there is a free interval
+ * for the \c TrackSegment. Issue a \c Session::addInsertEvent() then
+ * finish.
+ *
+ * If there is a "soft overlap", that is the overlaping
+ * \c TrackSegment already in the \c Track could be shrunk either to
+ * the left or the right so the new \c TrackSegment can be inserted.
+ * This is managed by \c RoutingEvent::_setAside(), for each soft
+ * overlaping \c TrackSegment, gets its perpandiculars and issue
+ * a displacement request for all of them. That is, re-post a
+ * \c RoutingEvent with updated constraints and remove the
+ * perpandicular from it's Track if it has already been routed.
+ * Note that no request is issued for the overlaping \c TrackSegment
+ * itself has it do not change of Track.
+ *
+ * If there is a "hard overlap", that is the two \c TrackSegment
+ * cannot share the same \c Track, remove the previous one from
+ * the \c Track and re-post a \c RoutingEvent. Note that, the
+ * cost object should have selected a \c TrackSegment which could
+ * be ripped-up. Otherwise the \c Track would'nt even be a candidate.
+ *
+ *
+ * When a TrackSegment is riped up, it is re-routed immediately
+ * afterward. This is done by increasing his event level.
+ *
+ */
+
+
+ /*! \namespace Kite
+ * \brief The namespace dedicated to Kite.
+ */
+
+ }
diff --git a/kite/doc/RoutingEvent.dox b/kite/doc/RoutingEvent.dox
new file mode 100644
index 00000000..031e85e6
--- /dev/null
+++ b/kite/doc/RoutingEvent.dox
@@ -0,0 +1,597 @@
+
+ // -*- C++ -*-
+
+
+ namespace Kite {
+
+ /*! \class RoutingEvent
+ * \brief Manage TrackSegment routing requests.
+ *
+ * The \RoutingEvent is the workhorse of Kite. A \RoutingEvent is
+ * associated to one \TrackSegment. One \TrackSegment could be
+ * associated to many \RoutingEvent in the queue, but only one
+ * of those is active (marked as unprocessed).
+ *
+ * \see ClassManipulator.
+ *
+ * \section secProcessAlgorithm Description of the process() method
+ *
+\code
+void RoutingEvent::process ()
+{
+ if ( isProcessed() ) return;
+ setProcessed ();
+ incRipupCount ();
+
+ if ( getRipupCount() > MAX_RIPUP_COUNT ) {
+ // We are *not* in ripup mode.
+ // The event's segment has to be topologically modified.
+ modifyTopology ( _segment );
+ } else {
+ // We are in ripup mode.
+ // Other overlaping segments are to be removeds/pusheds. It can result in
+ // segment breaking *if* other segment came from an already routed GCell.
+
+ // optimal, constraint, perpandicular.
+ computeAllIntervals ();
+
+ // Find & order all candidates Tracks.
+ candidates = computeCostOnCandidateTracks ();
+ sort ( candidates );
+
+ if ( candidates[0].isFree() ) {
+ // Case -A.1- "Free Track".
+ candidate[0].insert ( _segment );
+ } else if ( candidates[0].isSoftOverlap()
+ || candidates[0].isHardOverlap() ) {
+ // Case -A.2- "Soft Overlap".
+ // Case -A.3- "Hard Overlap".
+ for ( size_t i=0 ; i
+ * New \c isLocal() method on \TrackSegment. Tells if the \TrackSegment
+ * is associated only to local AutoSegment.
+ * Increase the overlap cost of a \TrackSegment from an already routed
+ * GCell routing set.
+ *
+ *
+ *
+ * \section secRoutingEventInterval The various intervals of a RoutingEvent
+ *
+ * The three Intervals controlling a RoutingEvent : all those intervals
+ * defines the track range in which the \TrackSegment could be inserted.
+ *
+ * - The optimal interval : where the \Net wirelength will be
+ * minimal (comes from \c Katabatic::AutoSegment).
+ *
- The constraint interval : the interval outside of which
+ * the \Net connexity would be broken. This is the bigger interval
+ * but it must be strictly respected (also comes from
+ * \c Katabatic::AutoSegment).
+ *
- The perpandicular interval : for each perpandicular
+ * \TrackSegment connected, the intersection of the free interval
+ * around them in their track.
+ *
+ * It is important to note that the \TrackSegment overlaping in the
+ * target track is not removed from the track. It is it's perpandiculars
+ * which are, along with a modification of theirs left axis weight and/or
+ * right axis weight.
+ *
+ * Second remark: no overlap will be created (due to the non-removal of
+ * overlaping \TrackSegments) because the insertion is delayed in case
+ * of overlap.
+ *
+ * The perpandicular interval comes from perpandicular constraints on \TrackSegment
+ * of the same \c Net. The left/right axis weights comes from requests of
+ * other \c Nets.
+ *
+ * \image html RoutingEvent-1.png "RoutingEvent Intervals"
+ * \image latex RoutingEvent-1.pdf "RoutingEvent Intervals" width=0.6\textwidth
+ *
+ * Example of perpandicular interval computation :
+ *
+ * \image html RoutingEvent-2.png "Perpandicular Interval"
+ * \image latex RoutingEvent-2.pdf "Perpandicular Interval"
+ *
+ *
+ * \section secRoutingEventRules Rules governing RoutingEvents
+ *
+ * \RoutingEvent respect the following rules:
+ *
+ * - A \TrackSegment can only be displaced by it's associated \RoutingEvent.
+ *
- Corollary: the only \TrackSegment displaced while processing a
+ * \RoutingEvent is the one associated to the event.
+ *
- Conflicts occurs between the \RoutingEvent \TrackSegment and already
+ * placed others \TrackSegment.
+ *
+ * The conflict can be solved by displacing/modifying others
+ * \TrackSegment or by modifying the to be inserted one. In the later
+ * case, the newly created or modified \TrackSegment are (re)scheduleds
+ * before the would be inserted.
+ *
- Conflicting \TrackSegments are only removed from their \Track
+ * but their axis remains unchanged. Movement requests are passed
+ * through increase of the left/right axis weights, if needed.
+ *
- \TrackSegment are inserted only, and only if there is enough free space.
+ * That is, if any kind of overlap occurs, it is not inserted
+ * but rescheduled. The blocking \TrackSegments are then
+ * rescheduled after the current one.
+ *
- Each \RoutingEvent processing takes place inside a one atomic
+ * Session. That is, the coherency of the data-base is restored
+ * immediatly afterward (both Kite & Katabatic).
+ *
+ *
+ * \remark Be very careful to distinguish between Session commands, which affects
+ * \Track and \TrackSegment insertion/update/removal and schedule/re-schedule
+ * events, which relates to the negociation algorithm.
+ *
+ * Re-ordering rules:
+ *
+ * - In normal mode, that is, no maximum ripup has been reached, the
+ * blocking other \TrackSegment are removed and the current
+ * is rescheduled before them.
+ *
- In maximum ripup mode, some \TrackSegment has to give way.
+ *
+ * - If the current one is modified, it must be rescheduled after
+ * it's modified bits are rescheduleds.
+ *
- If others are modifieds they must be rescheduled after
+ * the current one (so it will grabs the place).
+ *
+ *
+ *
+ *
+ * \section secRoutingEventCycle RoutingEvent life cycle
+ *
+ * As an active \RoutingEvent is associated with one and only one \TrackSegment
+ * we can talk indeferently of \RoutingEvent lifecycle or \TrackSegment
+ * lifecycle.
+ *
+ * Below is the ordered list of states that a \RoutingEvent could be in.
+ * The order correspond to increasing level of slackening/freedom.
+ * Transition between states occurs each time a maximum ripup is reached.
+ *
+ *
+ *
+ * \b Id |
+ * \b Type |
+ * \b Local |
+ * \b Global |
+ * \b Action |
+ *
+ *
+ * \e 1 |
+ * \c Minimize |
+ * \e yes |
+ * \e no |
+ * try to fit into a hole |
+ *
+ *
+ * \e 2 |
+ * \c DogLeg |
+ * \e yes |
+ * \e no |
+ * Dogleg : analyse overlap and try to solve it by breaking (self) |
+ *
+ *
+ * \e 3 |
+ * \c Desalignate |
+ * \e yes |
+ * \e yes |
+ * on a set of alignated \TrackSegment, suppress the
+ * alignment constraints, thus making then independants
+ * |
+ *
+ *
+ * \e 4 |
+ * \c Slacken |
+ * \e yes |
+ * \e yes |
+ * if the target/source constraint is less than the
+ * GCell, adds perpandicular straps to free the \TrackSegment.
+ * This occurs to free from terminal constraints
+ * |
+ *
+ *
+ * \e 5 |
+ * \c ConflictSolve1 |
+ * \e yes |
+ * \e yes |
+ * try to find in the history a reccurent dislodger,
+ * and break (self) to accomodate it
+ * |
+ *
+ *
+ * \e 6 |
+ * \c ConflictSolve2 |
+ * \e no |
+ * \e yes |
+ * try to find a Track on which we can dislodge
+ * an other \TrackSegment
+ * |
+ *
+ *
+ * \e 7 |
+ * \c MoveUp |
+ * \e no |
+ * \e yes |
+ * try to go on upper layer.
+ * |
+ *
+ *
+ * \e 8 |
+ * \c Unimplemented |
+ * \e no |
+ * \e yes |
+ * we failed to place this \TrackSegment
+ * |
+ *
+ *
+ *
+ *
+ * \section secManageMaximumRipup Managing the maximum ripup case
+ *
+\code
+bool State::manageMaximumRipup ()
+{
+ bool success = false;
+
+ if ( !_segment->isGlobal() ) {
+ // Candidates Tracks (ignore optimal & perpandiculars).
+ candidates = computeAllIntervals ();
+ overlap = _segment->getInterval();
+
+ for ( size_t i=0 ; i reject.
+ // Local vs. Terminal => reject.
+ if ( others[0]->isLocal() || others[0]->isTerminal() ) continue;
+
+ // Local vs. Global (not routed yet).
+ if ( others[i]->getOrder() >= _segment->getOrder() ) {
+ success = modifyTopology(others[0]);
+ break;
+ }
+
+ // Local vs. Global (already routed).
+ success = relax(_others[0],overlap);
+ if ( success ) break;
+ }
+ }
+ }
+
+ if ( !success ) {
+ // Global vs. Local.
+ // Failed Local vs. Any.
+ success = modifyTopology(_segment);
+ }
+ return success;
+}
+\endcode
+ *
+ *
+ * \section secModifyTopology Description of the modifyTopology() method
+ *
+\code
+bool Manipulator::modifyTopology ( TrackSegment* segment )
+{
+ bool success = false;
+
+ if ( segment->isLocal() ) {
+ if ( segment->canMinimize() {
+ segment->minimize();
+ success = true;
+ }
+ if ( segment->canDogLeg() ) {
+ // Case -C.4- "Self Relax".
+ segment->makeDogLeg();
+ success = true;
+ }
+ } else if ( segment->canDesalignate() ) {
+ // Case -C.5- "Desalignate".
+ segment->desalignate();
+ success = true;
+ } else if ( segment->canSlacken() ) {
+ // Case -C.6- "Slacken".
+ segment->slacken();
+ success = true;
+ } else {
+ RipupHistory* history = RipupHistory(segment);
+ GCell* dogLegGCell = history.getDogLegGCell();
+
+ if ( dogLegGCell ) {
+ if ( segment->canDogLegAt(dogLegGCell) ) {
+ segment->makeDogLeg(dogLegGCell)
+ success = true;
+ }
+ } else {
+ // Dislodgers seems to far in ripup history.
+ // Recheck the Track, maybe they have vanish.
+ Track* track = getTrack(segment);
+ if ( track->getFreeInterval(segment) ) {
+ track.insert ( segment );
+ success = true;
+ }
+ }
+ }
+
+ if ( segment->canMoveUp() ) {
+ segment->moveUp ();
+ success = true;
+ }
+
+ if ( success ) {
+ resetRipupCount(segment);
+ } else {
+ cerr << "[UNIMPLEMENTED] " << segment << endl;
+ }
+
+ return success;
+}
+\endcode
+ *
+ *
+ * \section secHardSoftOverlap Hard and soft overlap
+ *
+ * Schematic execution of a \RoutingEvent leading to a set aside.
+ *
+ * - The scheduler try to place the \TrackSegment on top of the
+ * event queue, calling process().
+ *
- There is a soft overlap on the best candidate track, a set
+ * aside is issued.
+ *
- Each \TrackSegment in conflict in the candidate track has the
+ * \RoutingEvent bounds of it's perpandicular \TrackSegment modificated
+ * according to the free space requested through setLeftBound() or setRightBound().
+ *
- If a perpandicular is already in a \Track is removed from it and scheduled for
+ * immediate re-routing (it's event level is increased so it pops
+ * out immediately from the queue).
+ *
- If the perpandicular is not routed yet, we are done.
+ *
+ * Note that this technique of modificating a \RoutingEvent yet to come is
+ * kind a like seeing the future...
+ *
+ *
+ * \image html RoutingEvent-3.png "Set aside schematic"
+ * \image latex RoutingEvent-3.pdf "Set aside schematic"
+ *
+ *
+ * \section setDetructionStrategy Destruction Strategy
+ *
+ * \RoutingEvent are not destroyed as soon as they have been processed by
+ * the scheduler. Instead, they are stored in the historical queue.
+ * They are two reasons for that behavior :
+ *
+ * - \RoutingEvent are used to store algorithmic informations that
+ * must persist until the negociation algorithm have fully
+ * completed (bound interval in particular).
+ *
- When ripup phases takes place and maximum ripup count is
+ * reached, the history can be used to find the whole set of
+ * \TrackSegment in conflict an made an educated guess about
+ * which one must be relaxed.
+ *
+ *
+ * \important This is the history queue which is responsible for freeing all the
+ * \RoutingEvent in his destructor.
+ *
+ *
+ * \section secRoutingEventCase Routing Event actions
+ *
+ *
+ * - Free Track Case
+ *
+ * There is a sufficent free space in the candidate \Track to insert the
+ * \TrackSegment. The \TrackSegment is inserted.
+ *
+ * \important This is the only way for a \TrackSegment to be inserted into a \Track.
+ *
+ * \image html RoutingEvent-10.png
+ * \image latex RoutingEvent-10.pdf
+ *
+ *
+ *
- Soft Overlap Case
+ *
+ * Already inserted \TrackSegment a & b could be shrunk
+ * to make place for \TrackSegment c. Parallel overlaping \TrackSegment
+ * are not removed, their perpandiculars are with updated left/right axis weight.
+ *
+ * The a perpandicular belongs the same GCell routing set so it
+ * is removed from is \Track to be displaced.
+ *
+ * The b perdandicular belongs to a more prioritary GCell routing
+ * set, which has therefore be placed earlier so it can't be removed.
+ * Instead it is broken.
+ *
+ * \image html RoutingEvent-11.png
+ * \image latex RoutingEvent-11.pdf
+ *
+ *
+ *
- Hard Overlap Case
+ *
+ * No way to shrunk overlaping \TrackSegment to make place for c.
+ * All parallel overlaping \TrackSegments must be removeds to be displaced
+ * on other \Tracks.
+ *
+ * The a parallel belongs to a more prioritary GCell routing set
+ * so it can be removed, it is therefore broken.
+ *
+ * The b parallel belongs the same GCell routing set so it can be
+ * removed to be displaced.
+ *
+ * \image html RoutingEvent-12.png
+ * \image latex RoutingEvent-12.pdf
+ *
+ *
+ *
- Self Relax
+ *
+ * Instead of trying to displace overlaping \TrackSegments we break the
+ * current one.
+ *
+ * \image html RoutingEvent-13.png
+ * \image latex RoutingEvent-13.pdf
+ *
+ *
+ *
- Self Desalignate
+ *
+ * Instead of trying to displace overlaping \TrackSegments we desalignate
+ * it's components (by supressing alignement constraints on it's
+ * AutoContacts). We do not create new Katabatic components but new
+ * \TrackSegments will appears.
+ *
+ * \image html RoutingEvent-14.png
+ * \image latex RoutingEvent-14.pdf
+ *
+ *
+ *
- Self Slacken
+ *
+ * Instead of trying to displace overlaping \TrackSegments we slacken
+ * the current one. This is different than desalignate because we create
+ * new Katabatic component to relax any AutoContact transmitted constraints.
+ * This operation is most likely to be applied on \TrackSegments that are
+ * directly connecteds to terminals.
+ *
+ * \image html RoutingEvent-15.png
+ * \image latex RoutingEvent-15.pdf
+ *
+ *
+ */
+
+ /*! \function bool RoutingEvent::isProcessed () const;
+ * \return \true if this event has already been processed.
+ *
+ * \remark Note that inside a _setAside() a \RoutingEvent can be re-posted for
+ * a given \TrackSegment which has been processed yet. This can lead
+ * to two or more \RoutingEvent in the queue (as we cannot easily remove
+ * a \RoutingEvent already in the queue). We need this new \RoutingEvent
+ * because we want to reschedule with a new priority/slack.
+ * As we cannot remove the previous \RoutingEvent, we mark it as
+ * processed for it to be ignored by the scheduler.
+ */
+
+ /*! \function TrackSegment* RoutingEvent::getSegment () const;
+ * \Return The associated and unique \TrackSegment.
+ */
+
+ /*! \function unsigned long RoutingEvent::getPriority () const;
+ * \Return The second criterion used to sort \RoutingEvents in the negociation queue.
+ * Currently, it is the area of the associated \TrackSegment, which in
+ * turn return the slack (not a very fortunate choice of name...).
+ */
+
+ /*! \function unsigned int RoutingEvent::getEventLevel () const;
+ * \Return The first criterion used to sort \RoutingEvents in the negociation queue.
+ * It is used to re-schedule a \RoutingEvent and make the new event be
+ * processed before the original one, which is marked as
+ * processed to be ignored.
+ *
+ * \see setEventLevel().
+ */
+
+ /*! \function RoutingEvent* RoutingEvent::getClone () const;
+ * \Return An exact copy of the current \RoutingEvent.
+ */
+
+ /*! \function RoutingEvent* RoutingEvent::reschedule ( RoutingEventQueue& queue );
+ * \param queue The \RoutingEvent queue.
+ * \return The rescheduled \RoutingEvent. May be \NULL if it cannot be rescheduled.
+ */
+
+ /*! \function void RoutingEvent::setProcessed ( bool state=true );
+ * \param state The state into which the event is to be put.
+ *
+ * Mark the event as processed. This arises in two cases :
+ *
+ * - The event has really been processed by the process() member
+ * function.
+ *
- There has been a fork from this event and it has been
+ * superseded by a newly rescheduled one, so we have to
+ * invalidate this one.
+ *
+ */
+
+ /*! \function void RoutingEvent::setEventLevel ( unsigned int level );
+ * \param level The new event level.
+ *
+ * \see getEventLevel().
+ */
+
+ /*! \function void RoutingEvent::process ( RoutingEventQueue& queue, RoutingEventHistory& history );
+ * \param queue The event queue from the negociate algorithm.
+ * \param history The event history.
+ *
+ * Perform all the operations shared by all \RoutingEvent classes then
+ * calls the virtual _subProcess() functions.
+ *
+ * Shared operations are :
+ *
+ * - Invalidating all perpandicular \TrackSegments.
+ *
- Computing the free interval allowed by the free intervals
+ * in perpandicular \Tracks holding the perpandicular \TrackSegments.
+ *
- Merging in the various constraints intervals : from the
+ * \TrackSegment itself, from the free intervals in the
+ * perpandicular \Tracks and from the \RoutingEvent bound
+ * constraints.
+ *
- Finding the candidate \Tracks for the \RoutingEvent,
+ * using \c Track_Spiral \Collection.
+ *
+ * The results of the shared operation are passed to derived classes
+ * trough the \c State internal structure.
+ */
+
+ /* \function bool RoutingEvent::_setAside ( Track* track, size_t begin, size_t end, Net* net, Interval interval, RoutingEventQueue& queue );
+ * \param track The track in wich to make free space.
+ * \param begin The index of the first overlaping TrackSegment.
+ * \param end The index of the last overlaping TrackSegment.
+ * \param net The net for which we want to insert a TrackSegment.
+ * \param interval The interval which must be made empty.
+ * \param queue The queue of RoutingEvent.
+ *
+ * Manage the case of soft overlap. Create or enlarge a free space
+ * in \c track so it can contain the requested \interval. [begin:end]
defines
+ * the range of indexes of overlaping \TrackSegment in \c track.
+ * Displace TrackSegment that are perpandicular to those overlaping,
+ * remove them from their \c Track if needed and issue an associated \RoutingEvent
+ * with an updated bound constraint. Note that the overlaping \TrackSegment
+ * themselves are not removed from the \c track.
+ *
+ * A note on implementation :
+ *
+ * - \c data1 : the DataNegociate of the to be inserted \TrackSegment.
+ *
- \c segment2 : the current overlaping \TrackSegment (from \c begin
+ * to \c end).
+ *
- \c data2 : the DataNegociate of the overlaping \TrackSegment.
+ *
- \c segment3 : a \TrackSegment perpandicular to \c segment2.
+ *
+ */
+
+ /* \function void RoutingEvent::_ripup ( Track* track, Net* net, Interval interval, size_t begin, size_t end, RoutingEventQueue& queue );
+ * \param track The track in wich to make free space.
+ * \param net The net for which we want to insert a TrackSegment.
+ * \param interval The interval which must be made empty.
+ * \param begin The index of the first overlaping TrackSegment.
+ * \param end The index of the last overlaping TrackSegment.
+ * \param queue The queue of RoutingEvent.
+ *
+ * Manage the case of hard overlap, that is bluntly remove
+ * any \TrackSegment overlaping \interval. Issue both a remove event
+ * (to \c Session) and a \RoutingEvent to re-process the dislodged
+ * \TrackSegment.
+ */
+
+ } // End of Kite namespace.
diff --git a/kite/doc/Session.dox b/kite/doc/Session.dox
new file mode 100644
index 00000000..45ca9041
--- /dev/null
+++ b/kite/doc/Session.dox
@@ -0,0 +1,133 @@
+
+ // -*- C++ -*-
+
+
+ namespace Kite {
+
+ /*! \class Session
+ * \brief Kite update Session (\b API).
+ *
+ * Session extend the Katabatic update session to the Kite
+ * router level. Mainly by managing Track update.
+ *
+ * For details on how Katabatic Sessions works, have a look to
+ * \ref katabaticSession.
+ *
+ *
+ * \section secSessionMechanism The Session Mechanism.
+ *
+ * Delayed modification procedure :
+ *
+ * - Modifications events are recorded into the Session.
+ * At this step, no modification are actually done, the
+ * data-base retains it's previous state and coherency.
+ *
- The Revalidate() procedure is called (or the Session
+ * is closed), then all the modification events are applied.
+ * the data-base is in it's new state.
+ *
+ *
+ *
+ * \section secKiteSessionRevalidate The Revalidate Algorithm.
+ *
+ * Revalidation steps :
+ *
+ * - process all remove events. detach TrackSegment from
+ * their Track, but do not remove the pointer from the
+ * internal \vector.
+ *
- Pack all Track in which removal have took place.
+ *
- process all insert events. This is the time TrackSegment
+ * are moved into their new Track (physical displacement).
+ *
- Call the Katabatic::Session::revalidate() method.
+ *
- Recompute the canonical position of source and target
+ * of all invalidateds TrackSegment (take account of
+ * extention modifications).
+ *
- Perform a sort() on all Track that have been modifieds.
+ *
+ */
+
+
+ /*! \name Accessors
+ */
+ // \{
+
+ /*! \function static Session* Session::get ();
+ * \Return The currently opened session, \c NULL if no session has
+ * been opened.
+ */
+
+ /*! \function static KiteEngine* Session::getKiteEngine ();
+ * \Return The Kite ToolEngine associated to the current update
+ * session.
+ */
+
+ // \}
+
+
+ /*! \name Miscellaneous
+ */
+ // \{
+
+ /*! \function bool Session::isEmpty ();
+ * Ensure that the Session is empty and can be closed (deleted)
+ * safely.
+ */
+
+ /*! \function static Session* Session::open ( KiteEngine* kite );
+ * \param kite A Kite ToolEngine on which to work.
+ * \return A new Kite update Session.
+ *
+ * Open a new Kite update Session on the \c kite \c ToolEngine.
+ * At this point only one session can be opened at a time. Attempt
+ * to open a second one will result in an exception.
+ */
+
+ // \}
+
+
+ /*! \name Event Scheduling
+ */
+ // \{
+
+ /* \function void Session::addInvalidated ( TrackSegment* segment );
+ * \param segment An AutoSegment that has been moved.
+ *
+ * add \e segment to the \vector of TrackSegment for which we
+ * have to recompute the canonical size (i.e. extentions may
+ * have moved).
+ */
+
+ /*! \function void Session::addInsertEvent ( TrackSegment* segment, Track* track );
+ * \param segment An AutoSegment to insert in a Track.
+ * \param track The Track into which the \e segment will be inserted.
+ *
+ * Schedule the insertion of \e segment into Track \e track.
+ * The \e segment must not already be part of a Track.
+ */
+
+ /*! \function void Session::addRemoveEvent ( TrackSegment* segment );
+ * \param segment An AutoSegment to remove from a Track.
+ *
+ * Schedule the removal of \e segment from Track \e track.
+ */
+
+ /*! \function void Session::addMoveEvent ( TrackSegment* segment, Track* track );
+ * \param segment An AutoSegment to move into a new Track.
+ * \param track The Track into which the \e segment will be moved.
+ *
+ * Schedule the displacement of \e segment into Track \e track.
+ */
+
+ /*! \function void Session::addSortEvent ( Track* track, bool forced=false );
+ * \param track The Track to update.
+ * \param forced Force the invalidation of the \Track.
+ *
+ * Schedule the update of Track \e track. If the \Track has not been
+ * invalidated, no actual sort will takes place. To force a sort
+ * (manually invalidating the \Track), sets \b forced to \true.
+ *
+ * \see Track::pack() & Track::sort().
+ */
+
+ // \}
+
+ }
diff --git a/kite/doc/Track.dox b/kite/doc/Track.dox
new file mode 100644
index 00000000..3422d6ee
--- /dev/null
+++ b/kite/doc/Track.dox
@@ -0,0 +1,397 @@
+
+ // -*- C++ -*-
+
+
+ namespace Kite {
+
+ /*! \class Track
+ * \brief Structure managing one routing track.
+ *
+ * \section secTrackImplementation Track Implementation
+ *
+ * Basically a Track is a sorted vector of TrackSegment, TrackSegment
+ * beeing a decoration of the Katabatic::AutoSegment. Managment rules :
+ *
+ * - Rule 1 : the vector of TrackSegment is sorted by
+ * increasing source positions.
+ *
- Rule 2 : two consecutives segments TrackSegment do
+ * not overlap, except in case of rule 3.
+ *
- Rule 3 : if they belongs to the same \Net, two
+ * consecutive segments can overlap, see Track::getNetUsedInterval().
+ *
+ *
+ * \image html Track-1.png "Track Structure"
+ * \image latex Track-1.pdf "Track Structure" width=0.7\textwidth
+ *
+ *
+ * updates procedures
+ *
+ * Kite extend the Katabatic::Session mechanism to manage Track
+ * modifications.
+ *
+ * Indexes vs. Iterators
+ *
+ * Numerical indexes have been prefered over iterators because they can
+ * be used more easily by objects other the Track itself for referencing.
+ * So internal managment follow the same rule, handling indexes or
+ * reference to indexes.
+ *
+ * Looking up free/used zones
+ *
+ * The most important operation performed on a Track is to locate
+ * free or used zones at a given point. We uses the \STL \lower_bound
+ * function to find the index in the vector from a position.
+ * It relies heavily on the hypothesis that consecutives TrackSegment
+ * do not overlap, however, as segments from a same net can overlap
+ * the \c max() function is more complex than the \c min(). In fact
+ * it has to aggregate all the overlaping TrackSegment from the
+ * same \Net (getUsedNetInterval()).
+ *
+ * \image html Track-2.png "Track Zones - First Approach"
+ * \image latex Track-2.pdf "Track Zones - First Approach" width=0.7\textwidth
+ *
+ * As can be seen on the previous figure it is slightly more
+ * efficient to work on \c lower_bound-1 instead of \c lower_bound.
+ *
+ * \image html Track-3.png "Track Zones - Optimized"
+ * \image latex Track-3.pdf "Track Zones - Optimized" width=0.7\textwidth
+ */
+
+ /*! \enum Track::IndexState
+ * Indicates how to compute the bounds of the interval enclosing
+ * a given position.
+ *
+ * \note According to \e position, the interval can be a free interval
+ * or a used interval.
+ */
+
+ /*! \var Track::MinTrackMin
+ * Minimum/Source : uses the Track minimum.
+ */
+
+ /*! \var Track::MinSegmentMin
+ * Minimum/Source : uses the begin segment minimum (source).
+ */
+
+ /*! \var Track::MinSegmentMax
+ * Minimum/Source : uses the begin segment maximum (target).
+ */
+
+ /*! \var Track::MaxTrackMax
+ * Maximum/Target : uses the Track maximum.
+ */
+
+ /*! \var Track::MaxSegmentMin
+ * Maximum/Target : uses the end segment minimum (source).
+ */
+
+ /*! \var Track::MaxNextSegmentMin
+ * Maximum/Target : uses the next to end segment minimum (source).
+ */
+
+ /*! \var Track::MaxSegmentMax
+ * Maximum/Target : uses the end segment maximum (target).
+ */
+
+ /*! \var Track::BeforeFirst
+ * Interval type : free, before the first interval [case (1)].
+ */
+
+ /*! \var Track::Inside
+ * Interval type : used, in the Track [case (2)].
+ */
+
+ /*! \var Track::Outside
+ * Interval type : free, between two used TrackSegment [case (3)].
+ */
+
+ /*! \var Track::AfterLast
+ * Interval type : free, after the last used TrackSegment [case (4)].
+ */
+
+ /*! \var Track::EmptyTrack
+ * Interval type : free, and the Track is empty [case (5)].
+ */
+
+ /*! \var Track::MinMask
+ * Mask value : used to reset all the minimal values.
+ */
+
+ /*! \var Track::MaxMask
+ * Mask value : used to reset all the maximal values.
+ */
+
+ /*! \var Track::NPOS;
+ * A special index value (greatest integer) meaning that
+ * an index is invalid.
+ */
+
+
+ /*! \name Accessors
+ */
+ // \{
+
+ /*! \function RoutingPlane* Track::getRoutingPlane () const;
+ * \Return The RoutingPlane owning this Track.
+ */
+
+ /*! \function KiteEngine* Track::getKiteEngine () const;
+ * \Return The KiteEngine owning this Track.
+ */
+
+ /*! \function RoutingPlane* Track::getIndex () const;
+ * \Return The index of this Track in the RoutingPlane Track vector.
+ */
+
+ /*! \function Layer* Track::getLayer () const;
+ * \Return The \Layer of the Track.
+ */
+
+ /*! \function DbU::Unit Track::getAxis () const;
+ * \Return The Axis of the Track.
+ */
+
+ /*! \function DbU::Unit Track::getMin () const;
+ * \Return The minimal allowed coordinate of the Track.
+ */
+
+ /*! \function DbU::Unit Track::getMax () const;
+ * \Return The maximal allowed coordinate of the Track.
+ */
+
+ /*! \function Track* Track::getNext () const;
+ * \Return The next Ttrack in the \RoutingPlane vector. That is the
+ * one with the axis immediatly superior.
+ */
+
+ /*! \function Track* Track::getPrevious () const;
+ * \Return The previous Track in the \RoutingPlane vector. That is the
+ * one with the axis immediatly inferior.
+ */
+
+ /*! \function size_t Track::getSize () const;
+ * \Return The total number of TrackSegment in the Track.
+ */
+
+ /*! \function Point Track::getPosition ( DbU::Unit position ) const;
+ * \Return the point at \c (position,getAxis()) for horizontal Track
+ * at or \c (getAxis(),position) for vertical Track.
+ */
+
+ // \}
+
+
+ /*! \name TrackSegment Accessors
+ */
+ // \{
+
+ /*! \function TrackSegment* Track::getNext ( size_t& index, Net* net ) const;
+ * \param index Index of the starting TrackSegment.
+ * \param net A \Net to ignore.
+ * \return The next TrackSegment (\NULL if not found).
+ *
+ * find, starting from TrackSegment at \e index the next TrackSegment
+ * ignoring TrackSegment from \e net. \e index is modified to point
+ * on the returned TrackSegment. If there's no next TrackSegment (\NULL)
+ * then index is set to Track::NPOS.
+ */
+
+ /*! \function TrackSegment* Track::getPrevious ( size_t& index, Net* net ) const;
+ * \param index Index of the starting TrackSegment.
+ * \param net A \Net to ignore.
+ * \return The previous TrackSegment (\NULL if not found).
+ *
+ * find, starting from TrackSegment at \e index the previous TrackSegment
+ * ignoring TrackSegment from \e net. \e index is modified to point
+ * on the returned TrackSegment. If there's no previous TrackSegment (\NULL)
+ * then index is set to Track::NPOS.
+ */
+
+ /*! \function TrackSegment* Track::getNextFixed ( size_t& index ) const;
+ * \param index Index of the starting TrackSegment.
+ * \return The first previous \e Fixed TrackSegment.
+ *
+ * find, starting from TrackSegment at \e index the first previous
+ * with a \e Fixed attribute set. \e index is modified to point on the
+ * returned TrackSegment. If there's no previous TrackSegment (\NULL)
+ * then index is set to Track::NPOS.
+ */
+
+ /*! \function TrackSegment* Track::getSegment ( size_t index ) const;
+ * \param index The index of the TrackSegment.
+ * \return The TrackSegment at \e index. The result will be \NULL in the
+ * follwing cases :
+ *
+ * - \e index is outside the sorted zone.
+ *
- \e index points to a hole in the Track.
+ *
- \e index is equal to Track::NPOS.
+ *
+ */
+
+ /*! \function TrackSegment* Track::getSegment ( DbU::Unit position ) const;
+ * \param position The position where to search.
+ * \return The TrackSegment whose starting point is immediatly inferior to \e position.
+ */
+
+ /*! \function size_t Track::find ( const TrackSegment* segment ) const;
+ * \Return the \e index of \e segment inside the Track. If the \e segment do
+ * not belongs to the Track, return Track::NPOS.
+ */
+
+ /*! \function void Track::getIBounds ( DbU::Unit position, size_t& begin, size_t& end, unsigned int& state ) const;
+ * \param position The position where to search.
+ * \param begin Index of the starting bound.
+ * \param end Index of the ending bound.
+ * \param state how to use the returned \e indexes.
+ * \return The TrackSegment index around \e position.
+ *
+ * The relation between the returned \e index and the position is
+ * given through the \e state parameter.
+ *
+ * \note It uses the \lower_bound \STL function.
+ */
+
+ /*! \function DbU::Unit Track::getSourcePosition ( size_t index ) const;
+ * \Return The canonical source position of TrackSegment at index \e index.
+ * If \e index is equal to Track::NPOS, returns zero.
+ */
+
+ /*! \function DbU::Unit Track::getSourcePosition ( vector::iterator it ) const;
+ * \Return The canonical source position of TrackSegment pointed by iterator \e it.
+ * If \e it is equal to \c end() , returns zero.
+ */
+
+ /*! \function DbU::Unit Track::getMinimalPosition ( size_t index, unsigned int state ) const;
+ * \Return The minmal position (lower bound) of an interval, starting near index \e index
+ * with state \e state.
+ *
+ * \see Track::IndexState.
+ */
+
+ /*! \function DbU::Unit Track::getMaximalPosition ( size_t index, unsigned int state ) const;
+ * \Return The maximal position (upper bound) of an interval, ending near index \e index
+ * with state \e state.
+ *
+ * \see Track::IndexState.
+ */
+
+ /*! \function Interval Track::getFreeInterval ( DbU::Unit position, Net* net ) const;
+ * \param position where fo find a free interval.
+ * \param net for which net to find the free interval.
+ * \return The longuest free interval enclosing \e position (may be empty).
+ */
+
+ /*! \function Interval Track::expandUsedInterval ( size_t& begin, size_t& end ) const;
+ * \param begin index on any of the overlaping TrackSegment. This value
+ * is then modified to point on the lower TrackSegment of the set.
+ * \param end initial value is ignored. sets to the index of the rightmost
+ * extended TrackSegment of the set (i.e. the one setting the
+ * upper bound).
+ * \return the whole interval used by a set of overlaping TrackSegment.
+ *
+ * \image html Track-4.png "Overlap - Example 1"
+ * \image html Track-5.png "Overlap - Example 2"
+ * \image latex Track-4.pdf "Overlap - Example 1" width=0.7\textwidth
+ * \image latex Track-5.pdf "Overlap - Example 2" width=0.7\textwidth
+ */
+
+ /*! \function Interval Track::expandFreeInterval ( size_t& begin, size_t& end, unsigned int state, Net* net ) const;
+ * \param begin the lowest used TrackSegment.
+ * \param end the highest used TrackSegment.
+ * \param state the enclosing characterics.
+ * \param net the for wich we seek place.
+ * \Return The longuest free interval between \c ]begin,end[ .
+ *
+ * \note \c ]begin,end[ must define a free interval between two TrackSegment.
+ */
+
+ /*! \function void Track::_check ( const char* message=NULL ) const;
+ * \param message An iformative message, only printed if an error occurs.
+ * \return \true if the Track contains no incoherencies.
+ *
+ * Perform a complete Track check. Looks for the following incoherencies :
+ *
+ * - TrackSegment do not refers this Track.
+ *
- TrackSegment is detached (TrackSegment::getTrack() is \NULL).
+ *
- TrackSegment is hollow, this one is very unlikely as hollow
+ * TrackSegment are only created for the \lower_bound.
+ *
- \NULL pointers (should never occurs, nevertheless...)
+ *
- And finally, call checkOverlap().
+ *
+ */
+
+ /*! \function void Track::checkOverlap () const;
+ * \return the number of overlaping TrackSegment.
+ *
+ * Perform the following checks :
+ *
+ * - Two consecutive TrackSegment from different \Net must not
+ * overlap.
+ *
- For TrackSegment starting from the same position, the
+ * longuest must be first.
+ *
+ */
+
+ /*! \function void Track::getOverlapBounds ( Interval interval, size_t& begin, size_t& end ) const;
+ * \param interval the overlaping interval.
+ * \param begin where to store the starting bound.
+ * \param end where to store the ending bound.
+ *
+ * find the range of TrackSegment intersecting \e interval.
+ * Note that when the \e interval lower bound crosses a set of
+ * overlaping intervals from the same \Net, the interval at
+ * \e begin will crosses the lower bound but some following
+ * of the same \Net may not.
+ */
+
+ /*! \function DbU::Unit Track::getOverlapCost ( Interval interval, Net* net, size_t begin, size_t end ) const;
+ * \param interval the overlaping interval.
+ * \param net a Net to ignore (null cost).
+ * \param begin the starting bound.
+ * \param end the ending bound.
+ * \return The cost of the overlap.
+ *
+ * compute the cost of the overlap of \e interval with the range
+ * \c [begin,end] of TrackSegment. Any TrackSegment belonging to
+ * \e net will be ignored.
+ */
+
+ /*! \function DbU::Unit Track::getOverlapCost ( Interval interval, Net* net ) const;
+ * \param interval the overlaping interval.
+ * \param net a Net to ignore (null cost).
+ *
+ * compute the overlap of \e interval with TrackSegment from
+ * the current Track, ignoring thoses belonging to \e net.
+ */
+
+ // \}
+
+
+ /*! \name Updators
+ */
+ // \{
+
+ /*! \function void Track::insert ( TrackSegment* segment );
+ * adds \e segment to the Track. Must only be used inside a
+ * TrackSession.
+ *
+ * \see TrackSession.
+ */
+
+ /*! \function size_t Track::pack ();
+ * \Return The number of removeds TrackSegment.
+ *
+ * Suppress all the TrackSegment that have been withdraw from the
+ * Track. TrackSegment must be withdraw trough the TrackSegment::detach()
+ * method which sets their owning Track to \NULL (the removal criterion).
+ */
+
+ /*! \function void Track::sort ();
+ *
+ * sort the the vector. Must be called \e after the Pack() method,
+ * so no detached TrackSegment are presents.
+ */
+
+ // \}
+
+ }
diff --git a/kite/doc/TrackCost.dox b/kite/doc/TrackCost.dox
new file mode 100644
index 00000000..4d56a32f
--- /dev/null
+++ b/kite/doc/TrackCost.dox
@@ -0,0 +1,130 @@
+
+ // -*- C++ -*-
+
+
+ namespace Kite {
+
+ /*! \class TrackCost
+ * \brief Insertion cost of a \TrackSegment in a \Track.
+ *
+ *
+ * The \TrackCost is not computed by itself. It has to be build by
+ * whoever has created it. For example Track::getOverlapCost().
+ *
+ *
+ * \section secTrackCostOrdering Sorting Track costs
+ *
+ * The \TrackCost is composed of the following criterions :
+ *
+ * - boolean \c _infinite : infinite.
+ *
- count \c _terminals : number of terminals.
+ *
- length \c _delta : overlap between requested interval and
+ * \TrackSegment of the \Track.
+ *
- length \c _deltaPerpand : length of perpandicular wiring needed to
+ * connect to this \Track.
+ *
+ * Criterions are listed above in decreasing lexicographical weigh order.
+ *
+ * There is also special partial ordering functor : TrackCost::CompareByDelta.
+ */
+
+ /*! \function TrackCost::TrackCost ( Track* track, const Interval& interval, size_t begin, size_t end );
+ * \param track The track on which the cost is performed.
+ * \param interval The interval for which we want a cost.
+ * \param begin The index of the first overlaping \TrackSegment in the \Track.
+ * \param end The index of the last overlaping \TrackSegment in the \Track.
+ *
+ * Create a \TrackCost object. Constructor parameters cannot be changed
+ * after creation.
+ *
+ * \remark The cost is not computed by the constructor. It is computed afterward
+ * by any flavor of Track::getOverlapCost().
+ */
+
+ /*! \function bool TrackCost::isInfinite () const;
+ * \Return The overlap include a \TrackSegment from a \GCellRoutingSet of
+ * higher priority, must'nt be overlaped.
+ */
+
+ /*! \function bool TrackCost::isHardOverlap () const;
+ * \Return The overlaped \TrackSegment cannot be shrunk to create a sufficent
+ * free space. See the bound interval of \TrackSegmentCost.
+ */
+
+ /*! \function bool TrackCost::isOverlap () const;
+ * \Return The overlaped \TrackSegment could be shrunk to create a suitable
+ * free space.
+ */
+
+ /*! \function bool TrackCost::isFree () const;
+ * \Return There is enough free space to insert the \TrackSegment.
+ */
+
+ /*! \function Track* TrackCost::getTrack () const;
+ * \Return The associated \Track.
+ */
+
+ /*! \function const Interval& TrackCost::getInterval () const;
+ * \Return The interval for which we want to compute a cost.
+ */
+
+ /*! \function size_t TrackCost::getBegin () const;
+ * \Return The index of the first overlaping \TrackSegment in \Track.
+ */
+
+ /*! \function size_t TrackCost::getEnd () const;
+ * \Return The index of the last overlaping \TrackSegment in \Track.
+ */
+
+ /*! \function unsigned int TrackCost::getTerminals () const;
+ * \Return The number of terminal in the interval, see TrackSegmentCost::getTerminals().
+ */
+
+ /*! \function DbU::Unit TrackCost::getDelta () const;
+ * \Return The amount of overlaping between the interval and the \TrackSegments
+ * already in the \Track.
+ */
+
+ /*! \function DbU::Unit TrackCost::getDeltaPerpand () const;
+ * \Return The amount of perpandicular wirelength needed to put the to be
+ * inserted \TrackSegment in this \Track.
+ */
+
+ /*! \function void TrackCost::setInfinite ();
+ * Raise the infinite flag.
+ */
+
+ /*! \function void TrackCost::setHardOverlap ();
+ * Raise the hard overlap flag.
+ */
+
+ /*! \function void TrackCost::setOverlap ();
+ * Raise the soft overlap flag.
+ */
+
+ /*! \function void TrackCost::incTerminals ( unsigned int number );
+ * \param number The number of terminal to adds.
+ */
+
+ /*! \function void TrackCost::incDelta ( DbU::Unit delta );
+ * \param delta The amount of length to add to the overlap.
+ */
+
+ /*! \function void TrackCost::incDeltaPerpand ( DbU::Unit delta );
+ * \param delta Increments the perpandicular delta.
+ */
+
+ /*! \function bool operator< ( const TrackCost& lhs, const TrackCost& rhs );
+ * \param lhs the left hand side operand.
+ * \param rhs the right hand side operand.
+ * \return \true if lhs < rhs
, see \ref secTrackCostOrdering.
+ */
+
+
+ /*! \class TrackCost::CompareByDelta
+ * \brief Partial compare function for \TrackCost.
+ *
+ * Allow \TrackCost sorting on the \c _delta criterion alone.
+ */
+
+ } // End of Kite namespace.
diff --git a/kite/doc/TrackSegment.dox b/kite/doc/TrackSegment.dox
new file mode 100644
index 00000000..cb68db85
--- /dev/null
+++ b/kite/doc/TrackSegment.dox
@@ -0,0 +1,170 @@
+
+ // -*- C++ -*-
+
+
+ namespace Kite {
+
+ /*! \typedef SegmentOverlapCostCB
+ * Prototype of overlap cost callback functions.
+ *
+ * \see TrackSegment::setOverlapCostCB(), TrackSegment::getOverlapCost().
+ */
+
+ /*! \class TrackSegment
+ * \brief Derived Katabatic::AutoSegment for the router.
+ *
+ * We create one TrackSegment per aligned Katabatic::AutoSegment set,
+ * the TrackSegment is associated to the canonical one of the set.
+ *
+ * To provide some speedup, the full extention of the aligned segment
+ * set is computed once and stored in the TrackSegment itself.
+ * The drawback beeing that whenever one segment from the aligned
+ * set has it's extention modified, the full extention must be
+ * recomputed.
+ */
+
+
+ /*! \name Constructors & Destructors
+ */
+ // \{
+
+ /*! \function static TrackSegment* TrackSegment::create ( AutoSegment* segment, Track* track, bool& created );
+ * \param segment The Katabatic AutoSegment to decorate.
+ * \param track A Track into which insert the TrackSegment (may be \NULL).
+ * \param created This flag is sets is a new TrackSegment has be created.
+ * \return A TrackSegment wrapped around an AutoSegment.
+ *
+ * Constructor mainly used at loading time to decorate the Katabatic
+ * data-base with the router attributes.
+ */
+
+ // \}
+
+
+ /*! \name Predicates
+ */
+ // \{
+
+ /*! \function bool TrackSegment::isLocked () const;
+ * \Return \True if the TrackSegment is locked (cannot be deleted from the
+ * Track).
+ */
+
+ // \}
+
+
+ /*! \name Callback modifier
+ */
+ // \{
+
+ /*! \function SegmentOverlapCostCB* TrackSegment::setOverlapCostCB ( SegmentOverlapCostCB* cb );
+ * \param cb the new overlap cost callback.
+ * \return the previous overlap cost callback.
+ *
+ * sets the overlap callback.
+ */
+
+ // \}
+
+
+ /*! \name Accessors
+ */
+ // \{
+
+ /*! \function Track* TrackSegment::getTrack () const;
+ * \Return The Track in which this TrackSegment is inserted (can be \NULL).
+ */
+
+ /*! \function size_t TrackSegment::getIndex () const;
+ * \Return Index of the TrackSegment inside the Track's vector. set to
+ * Track::NPOS if not inserted in any Track.
+ */
+
+ /*! \function unsigned long TrackSegment::getArea () const;
+ * \Return The priority value used for TrackSegment sorting. Currently,
+ * the slack of the AutoSegment.
+ */
+
+ /*! \function TrackSegment* TrackSegment::getNext () const;
+ * \Return The next TrackSegment in the Track (can be \NULL).
+ *
+ * \see Track::getNext().
+ */
+
+ /*! \function TrackSegment* TrackSegment::getPrevious () const;
+ * \Return The previous TrackSegment in the Track (can be \NULL).
+ *
+ * \see Track::getPrevious().
+ */
+
+ /*! \function Interval TrackSegment::getFreeInterval () const;
+ * \Return The free interval around this TrackSegment in the Track.
+ */
+
+ /*! \function DbU::Unit TrackSegment::getSourceCanonical () const;
+ * \Return The leftmost position of the associated aligned segment set.
+ */
+
+ /*! \function DbU::Unit TrackSegment::getTargetCanonical () const;
+ * \Return The rightmost position of the associated aligned segment set.
+ */
+
+ /*! \function DbU::Unit TrackSegment::getCanonicalInterval () const;
+ * \Return The canonical interval of the associated aligned segment set.
+ */
+
+ /* \function DbU::Unit TrackSegment::getOverlapCost ( Interval interval, Net* net ) const;
+ * \param interval the overlaping interval.
+ * \param net the \Net owning the overlaping interval.
+ * \return The cost of overlaping the TrackSegment with \e interval from \Net \e net.
+ */
+
+ // \}
+
+
+ /*! \name Modifiers
+ */
+ // \{
+
+ /*! \function void TrackSegment::setLock ( bool state );
+ * \param state set the Track locking state.
+ */
+
+ /*! \function void TrackSegment::setTrack ( Track* track );
+ * \param track The Track the TrackSegment is assigned to.
+ */
+
+ /*! \function void TrackSegment::setIndex ( size_t index );
+ * \param index The index of TrackSegment in the Track's vector.
+ */
+
+ /*! \function void TrackSegment::setArea ();
+ * compute the the sorting criterion used as priority, for
+ * now it's simply the AutoSegment's slack.
+ */
+
+ /*! \function void TrackSegment::detach ();
+ * remove the TrackSegment from the Track.
+ *
+ * \important This function do not update the Track itself. The
+ * program must take care of it under penalty of introducing
+ * incoherencies.
+ *
+ * \see Track::detach().
+ */
+
+ /* \function void TrackSegment::autoInvalidate ();
+ * add \e this TrackSegment to the Kite level update Session.
+ * Something maybe buggy here, or at least not very clean.
+ */
+
+ /* \function void TrackSegment::refreshCanonical ();
+ * Recompute the letfmost & rightmost position of the collapsed set.
+ * Must be done after each modification of the TrackSegment.
+ * Dealt by the TrackSession mechanism.
+ *
+ */
+
+ // \}
+
+ }
diff --git a/kite/doc/TrackSegmentCost.dox b/kite/doc/TrackSegmentCost.dox
new file mode 100644
index 00000000..9d1435bd
--- /dev/null
+++ b/kite/doc/TrackSegmentCost.dox
@@ -0,0 +1,118 @@
+
+ // -*- C++ -*-
+
+
+ namespace Kite {
+
+ /*! \class TrackSegmentCost
+ * \brief The cost calculator of a TrackSegment.
+ *
+ * \section secMiscAttributes Miscellaneous attributes
+ *
+ * Net instead of \TrackSegment : what we will access the most is the
+ * \TrackSegment owner, so it's it we keep as an attribute. The consequence
+ * beeing that the update member function should be given the \TrackSegment
+ * as argument.
+ *
+ *
+ * \section secBoundInterval Bound interval cost component
+ *
+ * This is the minimal interval to which the \TrackSegment can be
+ * shrunk without breaking the net's connexity. The interval is
+ * computed by AutoSegment::getTopologicalInfos(). And the computation
+ * is as follow :
+ *
+ * - Each AutoContact has a constraint box which defines
+ * the legal area where the AutoContact could be positionned.
+ *
- The left bound is the minimum of all constraints
+ * boxes max.
+ *
- Conversely, the right bound is the maximum of all
+ * constraints boxes min.
+ *
+ * \image html TrackSegmentCost-1.png "Left bound & right bound"
+ * \image latex TrackSegmentCost-1.pdf "Left bound & right bound" width=0.6\textwidth
+ *
+ * \image html TrackSegmentCost-2.png "Maximal shrink example"
+ * \image latex TrackSegmentCost-2.pdf "Maximal shrink example" width=0.6\textwidth
+ *
+ *
+ * \section secCostAttractors Attractors and differential wirelength cost component
+ *
+ * The goal of attractors is to compute the wirelength variation whenever
+ * the \TrackSegment changes of supporting \Track.
+ *
+ * The \TrackSegment is connected to perpandicular \TrackSegment, attractors
+ * are the extremity position of those perpandicular which are not
+ * connected to the reference \TrackSegment. The true rule is more complex
+ * an is computed by AutoSegment::isTopologicalBound().
+ *
+ * \image html TrackSegmentCost-3.png "Attractors example"
+ * \image latex TrackSegmentCost-3.pdf "Attractors example" width=0.6\textwidth
+ *
+ * In the attractor example, the reference horizontal \TrackSegment (in
+ * black) which is made of (at least) three \c AutoSegments, is connected
+ * to five vertical canonical \TrackSegment (labelled \e A through \e E).
+ *
+ * \e Left attractors are below the horizontal \TrackSegment axis,
+ * \e right ones are above. Punctual attractors are exactly on the axis.
+ *
+ * As both \TrackSegment and \c AutoSegment are orienteds, source is always
+ * the minimum and target always the maximum.
+ *
+ * The attractors are deduced as follow :
+ *
+ * - \e A : source is on the axis and move with it, so it is not took
+ * into account. Target
\@2:19
is a right attractor.
+ * - \e B : not aligned due to constraints on \e A, fully included in
+ * \e A, do not generate attractor.
+ *
- \e C : canonical is accross the reference horizontal, both source
+ * and target generate attractors :
left \@7:6
and
+ * right \@7:16
.
+ * - \e D : punctual, that is null-length canonical exactly on the
+ * axis. Generate only one attractor :
punctual \@14:10
+ * (i.e. not one for each extremity).
+ * - \e E : target is on the axis and move with it, so it is not took
+ * into account. Target
\@23:4
is a left attractor.
+ *
+ * The concept of left/right and punctual flavor for attractors are only
+ * used dured construction. Once built only the coordinate remains.
+ *
+ * The extremity of perpandicular canonical \TrackSegment connected to
+ * the reference segment do not generate attractors because they move
+ * with it. But there are exception to this behavior : one is that
+ * the extremity is in fact anchored to a terminal and will not move.
+ * This is the work of the AutoSegment::isTopologicalBound() function
+ * to check for thoses exceptions, in which case an attractor will be
+ * created.
+ *
+ *
+ * \section secTerminalCount The terminal count cost component
+ *
+ * The number of terminals directly connected to this \TrackSegment.
+ * Computation relies on AutoSegment::getTerminalCount().
+ */
+
+ /*! \function Net* TrackSegmentCost::getNet () const;
+ * \Return The Net owning this TrackSegment.
+ */
+
+ /*! \function unsigned int TrackSegmentCost::getTerminals () const;
+ * \Return The number of terminal directly connected to this \TrackSegment.
+ */
+
+ /*! \function DbU::Unit TrackSegmentCost::getWiringDelta ( DbU::Unit axis ) const;
+ * \param axis The axis where to put the TrackSegment.
+ *
+ * \return The total wirelengh needed for perpandicular TrackSegment to connect
+ * with this one sets on axis. The sum of distance to all the
+ * attractors.
+ */
+
+ /*! \function void TrackSegmentCost::update ( TrackSegment* trackSegment );
+ * \param trackSegment the associated \TrackSegment, must be the same as used
+ * in the construction.
+ *
+ * Update the cost calculator after a relative position change.
+ */
+
+ } // End of Kite namespace.
diff --git a/kite/doc/asimbook.cls b/kite/doc/asimbook.cls
new file mode 100644
index 00000000..54270780
--- /dev/null
+++ b/kite/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/kite/doc/doxyfile b/kite/doc/doxyfile
new file mode 100644
index 00000000..a51583ff
--- /dev/null
+++ b/kite/doc/doxyfile
@@ -0,0 +1,286 @@
+# Doxyfile 1.3.4
+
+# --------------------------------------------------------------------
+# Project related configuration options
+
+PROJECT_NAME = "Kite - Detailed Router"
+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"\
+ "Return=Returns:"\
+ "True=\b True"\
+ "true=\b true"\
+ "False=\b False"\
+ "false=\b false"\
+ "VERTICAL=\b VERTICAL"\
+ "HORIZONTAL=\b HORIZONTAL"\
+ "NULL=\c NULL"\
+ "vector=\c vector"\
+ "lower_bound=\c lower_bound"\
+ "Collection=\c Collection"\
+ "Collections=\c Collections"\
+ "Interval=\c Interval"\
+ "interval=\c interval"\
+ "Box=\c Box"\
+ "box=\c box"\
+ "Layer=\c Layer"\
+ "Layers=\c Layers"\
+ "Net=\c Net"\
+ "Nets=\c Nets"\
+ "Pin=\c Pin"\
+ "Pins=\c Pins"\
+ "Plug=\c Plug"\
+ "Plugs=\c Plugs"\
+ "RoutingPad=\c RoutingPad"\
+ "RoutingPads=\c RoutingPads"\
+ "Cell=\c Cell"\
+ "Cells=\c Cells"\
+ "CEngine=\c CEngine"\
+ "CEngines=\c CEngines"\
+ "GCell=\c GCell"\
+ "GCells=\c GCells"\
+ "GCellRoutingSet=\c GCellRoutingSet"\
+ "RoutingPlane=\c RoutingPlane"\
+ "RoutingPlanes=\c RoutingPlanes"\
+ "TrackSegment=\c TrackSegment"\
+ "TrackSegments=\c TrackSegments"\
+ "TrackSegmentCost=\c TrackSegmentCost"\
+ "TrackSegmentCosts=\c TrackSegmentCosts"\
+ "RoutingEvent=\c RoutingEvent"\
+ "RoutingEvents=\c RoutingEvents"\
+ "Track=\c Track"\
+ "Tracks=\c Tracks"\
+ "TrackCost=\c TrackCost"\
+ "TrackCosts=\c TrackCosts"\
+ "Session=\c Session"\
+ "Sessions=\c Sessions"\
+ "Hurricane=Hurricane"\
+ "STL=STL"
+OPTIMIZE_OUTPUT_FOR_C = NO
+OPTIMIZE_OUTPUT_JAVA = NO
+SUBGROUPING = YES
+
+# --------------------------------------------------------------------
+# Build related configuration options
+
+EXTRACT_ALL = NO
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+EXTRACT_LOCAL_CLASSES = YES
+EXTRACT_ANON_NSPACES = 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/kite/TrackSegment.h ../src/TrackSegment.cpp TrackSegment.dox \
+ ../src/kite/TrackSegmentCost.h ../src/TrackSegmentCost.cpp TrackSegmentCost.dox \
+ ../src/kite/Track.h ../src/Track.cpp Track.dox \
+ ../src/kite/TrackCost.h ../src/TrackCost.cpp TrackCost.dox \
+ ../src/kite/RoutingEvent.h ../src/RoutingEvent.cpp RoutingEvent.dox \
+ ../src/kite/Session.h Session.dox \
+ Kite.dox
+
+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 = NO
+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 = YES
+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_PROCESSOR__
+EXPAND_AS_DEFINED =
+SKIP_FUNCTION_MACROS = YES
+
+# --------------------------------------------------------------------
+# Configuration options related to external references
+
+TAGFILES = ../../../../hurricane/doc/hurricane/html/hurricane.tag=../hurricane \
+ ../../katabatic/doc/html/katabatic.tag=../katabatic
+GENERATE_TAGFILE = html/kite.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/kite/doc/footer.html b/kite/doc/footer.html
new file mode 100644
index 00000000..d0245539
--- /dev/null
+++ b/kite/doc/footer.html
@@ -0,0 +1,16 @@
+
+
+
+
+