From 00975e1ad1b48afedde8e5fe347da6601fe5b1f1 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Wed, 4 Dec 2013 00:58:58 +0000 Subject: [PATCH] * ./katabatic: - New: Whole replacement by Katabatic3. --- katabatic/CMakeLists.txt | 13 +- katabatic/doc/ASIM-bigfonts.css | 353 -- katabatic/doc/ASIM.css | 485 --- katabatic/doc/AutoContact.dox | 730 ++-- katabatic/doc/AutoSegment.dox | 1563 ++++---- katabatic/doc/GCell.dox | 660 +++- katabatic/doc/GCellGrid.dox | 109 +- katabatic/doc/Grid.dox | 204 +- katabatic/doc/KatabaticEngine.dox | 441 ++- katabatic/doc/LayerAssign.dox | 143 - katabatic/doc/LoadGrByNet.dox | 27 - katabatic/doc/NetConstraints.dox | 128 - katabatic/doc/NetOptimals.dox | 59 - katabatic/doc/Session.dox | 335 +- katabatic/doc/customHierarchy.html | 100 +- katabatic/doc/customSummary.html | 6 +- katabatic/doc/doxyfile | 42 +- katabatic/doc/footer.html | 2 +- katabatic/doc/header.html | 2 +- katabatic/doc/images/AutoContact-1.fig | 107 - katabatic/doc/images/AutoContact-10.fig | 72 - katabatic/doc/images/AutoContact-11.fig | 68 - katabatic/doc/images/AutoContact-12.fig | 91 - katabatic/doc/images/AutoContact-13.fig | 104 - katabatic/doc/images/AutoContact-14.fig | 79 - katabatic/doc/images/AutoContact-15.fig | 73 - katabatic/doc/images/AutoContact-2.fig | 43 - katabatic/doc/images/AutoContact-3.fig | 54 - katabatic/doc/images/AutoContactG1-1.fig | 33 - katabatic/doc/images/AutoContactG2-1.fig | 75 - katabatic/doc/images/AutoContactG3-1.fig | 89 - katabatic/doc/images/AutoContactG3-2.fig | 91 - katabatic/doc/images/AutoContactG3-3.fig | 124 - katabatic/doc/images/AutoContactG3-4.fig | 146 - katabatic/doc/images/AutoContactG4-1.fig | 111 - katabatic/doc/images/AutoContactG4-2.fig | 109 - katabatic/doc/images/AutoContactG4-3.fig | 109 - katabatic/doc/images/AutoContactG4-4.fig | 108 - katabatic/doc/images/AutoContactG4-5.fig | 151 - katabatic/doc/images/AutoInvalidate-1.fig | 66 - .../doc/images/AutoSegmentCollapse-1.fig | 87 - .../doc/images/AutoSegmentCollapse-2.fig | 87 - .../doc/images/AutoSegmentCollapse-3.fig | 85 - .../doc/images/AutoSegmentCollapse-4.fig | 90 - .../doc/images/AutoSegmentCollapse-5.fig | 81 - .../doc/images/AutoSegmentCollapse-6.fig | 82 - katabatic/doc/images/GCellConfiguration-1.fig | 65 - .../doc/images/GCellConfiguration-10.fig | 20 - .../doc/images/GCellConfiguration-11.fig | 24 - .../doc/images/GCellConfiguration-12.fig | 31 - .../doc/images/GCellConfiguration-13.fig | 29 - .../doc/images/GCellConfiguration-14.fig | 76 - .../doc/images/GCellConfiguration-15.fig | 22 - .../doc/images/GCellConfiguration-16.fig | 22 - .../doc/images/GCellConfiguration-17.fig | 458 --- .../doc/images/GCellConfiguration-18.fig | 123 - .../doc/images/GCellConfiguration-19.fig | 119 - katabatic/doc/images/GCellConfiguration-2.fig | 70 - .../doc/images/GCellConfiguration-20.fig | 66 - .../doc/images/GCellConfiguration-21.fig | 92 - .../doc/images/GCellConfiguration-22.fig | 96 - .../doc/images/GCellConfiguration-23.fig | 91 - .../doc/images/GCellConfiguration-24.fig | 45 - katabatic/doc/images/GCellConfiguration-3.fig | 171 - .../doc/images/GCellConfiguration-30.fig | 128 - .../doc/images/GCellConfiguration-31.fig | 133 - .../doc/images/GCellConfiguration-32.fig | 133 - .../doc/images/GCellConfiguration-33.fig | 74 - .../doc/images/GCellConfiguration-34.fig | 67 - .../doc/images/GCellConfiguration-35.fig | 111 - .../doc/images/GCellConfiguration-36.fig | 64 - katabatic/doc/images/GCellConfiguration-4.fig | 86 - .../doc/images/GCellConfiguration-40.fig | 81 - .../doc/images/GCellConfiguration-41.fig | 98 - .../doc/images/GCellConfiguration-42.fig | 104 - .../doc/images/GCellConfiguration-43.fig | 104 - .../doc/images/GCellConfiguration-44.fig | 60 - .../doc/images/GCellConfiguration-45.fig | 50 - katabatic/doc/images/GCellConfiguration-5.fig | 90 - katabatic/doc/images/GCellConfiguration-6.fig | 656 ---- katabatic/doc/images/GCellConfiguration-7.fig | 106 - katabatic/doc/images/LegalConstruct-1.fig | 136 - katabatic/doc/images/LegalConstruct-2.fig | 151 - katabatic/doc/images/LegalConstruct-3.fig | 55 - katabatic/doc/images/LegalConstruct-4.fig | 91 - katabatic/doc/images/LegalConstruct-5.fig | 94 - katabatic/doc/images/LegalConstruct-6.fig | 59 - katabatic/doc/images/Makefile.am | 65 - katabatic/doc/images/Makefile.in | 403 -- katabatic/doc/images/NetConstraints-1.fig | 78 - katabatic/doc/images/NetConstraints-2.fig | 75 - katabatic/doc/images/NetConstraints-3.fig | 72 - katabatic/doc/images/NetConstraints-4.fig | 68 - katabatic/doc/images/NetOptimals-1.fig | 146 - katabatic/doc/images/NetOptimals-2.fig | 80 - katabatic/doc/images/NetOptimals-3.fig | 109 - katabatic/doc/images/PerpandicularState-1.fig | 102 - katabatic/doc/images/PerpandicularState-2.fig | 113 - katabatic/doc/images/PerpandicularState-3.fig | 108 - katabatic/doc/images/PerpandicularState-4.fig | 108 - katabatic/doc/images/SplitAutoContact-1.fig | 58 - katabatic/doc/images/SplitAutoContact-2.fig | 53 - katabatic/doc/images/SplitAutoContact-3.fig | 48 - katabatic/doc/images/SplitAutoContact-4.fig | 46 - katabatic/doc/images/SplitAutoContact-5.fig | 46 - katabatic/doc/images/SplitAutoContact-6.fig | 36 - katabatic/doc/images/_do_1G_1M1.fig | 120 + katabatic/doc/images/_do_1G_1M1.png | Bin 0 -> 3805 bytes katabatic/doc/images/_do_1G_1M3.fig | 204 + katabatic/doc/images/_do_1G_1M3.png | Bin 0 -> 7501 bytes katabatic/doc/images/_do_1G_xM1.fig | 312 ++ katabatic/doc/images/_do_1G_xM1.png | Bin 0 -> 8182 bytes katabatic/doc/images/_do_xG.fig | 131 + katabatic/doc/images/_do_xG.png | Bin 0 -> 8067 bytes katabatic/doc/images/_do_xG_1M1_1M2.fig | 778 ++++ katabatic/doc/images/_do_xG_1M1_1M2.png | Bin 0 -> 18463 bytes katabatic/doc/images/_do_xG_xM1_xM3.fig | 1542 ++++++++ katabatic/doc/images/_do_xG_xM1_xM3.png | Bin 0 -> 24305 bytes katabatic/doc/images/_do_xG_xM2.fig | 422 +++ katabatic/doc/images/_do_xG_xM2.png | Bin 0 -> 10865 bytes katabatic/doc/images/_do_xG_xM3.fig | 374 ++ katabatic/doc/images/_do_xG_xM3.png | Bin 0 -> 11165 bytes katabatic/doc/images/_makeDogleg-1.fig | 247 ++ katabatic/doc/images/_makeDogleg-1.png | Bin 0 -> 10266 bytes katabatic/doc/images/_makeDogleg-2.fig | 246 ++ katabatic/doc/images/_makeDogleg-2.png | Bin 0 -> 11981 bytes katabatic/doc/images/_makeDogleg-4.fig | 270 ++ katabatic/doc/images/_makeDogleg-4.png | Bin 0 -> 12282 bytes katabatic/doc/images/_slacken-1.fig | 279 ++ katabatic/doc/images/_slacken-1.png | Bin 0 -> 9434 bytes katabatic/doc/images/_slacken-2.fig | 268 ++ katabatic/doc/images/_slacken-2.png | Bin 0 -> 12145 bytes katabatic/doc/images/checkRoutingPadSize.fig | 153 + katabatic/doc/images/checkRoutingPadSize.png | Bin 0 -> 2997 bytes katabatic/doc/images/doRp_Access.fig | 177 + katabatic/doc/images/doRp_Access.png | Bin 0 -> 4260 bytes katabatic/doc/images/doRp_AutoContacts.fig | 315 ++ katabatic/doc/images/doRp_AutoContacts.png | Bin 0 -> 14091 bytes katabatic/doc/images/doRp_StairCaseH.fig | 122 + katabatic/doc/images/doRp_StairCaseH.png | Bin 0 -> 2616 bytes katabatic/doc/images/doRp_StairCaseV.fig | 110 + katabatic/doc/images/doRp_StairCaseV.png | Bin 0 -> 3019 bytes katabatic/doc/images/moveULeft-1.fig | 133 + katabatic/doc/images/moveULeft-1.png | Bin 0 -> 8479 bytes katabatic/doc/images/updateTopologyHTee.fig | 274 ++ katabatic/doc/images/updateTopologyHTee.png | Bin 0 -> 16311 bytes .../doc/images/updateTopologyTerminal.fig | 316 ++ .../doc/images/updateTopologyTerminal.png | Bin 0 -> 13234 bytes katabatic/doc/images/updateTopologyTurn.fig | 244 ++ katabatic/doc/images/updateTopologyTurn.png | Bin 0 -> 18598 bytes katabatic/doc/mkDoc.sh | 10 - katabatic/src/AutoContact.cpp | 2712 ++------------ katabatic/src/AutoContactHTee.cpp | 314 ++ katabatic/src/AutoContactTerminal.cpp | 367 ++ katabatic/src/AutoContactTurn.cpp | 264 ++ katabatic/src/AutoContactVTee.cpp | 302 ++ katabatic/src/AutoContacts.cpp | 140 - katabatic/src/AutoHorizontal.cpp | 829 ++--- katabatic/src/AutoSegment.cpp | 1932 +++++----- katabatic/src/AutoSegments.cpp | 550 +-- katabatic/src/AutoVertical.cpp | 706 ++-- katabatic/src/CMakeLists.txt | 40 +- katabatic/src/ChipTools.cpp | 68 +- katabatic/src/Configuration.cpp | 37 +- katabatic/src/GCell.cpp | 691 ++-- katabatic/src/GCellGrid.cpp | 26 +- katabatic/src/GraphicKatabaticEngine.cpp | 24 +- katabatic/src/Grid.cpp | 16 +- katabatic/src/KatabaticEngine.cpp | 589 ++- katabatic/src/LayerAssign.cpp | 485 ++- katabatic/src/LoadGrByNet.cpp | 3298 +++++++---------- katabatic/src/NetConstraints.cpp | 397 +- katabatic/src/NetOptimals.cpp | 56 +- katabatic/src/Observer.cpp | 30 + katabatic/src/PowerRails.cpp | 215 +- katabatic/src/PyKatabatic.cpp | 20 +- katabatic/src/Session.cpp | 343 +- katabatic/src/katabatic/AutoContact.h | 341 +- katabatic/src/katabatic/AutoContactHTee.h | 75 + katabatic/src/katabatic/AutoContactTerminal.h | 81 + katabatic/src/katabatic/AutoContactTurn.h | 73 + katabatic/src/katabatic/AutoContactVTee.h | 72 + katabatic/src/katabatic/AutoContacts.h | 165 - katabatic/src/katabatic/AutoHorizontal.h | 100 +- katabatic/src/katabatic/AutoSegment.h | 661 ++-- katabatic/src/katabatic/AutoSegments.h | 177 +- katabatic/src/katabatic/AutoVertical.h | 101 +- katabatic/src/katabatic/ChipDatas.h | 88 + katabatic/src/katabatic/ChipTools.h | 33 +- katabatic/src/katabatic/Configuration.h | 31 +- katabatic/src/katabatic/Constants.h | 158 + katabatic/src/katabatic/ContactWrapper.h | 113 - katabatic/src/katabatic/GCell.h | 335 +- katabatic/src/katabatic/GCellGrid.h | 52 +- katabatic/src/katabatic/GCells.h | 30 +- .../src/katabatic/GraphicKatabaticEngine.h | 16 +- katabatic/src/katabatic/Grid.h | 98 +- katabatic/src/katabatic/GridBox.h | 29 +- katabatic/src/katabatic/GridCollections.h | 29 +- katabatic/src/katabatic/KatabaticEngine.h | 258 +- katabatic/src/katabatic/Observer.h | 119 + katabatic/src/katabatic/SegmentWrapper.h | 110 - katabatic/src/katabatic/Session.h | 110 +- 203 files changed, 17429 insertions(+), 21506 deletions(-) delete mode 100644 katabatic/doc/ASIM-bigfonts.css delete mode 100644 katabatic/doc/ASIM.css delete mode 100644 katabatic/doc/LayerAssign.dox delete mode 100644 katabatic/doc/LoadGrByNet.dox delete mode 100644 katabatic/doc/NetConstraints.dox delete mode 100644 katabatic/doc/NetOptimals.dox delete mode 100644 katabatic/doc/images/AutoContact-1.fig delete mode 100644 katabatic/doc/images/AutoContact-10.fig delete mode 100644 katabatic/doc/images/AutoContact-11.fig delete mode 100644 katabatic/doc/images/AutoContact-12.fig delete mode 100644 katabatic/doc/images/AutoContact-13.fig delete mode 100644 katabatic/doc/images/AutoContact-14.fig delete mode 100644 katabatic/doc/images/AutoContact-15.fig delete mode 100644 katabatic/doc/images/AutoContact-2.fig delete mode 100644 katabatic/doc/images/AutoContact-3.fig delete mode 100644 katabatic/doc/images/AutoContactG1-1.fig delete mode 100644 katabatic/doc/images/AutoContactG2-1.fig delete mode 100644 katabatic/doc/images/AutoContactG3-1.fig delete mode 100644 katabatic/doc/images/AutoContactG3-2.fig delete mode 100644 katabatic/doc/images/AutoContactG3-3.fig delete mode 100644 katabatic/doc/images/AutoContactG3-4.fig delete mode 100644 katabatic/doc/images/AutoContactG4-1.fig delete mode 100644 katabatic/doc/images/AutoContactG4-2.fig delete mode 100644 katabatic/doc/images/AutoContactG4-3.fig delete mode 100644 katabatic/doc/images/AutoContactG4-4.fig delete mode 100644 katabatic/doc/images/AutoContactG4-5.fig delete mode 100644 katabatic/doc/images/AutoInvalidate-1.fig delete mode 100644 katabatic/doc/images/AutoSegmentCollapse-1.fig delete mode 100644 katabatic/doc/images/AutoSegmentCollapse-2.fig delete mode 100644 katabatic/doc/images/AutoSegmentCollapse-3.fig delete mode 100644 katabatic/doc/images/AutoSegmentCollapse-4.fig delete mode 100644 katabatic/doc/images/AutoSegmentCollapse-5.fig delete mode 100644 katabatic/doc/images/AutoSegmentCollapse-6.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-1.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-10.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-11.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-12.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-13.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-14.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-15.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-16.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-17.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-18.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-19.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-2.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-20.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-21.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-22.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-23.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-24.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-3.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-30.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-31.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-32.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-33.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-34.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-35.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-36.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-4.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-40.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-41.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-42.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-43.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-44.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-45.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-5.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-6.fig delete mode 100644 katabatic/doc/images/GCellConfiguration-7.fig delete mode 100644 katabatic/doc/images/LegalConstruct-1.fig delete mode 100644 katabatic/doc/images/LegalConstruct-2.fig delete mode 100644 katabatic/doc/images/LegalConstruct-3.fig delete mode 100644 katabatic/doc/images/LegalConstruct-4.fig delete mode 100644 katabatic/doc/images/LegalConstruct-5.fig delete mode 100644 katabatic/doc/images/LegalConstruct-6.fig delete mode 100644 katabatic/doc/images/Makefile.am delete mode 100644 katabatic/doc/images/Makefile.in delete mode 100644 katabatic/doc/images/NetConstraints-1.fig delete mode 100644 katabatic/doc/images/NetConstraints-2.fig delete mode 100644 katabatic/doc/images/NetConstraints-3.fig delete mode 100644 katabatic/doc/images/NetConstraints-4.fig delete mode 100644 katabatic/doc/images/NetOptimals-1.fig delete mode 100644 katabatic/doc/images/NetOptimals-2.fig delete mode 100644 katabatic/doc/images/NetOptimals-3.fig delete mode 100644 katabatic/doc/images/PerpandicularState-1.fig delete mode 100644 katabatic/doc/images/PerpandicularState-2.fig delete mode 100644 katabatic/doc/images/PerpandicularState-3.fig delete mode 100644 katabatic/doc/images/PerpandicularState-4.fig delete mode 100644 katabatic/doc/images/SplitAutoContact-1.fig delete mode 100644 katabatic/doc/images/SplitAutoContact-2.fig delete mode 100644 katabatic/doc/images/SplitAutoContact-3.fig delete mode 100644 katabatic/doc/images/SplitAutoContact-4.fig delete mode 100644 katabatic/doc/images/SplitAutoContact-5.fig delete mode 100644 katabatic/doc/images/SplitAutoContact-6.fig create mode 100644 katabatic/doc/images/_do_1G_1M1.fig create mode 100644 katabatic/doc/images/_do_1G_1M1.png create mode 100644 katabatic/doc/images/_do_1G_1M3.fig create mode 100644 katabatic/doc/images/_do_1G_1M3.png create mode 100644 katabatic/doc/images/_do_1G_xM1.fig create mode 100644 katabatic/doc/images/_do_1G_xM1.png create mode 100644 katabatic/doc/images/_do_xG.fig create mode 100644 katabatic/doc/images/_do_xG.png create mode 100644 katabatic/doc/images/_do_xG_1M1_1M2.fig create mode 100644 katabatic/doc/images/_do_xG_1M1_1M2.png create mode 100644 katabatic/doc/images/_do_xG_xM1_xM3.fig create mode 100644 katabatic/doc/images/_do_xG_xM1_xM3.png create mode 100644 katabatic/doc/images/_do_xG_xM2.fig create mode 100644 katabatic/doc/images/_do_xG_xM2.png create mode 100644 katabatic/doc/images/_do_xG_xM3.fig create mode 100644 katabatic/doc/images/_do_xG_xM3.png create mode 100644 katabatic/doc/images/_makeDogleg-1.fig create mode 100644 katabatic/doc/images/_makeDogleg-1.png create mode 100644 katabatic/doc/images/_makeDogleg-2.fig create mode 100644 katabatic/doc/images/_makeDogleg-2.png create mode 100644 katabatic/doc/images/_makeDogleg-4.fig create mode 100644 katabatic/doc/images/_makeDogleg-4.png create mode 100644 katabatic/doc/images/_slacken-1.fig create mode 100644 katabatic/doc/images/_slacken-1.png create mode 100644 katabatic/doc/images/_slacken-2.fig create mode 100644 katabatic/doc/images/_slacken-2.png create mode 100644 katabatic/doc/images/checkRoutingPadSize.fig create mode 100644 katabatic/doc/images/checkRoutingPadSize.png create mode 100644 katabatic/doc/images/doRp_Access.fig create mode 100644 katabatic/doc/images/doRp_Access.png create mode 100644 katabatic/doc/images/doRp_AutoContacts.fig create mode 100644 katabatic/doc/images/doRp_AutoContacts.png create mode 100644 katabatic/doc/images/doRp_StairCaseH.fig create mode 100644 katabatic/doc/images/doRp_StairCaseH.png create mode 100644 katabatic/doc/images/doRp_StairCaseV.fig create mode 100644 katabatic/doc/images/doRp_StairCaseV.png create mode 100644 katabatic/doc/images/moveULeft-1.fig create mode 100644 katabatic/doc/images/moveULeft-1.png create mode 100644 katabatic/doc/images/updateTopologyHTee.fig create mode 100644 katabatic/doc/images/updateTopologyHTee.png create mode 100644 katabatic/doc/images/updateTopologyTerminal.fig create mode 100644 katabatic/doc/images/updateTopologyTerminal.png create mode 100644 katabatic/doc/images/updateTopologyTurn.fig create mode 100644 katabatic/doc/images/updateTopologyTurn.png delete mode 100644 katabatic/doc/mkDoc.sh create mode 100644 katabatic/src/AutoContactHTee.cpp create mode 100644 katabatic/src/AutoContactTerminal.cpp create mode 100644 katabatic/src/AutoContactTurn.cpp create mode 100644 katabatic/src/AutoContactVTee.cpp delete mode 100644 katabatic/src/AutoContacts.cpp create mode 100644 katabatic/src/Observer.cpp create mode 100644 katabatic/src/katabatic/AutoContactHTee.h create mode 100644 katabatic/src/katabatic/AutoContactTerminal.h create mode 100644 katabatic/src/katabatic/AutoContactTurn.h create mode 100644 katabatic/src/katabatic/AutoContactVTee.h delete mode 100644 katabatic/src/katabatic/AutoContacts.h create mode 100644 katabatic/src/katabatic/ChipDatas.h create mode 100644 katabatic/src/katabatic/Constants.h delete mode 100644 katabatic/src/katabatic/ContactWrapper.h create mode 100644 katabatic/src/katabatic/Observer.h delete mode 100644 katabatic/src/katabatic/SegmentWrapper.h diff --git a/katabatic/CMakeLists.txt b/katabatic/CMakeLists.txt index 18d8474b..7330087e 100644 --- a/katabatic/CMakeLists.txt +++ b/katabatic/CMakeLists.txt @@ -1,3 +1,4 @@ +# -*- explicit-buffer-name: "CMakeLists.txt" -*- project(KATABATIC) @@ -25,19 +26,15 @@ find_package(KNIK REQUIRED) if(BUILD_DOC) find_package(Doxygen) - ENDIF(BUILD_DOC) + endif(BUILD_DOC) + if(BUILD_DOC AND DOXYGEN_FOUND) + add_subdirectory(doc) + endif(BUILD_DOC AND DOXYGEN_FOUND) add_subdirectory(src) add_subdirectory(cmake_modules) - if(BUILD_DOC AND DOXYGEN_FOUND AND IS_DIRECTORY doc) - add_subdirectory(doc) - endif(BUILD_DOC AND DOXYGEN_FOUND AND IS_DIRECTORY doc) if(CHECK_DATABASE) add_definitions(-DCHECK_DATABASE) message(STATUS "Checking database enabled (very slow).") endif(CHECK_DATABASE) - if(CHECK_DETERMINISM) - add_definitions(-DCHECK_DETERMINISM) - message(STATUS "Checking determinism enabled.") - endif(CHECK_DETERMINISM) diff --git a/katabatic/doc/ASIM-bigfonts.css b/katabatic/doc/ASIM-bigfonts.css deleted file mode 100644 index f8ec6823..00000000 --- a/katabatic/doc/ASIM-bigfonts.css +++ /dev/null @@ -1,353 +0,0 @@ - - -/* - * x-----------------------------------------------------------------x - * | HTML Standart Tags | - * x-----------------------------------------------------------------x - */ - - html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 { - font-size: 100%; - font-family: verdana, sans-serif; - } - - body { - color: black; - background: white; - background-color: white; - background-position: top left; - background-attachment: fixed; - background-repeat: no-repeat; - margin-top: 2em; - margin-right: 10%; - margin-left: 10%; - } - - hr { - height: 1px; - border: 0; - color: #004400; - background-color: #004400; - } - - - h1, h2, h3, h4, h5, h6 { - font-family: verdana, sans-serif; - } - - h1 { text-align: center; } - h2, h3, h4, h5, h6 { text-align: left; - padding-top: 2em; - } - h1, h2, h3 { font-family: "Trebuchet MS", sans-serif; - color: #09550B; - } - h1 { font-weight: bold; font-size: 170%; } - h2 { font-weight: bold; font-size: 140%; } - h3 { font-weight: bold; font-size: 118%; } - h4 { font-weight: bold; font-size: 100%; } - h5 { font-style: italic; font-size: 100%; } - h6 { font-variant: small-caps; font-size: 100%; } - - .hide { - display: none; - color: white; - } - - - p { - margin-top: 0.6em; - margin-bottom: 0.6em; - margin-left: 0.0em; - margin-right: 0.0em; - } - - - address { - text-align: right; - font-weight: bold; - font-style: italic; - font-size: 80%; - } - - - caption { font-weight: bold } - - - blockquote { - margin-left: 4em; - margin-right: 4em; - margin-top: 0.8em; - margin-bottom: 0.8em; - font-style: italic; - color: #003300; - } - - blockquote p { - margin-bottom: 0; - } - - blockquote address { - margin: 0; - } - - - table { - border-collapse: collapse; - } - - dt, dd { margin-top: 0; margin-bottom: 0; } - dt { font-weight: bold; } - - - pre, tt, code { - font-family: "andale mono", monospace; - font-size: 100%; - white-space: pre; - } - - pre { - font-size: 80%; - border: solid; - border-width: thin; - border-color: #003300; - background-color: #EEEEEE; - padding: 0.5em; - margin-left: 2em; - margin-right: 2em - } - - tt { color: green; } - em { font-style: italic; font-weight: bold; } - strong { font-weight: bold; } - - span.textit { font-style: italic; } - span.textbf { font-weight: bold; } - - .small { font-size: 90%; } - .white { color: #FFFFFF; } - - - ul.toc { - list-style: disc; - list-style: none; - } - - - a:link img, a:visited img { border-style: none; } - a img { color: white; } - - a:link, a:active, a:visited { - color: #09550B; - text-decoration: none; - } - - a:hover, a:focus { - color: #FF9900; - text-decoration: underline; - } - - - - -/* - * x-----------------------------------------------------------------x - * | Doxygen Specific Classes | - * x-----------------------------------------------------------------x - */ - - -/* ------------------------------------------------------------------- - * Header & Footer Classes (customized top page navigation bar). - */ - - table.header { - width: 100%; - /*background-color: #EEEEEE;*/ - background-color: #CCE6CA; - } - - h1.header { - font-family: times, verdana, sans-serif; - } - - td.header { - /*width: 14%;*/ - text-align: center; - font-weight: bold; - font-family: verdana, sans-serif; - } - - table.footer { - width: 100%; - } - - td.leftFoot1, td.leftFoot2 { - text-align: left; - } - - td.rightFoot1, td.rightFoot2 { - text-align: right; - } - - td.leftFoot2 { - font-family: time; - font-weight: bold; - } - - td.rightFoot2 { - font-weight: bold; - } - - div.ah { - font-family: time; - font-size: 250%; - } - - -/* ------------------------------------------------------------------- - * Quick Index Class (top page navigation bar). - */ - - div.qindex, div.nav { - width: 100%; - /*background-color: #DADAEF;*/ - /*background-color: #eeeeff;*/ - /*background-color: #EEEEEE;*/ - background-color: #CCE6CA; - border: 1px solid #003300; - text-align: center; - margin: 2px; - padding: 2px; - line-height: 140%; - } - - a.qindex, a.qindex:visited, a.qindex:hover, a.qindexHL, a.el, a.elRef { - text-decoration: none; - font-weight: bold; - } - - a.qindex, a.qindex:visited { - color: #09550B; - } - - a.qindex:hover { - background-color: #ddddff; - } - - a.qindexHL, a.qindexHL:hover, a.qindexHL:visited { - background-color: #0c780c; - color: #ffffff; - border: 1px double #9295C2; - } - - a.code:link, a.code:visited, a.codeRef:link, a.codeRef:visited { - text-decoration: none; - font-weight: normal; - color: #0000ff; - } - - .indexkey { - background-color: #eeeeff; - border: 1px solid #b0b0b0; - padding: 2px 15px; - } - - .indexkey, .indexvalue { - background-color: #eeeeff; - border: 1px solid #b0b0b0; - padding: 2px 15px; - } - - .indexkey { - width: 40%; - } - - .indexvalue { - width: 80%; - } - - -/* ------------------------------------------------------------------- - * Verbatim Source Code / Examples. - */ - - pre.fragment { background-color: #EEEEEE; } - - span.keyword { color: #008000 } - span.keywordtype { color: #604020 } - span.keywordflow { color: #e08000 } - span.comment { color: #800000 } - span.preprocessor { color: #806020 } - span.stringliteral { color: #002080 } - span.charliteral { color: #008080 } - - -/* ------------------------------------------------------------------- - * Attributes Listing. - */ - - .mdTable { - /*border: 1px solid #868686;*/ - /*background-color: #DADAEF;*/ - /*background-color: #F4F4FB;*/ - border: 1px none #868686; - /*background-color: #B8E6B8;*/ - background-color: #CCE6CA; - margin-top: 25px; - } - - .mdRow { - padding: 5px 10px; - } - - /* This Mozilla/Firefox bug has been corrected from v1.5. - * .mdname1 { - * padding: 3px 0px 0px 0px; - * } - */ - - .mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - font-size: 12px; - font-style: italic; - /*background-color: #FAFAFA;*/ - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; - } - - .memItemLeft, .memItemRight, .memTemplItemLeft { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #0c0c0c; - border-right-color: #0c0c0c; - border-bottom-color: #0c0c0c; - border-left-color: #0c0c0c; - border-top-style: solid; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - /*background-color: #DADAEF;*/ - /*background-color: #eeeeff;*/ - /*background-color: #EEEEEE;*/ - background-color: #CCE6CA; - } - - .memItemLeft { font-size: 12px; } - .memItemRight { font-size: 13px; } - .memTemplItemLeft { font-size: 12px; } - .memTemplItemRight { font-size: 13px; } - - .memTemplParams { - color: #606060; - background-color: #DADAEF; - font-size: 12px; - } - diff --git a/katabatic/doc/ASIM.css b/katabatic/doc/ASIM.css deleted file mode 100644 index 6d92a0c5..00000000 --- a/katabatic/doc/ASIM.css +++ /dev/null @@ -1,485 +0,0 @@ - - -/* - * x-----------------------------------------------------------------x - * | HTML Standart Tags | - * x-----------------------------------------------------------------x - */ - - html, body, th, td, tr, p, li, h1, h2, h3, h4, h5, h6 { - font-size: 96%; - font-family: verdana, sans-serif; - } - - body { - color: black; - background: white; - background-color: white; - background-position: top left; - background-attachment: fixed; - background-repeat: no-repeat; - margin-top: 2em; - margin-right: 8%; - margin-left: 8%; - } - - hr { - height: 1px; - border: 0; - color: #004400; - background-color: #004400; - } - - - h1, h2, h3, h4, h5, h6 { - font-family: verdana, sans-serif; - } - - h1 { text-align: center; } - h2, h3, h4, h5, h6 { text-align: left; - padding-top: 2em; - } - h1, h2, h3 { font-family: "Trebuchet MS", sans-serif; - color: #09550B; - } - h1 { font-weight: bold; font-size: 170%; } - h2 { font-weight: bold; font-size: 140%; } - h3 { font-weight: bold; font-size: 118%; } - h4 { font-weight: bold; font-size: 100%; } - h5 { font-style: italic; font-size: 100%; } - h6 { font-variant: small-caps; font-size: 100%; } - - h2.classHierarchy { - /*border: 1px none #008500;*/ - border: 1px none #000000; - border-top-width: 2px; - border-top-style: solid; - padding-top: 1em; - } - - - .hide { - display: none; - color: white; - } - - - p { - margin-top: 0.6em; - margin-bottom: 0.6em; - margin-left: 0.0em; - margin-right: 0.0em; - } - - - address { - text-align: right; - font-weight: bold; - font-style: italic; - font-size: 80%; - } - - - caption { font-weight: bold } - - - blockquote { - margin-left: 4em; - margin-right: 4em; - margin-top: 0.8em; - margin-bottom: 0.8em; - font-style: italic; - color: #003300; - } - - blockquote p { - margin-bottom: 0; - } - - blockquote address { - margin: 0; - } - - - table { - border-collapse: collapse; - } - - dt, dd { margin-top: 0; margin-bottom: 0; } - dt { font-weight: bold; } - - - pre, tt, code { - font-family: "andale mono", monospace; - font-size: 100%; - white-space: pre; - } - - pre { - font-size: 80%; - border: dashed; - border-width: thin; - border-color: #003300; - /* - background-color: #EEEEEE; - */ - background-color: #FCFCE1; - padding: 0.5em; - margin-left: 2em; - margin-right: 2em - } - - tt { color: green; } - em { font-style: italic; - font-weight: bold; } - strong { font-weight: bold; } - - span.textit { font-style: italic; } - span.textbf { font-weight: bold; } - - .small { font-size: 90%; } - .white { color: #FFFFFF; } - - - ul.toc { - list-style: disc; - list-style: none; - } - - - a:link img, a:visited img { border-style: none; } - a img { color: white; } - - a:link, a:active, a:visited { - color: #09550B; - text-decoration: none; - } - - a:hover, a:focus { - color: #FF9900; - text-decoration: underline; - } - - - - -/* - * x-----------------------------------------------------------------x - * | Doxygen Specific Classes | - * x-----------------------------------------------------------------x - */ - - -/* ------------------------------------------------------------------- - * Header & Footer Classes (customized top page navigation bar). - */ - - h1.header { - font-size: 200%; - font-family: times, verdana, sans-serif; - } - - center.header { - background-color: #CCE6CA; - } - - table.header { - /*width: 100%;*/ - /*background-color: #EEEEEE;*/ - background-color: #CCE6CA; - } - - table.header td { - padding: 2px 14px; - text-align: center; - font-weight: bold; - font-family: verdana, sans-serif; - font-size: 110%; - } - - table.footer1, table.footer2 { width: 100%; } - td.LFooter { text-align: left; } - td.RFooter { text-align: right; } - td.CFooter { text-align: center;} - table.footer2 td.RFooter { font-weight: bold; width: 35% } - table.footer2 td.CFooter { width: 30% } - table.footer2 td.LFooter { font-weight: bold; width: 35%; font-family: time; } - - table.classHierarchy { - border-collapse: separate; - border-spacing: 5px; - font-size: 110%; - } - - table.classHierarchy tr { - border: 1px solid blue; - } - - table.classHierarchy td.normal { - border: 1px solid #CCE6CA; - width: 140pt; - text-align: center; - font-weight: bold; - background-color: #CCE6CA; - } - - table.classHierarchy td.virtual { - border: 1px solid black; - width: 140pt; - text-align: center; - font-weight: bold; - } - - table.classHierarchy td.wnormal { - border: 1px solid #CCE6CA; - width: 240pt; - text-align: center; - font-weight: bold; - background-color: #CCE6CA; - } - - table.classHierarchy td.wvirtual { - border: 1px solid black; - width: 240pt; - text-align: center; - font-weight: bold; - } - - div.ah { - font-family: time; - font-size: 250%; - } - - -/* ------------------------------------------------------------------- - * Quick Index Class (top page navigation bar). - */ - - div.qindex, div.nav { - width: 100%-4px; - /*background-color: #DADAEF;*/ - /*background-color: #eeeeff;*/ - /*background-color: #EEEEEE;*/ - background-color: #CCE6CA; - border: 0px solid #003300; - text-align: center; - margin: 0px; - padding: 2px; - line-height: 140%; - } - - a.qindex, a.qindex:visited, a.qindex:hover, a.qindexHL, a.el, a.elRef { - text-decoration: none; - font-weight: bold; - } - - a.qindex, a.qindex:visited { - color: #09550B; - } - - a.qindex:hover { - background-color: #ddddff; - } - - a.qindexHL, a.qindexHL:hover, a.qindexHL:visited { - background-color: #0c780c; - color: #ffffff; - border: 1px double #9295C2; - } - - a.code:link, a.code:visited, a.codeRef:link, a.codeRef:visited { - text-decoration: none; - font-weight: normal; - color: #0000ff; - } - - .indexkey { - background-color: #eeeeff; - border: 1px solid #b0b0b0; - padding: 2px 15px; - } - - .indexkey, .indexvalue { - background-color: #eeeeff; - border: 1px solid #b0b0b0; - padding: 2px 15px; - } - - .indexkey { - width: 40%; - } - - .indexvalue { - width: 80%; - } - - h3 a[name="index__"], - h3 a[name="index_a"], - h3 a[name="index_b"], - h3 a[name="index_c"], - h3 a[name="index_d"], - h3 a[name="index_e"], - h3 a[name="index_f"], - h3 a[name="index_g"], - h3 a[name="index_h"], - h3 a[name="index_i"], - h3 a[name="index_j"], - h3 a[name="index_k"], - h3 a[name="index_l"], - h3 a[name="index_m"], - h3 a[name="index_n"], - h3 a[name="index_o"], - h3 a[name="index_p"], - h3 a[name="index_q"], - h3 a[name="index_r"], - h3 a[name="index_s"], - h3 a[name="index_t"], - h3 a[name="index_u"], - h3 a[name="index_v"], - h3 a[name="index_w"], - h3 a[name="index_x"], - h3 a[name="index_y"], - h3 a[name="index_z"], - h3 a[name="index_0"], - h3 a[name="index_1"], - h3 a[name="index_2"], - h3 a[name="index_3"], - h3 a[name="index_4"], - h3 a[name="index_5"], - h3 a[name="index_6"], - h3 a[name="index_7"], - h3 a[name="index_8"], - h3 a[name="index_9"] - { - font-family: time; - font-size: 250%; - } - - -/* ------------------------------------------------------------------- - * Verbatim Source Code / Examples. - */ - - /* pre.fragment { background-color: #EEEEEE; } */ - - span.keyword { color: #008000 } - span.keywordtype { color: #604020 } - span.keywordflow { color: #e08000 } - span.comment { color: #800000 } - span.preprocessor { color: #806020 } - span.stringliteral { color: #002080 } - span.charliteral { color: #008080 } - - -/* ------------------------------------------------------------------- - * Attributes Listing. - */ - - .mdTable { - /*border: 1px solid #868686;*/ - /*background-color: #DADAEF;*/ - /*background-color: #F4F4FB;*/ - border: 1px none #008500; - border-left-width: 1px; - border-left-style: solid; - /*background-color: #B8E6B8;*/ - /*background-color: #CCE6CA;*/ - margin-top: 25px; - font-size: 105%; - } - - .mdRow { - padding: 5px 10px; - } - - /* This Mozilla/Firefox bug has been corrected from v1.5. - * .mdname1 { - * padding: 3px 0px 0px 0px; - * } - */ - - .mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - font-size: 11px; - font-style: italic; - /*background-color: #FAFAFA;*/ - border-top: 1px none #E0E0E0; - border-right: 1px none #E0E0E0; - border-bottom: 1px none #E0E0E0; - border-left: 1px none #E0E0E0; - margin: 0px; - } - - .memitem { - margin-bottom: 30px; - border: 1px none #008500; - } - - .memproto { - background-color: #CCE6CA; - border-left-width: 4px; - border-left-style: solid; - border-color: #008500; - } - - .memname { - white-space: nowrap; - padding-left: 5px; - font-size: 105%; - } - - - .memdoc{ - padding-left: 5px; - /*margin-top: -8px;*/ - border-left-width: 1px; - border-left-style: solid; - border-color: #008500; - } - - .memItemLeft, .memItemRight, .memTemplItemLeft, .memTemplItemRight { - padding: 1px 0px 0px 8px; - margin: 4px; - border-top-width: 1px; - border-right-width: 1px; - border-bottom-width: 1px; - border-left-width: 1px; - border-top-color: #0c0c0c; - border-right-color: #0c0c0c; - border-bottom-color: #0c0c0c; - border-left-color: #0c0c0c; - border-top-style: solid; - border-right-style: none; - border-bottom-style: none; - border-left-style: none; - /*background-color: #DADAEF;*/ - /*background-color: #eeeeff;*/ - /*background-color: #EEEEEE;*/ - background-color: #CCE6CA; - } - - .memTemplItemLeft, .memTemplItemRight { - border-bottom-width: 2px; - border-bottom-style: solid; - font-weight: bold; - } - - .memItemLeft { font-size: 11px; } - .memItemRight { font-size: 12px; } - .memTemplItemLeft { font-size: 11px; } - .memTemplItemRight { font-size: 12px; } - - .memTemplParams { - color: #FFFFFF; - background-color: #000000; - font-size: 11px; - font-weight: bold; - } - - .groupText, .groupHeader { - color: #09550B; - margin-top: 15px; - font-size: 130%; - font-weight: bold; - } - diff --git a/katabatic/doc/AutoContact.dox b/katabatic/doc/AutoContact.dox index 71c49147..142ab2af 100644 --- a/katabatic/doc/AutoContact.dox +++ b/katabatic/doc/AutoContact.dox @@ -1,364 +1,432 @@ // -*- C++ -*- - namespace Katabatic { /*! \class AutoContact - * \brief Self-sizing Contact (\b API). * - * \see \ref buildRules. + * \brief Abstract base class for AutoContact * - * \section secAutoContactSplitting AutoContact splitting mechanism + * \section secACCache Caching Mechanism * - * An AutoContact splitting occurs when more than two layers connects - * to a single AutoContact. + * To bypass the Ring/Hook mechanism \e and the subsequent Session::Lookup() + * call, the AutoSegments anchored on an AutoContact are cached in the + * AutoContact itself. They can be accessed through \c getHorizontalN() and + * getVerticalN() accessors \c N depending on the subtype of AutoContact. * - * General Case + * Cached AutoSegments are updated in the AutoContact::updateTopology() + * function only. * - *
    - *
  1. Create a \b secondary contact, so that both the original - * and the secondary abide by the two layers rule. - *
  2. Create new AutoSegments to connect original to secondary. - * There could be one or two segments created according to - * the layers distance. - *
  3. Re-attach the AutoSegments to the right AutoContact. - * The rule being that an AutoSegment is attached to the - * lowest AutoContact containing it's Layer. - *
  4. The orignal & secondary contact are passed trough - * the connexity restauration procedure. - *
* - * Importants Points + * \section secACInvalidate Invalidate on AutoContacts * + * The invalidation of an AutoContact invalidate all the segments + * that are anchored on it. + * + * Special Case of HTee & VTee + * + * When invalidating an HTee or VTee, two out of the three anchored + * segments are parallels. The \e aligned constraint is passed on + * those two. By default, when we invalidate an AutoSegment, the + * invalidation is applied to the whole aligned set through the + * AutoSegment::getAligneds() collection. So if one of the parallel + * is invalidated and the other not, it should only be because we + * are already in \c getAligneds(), then we do not want to invalidate + * again the whole aligned set. In that case, we perform an atomic only + * invalidation (reset Katabatic::KbPropagate). + * + * For the complete invalidation/revalidation mechanism see + * \ref secSessionAlgo "Session Algorithm". + * + * + * \section secDiffFromKatabatic2 Notes - Differences from Katabatic 2 + * + * From the previous version of Katabatic, AutoContact have + * been greatly stripped down (again). They are now always punctual + * objetcs with stricly fixed topologies: * - * - * Special Cases - * - * - * \image html AutoContact-12.png - * \image html AutoContact-13.png - * \image html AutoContact-14.png - * \image html AutoContact-15.png - * \image latex AutoContact-12.pdf - * \image latex AutoContact-13.pdf - * \image latex AutoContact-14.pdf - * \image latex AutoContact-15.pdf - */ - - /* \var GCell* AutoContact::_gcell - * \brief The GCell into which the AutoContact is located. - */ - - /*! \function AutoContact* AutoContact::fromRp ( GCell* gcell, RoutingPad* routingPad, const Layer* layer, Point point, DbU::Unit width, DbU::Unit height, bool fixed=false ); - * \param gcell The GCell in which to create the AutoContact. - * \param routingPad The RoutingPad on which to anchor the AutoContact. - * \param layer The AutoContact's layer. - * \param point The absolute position of the AutoContact. - * \param width AutoContact's width. - * \param height AutoContact's height. - * \param fixed The AutoContact cannot be moved. - * \return Newly created AutoContact. - * - * create an AutoContact anchored on a \c RoutingPad. The AutoContact can - * be moved along the \c RoutingPad but not outside it. - * - * A remark on the \c point parameter : it must be absolute coordinates, but - * as we uses the \c RoutingPad as an anchor they are translated into an - * offset from the \c RoutingPad (see how \c Hurricane handles coordinates - * through anchoring). It is also assumed that the AutoContact is to be - * electrically connected to the \c RoutingPad (no disconnection). - * So, we will faces three cases, depending on the \c RoutingPad - * underlying \c Entity : - * */ - /*! \function AutoContact* AutoContact::create ( GCell* gcell, Net* net, const Layer* layer, bool hAlignate=false, bool vAlignate=false ) - * \param gcell The GCell into which the AutoContact will be put. - * \param net The AutoContact's owner Net. - * \param layer The AutoContact's layer. - * \param hAlignate Keeps alignate (all) horizontal segments. - * \param vAlignate Keeps alignate (all) vertical segments. - * \return A new AutoContact. + //! \enum AutoContactFlag + //! Set of flags to describe the internal state of an AutoContact. + + //! \var AutoContactFlag::CntFixed + //! This contact cannot be moved. + + //! \var AutoContactFlag::CntTerminal + //! This contact is anchored on a terminal (AutoContactTerminal), must not be changed. + + //! \var AutoContactFlag::CntTurn + //! The object true class is AutoContactTurn, must not be changed. + + //! \var AutoContactFlag::CntHTee + //! The object true class is AutoContactHTee, must not be changed. + + //! \var AutoContactFlag::CntVTee + //! The object true class is AutoContactVTee, must not be changed. + + //! \var AutoContactFlag::CntInvalidated + //! At least one AutoSegment of this contact has been moved, the contact + //! position must be recomputed (in the Session revalidation). + + //! \var AutoContactFlag::CntInvalidatedCache + //! At least one AutoSegment has been broken or moved up, the connexity + //! must be checked and possibly corrected (in Session revalidation). + + //! \var AutoContactFlag::CntInCreationStage + //! Sets only during the initial creation process. + + //! \var AutoContactFlag::CntBadTopology + //! Something wrong has happened and the connexity of the AutoContact is + //! no longer ensured (too much or too less AutoSegments, too wide span of + //! AutoSegment layers). + + //! \function Hook* AutoContact::getBodyHook (); + //! Base class method proxy. + + //! \function Hook* AutoContact::getAnchorHook (); + //! Base class method proxy. + + //! \function Component* AutoContact::getAnchor () const; + //! Base class method proxy. + + //! \function Net* AutoContact::getNet () const; + //! Base class method proxy. + + //! \function const Layer* AutoContact::getLayer () const; + //! Base class method proxy. + + //! \function DbU::Unit AutoContact::getX () const; + //! Base class method proxy. + + //! \function DbU::Unit AutoContact::getY () const; + //! Base class method proxy. + + //! \function DbU::Unit AutoContact::getDx () const; + //! Base class method proxy. + + //! \function DbU::Unit AutoContact::getDy () const; + //! Base class method proxy. + + //! \function Point AutoContact::getCenter () const; + //! Base class method proxy. + + //! \function Point AutoContact::getPosition () const; + //! Base class method proxy. + + //! \function DbU::Unit AutoContact::getWidth () const; + //! Base class method proxy. + + //! \function DbU::Unit AutoContact::getHalfWidth () const; + //! Base class method proxy. + + //! \function DbU::Unit AutoContact::getHeight () const; + //! Base class method proxy. + + //! \function DbU::Unit AutoContact::getHalfHeight () const; + //! Base class method proxy. + + //! \function Components AutoContact::getSlaveComponents () const; + //! Base class method proxy. + + //! \function void AutoContact::setLayer ( const Layer* ) ; + //! Base class method proxy. + + //! \function void AutoContact::setWidth ( DbU::Unit ) ; + //! Base class method proxy. + + //! \function void AutoContact::setHeight ( DbU::Unit ) ; + //! Base class method proxy. + + //! \function void AutoContact::setSizes ( DbU::Unit w, DbU::Unit h ) ; + //! Base class method proxy. + + //! \function void AutoContact::setX ( DbU::Unit ) ; + //! Base class method proxy. + + //! \function void AutoContact::setY ( DbU::Unit ) ; + //! Base class method proxy. + + //! \function void AutoContact::setPosition ( DbU::Unit w, DbU::Unit h ) ; + //! Base class method proxy. + + //! \function void AutoContact::setPosition ( const Point& ) ; + //! Base class method proxy. + + //! \function void AutoContact::setDx ( DbU::Unit ) ; + //! Base class method proxy. + + //! \function void AutoContact::setDy ( DbU::Unit ) ; + //! Base class method proxy. + + //! \function void AutoContact::setOffset ( DbU::Unit w, DbU::Unit h ) ; + //! Base class method proxy. + + //! \function void AutoContact::translate ( const DbU::Unit& dx, const DbU::Unit& dy ) ; + //! Base class method proxy. + + //! \function bool AutoContact::isInCreationStage () const; + //! \sreturn \true if the AutoContact is still in it's initial creation stage. + + //! \function bool AutoContact::isInvalidated () const; + //! \sreturn \true if the some AutoSegment has changed and the AutoContact needs + //! to be repositionned (through a call to AutoContact::updateGeometry()). + + //! \function bool AutoContact::isInvalidatedCache () const; + //! \sreturn \true if the some AutoSegment has changed and the AutoContact + //! topology needs to be restored, as a gap may have appeared + //! (through a call to AutoSegment::updateTopology()). + + //! \function bool AutoContact::isTurn () const; + //! \sreturn \true if the dynamic type of the AutoContact is of type Turn. + + //! \function bool AutoContact::isTee ( unsigned int direction ) const; + //! \sreturn \true if the dynamic type of the AutoContact is either of type + //! AutoContactHTee or AutoContactVTee, according to \c direction. + + //! \function bool AutoContact::isHTee () const; + //! \sreturn \true if the dynamic type of the AutoContact is of type AutoContactHTee. + + //! \function bool AutoContact::isVTee () const; + //! \sreturn \true if the dynamic type of the AutoContact is of type AutoContactHTee. + + //! \function bool AutoContact::isFixed () const; + //! \sreturn \true if the AutoContact cannot be moved. + + //! \function bool AutoContact::hasBadTopology () const; + //! \sreturn \true if the AutoContact topology has been broken and a gap has appeared. + //! (sould not happen...) + + //! \function bool AutoContact::canDestroy ( unsigned int flags ) const; + //! \sreturn \true if the AutoContact could be destroyed, that is, no segments + //! remains anchored on it. If \c flags contains Katabatic::KbWarnOnError, + //! issue an error message. + + //! \function bool AutoContact::canMoveUp ( const AutoSegment* moved ) const; + //! \sreturn \true if \c segment can be moved up without triggering a topological + //! modification. It meaans that: + //! - Without \c moved, the AutoContact needs only one layer. + //! - \c moved go from \e below the AutoContact to \e above. + + //! \function Contact* AutoContact::base () const; + //! \sreturn The Hurricane::Contact which is decorated. + + //! \function size_t AutoContact::getAllocateds (); + //! \sreturn The total number of AutoContact currently allocateds. + + //! \function const Name& AutoContact::getStaticName (); + //! \sreturn The name of the Hurricane::ExtensionGo slice. + + //! \function const Name& AutoContact::getName () const; + //! \sreturn The name of the Hurricane::ExtensionGo slice. + + //! \function const Name& AutoContact::getId () const; + //! \sreturn The unique \c identifer of the AutoSegment. + + //! \function Box AutoContact::getBoundingBox () const; + //! \see Contact::getBoundingBox(). + + //! \function GCell* AutoContact::getGCell () const; + //! \sreturn The GCell into which the AutoContact is located. + + //! \function AutoSegment* AutoContact::getOpposite ( const AutoSegment* segment ) const; + //! \sreturn The AutoSegment other the same direction as \c segment, this is + //! only meaningful on AutoContactHTee or AutoContactVTee. It there is + //! no opposite, \c NULL is returned. + + //! \function AutoSegment* AutoContact::getSegment ( unsigned int index ) const; + //! \sreturn The nth anchored AutoSegment. The index is significant: + //! - \b 0 : first horizontal (\b h1). + //! - \b 1 : second horizontal (\b h2). + //! - \b 2 : first vertical (\b b1). + //! - \b 3 : second vertical (\b b2). + //! + //! Not all the indexes are filled for every AutoContact. For example + //! \c Turn have \b h1 and \b b1, and \c HTee have \b h1, \b h2 and + //! \b v1. + + //! \function unsigned int AutoContact::getMinDepth () const; + //! \sreturn The layer depth of the bottom layer of the AutoContact. + + //! \function unsigned int AutoContact::getMaxDepth () const; + //! \sreturn The layer depth of the top layer of the AutoContact. + + //! \function void AutoContact::getLengths ( DbU::Unit* lengths, AutoSegment::DepthLengthSet& processeds ); + //! \param lengths A table of DbU::Unit, the size of all routing layers used. + //! \param processeds An AutoSegment sorted set holding all the already processeds + //! AutoSegments. + //! + //! Compute the lengths over the owning GCell of all the AutoSegments anchored + //! on this AutoContact. The lengths are added to the total length table + //! \c lengths. To avoid double accounting of the local AutoSegments + //! that have both source & target in the same GCell, we keep a set + //! of already processeds AutoSegments in \c processeds. + + //! \function Box AutoContact::getNativeConstraintBox () const; + //! \sreturn The native constraint box (that is, whithout any user constraints + //! applied). For AutoContactTerminal, this is the Box of the supporting + //! external component, and for all others the bounding box of the + //! owning GCell. + + //! \function Interval AutoContact::getUConstraints ( unsigned int direction ) const; + //! \sreturn The constraint interval in \c direction (that is, the relevant side + //! of the constraint box). + + //! \function DbU::Unit AutoContact::getCBXMin () const; + //! \sreturn The X coordinate of the bottom left corner of the constraint box. + + //! \function DbU::Unit AutoContact::getCBYMin () const; + //! \sreturn The Y coordinate of the bottom left corner of the constraint box. + + //! \function DbU::Unit AutoContact::getCBXMax () const; + //! \sreturn The X coordinate of the top right corner of the constraint box. + + //! \function DbU::Unit AutoContact::getCBYMax () const; + //! \sreturn The Y coordinate of the top right corner of the constraint box. + + //! \function Box AutoContact::getConstraintBox () const; + //! \sreturn The current constraint box: the native constraint box with all + //! the user's contraints applieds. + + //! \function Box& AutoContact::intersectConstraintBox ( Box& box ) const; + //! \sreturn The intersection between \c box and the constraint box. The + //! result is stored into \c box and a reference to it is returned. + + //! \function void AutoContact::invalidate ( unsigned int flags=0 ); + //! Invalidate the AutoContact, schedule it for revalidation in the + //! Session. If flag containt Katabatic::CntInvalidTopology, + //! the topology of the AutoContact will also be checked and + //! possible gap closeds. + //! + //! The revalidations methods associated are: + //! - AutoSegment::updateGeometry(), recompute the punctual contact position. + //! - AutoSegment::updateTopology(), restore the connexity. + + //! \function void AutoContact::updateGeometry (); + //! Compute the new position of the AutoContact based on the AutoSegment + //! positions. The Session mechanism ensure that all AutoSegment are + //! set into their final positions before calling this updator. + + //! \function void AutoContact::updateTopology (); + //! Modificate the AutoContact topology to close any gap. This could + //! be by changing layer or creating a new dogleg on an incident + //! AutoSegment. + + //! \function void AutoContact::_getTopology ( Component*& anchor, Horizontal**& hs, Vertical**& vs, size_t sz ); + //! \param anchor The anchor, if any. + //! \param hs The Hurricane::Horizontal anchored. + //! \param vs The Hurricane::Vertical anchored. + //! \param sz The size of boths \c hs & \c vs table passed as arguments. + //! + //! Fill \c anchor , \c hs and \c vs with the components anchored on this + //! AutoContact. + + //! \function void AutoContact::showTopologyError ( const std::string& message ); + //! Comprensive display of the topology of the AutoContact to ease the + //! debug work. Prepend with the error message \c message. Do no throw + //! an error. + + //! \function void AutoContact::checkTopology (); + //! Check for topology correctness (no gaps), display an error message + //! if needed. + + //! \function void AutoContact::setGCell ( GCell* gcell ); + //! Set the owning GCell. + + //! \function void AutoContact::setCBXMin ( DbU::Unit xMin ); + //! Set the lower left X coordinate of the constraint box. + //! + //! \remark It cannot go outside the GCell bounding box. + + //! \function void AutoContact::setCBYMin ( DbU::Unit yMin ); + //! Set the lower left Y coordinate of the constraint box. + //! + //! \remark It cannot go outside the GCell bounding box. + + //! \function void AutoContact::setCBXMax ( DbU::Unit xMax ); + //! Set the upper right X coordinate of the constraint box. + //! + //! \remark It cannot go outside the GCell bounding box. + + //! \function void AutoContact::setCBYMax ( DbU::Unit yMax ); + //! Set the upper right Y coordinate of the constraint box. + //! + //! \remark It cannot go outside the GCell bounding box. + + //! \function void AutoContact::setConstraintBox ( const Box& box ); + //! Set the constraint box. + //! + //! \remark It cannot go outside the GCell bounding box. + + //! \function bool AutoContact::restrictConstraintBox ( DbU::Unit min, DbU::Unit max, unsigned int flags=KbWarnOnError ); + //! \param min The minimum of the restriction interval. + //! \param max The maximum of the restriction interval. + //! \param flags Gives the direction of the restriction. + //! \return \true if the restriction was actually applied. + //! + //! Restrict the current constraint box but check if the restriction + //! will not lead to an empty interval, in that case, do nothing and + //! return \false. + + + /*! \class LocatorHelper * - * As AutoContact are Contacts restricted to, at best, two adjacent - * routing layers, the layer argument is either a single routing - * contact or a two metals only VIA. - */ - - /*! \function AutoContact* AutoContact::create ( GCell* gcell, RoutingPad* rp, const Layer* layer, const DbU::Unit dx, const DbU::Unit dy, const DbU::Unit width, const DbU::Unit height, bool hAlignate=false, bool vAlignate=false, bool fixed=false ); - * \param gcell The GCell into which the AutoContact will be put. - * \param rp The RoutingPad anchor. - * \param layer The AutoContact's layer. - * \param dx Horizontal offset to the component. - * \param dy Vertical offset to the component. - * \param width Width of the AutoContact. - * \param height Height of the AutoContact. - * \param hAlignate Keeps alignate (all) horizontal segments. - * \param vAlignate Keeps alignate (all) vertical segments. - * \param fixed The AutoContact cannot be moved. - * \return A new AutoContact. + * \brief Locator Helper Collection's Locators * - * create an AutoContact anchored on a component : the component must - * be a \RoutingPad, sets the isTerminal() flag. + * Provide a small uniform walktough over the AutoSegments anchored + * on AutoContacts. The \c flags argument allows to choose between + * direction and include perpandiculars (in that case all segments + * are processeds). * - * As AutoContact are Contacts restricted to, at best, two adjacent - * routing layers, the layer argument is either a single routing - * contact or a two metals only VIA. - */ - - /*! \function GCell* AutoContact::getGCell() const - * \brief Returns the GCell into which the AutoContact is located. - */ - - /*! \function void AutoContact::updateGeometry() - * \brief Perform the segment resizing. * - * As it will resizes Hurricane components, this function call must - * be enclosed into an updateSession. - */ - - /*! \function AutoContacts AutoContact::getCollapseds ( unsigned int direction ); - * \param direction restrict the search to that direction. - * \return The \c Collection of AutoContact that are collapsed on this one, - * that is, linked through collapsed AutoSegment of type - * \c direction. - */ - - /*! \function bool AutoContact::isTerminal () const; - * \return \true if the AutoContact is anchored on a terminal. - */ - - /*! \function bool AutoContact::isHAlignate () const; - * \return \true if the horizontal AutoSegment anchored on the AutoContact - * must be kept aligned. - * \see \ref collapseCanonical - */ - - /*! \function bool AutoContact::isVAlignate () const; - * \return \true if the vertical AutoSegment anchored on the AutoContact - * must be kept aligned. - * \see \ref collapseCanonical - */ - - /*! \function void AutoContact::getLengths ( DbU::Unit* lengths, set& segments ); - * \return Increment the table of lengths for the lengths of segments of - * this AutoContact and inside it's owning GCell. - */ - - /*! \function void AutoContact::setTerminal ( bool isTerminal ); - * \param isTerminal set the terminal flag. - */ - - /*! \function bool AutoContact::isHExtended (); - * \return \true if the \b privileged direction of the AutoContact is horizontal. + * \section secLocHelperImplementation Implementation Details * - * To be privileged in horizontal direction means that the \c Y coordinates - * of all horizontals of the AutoContact are the same and imposed in either - * of the following ways: - *
    - *
  • Have a horizontal global (i.e. stem). The AutoContact could - * be non-punctual along the horizontal axis. - *
  • All it's horizontals are kept aligneds. - *
- * \note An AutoContact can be neither horizontally extended nor vertically - * extended. In which case it is punctual. + * As, at most, two horizontals and two verticals may be anchored on + * any AutoContact subtype, the locator helper perform a walk through + * a virtual table of 4 elements. The two first are the horizontals, + * the two last the verticals. The meaning of this index is consistent + * whith the \c index argument of AutoContact::getSegment(). When + * a segment is not present in an AutoContact, the \c getSegment() + * returns \c NULL and the LocatorHelper::progress() function will + * skip it. * - * \image html AutoContact-10.png - * \image latex AutoContact-10.pdf - */ - - /*! \function bool AutoContact::isVExtended (); - * \return \true if the \b privileged direction of the AutoContact is vertical. + * The private methods: + * - \c LocatorHelper::_min() + * - \c LocatorHelper::_max() * - * To be privileged in vertical direction means that the \c X coordinates - * of all verticals of the AutoContact are the same and imposed in either - * the following way: - *
    - *
  • Have a vertical global (i.e. stem). The AutoContact could - * be non-punctual along the vertical axis. - *
  • All it's vertical are kept aligneds. - *
- * \note An AutoContact can be neither horizontally extended nor vertically - * extended. In which case it is punctual. - * - * \image html AutoContact-11.png - * \image latex AutoContact-11.pdf + * Computes the bounds of \c _index according to the value of \c _flags: + * - \c KbHorizontal : \c 0 to less than \c 2. + * - \c KbVertical : \c 2 to less than \c 4. + * - \c KbHorizontal|KbVertical : \c 0 to less than \c 4. */ - /*! \function void AutoContact::setHAlignate ( bool hAlignate ); - * \param hAlignate The new horizontal alignement mode. - * - * When horizontal aligment mode is active, all horizontals of the - * AutoContact are kept aligned (on the same \b Y coordinate). - * \see \ref collapseCanonical - */ + //! \function LocatorHelper::LocatorHelper ( AutoContact* contact, unsigned int flags ); + //! Create a helper to iterate over the AutoSegments anchored on \c contact. + //! The \c flags arguments allow to select: + //! - The direction: Katabatic::KbHorizontal or Katabatic::KbVertical. + //! - Perpandicular inclusion: Katabatic::KbWithPerpands. + //! + //! When setting KbWithPerpands, all the segments will be iterated over. + //! It may seems a somewhat contorted way of doing things, the reason is + //! the ability to share (an pass) flags directly between different + //! functions. - /*! \function void AutoContact::setVAlignate ( bool vAlignate ); - * \param vAlignate The new vertical alignement mode. - * - * When vertical aligment mode is active, all verticals of the - * AutoContact are kept aligned (on the same \b X coordinate). - * \see \ref collapseCanonical - */ + //! \function bool LocatorHelper::isValid() const; + //! \sreturn \true if there is an AutoSegment to be processed. - /*! \function void AutoContact::restoreHConnexity ( DbU::Unit y, bool split=false ); - * \param y When splitting, the coordinate of the vertical strap segments. - * \param split Wether to separate the various horizontals or not. - * - * Ensure that there is no gap between horizontals of this AutoContact. - *
    - *
  • The default behavior (split=false) is simply to sets the - * H Alignate flags, thus forcing the alignment on the same \c Y. - *
  • To allow the horizontals to be on different axis, we can split - * them on differents AutoContacts aligneds vertically. The AutoSegments - * created between thoses secondary contacts are calleds "straps" and - * sets on the \c Y axis. - *
- * In case of splitting, all the verticals are kept on the original AutoContact. - */ + //! \function AutoSegment* LocatorHelper::getSegment() const; + //! \sreturn The current AutoSegment. \c NULL if the loop is over. - /*! \function void AutoContact::restoreVConnexity ( DbU::Unit x, bool split=false ); - * \param x When splitting, the coordinate of the horizontal strap segments. - * \param split Wether to separate the various verticals or not. - * - * Ensure that there is no gap between verticals of this AutoContact. - *
    - *
  • The default behavior (split=false) is simply to sets the - * V Alignate flags, thus forcing the alignment on the same \c X. - *
  • To allow the verticals to be on different axis, we can split - * them on differents AutoContacts aligneds horizontally. The AutoSegments - * created between thoses secondary contacts are calleds "straps" and - * sets on the \c X axis. - *
- * In case of splitting, all the horizontals are kept on the original AutoContact. - */ - - /*! \function void AutoContact::invalidate (); - * Put this AutoContact into the invalidated set (see \ref katabaticSession). - */ - - - //! \addtogroup katabaticSession - //! \{ - - /*! \function bool AutoContact::isInvalidated () const; - * \return \True if the AutoContact is invalidated, i.e. in the - * Katabatic Session, one or more of it's anchored AutoSegment - * being moved. - * - * \see autoInvalidate(). - */ - - /*! \function bool AutoContact::setInvalidated ( bool state ); - * \param state set the state of the AutoContact regarding the - * Katabatic Session. - * - * \see autoInvalidate(). - */ - - /*! \function Box AutoContact::getNativeConstraintBox () const; - * Return the native constraint box, that is, the \Box of the - * owning GCell or the bounding box of the terminal it's anchored - * upon. - */ - - /*! \function DbU::Unit AutoContact::getCBXMin () const; - * \return The X coordinate of the lower left corner. - */ - - /*! \function DbU::Unit AutoContact::getCBYMin () const; - * \return The Y coordinate of the lower left corner. - */ - - /*! \function DbU::Unit AutoContact::getCBXMax () const; - * \return The X coordinate of the upper right corner. - */ - - /*! \function DbU::Unit AutoContact::getCBYMax () const; - * \return The Y coordinate of the upper right corner. - */ - - /*! \function Box AutoContact::getConstraintBox () const; - * \return The current constraint box. - */ - - /*! \function Box& AutoContact::intersectConstraintBox ( Box& box ) const; - * \param box The box to intersect width. - * \return A reference on the the box given as argument. - * - * Do the intersection of the constraint box and the one given - * as argument. Store the result in place. - */ - - /*! \function void AutoContact::restoreNativeConstraintBox (); - * reset the constraint box to the native constraint box. - */ - - /*! \function void AutoContact::setConstraintBox ( const Box& box ); - * \param box The new constraint box. - * - * sets the constraint box. - */ - - /*! \function void AutoContact::restrictConstraintBox ( DbU::Unit constraintMin, DbU::Unit constraintMax, unsigned int direction ); - * \param constraintMin The constraint lower bound. - * \param constraintMax The constraint upper bound. - * \param direction The direction into which apply the constraint. - * - * restrict the constraint box in one direction. - */ - - /*! \function void AutoContact::setCBXMin ( DbU::Unit xMin ); - * \param xMin The X cooordinate of the lower left corner. - * - * sets the X coordinate of the lower left corner. - */ - - /*! \function void AutoContact::setCBYMin ( DbU::Unit yMin ); - * \param yMin The Y cooordinate of the lower left corner. - * - * sets the Y coordinate of the lower left corner. - */ - - /*! \function void AutoContact::setCBXMax ( DbU::Unit xMax ); - * \param xMax The X cooordinate of the upper right corner. - * - * sets the X coordinate of the upper right corner. - */ - - /*! \function void AutoContact::setCBYMax ( DbU::Unit yMax ); - * \param yMax The Y cooordinate of the upper right corner. - * - * sets the Y coordinate of the upper right corner. - */ - - //! \} + //! \function void LocatorHelper::progress(); + //! \sreturn Go to the next AutoSegment. } - namespace { - - } diff --git a/katabatic/doc/AutoSegment.dox b/katabatic/doc/AutoSegment.dox index ae35d17c..e0177f1e 100644 --- a/katabatic/doc/AutoSegment.dox +++ b/katabatic/doc/AutoSegment.dox @@ -1,677 +1,960 @@ // -*- C++ -*- - namespace Katabatic { /*! \class AutoSegment - * \brief Self-sizing segment (\b API). * - * AutoSegment provide an uniform way of accessing AutoHorizontal - * and AutoVertical self-sizing segments. AutoSegments mainly contains - * a pointer to the associated Horizontal/Vertical Hurricane segment. - * This is the Hurricane segment which is part of the ring of the - * AutoContact. Thus we can directly access the Hurricane segment - * from the AutoSegment, but for the othey around we uses a lookup - * table in the Katabatic \c ToolEngine (see the - * Katabatic::_Lookup() member function). + * \brief Abstract base class for AutoSegment * - * In order to inform the router of an AutoSegment state change, - * a callback function SegmentRevalidateCB can be positionned. * - * \c Segment associated to AutoSegment are automatically oriented - * in such a way that the source \c Hook is always \e lower than - * the target \c hook. For an Horizontal segment it means that - * the abcissa of the source is inferior to the abcsissa of the - * target. It goes the same way for Vertical segment with the - * ordinate. + * \section secASCreation Creating AutoHorizontal & AutoVertical * - * KatabaticSession mechanism : this is fairly similar to the - * \c Hurricane updateSession one. When a segment is either moved - * by the router or resized by it's AutoContact it is invalidated - * with autoInvalidate() and put into the set of invalidated - * segments. When the KatabaticSession is closed the onRevalidate() - * member function is called on each segment, which in turn calls - * the router's callback. See Session::open(), Session::revalidate(), - * Session::close() and \ref katabaticSession. + * AutoSegment is the abstract base class for AutoHorizontal and + * AutoVertical. They are must be created only through the + * factory method: AutoSegment::create(). * - * \remark As this object uses the decorator Design Pattern, almost all - * functions are pure virtuals. Implementation take place in a - * derived class \c AutoSegmentConcrete which is not documented, - * (same specifications as AutoSegment). * - * \see AutoSegmentDecorator class. - */ - - /*! \typedef AutoSegment::RevalidateCb_t ( AutoSegment* ) - * Function type for the router callback. See AutoSegment::setRevalidateCb(). - */ - - /* \function static AutoSegment::RevalidateCb_t* AutoSegment::setRevalidateCb ( RevalidateCb_t* cb ); - * \param cb The new router callback to install. - * \return The previous router callback. + * \section secASCharacteristics Characteristics of AutoSegments * - * Install the callback to call when an AutoSegment is revalidated, - * The callback is called by onRevalidate() on closing the Katabatic - * update session. - */ - - /*! \function bool AutoSegment::isHorizontal () const; - * \return \true if the AutoSegment is horizontal. - */ - - /*! \function bool AutoSegment::isVertical () const; - * \return \true if the AutoSegment is vertical. - */ - - /*! \function bool AutoSegment::isGlobal () const; - * \return \true if the AutoSegment is global : source and target - * AutoContact are not in the same GCell. - */ - - /*! \function bool AutoSegment::isLocal () const; - * \return \true if the AutoSegment is local : source and target - * belongs to the same GCell. - */ - - /*! \function bool AutoSegment::isTerminal () const; - * \return \true if the AutoSegment is terminal : the only way - * to access a terminal AutoContact (may not be directly - * achored on that terminal). - */ - - /*! \function bool AutoSegment::isCollapsed () const; - * \return \true if the AutoSegment is collapsed : kept to zero-length. - */ - - /*! \function bool AutoSegment::isCanonical () const; - * \return \true if the AutoSegment is canonical that is, the leftmost - * (for horizontal) or lowest (for vertical) segment of a set - * of collapsed segments. The canonical segment must be used - * as the unique representant for the collapsed set. - */ - - /*! \function bool AutoSegment::isFixed () const; - * \return \true if the AutoSegment cannot be moved (through setAxis()). - */ - - /*! \function bool AutoSegment::isAccountable () const; - * \return \true if the AutoSegment is canonical and not collapsed. - * Normally those flags are mutually exclusives, but better safe - * than sorry. - * - */ - - /*! \function virtual GCell* AutoSegment::getGCell () const; - * \return The GCell owning the source AutoContact. - */ - - /*! \function Net* AutoSegment::getNet () const; - * \return The net this AutoSegment is part of. - */ - - /*! \function Layer* AutoSegment::getLayer () const; - * \return The layer of the AutoSegment. - */ - - /*! \function virtual Segment* AutoSegment::getSegment (); - * \return The associated \c Hurricane segment. - */ - - /*! \function virtual Segment* AutoSegment::getSegment () const; - * \return The associated \c Hurricane segment. - * - * This function is for use in const members. - */ - - /*! \function virtual Segment* AutoSegment::getHorizontal (); - * \return If the the associated segment is horizontal, returns it. - * Otherwise (vertical) returns \c NULL. - */ - - /*! \function virtual Segment* AutoSegment::getVertical (); - * \return If the the associated segment is vertical, returns it. - * Otherwise (horizontal) returns \c NULL. - */ - - /*! \function DbU::Unit AutoSegment::getAxis () const; - * \return The segment axis : Y for horizontals and X for verticals. - */ - - /*! \function AutoContact* AutoSegment::getSource () const; - * \return The source AutoContact. - */ - - /*! \function AutoContact* AutoSegment::getTarget () const; - * \return The target AutoContact. - */ - - /*! \function DbU::Unit AutoSegment::getSourcePosition () const; - * \return The lower bound of the segment into the routing track, equal - * the source coordinate minus the half pitch. - */ - - /*! \function DbU::Unit AutoSegment::getTargetPosition () const; - * \return The upper bound of the segment into the routing track, equal - * the target coordinate plus the half pitch. - */ - - /*! \function virtual void AutoSegment::setAxis ( DbU::Unit axis, bool realignate=false, set* processeds=NULL ); - * \param axis New coordinate of the axis. For an horizontal segment - * it will change the Y coordinate and for a vertical, - * the X coordinate. - * \param realignate It set to true, the new axis position will be propagated - * to all collapsed segments, even if the current AutoSegment - * don't need to be moved. - * \param processeds The set of already processeds aligneds AutoSegments. - * - * setAxis is the API frontend to the alignate function. It actually - * only checks if the segment has to be moved and if the move is to - * be propagated to the aligned AutoSegments. - */ - - /*! \function virtual void AutoSegment::orient (); - * sets the source and target \c Hook of the Hurricane segment so - * the source is always lower than the target. - */ - - /*! \function virtual void AutoSegment::invalidate (); - * adds the AutoSegment to the invalidate session. This will happens - * whenever a segment is moved by the router through setAxis() or - * resized by it's AutoContact. - */ - - /* \function virtual void AutoSegment::onRevalidate (); - * This function is called at the time the AutoUpdate session is closed - * and calls the router's callback. - */ - - /*! \function virtual void AutoSegment::getConstraints ( DbU::Unit& constraintMin, DbU::Unit& constraintMax ) const; - * \param constraintMin Where to store the constraint lower bound. - * \param constraintMax Where to store the constraint upper bound. - * \return Always \true (don't remember why...). - * - * Constraints are deduced from the constraint box of the source - * AutoContact. - * - * \see \ref NetConstraints - */ - - /*! \function virtual void AutoSegment::getConstraints ( Interval& i ) const; - * \param i The constraint interval. - * \return Always \true (don't remember why...). - * - * \see getConstraints(), \ref NetConstraints - */ - - /*! \function DbU::Unit AutoSegment::getSlack () const; - * \return The length of the constraint interval. - * - * \see \ref NetOptimals - */ - - /*! \function DbU::Unit AutoSegment::getOptimalMin () const; - * \return The lower bound of the optimal interval. - * - * \see \ref NetOptimals - */ - - /*! \function DbU::Unit AutoSegment::getOptimalMax () const; - * \return The upper bound of the optimal interval. - * - * \see \ref NetOptimals - */ - - /*! \function Interval& AutoSegment::getOptimal ( Interval& i ) const; - * \param i The optimal interval. - * \return The interval given as argument. - * - * \see \ref NetOptimals - */ - - /*! \function DbU::Unit AutoSegment::getCost ( DbU::Unit axis ) const; - * \param axis An axis coordinate. - * \return The distance from the nearest optimal interval bound. - * - * \see \ref NetOptimals - */ - - /*! \function AutoSegment* AutoSegment::getCanonical ( DbU::Unit& sourcePosition, DbU::Unit& targetPosition ); - * \param sourcePosition Lower bound of the super-AutoSegment. - * \param targetPosition Upper bound of the super-AutoSegment. - * \return The canonical AutoSegment of the super-AutoSegment. - * - * A super-AutoSegment is the set of all AutoSegment which have been - * bound together through (perpandicular) collapsed AutoSegment. - * They behave like one big AutoSegment. For algorithmic purpose we - * needs a canonical representant : it will be the lower AutoSegment - * (the one with the lower source coordinates). - * We also needs to know the real extend of the super-AutoSegment : it's - * returned through \c sourcePosition and \c targetPosition parameters. - */ - - /*! \function AutoSegment* AutoSegment::getCanonical ( Interval& i ); - * \param i interval of the super-AutoSegment. - * \return The canonical AutoSegment of the super-AutoSegment. - * - * \see AutoSegment::getCanonical(). - */ - - /*! \function AutoSegments AutoSegment::getCollapseds ( bool withPerpand=false ); - * \return The \Collection of AutoSegment that are collapsed to this one - * (i.e. linked through perpandicual collapsed ones). Together - * they forms one big virtual AutoSegment. - */ - - /*! \function AutoSegments AutoSegment::getCollapsedPerpandiculars (); - * \return The \Collection of AutoSegment that are perpandicular to this - * one and it's collapsed fellows. - * - * Note that this \Collection contains only \b GLOBAL perpandicular - * AutoSegment and \b Terminal perpandicular AutoSegment. - */ - - /*! \function void AutoSegment::setCanonical ( bool state ); - * \param state sets the isCanonical() flag to this value. - */ - - /*! \function void AutoSegment::setTerminal ( bool state ); - * \param state sets the isTerminal() flag to this value. - */ - - /*! \function void AutoSegment::setLayer ( const Layer* layer ); - * \param layer Changes the \Hurricane segment layer. - */ - - /*! \function void AutoSegment::setPositions (); - * compute the positions of the AutoSegment into the routing track, - * from the \Hurricane segment extentions and the half-pitch. - * - * \see getSourcePosition() & getTargetPosition(). - */ - - /*! \function void AutoSegment::collapse (); - * sets the AutoSegment into collapsed state (zero-length). - */ - - /*! \function void AutoSegment::expand (); - * Uncollapse the AutoSegment, re-compute the constraints on - * the splitted sets. - */ - - /*! \function bool AutoSegment::toConstraintAxis ( set* processeds=NULL ); - * \return \True if the AutoSegment axis has been moved. - * - * If the segment axis is outside the constraint interval, set it - * the nearest constraint interval bound. - */ - - /*! \function bool AutoSegment::toOptimalAxis ( set* processeds=NULL ); - * \return \True if the AutoSegment axis has been moved. - * - * If the segment axis is outside the optimal interval, set it - * the nearest optimal interval bound. - */ - - /*! \function void AutoSegment::alignate ( DbU::Unit axis ); - * \param axis New axis's coordinate. - * - * Move the segment axis to a new position. Adjust positions - * of the supporting Contact whenever they are anchored on terminals - * (i.e. RoutingPad). - * This function is atomic and should not be called directly - * but rather through setAxis(). It's implemented in the - * derived classes AutoHorizontal & AutoVertical. - */ - - /*! \function void AutoSegment::setOptimalMin ( DbU::Unit oMin ); - * \param oMin sets the lower bound of the optimal interval. - * - * \see getOptimalMin(), getOptimalMax(), getCost(). - */ - - /*! \function void AutoSegment::setOptimalMax ( DbU::Unit oMin ); - * \param oMin sets the upper bound of the optimal interval. - * - * \see getOptimalMin(), getOptimalMax(), getCost(). - */ - - /*! \function void AutoSegment::checkPositions () const; - * check the coherency between the locally shadowed values - * of source \& target position and the real ones. If a discrepancy - * is found issue an error (but do not stop the program). - * - * Note that discrepancies are legal while the AutoSegment is - * invalidated (see \ref katabaticSession). - */ - - /*! \function void AutoSegment::checkInvalidated () const; - * issue an error if the AutoSegment is invalidated. Mainly used - * to debug the Katabatic Session mechanism (\ref katabaticSession). - */ - - - //! \addtogroup NetOptimals - //! \{ - - /*! \function virtual void AutoSegment::computeOptimal ( set* processeds=NULL ); - * compute the AutoSegment optimal position interval. - */ - - /*! \function virtual DbU::Unit AutoSegment::getOrigin () const; - * \return The lower bound of the GCell in which the AutoSegment is - * (\c YMin for horizontals, \c XMin for verticals). - */ - - /*! \function virtual DbU::Unit AutoSegment::getExtremity () const; - * \return The upper bound of the GCell in which the AutoSegment is - * (\c YMax for horizontals, \c XMax for verticals). - */ - - //! \} - - - //! \addtogroup katabaticSession - //! \{ - - /*! \function bool AutoSegment::isInvalidated () const; - * \return \True if the AutoSegment is invalidated, i.e. in the - * Katabatic Session, it's axis having being moved by the - * router. - * - * \see autoInvalidate(). - */ - - /*! \function bool AutoSegment::setInvalidated ( bool state ); - * \param state set the state of the AutoSegment regarding the - * Katabatic Session. - * - * \see autoInvalidate(). - */ - - //! \} - - - /*! \class AutoHorizontal - * \brief Horizontal AutoSegment (\b API). - */ - - /*! \function static AutoHorizontal* AutoHorizontal::create ( Horizontal* horizontal, int type, bool terminal=false, bool collapsed=false ); - * \param horizontal The associated \c Hurricane segment. - * \param type Global, local or guessed kind. - * \param terminal Whether the segment is tightly linked to a terminal. - * \param collapsed Whether the segment must be kept of null length. - * \return The newly created AutoSegment. - */ - - /*! \function static AutoHorizontal* AutoHorizontal::create ( AutoContact* source, AutoContact* target, const Layer* layer, DbU::Unit y, DbU::Unit width, int type, bool terminal=false, bool collapsed=false ); - * \param source The source \c Component. - * \param target The target \c Component. - * \param layer The segment's layer. - * \param y The segment's Y coordinate. - * \param width The segment's width. - * \param type Global, local or guessed kind. - * \param terminal Whether the segment is tightly linked to a terminal. - * \param collapsed Whether the segment must be kept of null length. - * \return The newly created AutoSegment. - * - * Allocate both \c Hurricane segment and Katabatic AutoSegment. - */ - - - /*! \class AutoVertical - * \brief Vertical AutoSegment (\b API). - */ - - /*! \function static AutoVertical* AutoVertical::create ( Vertical* vertical, int type, bool terminal=false, bool collapsed=false ); - * \param vertical The associated \c Hurricane segment. - * \param type Global, local or guessed kind. - * \param terminal Whether the segment is tightly linked to a terminal. - * \param collapsed Whether the segment must be kept of null length. - * \return The newly created AutoSegment. - */ - - /*! \function static AutoVertical* AutoVertical::create ( AutoContact* source, AutoContact* target, const Layer* layer, DbU::Unit x, DbU::Unit width, int type, bool terminal=false, bool collapsed=false ); - * \param source The source \c Component. - * \param target The target \c Component. - * \param layer The segment's layer. - * \param x The segment's X coordinate. - * \param width The segment's width. - * \param type Global, local or guessed kind. - * \param terminal Whether the segment is tightly linked to a terminal. - * \param collapsed Whether the segment must be kept of null length. - * \return The newly created AutoSegment. - * - * Allocate both \c Hurricane segment and Katabatic AutoSegment. - */ - - - /*! \function AutoSegment* AutoSegment::create ( AutoContact* source, AutoContact* target, unsigned int dir, int type, bool terminal=false, bool collapsed=false ); - * \param source The source AutoContact. - * \param target The target AutoContact. - * \param dir The AutoSegment direction (\b H / \b V). - * \param type Whether the AutoSegment is \b LOCAL, \b GLOBAL or must be guessed. - * \param terminal The AutoSegment is used to connect a terminal. - * \param collapsed The AutoSegment is collapsed. - * \return A new AutoSegment. - * - * create the AutoSegment between \c source and \c target, update the GCell - * density if needed. - * - * If the \c dir parameter do not contains the \b HORIZONTAL or \b VERTICAL - * boolean flags an error will be thrown. - */ - - - /*! \enum AutoSegment::Type - * This enumeration is used to hints AutoSegment constructor about - * the kind of segment we are about to create. Once created, the - * kind of AutoSegment is stored in a single boolean telling - * wether it's \b GLOBAL or \b LOCAL (see AutoSegment::isGlobal()). - * - * It is always best to avoid using AutoSegment::Guess as it implies findind - * and checking source and target anchors (through ring access). - * And in most cases we already known the kind of segment because - * we created the source and target AutoContact just before... - * See GCellConfiguration related functions. - */ - - /*! \var AutoSegment::Global - * The AutosSegment crosses at least one GCell boundary (i.e. - * source and target AutoContact do not belong to the same GCell). - */ - - /*! \var AutoSegment::Local - * The AutoSegment is fully included in one GCell. - */ - - /*! \var AutoSegment::Guess - * The AutoSegment constructor will guess the kind of AutoSegment - * by examining source and target anchors. - */ - - /*! \defgroup collapseCanonical 3. AutoSegment collapse & Canonical (internal) - * - * \section AlignedAS Collapsing AutoSegment - * - * A set of AutoSegment can be aligned together. The set will - * behave like one big AutoSegment, especially, moving one - * AutoSegment through setAxis() will move the whole set. - * - * For each set of aligned AutoSegment, we provide a canonical - * AutoSegment : the leftmost (for horizontal) or lowermost for - * verticals. - * - * There are two ways AutoSegments could be aligned : *
    - *
  • Through a collapsed perpandicular AutoSegment. - *
  • Through a locked AutoContact. + *
  • Unique ID: to ease the enforcing of a deterministic behavior + * and to gain some independance from the pointers, each AutoSegment + * is associated with an unique identifier. + * \red{IDs are now directly taken from the Hurricane::Segment.} + *
  • Source contact is always lesser than Target contact + * (Xs,Ys) < (Xt,Yt). + *
  • When assembled through AutoContactVTee or AutoContactHTee, + * AutoSegments became (i.e. must be kept) aligneds. Among a + * set of aligned AutoSegments, we distinguish a representative + * trough which we can manipulate the whole set. This representative + * is called the \e canonical AutoSegment and is the one with the + * lowest \c id). + *
  • When an aligned set contains at least one global, all the segments + * of the set are tagged Katabatic::SegWeakGlobal. This is + * especially useful on local ones to know if they are part of a + * much longer wire. + * + * Conversely, a set of aligned may contains only local segments and + * thus will not have the flag set. + *
  • To allow some optimization, the Katabatic::SegNotAligned + * tells if a segment is part of an aligned set. It is deduced from + * the type of both source and target contact: not on the parallel + * branch of a tee. *
* - * \subsection AlignedByCollapsed Aligned through collapsed AutoSegment + * The Ever Fragmenting Data Structure * - * When an AutoSegment is collapsed, all perpandicular AutoSegment - * to it's source and target AutoContact are aligneds. Collapsing - * an AutoSegment means that it should be kept to zero length and - * thus not managed by the overlying router. + * All the transformations applied to the database, after it's initial + * building, can be reduced to making new doglegs (and layer changes). + * Another way to put it, is that no Tee is ever created after the + * initial stage. The consequence is that the segments are only fragmenting + * more and more (up to a certain limit). The aligneds sets are progessively + * broken apart as needed, and until there remains only one tee per set + * (the two segments on the aligned branch). * - * \image html AutoSegmentCollapse-5.png "collapse by AutoSegment" - * \image latex AutoSegmentCollapse-5.pdf "collapse by AutoSegment" width=0.4\textwidth * - * \subsection AlignedByAutoContact Aligned through collapsed AutoContact + * \section secASOperations Operations on AutoSegments * - * With the setHAlignate() and setVAlignate() the alignment of - * horizontal (resp. vertical) AutoSegment of an AutoContact can be - * forced. - * - * \image html AutoSegmentCollapse-6.png "collapse by AutoContact" - * \image latex AutoSegmentCollapse-6.pdf "collapse by AutoContact" width=0.4\textwidth - * - * \subsection collapsedExample An example of collapse/alignment - * - * \image html AutoSegmentCollapse-1.png "collapse - Step 1" - * \image latex AutoSegmentCollapse-1.pdf "collapse - Step 1" width=0.4\textwidth - * - * \image html AutoSegmentCollapse-2.png "collapse - Step 2" - * \image latex AutoSegmentCollapse-2.pdf "collapse - Step 2" width=0.4\textwidth - * - * \image html AutoSegmentCollapse-3.png "collapse - Step 3" - * \image latex AutoSegmentCollapse-3.pdf "collapse - Step 3" width=0.4\textwidth - * - * \image html AutoSegmentCollapse-4.png "collapse - Step 4" - * \image latex AutoSegmentCollapse-4.pdf "collapse - Step 4" width=0.4\textwidth - */ - - - //! \addtogroup collapseCanonical - //! \{ - - /*! \enum AutoSegment::PerpandicularState - * set of flags used to build the state of two AutoSegment. - * \see getPerpandicularState(). - */ - - /*! \var AutoSegment::PerpandicularAny - * The \e current AutoSegment is perpandicular to the \e master. - * May it be or not through collapsed perpandiculars. - */ - - /*! \var AutoSegment::PerpandicularIndirect - * The \e current AutoSegment is perpandicular to the \e master - * through at least one collapsed perpandicular. - */ - - /*! \var AutoSegment::ParallelOrExpanded - * The \e current AutoSegment is not part of the aligned set, - * it's either parallel but not aligned (no constraint on the - * AutoContact) or perpandicular and not collapsed. - */ - - /*! \var AutoSegment::ParallelAndLayerChange - * The \e current AutoSegment is parallel to the master but not on - * the same layer as the \e source (the \e master by transitivity). - */ - - /*! \function unsigned int AutoSegment::getPerpandicularState ( AutoContact* contact, AutoSegment* source, AutoSegment* current, bool isHorizontalMaster, const Layer* masterLayer=NULL ) - * \param contact The AutoContact shared by source \& current. - * \param source The AutoSegment from where we came. - * \param current The AutoSegment we are exploring. - * \param isHorizontalMaster The direction of the reference AutoSegment. - * \param masterLayer The \Layer of the reference AutoSegment. - * \return A composite value telling the position of current relative to - * source and reference. - * - * Locators of \Collections like AutoSegment::getCollapseds() or - * AutoSegment::getCollapsedPerpandiculars() are built on this - * function. Any \Collection manipulating aligned sets must uses - * this function which is the keystone of the aligned set walk-through. - * - * The return value is a combination of binary flags from the - * AutoSegment::PerpandicularState enumeration. The function - * compute the following boolean values : *
    - *
  • \e sourcePerpandicular : \True if the \e source is perpandicular - * to the \e master AutoSegment. - *
  • \e currentPerpandicular : \True if the \e current is perpandicular - * to the \e master AutoSegment. - *
  • \e contactAlignate : \True if the alignment constraint on the - * AutoContact (if any) applies to \e source \& \e current. For instance - * it will be \True if both source and current are horizontal - * \b and AutoContact::isHAlignate() is \True. + *
  • Slackening. Constraints transmited through either source + * or target AutoContact are too tight (tighter than the GCell), + * by adding straps in the perpandicular direction, the full slack + * of the segment is restored. + *
  • Layer Change. One or two layers above or below the + * current layer. One up/down may means into the perpandicular + * routing direction. + *
  • Dogleg Creation. Mean breaking the segment in two. + * This operation is used to slacken the constraints on a segment + * or restore connexity on source/target contact after a layer + * change. The new segment is always created on the source. *
- * Then the return value is computed as follow : - *
    - *
  1. If \e current is parallel to \e master \b but not on the same - * layer. * - * sets the AutoSegment::AutoSegment::ParallelAndLayerChange flag. - *
  2. If \e current is perpandicular to \e master \b and not - * collapsed, it is perpandicular to the aligned set of the - * \e master. * - * sets the AutoSegment::AutoSegment::PerpandicularAny flag. - *
  3. \e source is perpandicular to \e master. There is an implicit - * context : the only way a perpandicular segment gets took into - * account, is to be collapsed. Then if the \e current AutoSegment - * is also perpandicular \b and \b not collapsed, it means - * that it's a perpandicular to the aligned set of the \e master, - * The difference with the previous case, is that it's through at - * least one collapsed perpandicular. + * \section secASInvalidate Invalidate on AutoSegments * - * sets the AutoSegment::AutoSegment::PerpandicularIndirect flag. - *
  4. \e source is parallel to \e master. Then we check for - * disconnection in the aligned set. Disconnection arises - * if the \e contactAlignate flag is \false (either no - * alignment constraint on the AutoContact or different - * directions), \b and the \e current segment is not a - * collapsed perpandicular. + * The simple invalidation of an AutoSegment do not invalidate + * it's source & target contact. * - * sets the AutoSegment::AutoSegment::ParallelOrExpanded flag. - *
- * The \b zero return value means that the \e current AutoSegment - * belong to the same aligned set as the \e master \b or is a - * perpandicular collapsed AutoSegment. + * An axis position change or a layer change both invalidate the + * AutoSegment and it's source & target contacts. * - * The figures below demonstrate all thoses case : + * For the complete invalidation/revalidation mechanism see + * \ref secSessionAlgo "Session Algorithm". * - * \image html PerpandicularState-1.png "Simple Perpandicular (case 2)" - * \image latex PerpandicularState-1.pdf "Simple Perpandicular (case 2)" width=0.8\textwidth * - * \image html PerpandicularState-2.png "Indirect Perpandicular (case 3)" - * \image latex PerpandicularState-2.pdf "Indirect Perpandicular (case 3)" width=0.8\textwidth + * \section secASAttributes Main Attributes of AutoSegments * - * \image html PerpandicularState-3.png "Parallel (case 4.1)" - * \image latex PerpandicularState-3.pdf "Parallel (case 4.1)" width=0.8\textwidth + * AutoSegment retains all attributes from Segment. The Segment itself + * beeing accessible through the base() methods. + *
    + *
  • An unique \c Id (for determinism). + *
  • The GCell from wich it starts from. It is the GCell of the + * source AutoContact. + *
  • A state, combination of flags from Katabatic::AutoSegmentFlag. + *
  • An interval for the optimal range of the AutoSegment axis. + *
  • An interval for user's defined constraint on the axis. + *
  • The interval giving the complete length of the AutoSegment, + * that is, with all extentions cap taken into account. + * This interval is refered as the \e span. + *
* - * \image html PerpandicularState-4.png "Aligned through AutoContact (case 4.2)" - * \image latex PerpandicularState-4.pdf "Aligned through AutoContact (case 4.2)" width=0.8\textwidth + * + * \section secASImplementation Implementation Details + * + * AutoSegment / AutoHorizontal & AutoVertical are kind of decorators of + * Hurricane::Segment (they do not scrictly respect the pattern). + * + * Canonical AutoSegment can should be considered as a kind of Composite. + * + * Thoses objects are created using a Factory method. + * + * + * \section secASMethodsClassif Methods Classification + * + *
    + *
  • Wrapper methods on the underlying Hurricane::Segment. + *
+ *
    + *
  • Atomic methods on AutoSegment, that is, which applies exactly + * on the current AutoSegment. + *
+ *
    + *
  • Canonical methods that applies on the set of aligned AutoSegments. + * There are two kind of those, the methods part of the API, and + * the ones that make the link with the atomic methods. Those + * intermediate methods hide some cumbersome AutoSegment list + * parameters. + *
      + *
    • AutoSegment::invalidate() + *
    • AutoSegment::computeOptimal() + *
    • AutoSegment::setAxis() + *
    • AutoSegment::toConstraintAxis() + *
    • AutoSegment::toOptimalAxis() + *
    + *
+ *
    + *
  • Uniform access, to simplify the managment of AutoHorizontal + * and AutoVertical through AutoSegment, a set of uniformized methods is + * introduced. For instance, to avoid to check the dynamic type to choose + * to call getSourceX() or getSourceY(), we may call getSourceU(). + * Uniform methods are named by replacing \c X/Y with \c U. + *
      + *
    • AutoSegment::getSourceU() + *
    • AutoSegment::getTargetU() + *
    • AutoSegment::getDuSource() + *
    • AutoSegment::getDuTarget() + *
    • AutoSegment::getSpanU() + *
    • AutoSegment::setDuSource() + *
    • AutoSegment::setDuTarget() + *
    + *
*/ - /*! \function unsigned int AutoSegment::getPerpandicularState ( AutoContact* contact, AutoSegment* source, AutoSegment* current, AutoSegment* master ) - * \param contact The AutoContact shared by source \& current. - * \param source The AutoSegment from where we came. - * \param current The AutoSegment we are exploring. - * \param master The reference AutoSegment. - * \return A composite value telling the position of current relative to - * source and reference. - */ - /*! \function bool AutoSegment::arePerpandiculars ( AutoSegment* a, AutoSegment* b ); - * \param a First AutoSegment. - * \param b Second AutoSegment. - * \return true if a \& b have perpandicular directions. - */ + //! \enum AutoSegmentFlag + //! Set of flags to describe the internal state of an AutoSegment. - /*! \function bool AutoSegment::areAligneds ( AutoSegment* a, AutoSegment* b ); - * \param a First AutoSegment. - * \param b Second AutoSegment. - * \return true if a \& b have same directions. - */ + //! \var AutoSegmentFlag::SegHorizontal + //! This AutoSegment is associated to a Hurricane::Horizontal, if not + //! set, it is associated to a Hurricane::Vertical. Set when the object + //! is constructed. - /*! \function bool AutoSegment::arePerpandiculars ( bool isHorizontalA, AutoSegment* b ); - * \param isHorizontalA is the A AutoSegment horizontal. - * \param b Second AutoSegment. - * \return true if a \& have perpandicular directions. - */ + //! \var AutoSegmentFlag::SegFixed + //! The Hurricane::Segment associated must/cannot be moved. - } + //! \var AutoSegmentFlag::SegGlobal + //! The AutoSegment span between at least two GCells (i.e. not fully enclosed + //! in one). + + //! \var AutoSegmentFlag::SegWeakGlobal + //! The AutoSegment is part of an aligned set which contains at least a global. + //! The global segment is itself tagged as weak global. + + //! \var AutoSegmentFlag::SegCanonical + //! This AutoSegment is the designated representant of a set of aligned + //! AutoSegment. + + //! \var AutoSegmentFlag::SegBipoint + //! This AutoSegment is a straight wire between two terminal AutoContact. + + //! \var AutoSegmentFlag::SegDogleg + //! This AutoSegment has been created as the perpandicular part of a dogleg. + + //! \var AutoSegmentFlag::SegStrap + //! This AutoSegment has been created to to reconnect parts of an AutoSegment + //! after slackening. + + //! \var AutoSegmentFlag::SegLayerChange + //! This AutoSegment has been created to to reconnect parts of an AutoSegment + //! after a layer change. + + //! \var AutoSegmentFlag::SegSlackened + //! This AutoSegment has been slackened, that is freed from any constraints from + //! source or target through the insertion of straps. + + //! \var AutoSegmentFlag::SegStrongTerminal + //! This AutoSegment directly connected to a terminal. + + //! \var AutoSegmentFlag::SegWeakTerminal1 + //! This AutoSegment indirectly connected to a terminal with medium strength. + + //! \var AutoSegmentFlag::SegWeakTerminal2 + //! This AutoSegment indirectly connected to a terminal with weak strength. + + //! \var AutoSegmentFlag::SegNotSourceAligned + //! This source contact of the segment is not the aligned part of a tee + //! (\c h1 or \c h2 for a \c HTee, \c v1 or \c v2 for a \c VTee). + //! + //! \sa AutoSegmentFlag::SegNotAligned + + //! \var AutoSegmentFlag::SegNotTargetAligned + //! This target contact of the segment is not the aligned part of a tee + //! (\c h1 or \c h2 for a \c HTee, \c v1 or \c v2 for a \c VTee). + //! + //! \sa AutoSegmentFlag::SegNotAligned + + //! \var AutoSegmentFlag::SegAxisSet + //! This AutoSegment has been explicitly positionned at least once. + + //! \var AutoSegmentFlag::SegInvalidated + //! This position or topology of this AutoSegment has been changed, needing + //! a revalidation. + + //! \var AutoSegmentFlag::SegInvalidatedLayer + //! The segment has been chenged of layer, but the source & target AutoContact + //! have not been topologicaly checked yet. This flag \b must be used in + //! whith AutoSegmentFlag::SegInvalidated. + + //! \var AutoSegmentFlag::SegCreated + //! The AutoSegment has just been created. This flag is set only from the + //! contruction of the object until is \e first revalidation. Used to + //! disable some tests that cannot be satisfied initially. + + //! \var AutoSegmentFlag::SegWeakTerminal + //! A mask composed of: + //! - Katabatic::SegStrongTerminal + //! - Katabatic::SegWeakTerminal1 + //! - Katabatic::SegWeakTerminal2 + + //! \var AutoSegmentFlag::SegNotAligned + //! A mask composed of: + //! - Katabatic::SegNotSourceAligned + //! - Katabatic::SegNotTargetAligned + //! + //! This mask is a quick way to know if a segment is \b not part of an aligned set. + //! It means that the segment is, on both ends, either connected to a terminal, + //! a turn or the stem part of a tee. + + + //! \function AutoSegment* AutoSegment::create ( AutoContact* source, AutoContact* target, Segment* hurricaneSegment ); + //! \param source The source AutoContact. + //! \param target The target AutoContact. + //! \param hurricaneSegment The Hurricane::Segment to decorate. + //! \return The AutoHorizontal/AutoVertical decorator segment. + //! + //! Factory method to create AutoHorizontal or AutoVertical. It is important + //! to note that this function may modify the underlying Hurricane::Segment. + //! - Layer is set to the default (bottom) routing Layers. + //! - Source & target anchor of \c hurricaneSegment are set on \c source + //! and \c target. If the \c hurricaneSegment is already anchored and + //! \c source or \c target are not the one decorating the anchors, an + //! exception is thrown. + + //! \function AutoSegment* AutoSegment::create ( AutoContact* source, AutoContact* target, unsigned int flags ); + //! \param source The source AutoContact. + //! \param target The target AutoContact. + //! \param flags Specify the constructor behavior. + //! \return The AutoHorizontal/AutoVertical. + //! + //! Factory method to create AutoHorizontal or AutoVertical. + //! \c flags indicate the direction (KbHorizontal or KbVertical). + //! The underlying Hurricane segment is also created. + + //! \function Segment* AutoSegment::base() const; + //! \sreturn the decorated Hurricane::Segment (const flavor). + + //! \function Segment* AutoSegment::base(); + //! \sreturn the decorated Hurricane::Segment. + + //! \function Horizontal* AutoSegment::getHorizontal(); + //! \sreturn If the decorated segment is a Hurricane::Horizontal, return it. + //! \c NULL otherwise. + + //! \function Vertical* AutoSegment::getVertical(); + //! \sreturn If the decorated segment is a Hurricane::Vertical, return it. + //! \c NULL otherwise. + + //! \function Cell* AutoSegment::getCell() const; + //! \see Segment::getCell(). + + //! \function Net* AutoSegment::getNet() const; + //! \see Segment::getNet(). + + //! \function const Layer* AutoSegment::getLayer() const; + //! \see Segment::getLayer(). + + //! \function BoundingBox* AutoSegment::getBoundingBox() const; + //! \see Segment::getBoundingBox(). + + //! \function Hook* AutoSegment::getSourceHook(); + //! \see Segment::getSourceHook(). + + //! \function Hook* AutoSegment::getTargetHook(); + //! \see Segment::getTargetHook(). + + //! \function Contact* AutoSegment::getSource() const; + //! \see Segment::getSource(). + + //! \function Contact* AutoSegment::getTarget() const; + //! \see Segment::getTarget(). + + //! \function Component* AutoSegment::getOppositeAnchor( Component* ) const; + //! \see Segment::getNet(). + + //! \function Components AutoSegment::getAnchors() const; + //! \see Segment::getAnchors(). + + //! \function DbU::Unit AutoSegment::getX() const; + //! \see Segment::getX(). + + //! \function DbU::Unit AutoSegment::getY() const; + //! \see Segment::getY(). + + //! \function DbU::Unit AutoSegment::getWidth() const; + //! \see Segment::getWidth(). + + //! \function DbU::Unit AutoSegment::getLength() const; + //! \see Segment::getLength(). + + //! \function DbU::Unit AutoSegment::getSourcePosition() const; + //! \see Segment::getSourcePosition(). + + //! \function DbU::Unit AutoSegment::getTargetPosition() const; + //! \see Segment::getTargetPosition(). + + //! \function DbU::Unit AutoSegment::getSourceX() const; + //! \see Segment::getSourceX(). + + //! \function DbU::Unit AutoSegment::getSourceY() const; + //! \see Segment::getSourceY(). + + //! \function DbU::Unit AutoSegment::getTargetX() const; + //! \see Segment::getTargetX(). + + //! \function DbU::Unit AutoSegment::getTargetY() const; + //! \see Segment::getTargetY(). + + //! \function DbU::Unit AutoSegment::invert(); + //! \see Segment::invert(). + + //! \function void AutoSegment::setLayer( const Layer* ); + //! \see Segment::setLayer(). + + //! \function bool AutoSegment::isHorizontal() const; + //! \sreturn \true if the Hurricane::Segment is Horizontal. + + //! \function bool AutoSegment::isVertical() const; + //! \sreturn \true if the Hurricane::Segment is Vertical. + + //! \function bool AutoSegment::isGlobal() const; + //! \sreturn \true if the segment is global (span over more than one GCell). + + //! \function bool AutoSegment::isLocal() const; + //! \sreturn \true if the segment is local (fully enclosed in one GCell). + + //! \function bool AutoSegment::isFixed() const; + //! \sreturn \true if segment must not be moved by the router. + + //! \function bool AutoSegment::isBipoint() const; + //! \sreturn \true if the segment straigh join two terminals. + + //! \function bool AutoSegment::isWeakTerminal() const; + //! \sreturn \true if segment is indirectly connected to a terminal. + + //! \function bool AutoSegment::isStrongTerminal( unsigned int flags=0 ) const; + //! \sreturn \true if segment is directly connected to a terminal. + + //! \function bool AutoSegment::isLayerChange() const; + //! \sreturn \true if segment is a strap used only to connect between two different + //! metal layers on the way up or down. + + //! \function bool AutoSegment::isStrap() const; + //! \sreturn \true if segment has been created from a slackening operation to + //! restore the slack of another segment. + + //! \function bool AutoSegment::isDogleg() const; + //! \sreturn \true if segment has been created as the perpandicular part of a dogleg. + + //! \function bool AutoSegment::isInvalidated() const; + //! \sreturn \true if segment has been moved or topologicaly altered. + + //! \function bool AutoSegment::isInvalidatedLayer() const; + //! \sreturn \true if segment has been changed of layer. Source and Target AutoContact + //! may need to be altered. + + //! \function bool AutoSegment::isCreated() const; + //! \sreturn \true if segment has just been created and is not revalidated for the + //! first time + + //! \function bool AutoSegment::isCanonical() const; + //! \sreturn \true if segment is the representant of an aligned set. + + //! \function bool AutoSegment::isUnsetAxis() const; + //! \sreturn \true if the segment axis has never been set. + + //! \function bool AutoSegment::isSlackened() const; + //! \sreturn \true if the segment has already been slackened. + + //! \function unsigned int AutoSegment::canDogleg( Interval interval ); + //! \sreturn non-zero if the aligned set of segment can be broken \e outside \c interval. + //! The returned value could be zero (failure) or Katabatic::KbDoglegOnLeft + //! or Katabatic::KbDoglegOnRight menaing that the aligned set could be broken + //! on the left of the \c interval (resp. right of it). + + // \function bool AutoSegment::canDesalignate( AutoContact* contact ) const; + // \sreturn \true if \c contact restrict the slack of the segment. + + //! \function bool AutoSegment::canSlacken( unsigned int flags=0 ) const; + //! \sreturn \true if the segment can be slackened. That is, source or target constraints + //! are less than three pitches. + //! + //! If \c flags contains KbPropagate, look on the whole aligned set. + + //! \function bool AutoSegment::_canSlacken() const; + //! \sreturn \true if the segment can be slackened. That is, source or target constraints + //! are less than three pitches. + + //! \function bool AutoSegment::canMoveULeft( float reserve ) const; + //! \return \true if the \e global segment can be moved on the left GCell (for a + //! vertical) or down (for an horizontal). The move is accepted only if + //! it do not change the amount of global wiring. Thus the following + //! conditions: + //! - The segment mustn't be on the leftmost GCell (obvious...). + //! - The segment must be global. + //! - The source and target contacts must be AutoContactTurn(s). + //! - At least one of the perpandicular must be global \b and connected + //! through the \e target. That is, it's a global which extends toward + //! left. + //! - The GCell of maximum density on the left must remains below the + //! current GCell of maximum density, with a margin of \c reserve + //! (expressed in total saturation percentage). + + //! \function bool AutoSegment::canMoveURight( float reserve ) const; + //! \return \true if the \e global segment can be moved on the right GCell (for a + //! vertical) or up (for an horizontal). The move is accepted only if + //! it do not change the amount of global wiring. Thus the following + //! conditions: + //! - The segment mustn't be on the leftmost GCell (obvious...). + //! - The segment must be global. + //! - The source and target contacts must be AutoContactTurn(s). + //! - At least one of the perpandicular must be global \b and connected + //! through the \e source. That is, it's a global which extends toward + //! right. + //! - The GCell of maximum density on the left must remains below the + //! current GCell of maximum density, with a margin of \c reserve + //! (expressed in total saturation percentage). + + //! \function bool AutoSegment::canMoveUp( float reserve, unsigned int flags ) const; + //! \param reserve Number of track that must remains free \e after the move. + //! \param flags Modificate the method behavior, see below. + //! \return \true if the segment can be moved up, that is to the next layer above in + //! the same preferred routing direction. This method will check that in + //! every GCell of the segment, at least \c reserve tracks are still avalaible + //! \e after the segment has been moved up (\c reserve can be less than + //! \c 1.0). + //! + //! Possible (bitwise) value for \c flags : + //! - \c KbAllowTerminal : allow strong terminal to be moved up. + //! - \c KbAllowLocal : allow local segments to be moved up. + //! - \c KbPropagate : perform the check on the whole aligned set. + //! - \c KbWithPerpands : also check the density on the perpandiculars + //! begin & end GCell, there must be at least a \c 0.5 density + //! reserve on them. + + //! \function bool AutoSegment::canPivotUp( float reserve, unsigned int flags ) const; + //! \param reserve Number of track that must remains free \e after the move. + //! \param flags Modificate the method behavior, see below. + //! + //! Checks of the segment can be \e pivoted up. The difference between + //! \c canMoveUp() and \c canPivotUp() lies in the fact that no + //! perpandicular segment needs to be altered if the current segment + //! is moved up. For example an \b M3 segment connected to only \b M4 can + //! be pivoted up (in \b M5), but if connected to \b M2, it cannot. + //! + //! Possible (bitwise) value for \c flags : + //! - \c KbPropagate : perform the check on the whole aligned set. + //! - \c KbIgnoreContacts : do not check the source & target layers + //! to know if the segment can be pivoted up. + + //! \function bool AutoSegment::canPivotDown( float reserve, unsigned int flags ) const; + //! \param reserve Number of track that must remains free \e after the move. + //! \param flags Modificate the method behavior, see below. + //! + //! Checks of the segment can be \e pivoted down. The difference between + //! \c canMoveDown() and \c canPivotDown() lies in the fact that no + //! perpandicular segment needs to be altered if the current segment + //! is moved down. + //! + //! Possible (bitwise) value for \c flags : + //! - \c KbPropagate : perform the check on the whole aligned set. + + //! \function bool AutoSegment::checkPositions() const; + //! \sreturn \true if the relative positions of source & target are coherent. + //! (source <= target). + + //! \function bool AutoSegment::checkConstraints() const; + //! \sreturn \true if the constraint intervel is coherent (non-empty or + //! punctual in the worst case). + + //! \function unsigned long AutoSegment::getId() const; + //! \sreturn The AutoSegment unique identifier. + + //! \function unsigned int AutoSegment::getDirection() const; + //! \sreturn Katabatic::KbHorizontal or Katabatic::KbVertical according to the decorated segment. + + //! \function GCell* AutoSegment::getGCell() const; + //! \sreturn The GCell into which the AutoSegment starts (the one of the source). + + //! \function size_t AutoSegment::getGCells( vector& gcells ) const; + //! \param gcells A vector that will be filled by all the GCells that the + //! segment overlap. In increasing order, from source to target. + //! \return The vector's size. + + //! \function AutoContact* AutoSegment::getAutoSource() const; + //! \sreturn The source AutoContact. + + //! \function AutoContact* AutoSegment::getAutoTarget() const; + //! \sreturn The target AutoContact. + + //! \function AutoContact* AutoSegment::getOppositeAnchor( AutoContact* contact ) const; + //! \sreturn The source or target AutoContact opposite to \c contact. + + //! \function size_t AutoSegment::getPerpandicularsBound( set& bounds ); + //! \param bounds A vector that will be filled by all the AutoSegments perpandicular + //! to this one that induce a constraint. + //! \return The vector's size. + + //! \function AutoSegment* AutoSegment::getParent() const; + //! \sreturn If this segment has been created by a dogleg operation, the parent is + //! the one from which we fragmented. + + //! \function DbU::Unit AutoSegment::getAxis() const; + //! \sreturn The AutoSegment axis position. + + //! \function DbU::Unit AutoSegment::getSourceU() const; + //! \sreturn The AutoSegment \e uniform source position. (X for an horizontal and + //! Y for a Vertical). + + //! \function DbU::Unit AutoSegment::getTargetU() const; + //! \sreturn The AutoSegment \e uniform target position. (X for an horizontal and + //! Y for a Vertical). + + //! \function DbU::Unit AutoSegment::getDuSource() const; + //! \sreturn The AutoSegment \e uniform delta from source. (dX for an horizontal and + //! dY for a Vertical). + + //! \function DbU::Unit AutoSegment::getDuTarget() const; + //! \sreturn The AutoSegment \e uniform delta from source. (dX for an horizontal and + //! dY for a Vertical). + + //! \function DbU::Unit AutoSegment::getOrigin() const; + //! \sreturn The AutoSegment \e uniform source (lowest) GCell coordinate. (dX for an horizontal and + //! dY for a Vertical). + + //! \function DbU::Unit AutoSegment::getExtremity() const; + //! \sreturn The AutoSegment \e uniform target (greatest) GCell coordinate. (dX for an horizontal and + //! dY for a Vertical). + + //! \function Interval AutoSegment::getSpanU() const; + //! \sreturn The AutoSegment \e uniform occupying interval (on X for horizontal and + //! on Y for vertical). + + //! \function Interval AutoSegment::getSourceConstraints( unsigned int flags ) const; + //! \return The Interval into witch the source AutoContact can vary. By default + //! all deduced constraints and user constraints are took into account. + //! If \c flags contains \c KbNativeConstraints the constraint returned is + //! only the enclosing GCell. + + //! \function Interval AutoSegment::getTargetConstraints( unsigned int flags ) const; + //! \return The Interval into witch the target AutoContact can vary. By default + //! all deduced constraints and user constraints are took into account. + //! If \c flags contains \c KbNativeConstraints the constraint returned is + //! only the enclosing GCell. + + //! \function bool AutoSegment::getConstraints( DbU::Unit& min, DbU::Unit& max ) const; + //! \sreturn in \c min & \c max the allowed range for the segment axis. + + //! \function bool AutoSegment::getConstraints( Interval& i ) const; + //! \sreturn in \c i the allowed range for the segment axis. + + //! \function const Interval& AutoSegment::getUserConstraints() const; + //! \sreturn A reference to the additional constraints added to the axis of the segment. + + //! \function DbU::Unit AutoSegment::getSlack() const; + //! \sreturn The length of the axis constraint interval. + + //! \function DbU::Unit AutoSegment::getOptimalMin() const; + //! \sreturn The AutoSegment minimum axis optimal range. + + //! \function DbU::Unit AutoSegment::getOptimalMax() const; + //! \sreturn The AutoSegment maximum axis optimal range. + + //! \function Interval& AutoSegment::getOptimal( Interval& i ) const; + //! Inialize \c i with the AutoSegment axis optimal range. + + //! \function DbU::Unit AutoSegment::getCost( DbU::Unit axis ) const; + //! \return The cost if this segment is placed at \c axis. The cost is null if + //! \c axis is inside the optimal interval and is the distance toward + //! the nearest bound outside. + + //! \function AutoSegment* AutoSegment::getCanonical( Interval& i ); + //! \return The canonical segment associated to this one. Additionnaly compute + //! the source & target position of the whole set of aligned segments. + + //! \function AutoSegment* AutoSegment::getCanonical( DbU::Unit& min, DbU::Unit& max ); + //! \return The canonical segment associated to this one. Additionnaly compute + //! the source & target position of the whole set of aligned segments. + + //! \function unsigned int AutoSegment::_getFlags () const; + //! Sets \c flags given as arguments. + + //! \function void AutoSegment::setFlags ( unsigned int flags ); + //! Sets \c flags given as arguments. + + //! \function void AutoSegment::unsetFlags ( unsigned int flags ); + //! Unsets \c flags given as arguments. + + //! \function void AutoSegment::setDuSource( DbU::Unit du ); + //! Set the \e uniform \c dU from source anchor (dX for Horizontal, + //! dY for Vertical). + + //! \function void AutoSegment::setDuTarget( DbU::Unit du ); + //! Set the \e uniform \c dU from target anchor (dX for Horizontal, + //! dY for Vertical). + + //! \function void AutoSegment::updateOrient (); + //! Ensure that source is lower than target. Swap them if needed. + //! Swap never occurs on global segment because their source and target + //! anchors are from different GCell, which are already ordered. + + //! \function void AutoSegment::computeTerminal (); + //! Recompute the terminal status of an AutoSegment. Initially, a + //! segment which source or target is a terminal is flagged as + //! SegStrongTerminal. After a topological modification, if the + //! segment is no longer directly attached to a terminal, the + //! status is progessively weakened. Once it reaches the weakest + //! level, it stays on it so the algorithm can work out which + //! segments is a start to a path toward a terminal. + //! + //! Status from stronger to weaker: + //! - Katabatic::SegStrongTerminal. + //! - Katabatic::SegWeakTerminal1 + //! - Katabatic::SegWeakTerminal2 + //! + //! \remark The weakening is poorly done. After making a dogleg we do not + //! know which of the segment must be weakened if not directly attached + //! on a terminal. We must examinate source & target. + + //! \function void AutoSegment::updatePositions(); + //! Update the segment begenning and ending positions. The positions + //! takes into account the extension caps and reflect the real space + //! used by the segment under it's long axis. + + //! \function void AutoSegment::mergeUserConstraints( const Interval& constraints ); + //! Constraints applies on the valid axis interval. + //! Merge in \c constraints with the user's constraints. The resulting + //! constraints is the intersection of the former user's contraints and + //! the one given as argument. + + //! \function void AutoSegment::resetUserConstraints(); + //! Constraints applies on the valid axis interval. + //! Suppress all user's constraints. + + //! \function void AutoSegment::setOptimalMin( DbU::Unit min ); + //! Sets the lower bound of the optimal axis interval. + + //! \function void AutoSegment::setOptimalMax( DbU::Unit max ); + //! Sets the lower bound of the optimal axis interval. + + //! \function Interval AutoSegment::_invalidate(); + //! Invalidate this segment. The segment is scheduled into the Session + //! revalidation mechanism. + + //! \function Interval AutoSegment::revalidate(); + //! Mark this segment as valid (unset the Invalidated flag) and update + //! positions. Unlike AutoSegment::invalidate(), it's an atomic method. + + //! \function Interval AutoSegment::getMinSpanU() const; + //! \return The AutoSegment \e uniform minimum occupying interval, computed from the + //! constraints of all the supporting aligned AutoContacts. + //! (on X for horizontal and on Y for vertical). + + //! \function AutoSegment* AutoSegment::canonize ( unsigned int flags=KbNoFlags ); + //! Find and set the canonical AutoSegment from a set of aligneds. For the + //! time beeing we assumes that there is no merging process, so the Segments + //! will only gets more and more fragmented. This implies that a segment can + //! become canonical but it will never revert to normal status. + //! + //! The canonical AutoSegment is the one with the lowest \c Id. This a way + //! of ensuring reproductible results. Note that the canonical one may not + //! be the \e geometrically lowest one. + //! + //! \remark Canonical aware method. + + //! \function Interval AutoSegment::computeOptimal( set& processeds ); + //! \param processeds A set of already processeds AutoSegment. Used by the + //! caller function to avoid doing again the computation + //! on an AutoSegment from an already proccessed aligned set. + //! Compute the optimal axis interval for the aligned set. + //! + //! \remark Canonical aware method. + + //! \function void AutoSegment::invalidate( unsigned int flags=KbPropagate ); + //! Invalidate this AutoSegment, or if the Katabatic::KbPropagate flags + //! is set, the whole set of aligned segments. + //! + //! \remark If Katabatic is in the destruction stage, this function does nothing. + //! \remark Canonical aware method. + + //! \function void AutoSegment::setAxis( DbU::Unit axis, unsigned int flags=0 ); + //! \param axis The new position of the axis. + //! \param flags See KbRealignate. + //! + //! Set the axis of an aligned set. This method does nothing if not called + //! on the canonical AutoSegment of the set. If the new value of the axis + //! is equal to the previous one, nothing is done (non-canonical AutoSegment + //! are not looked after). To force an actual axis set, with invalidation of + //! the whole AutoSegment set, set the KbRealignate flag. + //! + //! \remark Canonical aware method. + + //! \function bool AutoSegment::toConstraintAxis(); + //! If the AutoSegment axis is outside the constraint interval, put it on + //! nearest bound. This method is active only on canonical AutoSegments. + //! + //! \return \true if an actual axis change is made. + //! + //! \remark Canonical aware method. + + //! \function bool AutoSegment::toOptimalAxis(); + //! If the AutoSegment axis is outside the optimal interval, put it on + //! nearest bound. This method is active only on canonical AutoSegments. + //! + //! \return \true if an actual axis change is made. + //! + //! \remark Canonical aware method. + + //! \function AutoSegments AutoSegment::getAligneds ( unsigned int flags ); + //! The Collection of AutoSegments that are aligned on this one + //! through AutoContactHTee or AutoContactVTee. If the \c flags + //! contains Katabatic::KbWithPerpands, the Collection will also + //! includes the AutoSegments directly perpandiculars to the whole + //! aligned set. + + //! \function AutoSegments AutoSegment::getPerpandiculars (); + //! The Collection of all AutoSegments directly perpandiculars to the + //! whole aligned set. + + //! \function AutoSegments AutoSegment::getOnSourceContact ( unsigned int direction ); + //! \sreturn The Collection of AutoSegment in \c direction that are on this segment + //! source contact. + + //! \function AutoSegments AutoSegment::getOnTargetContact ( unsigned int direction ); + //! \sreturn The Collection of AutoSegment in \c direction that are on this segment + //! target contact. + + //! \function AutoSegment::~AutoSegment () + //! AutoSegment destructor. It is not directly accessible, instead use + //! one flavor of the AutoSegment::create(). + + //! \function AutoSegment::AutoSegment ( Segment* segment ); + //! AutoSegment constructor. It is not directly accessible, instead use + //! one flavor of the AutoSegment::create(). + + //! \function void AutoSegment::_preCreate( AutoContact* source, AutoContact* target ); + //! Perform sanity checks before allowing the actual creation of an + //! AutoSegment. If an error occurs throw an exception. + //! + //! Check for: + //! - \c source and \c target must not be \NULL. + //! - \c source and \c target must be different. + + //! \function void AutoSegment::_postCreate (); + //! Perform operations that, given the data structure cannot be done + //! in the constructor. Also allows for sharing code with the derived + //! classes. Currently: + //! - Invalidate the whole net (topology change). + //! - Insert the AutoSegment in the lookup/Session machanism. + //! - Call AutoSegment::invalidate(). + //! - Call AutoSegment::updateOrient(). + //! - Call AutoSegment::updatePositions(). + + //! \function void AutoSegment::_preDestroy (); + //! Perform operations that must be done before the actual destructor is + //! called. Merely whidrawn the AutoSegment from the lookup/Session mechanism. + + //! \function AutoSegment* AutoSegment::makeDogleg ( AutoContact* from ); + //! \param from The AutoContact \e from which we want to make a dogleg. + //! + //! This method is dedicated for the restauration of topology connexity on + //! AutoContcact after a layer change on one of their connected AutoSegment. + //! + //! It perform three operations: + //! -# Create a dogleg on the AutoSegment (using the normal GCell variant). + //! -# Adjust the layers of the dogleg according whether we are going \e up + //! or \e down from the AutoContact \c from to the segment. + //! -# Returns the new AutoSegment connected to \c from (it may be the + //! same as before, \b if the AutoContact is the source of the + //! segment). + + //! \function unsigned int AutoSegment::makeDogleg ( GCell* doglegGCell, unsigned int flags=KbNoFlags ); + //! Make a dogleg in a set of aligned segments, thus the dogleg + //! may not be created on \c this segment but in the one which is under + //! \c doglegGCell. + //! + //! \sreturn A flag telling if the above or below layer was used for the + //! perpandicular segment (Katabatic::KbUseAboveLayer or + //! Katabatic::KbUseBelowLayer). + + //! \function unsigned int AutoSegment::makeDogleg ( Interval interval, unsigned int flags=KbNoFlags ); + //! Make a dogleg in a set of aligned segments, thus the dogleg + //! may not be created on \c this segment but in one which span intersect + //! \c interval. + //! + //! \sreturn A set of flags telling if the break has occured on the left candidate + //! (Katabatic::KbDoglegOnLeft) or right (Katabatic::KbDoglegOnRight). + //! it is combined with the flag telling if the above or below layer was + //! used for the dogleg. In case of failure, zero is returned. + //! + //! Break the set of aligned segments so the break point is \e outside + //! \c interval. The break point so can occurs on the \e left of the + //! interval (Katabatic::KbDoglegOnLeft) or on the \e right of the + //! interval (Katabatic::KbDoglegOnRight). When the set of aligned + //! segments fully enclose \c interval, a choice has to be made between + //! the left and right candidate. The rules are as follow: + //! - A \e left candidate include the \e min of the interval into + //! it's span. + //! - A \e right candidate include the \e max of the interval into + //! it's span. + //! - In certain topologies, there can be more than left or right + //! candidates (more than one segment of the set intersect the + //! bounds of the interval). Thoses candidates are ecludeds. + //! - If the two candidates are avalaibles, we choose the one + //! with the greated \e native constraints. + //! - In case of strict equality, the left candidate is choosen. + //! + //! \image html _makeDogleg-4.png "Example Case 4" + + //! \function unsigned int AutoSegment::_makeDogleg ( GCell* doglegGCell, unsigned int flags ); + //! This method is the workhorse for the various dogleg and topology + //! restauration methods. It is the atomic method that actually + //! make the dogleg on \b this segment. + //! + //! \sreturn Katabatic::KbUseAboveLayer if the dogleg is using the \e above layer + //! (Katabatic::KbUseBelowLayer for the below layer). + //! + //! Break the current segment in two (a.k.a. making a dogleg). + //! - The segment is broken inside \c doglegGCell. + //! - Two new segments are createds, one perpandicular and one parallel. + //! - The original segment is always kept attached to the \e source. + //! (the new parallel fragment is attached to the \e target). + //! - The perpandicular segment is in the layer \e above by default. + //! If we are already on the topmost routing layer, the \e below + //! layer is used. + //! - If the segment pass through the breaking GCell, it's axis is set + //! into the center. If the segment is local, the axis is the middle + //! of the segment. + //! - The Local/Global kind of the original segment is updated. + //! The local/global status is computed by the constructor of the AutoSegment + //! for the perpandicular and the new parallel. + //! - The terminal state is updated. If the segment is a strong terminal + //! the part that is no longer directly connected to the terminal is + //! demoted to Katabatic::SegWeakTerminal1. + //! - The perpandicular is obviously a canonical. If the broken segment + //! is canonical, the original \b is left canonical and only the new parallel + //! is re-canonized. Otherwise, we re-canonise both sets of aligned segments + //! (the one on the source and the one on the target). + //! - The three segments are added to the session dogleg stack. + //! + //! \red{After this method call the net topology is guarantee to be valid.} + //! + //! \image html _makeDogleg-1.png "Example Case 1" + //! \image html _makeDogleg-2.png "Example Case 2" + + //! \function bool AutoSegment::moveULeft (); + //! This function do not manage an aligned set. It applies on \c this + //! segment only. + //! + //! Displace an Horizontal or Vertical segment to the GCell below (a.k.a. + //! lower or inferior). Rules for displacement: + //! - The segment must be connected at both end to a turn contact + //! (we do not want to manage more complex cases for the time beeing). + //! - And, of course, the segment must not already by on the bottomost + //! GCell... + //! + //! The displacement take care of: + //! - Managing the status of the various perpandiculars. The stretched + //! one are made global if needed. The shrinked one made local, if + //! needed. + //! - The supporting AutoContact (source & target) are changed of + //! GCell. + //! - If the segment is global, the go-through GCells are updateds. + //! + //! \sreturn \true if the move has succeeded. + //! + //! \image html moveULeft-1.png "moveULeft() for an Horizontal" + + //! \function bool AutoSegment::moveURight (); + //! This function do not manage an aligned set. It applies on \c this + //! segment only. + //! + //! Displace an Horizontal or Vertical segment to the GCell above (a.k.a. + //! upper or superior). Rules for displacement: + //! + //! \sa AutoSegment::moveULeft() for a complete description. + + //! \function void AutoSegment::slacken ( unsigned int flags ); + //! + //! If the the AutoSegment is attached trough source and/or target to a + //! terminal with too tight constraints, create a dogleg on overconstrained + //! extremities. + //! + //! If \c flags contains Katabatic::KbPropagate, not only the current segment will be + //! looked up, but the whole aligned set. Note that due to the structure of + //! the database, there can be no more than two terminal connected segments + //! on the whole set (one on each extremity). + //! + //! If \c flags contains Katabatic::KbHalfSlacken, the number of tracks under which + //! the constraints are considered too tight is 3. Otherwise it is 10, that is a + //! whole GCell side span. This flag should be used when a long set of global + //! wire is overconstrained by only one of it's terminal, the other one offering + //! sufficient slack (typically: 8). + //! + //! The segment will also be slackened from it's terminal if the difference + //! between the current slack (resulting from all the constraints of the + //! aligned set) and the native slack is less than 3 tracks. This case means + //! that we are already near the native slack and it not sufficent enough + //! a degree of freedom. + //! + //! \image html _slacken-1.png "slacken() for an Horizontal" + //! + //! The \c slacken() method reject the slackening of short locals as shown in + //! figure \b 2.a. One way or another, we must connect to the terminal through + //! \b this short local. If we cannot place it, breaking it in two other + //! short local wouldn't help. In fact, it will only clutter more the GCell + //! and make subsequent routing more difficult. + //! + //! The figures \b 2.b and \b 2.c shows the special case of slackening an + //! horizontal from an \e horizontal terminal. In the original configuration, + //! the slack on segment \c id:10 is null, it's only choice is to be aligned + //! with the terminal. If a slackening is requested, it generally implies that + //! the horizontal track is blocked, and close to the terminal. Based on thoses + //! hypothesis, when we slacken the segment \c id:10 we impose that the + //! \e source contact is \b fixed on the terminal itself. That is, the segment + //! \c id:10 will be reduced to a zero-length and we made an immediate turn + //! (see \b 2.c ). + //! + //! \image html _slacken-2.png "slacken() for an Horizontal (special cases)" + +} diff --git a/katabatic/doc/GCell.dox b/katabatic/doc/GCell.dox index 64d9433a..64915d9e 100644 --- a/katabatic/doc/GCell.dox +++ b/katabatic/doc/GCell.dox @@ -1,179 +1,535 @@ + // -*- C++ -*- - namespace Katabatic { /*! \class GCell - * \brief Global Routing cell (\b API). + * + * \brief Routing Global Cell + * + * + * \section secGCellDescription GCell Description + * + * Please note that there are two kind of Global Cells (or GCell for short): + * - The GCell used by the global router Knik. + * - The GCell used by the detailed router (Katabatic & Kite). + * Although the information they hold is obviously related, they are two + * separate kind of objects. + * + * The area of the design to be routed is divided in a regular grid of + * rectangular area, the GCellGrid. Each rectangular area is a GCell. + * + * The GCell contains the following informations: + * - The AutoSegments that begins or ends in it. The list of segments + * is not avalaible directly but through the AutoContacts that are + * owned by the GCell. + * - The AutoSegments that go straight \e through it (or \e over it). + * Horizontal & Vertical segments are stored in two separeted list. + * Those two lists are sorted by layer depth (the deepest layers + * first). + * - A lot of synthetic information about the density of tracks used + * in the GCell. + * + * AutoContacts are affected to GCells, the area of the GCell is the + * one into which the AutoContact is allowed to be placed. It is this + * that way that the respect of the global routing choosen by Knik is + * enforced. See the AutoContact constraint box. + * + * When tracks are aligned with the GCell boundaries they one exactly on + * the boundary can belong to the GCell on either side of the boundary. + * But we want a clear and mutually exclusive ownership of each GCell + * area. So, we choose that one GCell do not own the topmost and rightmost + * track. And to implement it, we shrink top and right coordinates by + * the amount of GCell::getTopRightShrink(), which must be less than the + * track spacing. + * + * + * \subsection secGCellDensity Saturation & Density Computation + * + * At any depth (i.e. layer), in the preferred routing direction, a GCell + * can pass a finite length of wire. For example on an horizontal preferred + * layer: + \f[ + WL_{max} = width(GCell) \times Htracks(GCell) + \f] + * Then the density, is the ratio between \f$WL_{max}\f$ and the actually + * used wirelength: + \f[ + Wdensity(depth) = \frac{WL_{used}(depth)}{WL_{max}(depth)} + \f] + * Normally, the ratio musn't exceed 1.0, but the occupied wire length computation, + * for now, doesn't merge overlapping wires belonging to the same net, so + * the ratio may be slightly inaccurate. Thus in some pathological cases may + * be greater than 1.0 whithout truly been overloaded. * - * \attention This class can only be allocated through a GCellGrid thus - * Constructors/Destructors are protecteds. + * A Cell is considered as \e saturated if the overall density is above the + * saturation ratio given by Session::getSaturateRatio(). * - * \remark As this object uses the decorator Design Pattern, almost all - * functions are pure virtuals. Implementation take place in a - * derived class \c GCellConcrete which is not documented, - * (same specifications as GCell). + * Contact density is calculated as follow: + \f[ + Cont_{density} = \frac{|Contacts|}{Htracks \times Vtracks \times 4} + \f] + * It is a ratio over the number of actual contacts in the GCell and the maximal + * number. The maximal number being the product of the number of tracks in + * both direction and 4 stands for the hardwired number of layers (the depth). + * + * Should not be hardwired... \red{To be corrected in future versions.} + * + * + * \subsection secGCellFeedthrough Feedthrough Computation * - * \see GCellDecorator class. - */ - - /*! \function GCellGrid* GCell::getGCellGrid () const; - * \return The GCellGrid to which the GCell belongs. - */ - - /*! \function unsigned int GCell::getIndex () const; - * \return The linear index of this GCell inside the GCellGrid GCell table. - */ - - /*! \function unsigned int GCell::getRow () const; - * \return The GCell's row inside the GCellGrid (this is a Y coordinate). - */ - - /*! \function unsigned int GCell::getColumn () const; - * \return The GCell's row inside the GCellGrid (this is a X coordinate). - */ - - /*! \function Point GCell::getCenter () const; - * \return The center of the GCell. - */ - - /*! \function DbU::Unit GCell::getX () const; - * \return The X coordinate of the GCell's lower left corner (\b XMin). - */ - - /*! \function DbU::Unit GCell::getY () const; - * \return The Y coordinate of the GCell's lower left corner (\b YMin). - */ - - /*! \function DbU::Unit GCell::getXMax () const; - * \return The X coordinate of the GCell's upper right corner. - */ - - /*! \function DbU::Unit GCell::getYMax () const; - * \return The Y coordinate of the GCell's lower upper right corner. - */ - - /*! \function Box GCell::getBoundingBox () const; - * \return The GCell bounding box. - */ - - /*! \function GCell* GCell::getLeft () const; - * \return The CCell's left neighbour (may be \c NULL if first of the row). - */ - - /*! \function GCell* GCell::getRight () const; - * \return The CCell's right neighbour (may be \c NULL if last of the row). - */ - - /*! \function GCell* GCell::getUp () const; - * \return The CCell's up neighbour (may be \c NULL if top of the column). - */ - - /*! \function GCell* GCell::getDown () const; - * \return The CCell's down neighbour (may be \c NULL if bottom of the column). - */ - - /*! \function unsigned int GCell::getDensity ( unsigned int depth ) const; - * \return The density of vertical wires going through this GCell. - * \see updateDensity() - */ - - /*! \function unsigned int GCell::getCDensity () const; - * \return The AutoContact density. - * \see updateDensity() - */ - - /*! \function unsigned int GCell::getDensity () const; - * \return The average of horizontal and vertical density. - * \see updateDensity() - */ - - /*! \function vector* GCell::getVSegments (); - * \return All vertical AutoSegment, starting, ending or crossing this GCell. - */ - - /*! \function vector* GCell::getHSegments (); - * \return All horizontal AutoSegment, starting, ending or crossing this GCell. - */ - - /*! \function vector* GCell::getContacts (); - * \return All AutoContact belonging to this GCell. - */ - - /*! \function AutoSegments GCell::getVStartSegments (); - * \return All vertical AutoSegment starting from this GCell. - */ - - /*! \function AutoSegments GCell::getHStartSegments (); - * \return All horizontal AutoSegment starting from this GCell. - */ - - /*! \function AutoSegments GCell::getVStopSegments (); - * \return All vertical AutoSegment ending in this GCell. - */ - - /*! \function AutoSegments GCell::getHStopSegments (); - * \return All horizontal AutoSegment ending in this GCell. - */ - - /*! \function AutoSegments GCell::getStartSegments ( unsigned int direction ); - * \param direction The selected direction. - * \return All AutoSegment starting from this GCell in \b direction. - */ - - /*! \function AutoSegments GCell::getStopSegments ( unsigned int direction ); - * \param direction The selected direction. - * \return All AutoSegment ending in this GCell in \b direction. - */ - - /*! \function void GCell::addVSegment ( AutoSegment* segment ); - * \param segment A vertical AutoSegment. + * The feedtrough value is an estimate is of how many complete tracks have been used + * on a given layer of the GCell. It varies between zero and the number of track on the + * GCell (complete saturation). As an estimate, it doesn't tell you the actual + * number of free track, but how many you may expect assuming the routing is + * reasonably well done. + * + * Computation is done as follow: + * + *
Wire typeEstimated Cost + *
Straight wire (feedthrough) + * \b 1.0 + *
Beginning or ending global wire + * \b 0.5 + *
Local wire. + * \b 1/3 + *
Blockage wire + * The exact percentage of the track + *
+ * + * + * \subsection secGCellTrackComputation Track Computation * - * Indicate that the vertical \c segment is going straigh through this - * GCell (no AutoContact). + * The number of track that can go through a GCell in the horizontal + * direction is computed as follow: + \f[ + Htracks = \frac{heigth(GCell)}{Vpitch} + 1 + \f] + * + * The pitch is assumed to be the same for every layer and is hardwired + * to 5.0 lambda. + * + * This is a bad architectural choice. The informations pertaining to + * routing should be held at Kite level, not be hardwired and the pitch + * should be made variable with the layer... + * \red{To be corrected in future versions}. + * + * + * \section secGCellLazyEvaluation GCell Lazy Evaluation + * + * To save processing time, the densities are not recomputed every time a + * segment is modified (added, removed or moved). Instead a lazy evaluation + * mechanism is used. Densities are recomputed each time a density is queried + * \e and the lazy evaluation \e not explicitly disabled (flag NoUpdate). + * + * + * \section secGCellSortingKey GCell Sorting Key + * + * In order to perform a lexicographical sort on the tuple \f$(density(depth),id)\f$ + * of a GCell, a specific slave object GCell::Key is introduced. It is the + * density on one specific depth, not the average density. + * + * + * \section secGCellDesaturation GCell Desaturation / Layer Assignment + * + * In addition to it's geometrical and density functionality, the GCell + * provides \e desaturation capabilities. Desaturation is the operation + * of moving up feedthough AutoSegment from the bottom layers towards + * the upper ones in order to balance the densities in the different + * densities. Thoses operations provides building blocks for the layer + * assignment stage which is provided by the Kabatic tool. + * + * Two strategies are avalaibles, moving one global AutoSegment at a + * time with GCell::stepDesaturate() or, when one AutoSegment is moved + * up, move up the whole net trunk with GCell::stepNetDesaturate(). + * + * \section secGCellImplantation GCell Implantation + * + * GCell derives from Hurricane::ExtensionGo to allow a graphical rendering + * of the routing density. */ - /*! \function void GCell::addHSegment ( AutoSegment* segment ); - * \param segment An horizontal AutoSegment. + //! \function size_t GCell::getAllocateds (); + //! \sreturn The number of allocated GCells. + + //! \function const Name& GCell::getStaticName (); + //! \sreturn The name of the Go slice: \c "Katabatic::GCell". + //! + //! \see Hurricane::ExtensionGo + + //! \function const Name& GCell::getName () const; + //! \sreturn The name of the Go slice: \c "Katabatic::GCell". + //! + //! \see Hurricane::ExtensionGo + + //! \function Box GCell::getBoundingBox () const; + //! \sreturn The bounding box of the GCell, with the top right shrink applied. + + //! \function void GCell::translate ( const DbU::Unit&, const DbU::Unit& ); + //! Required to exists as a Hurricane::Go derived class. But must never + //! be used... + + //! \function GCellGrid* GCell::getGCellGrid () const; + //! \sreturn The Grid of which GCell is part of. + + //! \function unsigned int GCell::getIndex () const; + //! \sreturn The linear index of the GCell in the GCellGrid vector. + //! + //! \see GCellGrid for the meaning of the index. + + //! \function unsigned int GCell::getRow () const; + //! \sreturn The row of the GCell in the GCellGrid. + + //! \function unsigned int GCell::getColumn () const; + //! \sreturn The Column of the GCell in the GCellGrid. + + //! \function GCell* GCell::getLeft () const; + //! \sreturn The left neighbor of the GCell (\c NULL if it is the leftmost GCell). + + //! \function GCell* GCell::getRight () const; + //! \sreturn The right neighbor of the GCell (\c NULL if it is the rightmost GCell). + + //! \function GCell* GCell::getUp () const; + //! \sreturn The top neighbor of the GCell (\c NULL if it is the topmost GCell). + + //! \function GCell* GCell::getDown () const; + //! \sreturn The bottom neighbor of the GCell (\c NULL if it is the bottommost GCell). + + //! \function DbU::Unit GCell::getTopRightShrink (); + //! \sreturn The amount of shrink on the top and right boundaries. + + //! \function unsigned int GCell::getDepth () const; + //! \sreturn The depth (i.e. number of routing layers) of the GCell. + + //! \function bool GCell::isSaturated () const; + //! \sreturn \true if at least one layer exceed a saturation of \c 1.0 (more wirelength + //! that it can hold). + + //! \function bool GCell::isSaturated ( unsigned int depth ) const; + //! \sreturn \true if the saturation ratio of layer \c depth is over the threshold defined + //! for the GCells. + + //! \function bool GCell::isValid () const; + //! \sreturn \true if all the AutoContact/AutoSegment of the GCell are valids. + + //! \function bool GCell::isAboveDensity ( float threshold ) const; + //! \sreturn \true if the overall saturation ratio greater than \c threshold. + + //! \function bool GCell::hasFreeTrack ( size_t depth, float reserve ) const; + //! \sreturn \true if there should be enough wire length to pass a wire completly + //! trough this GCell. + + //! \function DbU::Unit GCell::getX () const; + //! \sreturn The lower left X coordinate of the GCell box. + + //! \function DbU::Unit GCell::getY () const; + //! \sreturn The lower left Y coordinate of the GCell box. + + //! \function DbU::Unit GCell::getXMax () const; + //! \sreturn The upper right X coordinate of the GCell box (top right shrink applied). + + //! \function DbU::Unit GCell::getYMax () const; + //! \sreturn The upper right Y coordinate of the GCell box (top right shrink applied). + + //! \function Interval GCell::getSide ( unsigned int direction ) const; + //! \sreturn The interval corresponding to the side position of the GCell box, + //! in \c direction. + + //! \function float GCell::getHCapacity () const; + //! \return The number of track that can go through the GCell in the horizontal + //! direction. For a detailed explanation of the computation see + //! \ref secGCellTrackComputation. + + //! \function float GCell::getVCapacity () const; + //! \return The number of track that can go through the GCell in the vertical + //! direction. For a detailed explanation of the computation see + //! \ref secGCellTrackComputation. + + //! \function float GCell::getDensity ( unsigned int flags=0 ) const; + //! \sreturn The average density of the GCell, for all the depths. + //! + //! \ref secGCellDensity, \ref secGCellLazyEvaluation. + + //! \function float GCell::getCDensity ( unsigned int flags=0 ) const; + //! \sreturn The density of contacts. + //! + //! \ref secGCellDensity, \ref secGCellLazyEvaluation. + + //! \function float GCell::getWDensity ( unsigned int depth, unsigned int flags=0 ) const; + //! \sreturn The density of wires at \c depth. + //! + //! \ref secGCellDensity, \ref secGCellLazyEvaluation. + + //! \function DbU::Unit GCell::getBlockage ( unsigned int depth ) const; + //! \sreturn The total length of blockage wire on layer at \c depth. + + //! \function float GCell::getFragmentation ( unsigned int depth ) const; + //! \sreturn The longest free fragment size on layer \c depth (in percent). + + //! \function float GCell::getFeedthroughs ( unsigned int depth ) const; + //! \sreturn The estimate number of \e occupied tracks on layer \c depth. + //! + //! \see \ref secGCellFeedthrough + + //! \function float GCell::getGlobalsCount ( unsigned int depth ) const; + //! \sreturn The number of global wires that go completly through the GCell at layer \c depth. + //! This do not includes the global wires that begins or ends in the GCell. + + //! \function const vector& GCell::getHSegments () const; + //! \returns The vector of all horizontal AutoSegments that completly goes through the GCell. + + //! \function const vector& GCell::getVSegments () const; + //! \returns The vector of all vertical AutoSegments that completly goes through the GCell. + + //! \function const vector& GCell::getContacts () const; + //! \returns The vector of all AutoContacts owned by the GCell. + + //! \function AutoSegments GCell::getHStartSegments (); + //! \returns A Collection of the horizontal AutoSegments that starts from this GCell. + + //! \function AutoSegments GCell::getVStartSegments (); + //! \returns A Collection of the vertical AutoSegments that starts from this GCell. + + //! \function AutoSegments GCell::getHStopSegments (); + //! \returns A Collection of the horizontal AutoSegments that stops in this GCell. + + //! \function AutoSegments GCell::getVStopSegments (); + //! \returns A Collection of the vertical AutoSegments that stops in this GCell. + + //! \function AutoSegments GCell::getStartSegments ( unsigned int direction ); + //! \returns A Collection of the horizontal or vertical AutoSegments that starts from this GCell + //! according to \c direction. + + //! \function AutoSegments GCell::getStopSegments ( unsigned int direction ); + //! \returns A Collection of the horizontal or vertical AutoSegments that stops in this GCell + //! according to \c direction. + + //! \function size_t GCell::getRoutingPads ( set& rps ); + //! \returns The size of the RoutingPad set. + //! + //! Fills the \c rps set with all the RoutingPads that appears in this GCell. + //! (looks at all the anchors of the owned AutoContact) + + //! \function const Key& GCell::getKey () const; + //! \returns The sorting key of the GCell. + //! + //! \see \ref secGCellSortingKey + + //! \function size_t GCell::checkDensity () const; + //! \returns \c 1 if the GCell is saturated, 0 otherwise. + //! + //! Check, if the GCell is saturated, layer by layer. Issue a warning + //! if that is the case. + + //! \function bool GCell::checkEdgeSaturation ( float threshold ) const; + //! \returns \true if the Up/Right edge is over the \c threshold. + //! + //! Check if the number of AutoSegments crossing the Up & Right edges of the GCell + //! exceed \c threshold. The \c thresold must be expressed as a percentage of + //! the full capacity of the edges. The overload is computed as a whole and not + //! depth by depth. + + //! \function void GCell::addBlockage ( unsigned int depth, DbU::Unit length ); + //! Adds \c length of wire blockage to layer \c depth. + + //! \function void GCell::addHSegment ( AutoSegment* segment ); + //! Adds \c segment to the list of horizontal feedthroughs. + + //! \function void GCell::addVSegment ( AutoSegment* segment ); + //! Adds \c segment to the list of vertical feedthroughs. + + //! \function void GCell::addContact ( AutoContact* contact ); + //! Adds \c contact to the list of contacts owned by this GCell. + + //! \function void GCell::removeHSegment ( AutoSegment* segment ); + //! Removes \c segment to the list of horizontal feedthroughs. + + //! \function void GCell::removeVSegment ( AutoSegment* segment ); + //! Removes \c segment to the list of vertical feedthroughs. + + //! \function void GCell::removeContact ( AutoContact* contact ); + //! Removes \c contact to the list of contacts owned by this GCell. + + //! \function void GCell::updateContacts (); + //! Force a geometry update on all the AutoContact of the GCell. + + //! \function size_t GCell::updateDensity (); + //! \sreturn \true if the GCell is saturated. + //! + //! Update the various densities of the GCell. No actual computation is + //! performed if the GCell is \e not invalidated. + + //! \function void GCell::updateKey ( unsigned int depth ); + //! Update the GCell key with the new density at layer \c depth. + //! + //! \see \ref secGCellSortingKey. + + //! \function bool GCell::stepDesaturate ( unsigned int depth, set& globalNets, AutoSegment*& moved, unsigned int flags=0 ); + //! \param depth The depth to desaturate. + //! \param globalNets The set of Nets of which at least one segment has been moved up. + //! \param moved The moved up AutoSegment. + //! \param flags If KbForceMove is set, force one AutoSegment to move up, event if + //! the GCell is not saturated in the relevant depth. + //! + //! \sreturn \true if an AutoSegment has actually been moved up. + //! + //! Perform the atomic desaturation, that is move up one AutoSegment from + //! layer \c depth to layer depth+2, longuests AutoSegments are + //! moved first. Only global feedthrough AutoSegments are candidates to be + //! moved up. The Net owning the moved up segment is added to the \c globalNets + //! set. If the GCell is not saturated on layer \c depth, nothing is + //! done. If the \c forced flag is set, one global AutoSegment is moved up + //! regardless of the saturation status. + //! + //! \see \ref secGCellDesaturation + + //! \function bool GCell::stepNetDesaturate ( unsigned int depth, set& globalNets, SetIndex& invalidateds ); + //! \param depth The depth to desaturate. + //! \param globalNets The set of Nets of which at least one segment has been moved up. + //! \param invalidateds The set of GCell ids that have been invalidateds. + //! + //! \sreturn \true if a Net has been moved up. + //! + //! Perform a desaturation by whole Net trunk. Select the longest feedthrough + //! AutoSegment in layer \c depth, then attempt to move up the whole Net (all + //! it's global AutoSegments are moved up). + //! + //! \see \ref secGCellDesaturation + + //! \function bool GCell::rpDesaturate ( set& nets ); + //! If the number of RoutingPad in the first routing layer exceed the + //! Session::getSaturateRp() threshold, force a desaturation of layer + //! \c depth 1 until it is below 0.5. + //! + //! \see \ref secGCellDesaturation + + + /*! \class GCell::CompareByIndex + * + * \brief GCell Index Comparison Functor * - * Indicate that the horizontal \c segment is going straigh through this - * GCell (no AutoContact). + * A comparison functor for GCell, compare by \c index (the linear + * index in the GCellGrid vector. */ - /*! \function void GCell::addContact ( AutoContact* contact ); - * \param contact An AutoContact. + //! \typedef typedef set GCell::SetIndex; + //! Shorthand for a set of GCell sorted on their index. + + + /*! \class GCell::CompareByDensity + * + * \brief GCell Density Comparison Functor * - * Indicate that the \c contact is owned by this GCell. This means that - * either it's a branching point or there are terminals in the GCell. - * The AutoContact is geometrically bound by the GCell bounding box. + * A comparison functor for GCell, compare by density on layer \c depth. */ - /*! \function void GCell::updateContacts (); - * Force the geometrical recalculation of all AutoContact owned by - * this GCell. + //! \function GCell::CompareByDensity::CompareByDensity ( unsigned int depth ); + //! Build a density comparator for GCells on layer \c depth. + + + /*! \class GCell::Key + * + * \brief GCell Key - Density Cache + * + * This class is used to create a GCell internal cache on density, mainly + * to be used by GCellDensitySet. */ - /*! \function void GCell::updateDensity (); - * Recompute the horizontal, vertical, global and contact of - * this GCell. + //! \function GCell::Key::Key ( GCell* owner, unsigned int depth ); + //! \param owner The GCell owning the key. + //! \param depth The layer \c depth of the density to use. + //! + //! Key constructor, with an initial value for the cached density. + + //! \function GCell* GCell::Key::getGCell () const; + //! \sreturn The owning GCell. + + //! \function float GCell::Key::getDensity () const; + //! \sreturn The value of the cached density. + + //! \function void GCell::Key::update ( unsigned int depth ); + //! \sreturn Update the density + + + /*! \class GCellDensitySet + * + * \brief GCell Set, sorted by density * - * The horizontal density is computed as follow : the sum of the length - * of all horizontal wires divided by the the total length of horizontal - * wires (the width of the GCell times the number of horizontal tracks). - * A density equal to one means a totally saturated GCell, and greater - * than one an overloaded GCell (unroutable). + * A small container helper to manage a set of GCell sorted by density + * on a specific layer \c depth. * - * The vertical density is computed in a similar way to the horizontal - * one. + * The helper is implemented in term of a set. Once inserted in a set + * an element must not have is sorting key changed. But GCell density + * may change due to AutoSegment modifications during the lifetime of + * the set. To circumvent this problem, the GCell provide a key attribute + * to be used specifically with GCellDensitySet. This key act as a cached + * copy of the GCell density which is updated \e only by a call to + * GCell::updateKey() (and \e not GCell::updateDensity()). GCell which + * density have changed and key has to be updated must be signaled to + * set with the GCellDensityQueue::unqueue() method. When we want to + * update the sorting of the set on the new densities, we call + * GCellDensitySet::requeue() which, for each invalidated GCell do: + * - Remove the GCell from the set. + * - Update the key (call GCell::updateKey()). + * - Reinsert the GCell in the set (thus with the updated key). * - * The global density is the average of horizontal and vertical - * density. + * Typical usage: +\code + GCellDensitySet gcells ( 2, *(getGCellGrid()->getGCellVector()) ); + + while ( true ) { + bool optimized = false; + + std::set::const_iterator igcell = gcells.getGCells().begin(); + for ( ; igcell != gcells.getGCells().end() ; ++igcell ) { + if ( doSomeOptimization(*igcell) ) { + optimized = true; + gcells.unqueue( *igcell ); + } + } + + if (not optimized) break; + + gcells.requeue(); + } +\endcode * - * AutoContact density is the ratio of number of contact with length of - * the diagonal of the GCell multiplied by two. This is a rough approximate. - * - * \see GCellGrid::updateDensity(). */ + //! \function GCellDensitySet::GCellDensitySet ( unsigned int depth ); + //! Create a new empty GCellDensitySet, sorting on density of layer \c depth. + + //! \function GCellDensitySet::GCellDensitySet ( unsigned int depth, const std::vector& gcells ); + //! Create a new empty GCellDensitySet, sorting on density of layer \c depth. + //! Load the queue with the GCells supplied in the \c gcells vector. + + //! \function GCellDensitySet::~GCellDensitySet (); + //! Delete a GCellDensitySet, if the queue is not empty, issue a warning. + + //! \function bool GCellDensitySet::empty () const; + //! \sreturn \true if the queue is empty. + + //! \function size_t GCellDensitySet::size () const; + //! \sreturn the numbers of elements in the queue. + + //! \function const std::set& GCellDensitySet::getGCells () const; + //! \sreturn the list of GCells currently in the queue. + + //! \function size_t GCellDensitySet::insert ( GCell* gcell ); + //! Insert \c gcell into the set. + + //! \function size_t GCellDensitySet::erase ( GCell* gcell ); + //! Remove \c gcell from the set. + + //! \function void GCellDensitySet::unqueue ( GCell* gcell ); + //! Invalidate \c gcell. The density of \c gcell may have changed and needs to be + //! reinserted into the queue. It is temporarily set asides until the next + //! call to GCellDensitySet::requeue(). + + //! \function void GCellDensitySet::requeue (); + //! Reinsert in the queue all the GCells that have been previously + //! invalidated by a call to GCellDensitySet::unqueue(). This function calls + //! GCell::updateKey() before reinserting the GCell. + } diff --git a/katabatic/doc/GCellGrid.dox b/katabatic/doc/GCellGrid.dox index d8fa9960..eedf619b 100644 --- a/katabatic/doc/GCellGrid.dox +++ b/katabatic/doc/GCellGrid.dox @@ -1,21 +1,110 @@ // -*- C++ -*- - namespace Katabatic { /*! \class GCellGrid - * \brief Routing Grid (\b API). * - * \attention This class is can only be allocated through a Katabatic - * \c ToolEngine thus Constructors/Destructors are protecteds. + * \brief GCell Grid * - * \section GCellGridImplementation GCellGrid Implementation Details + * The GCell Grid of Katabatic. Although the base template class + * Grid support irregular grid, the GCellGrid is regular, following + * the Knik global router GCells. Only the topmost row and leftmost + * column may have different height or width to cope with the + * design real size. + * + * Due to the regular nature of the grid, the horizontal & vertical + * edges capacities are all identical, and initialized from the + * Katabatic Configuration. + * + * The grid is build from the Knik global routing, so obviously + * a KnikEngine must be attached to the Cell when building the + * GCellGrid. An error is thrown otherwise. */ - /*! \function void GCellGrid::updateDensity (); - * \return Recompute the density of each GCell in the grid. - * \see GCell::updateDensity(). - */ + //! \function GCellGrid* GCellGrid::create( KatabaticEngine* ktbt ); + //! API-space contructor. + + //! \function void GCellGrid::_postCreate (); + //! Perform the GCell & GCell vector allocation. + //! - Read the horizontal and vertical cut lines from Knik and translate + //! them into BaseGrid::Axis. + //! - From the BaseGrid::Axis, deduces the exact positions of the GCells and + //! allocate them. + //! - The GCell allocation is done in a "row by row" fashion consistent + //! with BaseGrid implicit assumptions. + + //! \function void GCellGrid::_preDestroy (); + //! The GCells are deleted at this point. + + //! \function Cell* GCellGrid::getCell() const; + //! \sreturn The associated Cell. + + //! \function KatabaticEngine* GCellGrid::getKatabatic() const; + //! \sreturn The associated KatabaticEngine. + + //! \function unsigned int GCellGrid::getDensityMode() const; + //! \sreturn The computation mode of the GCell densities. + + //! \function size_t GCellGrid::getHEdgeCapacity() const; + //! \sreturn The horizontal edge capacity. As the matrix is regular it is + //! identical for all horizontal edges. + + //! \function size_t GCellGrid::getVEdgeCapacity() const; + //! \sreturn The vertical edge capacity. As the matrix is regular it is + //! identical for all vertical edges. + + //! \function Interval GCellGrid::getUSide( unsigned int direction ) const; + //! \sreturn The side of the whole grid in \c direction. + + //! \function size_t GCellGrid::checkDensity() const; + //! \sreturn The number of GCell saturateds. + //! + //! Check all GCells for saturations. + + //! \function bool GCellGrid::checkEdgeSaturation( float threshold ) const; + //! \sreturn \true if at least one edge is over \c threshold (percentage + //! of occupation). + //! + //! Check all the edges for saturations. + + //! \function void GCellGrid::setDensityMode( unsigned int mode ); + //! Sets the density computation mode. + + //! \function void GCellGrid::updateContacts( unsigned int flags=KbOpenSession ); + //! Force an update on all AutoContact on all the GCells. + //! if \c openSession is \true, enclose the update in a Session. + + //! \function size_t GCellGrid::updateDensity(); + //! \sreturn The number of GCell saturateds. + //! + //! Force a density update on all the GCells. + + //! \enum GCellGrid::DensityMode + //! Various ways of computing the overall density of a GCell. + + //! \var GCellGrid::AverageHVDensity + //! The average density all depths accounted. + + //! \var GCellGrid::AverageHDensity + //! The average density of horizontal layers. + + //! \var GCellGrid::AverageVDensity + //! The average density of horizontal layers. + + //! \var GCellGrid::MaxHVDensity + //! The maximum of the average horizontal & vertical densities taken + //! as a whole. + + //! \var GCellGrid::MaxVDensity + //! The maximum of the average vertical densities taken depth by depth. + + //! \var GCellGrid::MaxHDensity + //! The maximum of the average horizontal densities taken depth by depth. + + //! \var GCellGrid::MaxDensity + //! The maximum of the average horizontal & vertical densities + //! taken depth by depth. + + } - } diff --git a/katabatic/doc/Grid.dox b/katabatic/doc/Grid.dox index 49da96dd..1c4ef2e5 100644 --- a/katabatic/doc/Grid.dox +++ b/katabatic/doc/Grid.dox @@ -1,114 +1,150 @@ // -*- C++ -*- - namespace Katabatic { /*! \class BaseGrid - * \brief Grid Common Skeleton (\b API). * - * \attention Provide a non-template common skeleton for the Grid class - * template. Specifically manage the axis graduation, the geometric - * search functions and the indexes computation (assuming a linear - * storage of the grid elements). - * + * \brief Abstract Base Class for Irregular Grid * - * \section BaseGridImplementation Grid Implementation Details + * An abstract class for a 2-D matrix of objects. The grid is irregular + * in the sense that the horizontal and vertical cut lines may not be + * evenly spaced. * - * The matrix of GCell is stored in a linear vector of GCell's pointer, - * row by row. The Grid class provide convenient functions to - * convert a linear index into row / column and the other way around. + * The coordinates of cut lines in horizontal and vertical direction + * are stored BaseGrid::Axis structure. + * + * The BaseGrid contains all the non-template methods of the Grid, + * that is that do not depend of the matrix element type. + * + * The internal storage implemented in derived classes is expected to + * store "row by row" (rows are put one after another in the vector). */ - /*! \function unsigned int BaseGrid::getColumns () const; - * \return The number of columns of the GCell matrix. + //! \function void BaseGrid::destroy(); + //! The user-level destructor. + + //! \function BaseGrid::BaseGrid ( const Box& bb ); + //! Construct a new BaseGrid on area \c bb. Graduations, rows & columns are + //! sets to zero. + + //! \function const Box& BaseGrid::getBoundingBox() const; + //! \sreturn The grid bounding box. + + //! \function unsigned int BaseGrid::getColumns() const; + //! \sreturn The numbers of columns in the grid. + + //! \function unsigned int BaseGrid::getRows() const; + //! \sreturn The numbers of rows in the grid. + + //! \function unsigned int BaseGrid::getRawSize() const; + //! \sreturn The total number of elements in the grid (i.e. \f$ rows \times columns \f$) + + //! \function unsigned int BaseGrid::getIndex( unsigned int c, unsigned int r ) const; + //! An helper function that compute the linear index in the element + //! vector from a \c (c,r) coordinate pair: + //! \f[ index = c + r \times columns \f] + + //! \function unsigned int BaseGrid::getRow( unsigned int i ) const; + //! An helper function that compute the row number from the linear index in + //! the vector: + //! \f[ row = index / columns \f] + + //! \function unsigned int BaseGrid::getColumn( unsigned int i ) const; + //! An helper function that compute the column number from the linear index in + //! the vector: + //! \f[ column = index \div columns \f] + + //! \function const Axis& BaseGrid::getXGrads() const; + //! \sreturn The graduations on the X axis. + + //! \function const Axis& BaseGrid::getYGrads() const; + //! \sreturn The graduations on the Y axis. + + + + /*! \class BaseGrid::Axis + * + * \brief Graduations on a BaseGrid Axis (H or V). + * + * Describe the list of graduations on either X or Y axis of a + * BaseGrid. Graduations correspond to cut lines and may not be + * evenly spaced. + * + * Graduations are internally stored into a vector that needs to be + * sorted whenever new graduations are added (BaseGrid::Axis::sort()). */ - /*! \function unsigned int BaseGrid::getRows () const; - * \return The number of rows of the GCell matrix. - */ + //! \function void BaseGrid::Axis::addGraduation ( DbU::Unit pos ); + //! Adds a new graduation. After adding new graduations, do not forget + //! to perform a sort. - /*! \function unsigned int BaseGrid::getRawSize () const; - * \return The size of the vector holding the GCell matrix. - */ + //! \function void BaseGrid::Axis::sort (); + //! Re-order the graduations after an addition. - /*! \function unsigned int BaseGrid::getIndex ( unsigned int column, unsigned int row ) const; - * \param column The GCell's column. - * \param row The GCell's row. - * \return The linear index of the GCell at (column,row). - */ + //! \function size_t BaseGrid::Axis::getSize () const; + //! \sreturn The number of graduations on the axis. - /*! \function unsigned int BaseGrid::getRow ( unsigned int index ) const; - * \param index A linear index. - * \return extract the row number from the linear index. - */ + //! \function DbU::Unit BaseGrid::Axis::getGraduationNumber ( DbU::Unit pos, bool& onGraduation ) const; + //! \sreturn The index of the graduation which is immediatly inferior or equal to \c pos. + //! In case of strict equality, \c onGraduation is set to \true. + + //! \function DbU::Unit BaseGrid::Axis::operator[] ( unsigned int index ) const; + //! \sreturn The graduation at \c index. - /*! \function unsigned int BaseGrid::getColumn ( unsigned int index ) const; - * \param index A linear index. - * \return extract the column number from the linear index. - */ /*! \class Grid - * \brief Routing Grid (\b API). * - * \attention This class is can only be allocated through a Katabatic - * \c ToolEngine thus Constructors/Destructors are protecteds. + * \brief Template Class for Regular Grid * - * \section GridImplementation Grid Implementation Details - * - * The matrix of GCell is stored in a linear vector of GCell's pointer, - * row by row. The Grid class provide convenient functions to - * convert a linear index into row / column and the other way around. + * Contains all general purpose methods depending on the GCell type + * and geometrical computations. The internal storage is still not implemented + * in this class. */ + //! \function Grid::Grid ( const Box& ); + //! Grid constructor. - /*! \function GCell* Grid::getGCell ( const Point p1, const Point p2 ) const; - * \param p1 First point. - * \param p2 Second point. - * \return Returns the GCell enclosing both points. - * - * When we build a Net's routing wires, and the Net span more than one - * GCell, we can always find the appropriate GCell through the - * \c Hook, \c GCell and GCell association. - * - * Problem arises for a Net fully contained inside one GCell, in this - * case there is no SplitterContact telling us where we are. We have - * to guess the GCell by only using RoutingPad's positions. And unfortunatly - * \c RoutingPad can be on the edge of one GCell so we cannot tell if - * it belongs to the left or the right. To solve this problem we guess - * the GCell from two (different) \c RoutingPad positions. - * - * Note that if there is only one \c RoutingPad, there is no problem at - * all : we are dealing with a one \c Plug \c Net... - * - * If points do not belongs to one GCell (too far appart), strange - * results may occurs. - */ + //! \function CGellT* Grid::getGCell ( unsigned int index ) const; + //! \sreturn The grid object at linear index \c index in the vector. + //! If \c index is out of bounds, return \c NULL. - /*! \function GCell* Grid::getGCell ( unsigned int index ) const; - * \param index A linear index. - * \return The GCell at the given index. - * - * Be aware that no check is performed if the index is out of bound, - * this may leads to catastrophic results. - */ + //! \function CGellT* Grid::getGCell ( const Point p ) const; + //! \sreturn The grid object which is under position \c p. + //! - /*! \function vector Grid::getGCellVector (); - * \return The \vector holding all GCells. - */ + //! \function CGellT* Grid::getGCell ( const Point p1, const Point p2 ) const; + //! \sreturn The grid object which is under position \c p1 and \c p2. + //! Not very clear though. - /*! \function GCells Grid::getGCellsColumn ( unsigned int column, unsigned int rowStart, unsigned int rowStop ); - * \param column The column index. - * \param rowStart The start row index inside the column. - * \param rowStop The stop row index inside the column. - * \return The \c Collection of a partial row. - */ + //! \function CGellT* Grid::getGCellLeft ( const GCellT* gcell ) const; + //! \sreturn The left neighbor of \c gcell, \c NULL if it is the leftmost one. + //! - /*! \function GCells Grid::getGCellsRow ( unsigned int row, unsigned int columnStart, unsigned int columnStop ); - * \param row The row index. - * \param columnStart The start column index inside the row. - * \param columnStop The stop column index inside the row. - * \return The \c Collection of a partial column. - */ + //! \function CGellT* Grid::getGCellRight ( const GCellT* gcell ) const; + //! \sreturn The rigth neighbor of \c gcell, \c NULL if it is the rightmost one. + //! + + //! \function CGellT* Grid::getGCellUp ( const GCellT* gcell ) const; + //! \sreturn The upper neighbor of \c gcell, \c NULL if it is the uppermost one. + //! + + //! \function CGellT* Grid::getGCellDown ( const GCellT* gcell ) const; + //! \sreturn The down neighbor of \c gcell, \c NULL if it is the downmost one. + //! + + //! \function GenericCollection Grid::getGCells (); + //! \sreturn A GCellT Hurricane collection built upon the linear GCellT vector of + //! the grid. + + //! \function GenericCollection Grid::getGCellsColumn ( unsigned int column, unsigned int rowStart, unsigned int rowStop ); + //! \sreturn A GCellT Hurricane collection that contains the part of \c column starting + //! from \c rowStart to \c rowStop inclusive. + + //! \function GenericCollection Grid::getGCellsRow ( unsigned int row, unsigned int columnStart, unsigned int columnStop ); + //! \sreturn A GCellT Hurricane collection that contains the part of \c row starting + //! from \c columnStart to \c columnStop inclusive. } + + diff --git a/katabatic/doc/KatabaticEngine.dox b/katabatic/doc/KatabaticEngine.dox index 7e09fa3e..451470fa 100644 --- a/katabatic/doc/KatabaticEngine.dox +++ b/katabatic/doc/KatabaticEngine.dox @@ -1,202 +1,307 @@ // -*- C++ -*- - namespace Katabatic { - /*! \mainpage Routing Toolbox Documentation - * - * This documentation adresses two level of explanations : - * - *
    - *
  • The \b API description which explains how to use Katabatic, - * thoses parts as flagged as \b API. - *
  • The internal description which details how Katabatic do - * things. It's mostly intended for myself to help me not to - * forget how I've done things when debug time will come... - * It may also be valuable to people who may want to use - * or patch Katabatic for their own purpose (my secret hope). - *
- */ - - - /*! \namespace Katabatic - * \brief The namespace dedicated to Katabatic. - */ - /*! \enum LoadGRMethod - * Lists all avalaible global routing loading methods for - * loadGlobalRouting(). - */ - /*! \var LoadGRMethod LoadGrByNet - * The global routing will be loaded net by net. - */ - /*! \var LoadGRMethod LoadGrByGCell - * The global routing will be loaded GCell by GCell. - */ - - /*! \class KatabaticEngine - * \brief The Katabatic ToolEngine, routing toolbox (\b API). - */ - - /*! \function KatabaticEngine* KatabaticEngine::create ( const RoutingGauge* gauge, Cell* cell, vector& nets ); - * \param gauge The RoutingGauge to use. - * \param cell The \Cell to be routed. - * \param nets The subset of \Nets to be routeds. Note that the vector is - * copied inside the KatabaticEngine object, so there's no need to keep - * the parameter. * - * creates a new KatabaticEngine object. Should never be used, as Katabatic - * must be used as the base class for any router, and therefore - * created through it. Still avalaible for debugging purposes. - */ - - /* \function void KatabaticEngine::destroy (); - * Cleanly destruct the data-base, saves the routing wires in - * the \Hurricane data-base (really a call to _preDestroy()). + * \brief The Katabatic Tool * - * \see _saveNet(). - */ - - /*! \function GCellGrid* KatabaticEngine::getGCellGrid () const; - * \return The associated GCellGrid. - */ - - /*! \function const vector& KatabaticEngine::getRoutingNets () const; - * \return The subset of \Nets that are to be routed. - */ - - /*! \function void KatabaticEngine::loadGlobalRouting ( unsigned int method ) - * \param method to specify the algorithm used to perform the loading. * - * translates a global routing created by Tornado (GCell/GCell data-base) - * into an initial detailed routing. Two algorithms are currently - * avalaibles : - *
    - *
  • LoadGrByNet : load global routing net by net. - *
  • LoadGrByGCell : load global routing GCell by GCell. - *
+ * \section secEngineStates States of KatabaticEngine * - * This method is essentially a switch which calls the appropriate sub-method - * _loadGrByNet() or _LoadGRbyGCell(). It relies on the presence of a Nimbus - * ToolEngine, if not found, throws an error. - */ - - /*! \function void KatabaticEngine::setGlobalThreshold ( DbU::Unit threshold ); - * \param threshold The global routing threshold. + * During it's lifecycle, the engine go through a serie of states. + * It only can go forward between states. + * - \b EngineCreation : just after C++ object creation until + * the global routing is loaded. + * - \b EngineGlobalLoaded : \e after the global routing has + * been done. This state must be set by an external tool, + * Katabatic cannot know by itself when the global routing + * has been done (see Kite). + * - \b EngineActive : \e after the global routing has been + * converted into the Katabatic data structure. At this point + * the tool is ready to run. + * - \b EngineDriving : \e during the stage of stripping all + * the decorations the tool has added over the Hurricane data + * structure (mostly: AutoContact & AutoSegment). + * - \b EngineGutted : \e after the tool decorations have been + * removed. The tool is now useless and can only be destroyed. + * - \b EnginePreDestroying : this special state is reached when + * going straight from EngineActive to the destructor, that is, + * skipping the EngineDriving state. That means we do not + * want to save whatever routing has been done. In that case, + * not only the tool decorations are destroyeds, but also the + * Hurricane data-structures they relies on (Contact, Segments). * - * The length (in DbU::Unit) from which an AutoSegment will be considered to be - * global. * - * \see layerAssign(), getGlobalThresold(). - */ - - /*! \function DbU::Unit KatabaticEngine::getGlobalThreshold () const; - * \return The value of the global routing thresold. + * \section secEngineImpl KatabaticEngine Implementation Details * - * \see setGlobalThresold(). + * Due to the size of the code and the fact that the main body + * of some methods do not need to be present in the class, + * the implementation of KatabaticEngine is split in several + * files. The list below summarize them: + * - \c KatabaticEngine.cpp : the core of the class, methods that really + * need their bodies here. + * - \c PowerRails.cpp : utilities to construct an abstract from all + * the power rails through the hierarchy. + * - \c LayerAssign.cpp : layer assignement related methods and helpers. + * - \c LoadGrByNet.cpp : global routing loader, transform global routing + * into Katabatic data-structure. + * - \c NetConstraints.cpp : compute the topological constraints of all + * AutoSegment/AutoContact of a Net. + * - \c NetOptimals.cpp : compute the optimal positions of all AutoSegment + * of a Net. */ - /*! \function void KatabaticEngine::_computeNetConstraints ( Net* ); - * computes the \c AutoSegment constraints (see \ref NetConstraints). - */ + //! \enum EngineState + //! Describe the current state of the KatabaticEngine. - /*! \function void KatabaticEngine::_computeNetOptimals ( Net* ); - * computes the \c AutoSegment optimal positions (see \ref NetOptimals). - */ + //! \var EngineCreation + //! The tool is created, but still in the \c _postCreate stage. - /*! \function AutoSegment* KatabaticEngine::_lookup ( Segment* segment ) const; - * \param segment The \c Hurricane segment. - * - * Finds the Katabatic AutoSegment associated to \c segment. - * For this function to work, a Katabatic update session must be open. - * If not, an exception will be thrown. - */ + //! \var EngineGlobalLoaded + //! The global routing has been loaded from Knik. - /*! \function void KatabaticEngine::_link ( AutoSegment* autoSegment ); - * adds \b autoSegment to the AutoSegment internal lookup table. - * This function does nothing if DoLinkAutoSegment() is \false : - * in destruction mode. - * \see _Lookup(). - */ + //! \var EngineActive + //! The Engine is in normal running mode (routing ordinary wires). - /*! \function void KatabaticEngine::_unlink ( AutoSegment* autoSegment ); - * removes \b autoSegment AutoSegment internal lookup table. - * This function does nothing if DoLinkAutoSegment() is \false : - * in destruction mode. - * \see _Lookup(). - */ + //! \var EngineDriving + //! The Engine is transforming the AutoContact/AutoSegment into + //! normal Contact/Segment (prior to tool deletion). - /*! \function void KatabaticEngine::_destroyAutoSegments (); - * clear the internal AutoSegment lookup table. Should be called - * only from inside the Katabatic destructor. - */ + //! \var EnginePreDestroying + //! This state is used whenever the tool is destroyed without passing + //! through the EngineDriving state. - /*! \function void KatabaticEngine::_saveNet ( Net* net ); - * \param net The \Net to process. - * - * Revert (partially destruct) the AutoSegment/AutoContact - * structure of the \Net to the \Hurricane data-base. - * To be used only in the Katabatic destructor... - * - * \see destroy(). - */ + //! \var EngineGutted + //! After the EngineDriving state, all the working structures are + //! removed and the tool can no longer be used. It only awaits clean + //! destruction. + + //! \typedef set KatabaticEngine::NetSet; + //! Set of Net to be routed, alphabetically sorteds. - /*! \function KatabaticEngine* KatabaticEngine::get ( const Cell* cell ) - * \brief Returns the Katabatic ToolEngine attached to the Cell, if any. - */ + //! \function KatabaticEngine* KatabaticEngine::create ( Cell* cell ); + //! Create a KatabaticEngine on \c cell. - /*! \function void KatabaticEngine::refresh ( bool openSession=true ); - * Force the update of all AutoContact. By default opens a new - * update Session. If one is already open, set openSession to - * \False. - */ + //! \function const Name& KatabaticEngine::staticGetName (); + //! \sreturn The unique string identifier for the KatabaticEngine class of ToolEngine. - /*! \function void KatabaticEngine::startMeasures (); - * Start memory consumption and timer measurment (reset any - * previous one). - * - * \see stopMeasures(), printMeasures(). - */ + //! \function bool KatabaticEngine::isGMetal ( const Layer* layer ) const; + //! \sreturn \true if \c layer is one of the special (fake) metals used to build + //! the global routing. - /*! \function void KatabaticEngine::stopMeasures (); - * compute memory consumption \& time elapsed since the last - * call to startMeasures(). - * - * \see startMeasures(), printMeasures(). - */ + //! \function bool KatabaticEngine::isChip () const; + //! \sreturn \true if the hierarchy top-level of the Cell matches the one of a complete + //! design (i.e. pads and one core instance). - /*! \function void KatabaticEngine::printMeasures () const; - * Display memory consumption \& time elapsed. - * - * \see startMeasures(), stopMeasures(). - */ + //! \function bool KatabaticEngine::isInDemoMode () const; + //! \sreturn \true if the tool is in demo mode, that is suppress almost all warning + //! and debug messages. - /*! \function void KatabaticEngine::_check ( const char* message=NULL ) const; - * \param message The message to print. - * - * Perform a coherency complete coherency check of the - * data-base. Currently : - *
    - *
  • No AutoSegment remains invalidated (\ref katabaticSession). - *
  • AutoSegment extentions are coherent. - *
- */ + //! \function bool KatabaticEngine::doWarnOnGCellOverload () const; + //! \sreturn \true if the tool should issue a warning when a GCell is overloaded + //! (overload could be transient). + //! \function bool KatabaticEngine::doDestroyBaseContact () const; + //! \sreturn \true if the EngineDestroyBaseContact is set, meaning that when an + //! AutoContact is destroyed, the Contact it decorates is destroyed + //! altogether. - //! \addtogroup collapseCanonical - //! \{ + //! \function bool KatabaticEngine::doDestroyBaseSegment () const; + //! \sreturn \true if the EngineDestroyBaseSegment is set, meaning that when an + //! AutoSegment is destroyed, the Segment it decorates is destroyed + //! altogether. - /*! \function void KatabaticEngine::_canonize ( Net* net ); - * \param net The \Net to canonize. - * - * Find canonical AutoSegments and non-canonicals ones, - * sets up the flags accordingly. - * - * \see AutoSegment::isCanonical(). - */ + //! \function bool KatabaticEngine::doDestroyTool () const; + //! \sreturn \true if the tool state is beyond EngineStateGutted, that is, only + //! waits for \c destroy() to be called. - //! \} + //! \function const Name& KatabaticEngine::getName () const; + //! \sreturn The unique string identifier for the KatabaticEngine class of ToolEngine. + + //! \function EngineState KatabaticEngine::getState () const; + //! \sreturn The state the tool is currently in. + + //! \function unsigned int KatabaticEngine::getFlags ( unsigned int mask ) const; + //! \sreturn The \e anded combination of the tool flags and \c mask. + + //! \function Configuration* KatabaticEngine::getKatabaticConfiguration (); + //! \sreturn The Configuration of Katabatic. In this class it is redundant with + //! getConfiguration(), but may be useful in derived classes. + + //! \function Configuration* KatabaticEngine::getConfiguration (); + //! \sreturn The Configuration of the current ToolEngine. + + //! \function RoutingGauge* KatabaticEngine::getRoutingGauge () const; + //! \sreturn The RoutingGauge (Configuration shortcut). + + //! \function RoutingLayerGauge* KatabaticEngine::getLayerGauge ( size_t depth ) const; + //! \sreturn The RoutingLayerGauge associated to \c depth (Configuration shortcut). + + //! \function const Layer* KatabaticEngine::getRoutingLayer ( size_t depth ) const; + //! \sreturn The routing Layer associated to \c depth (Configuration shortcut). + + //! \function Layer* KatabaticEngine::getContactLayer ( size_t depth ) const; + //! \sreturn The contact Layer associated to \c depth (Configuration shortcut). + + //! \function DbU::Unit KatabaticEngine::getGlobalThreshold () const; + //! \sreturn The length above which a global wire is moved up in the layer assignment + //! stage (Configuration shortcut). + + //! \function float KatabaticEngine::getSaturateRatio () const; + //! \sreturn The ratio above which a GCell is considered to be saturated + //! (Configuration shortcut). + + //! \function DbU::Unit KatabaticEngine::getExtensionCap () const; + //! \sreturn The wires extension cap, same for all layers for the time beeing + //! (Configuration shortcut). + + //! \function size_t KatabaticEngine::getSaturateRp () const; + //! \sreturn The number of RoutingPad above which a GCell is saturated, causing + //! extras global segments to be moved up. + //! (Configuration shortcut). + + //! \function GCellGrid* KatabaticEngine::getGCellGrid () const; + //! \sreturn The GCellGrid. + + //! \function const NetSet& KatabaticEngine::getRoutingNets () const; + //! \sreturn The set of nets to be routeds. + + //! \function const ChipTools& KatabaticEngine::getChipTools () const; + //! \sreturn The chip tools (for whole designs). + + //! \function void KatabaticEngine::xmlWriteGCellGrid ( ostream& ); + //! Write in a stream all informations on the GCells in XML format. + + //! \function void KatabaticEngine::xmlWriteGCellGrid ( const string& ); + //! Write in a file all informations on the GCells in XML format. + + //! \function void KatabaticEngine::setState ( EngineState state ); + //! Force the state of the tool. Must be used with caution, as no sanity + //! checks are performeds. This method is normally invoked from inside + //! the KatabaticEngine various methods. + + //! \function void KatabaticEngine::setFlags ( unsigned int flags ); + //! Set the flags given in \c flags. + + //! \function void KatabaticEngine::unsetFlags ( unsigned int flags ); + //! Reset the flags given in \c flags. + + //! \function void KatabaticEngine::setGlobalThreshold ( DbU::Unit ); + //! (Configuration shortcut). + + //! \function void KatabaticEngine::setSaturateRatio ( float ); + //! (Configuration shortcut). + + //! \function void KatabaticEngine::setSaturateRp ( size_t ); + //! (Configuration shortcut). + + //! \function void KatabaticEngine::startMeasures (); + //! Starts memory consuption & time measurements. + + //! \function void KatabaticEngine::stopMeasures (); + //! Stops memory consuption & time measurements. Recorded measures are + //! kept until the next call to Katabatic::startMeasures(). + + //! \function void KatabaticEngine::printMeasures ( const string& tag ) const; + //! Print memory & time measurement on ``cmess1``. If \c tag is not empty, + //! also adds the measurement to the internal table (with \c tag as label). + + //! \function void KatabaticEngine::refresh ( unsigned int flags=KbOpenSession ); + //! In case the tool is associated with a graphic display, trigger + //! a full redraw of the Cell. Slow the router but allow to see work + //! in progress... If \c flags do not contains \c KbOpenSession + //! the refresh operation will not be enclosed inside it's own session. + //! This assumes that a session is already opened. + + //! \function void KatabaticEngine::makePowerRails (); + //! Detect all the aligned segments of same width that compose power + //! rails, unificate them and copy them at the design top level. + + //! \function void KatabaticEngine::createDetailedGrid (); + //! Allocate the GCellGrid. + + //! \function void KatabaticEngine::loadGlobalRouting ( unsigned int method, NetSet& nets ); + //! \param method the loading algorithm + //! \param nets the set of nets to route. + //! + //! Convert the global routing into the initial detailed routing. For the + //! time beeing, only one loading algorithm is available: net by net + //! (EngineLoadGrByNet). Only Net given in \c nets are routeds. If \c nets is empty + //! then all ordinary nets are routeds. In either cases the set of nets to route + //! is pruned from any power, ground or clock signals. + //! + //! \remark The tool state must be \b EngineGlobalLoaded \e before calling this method + //! and will be set to \b EngineActive on exit. + + //! \function void KatabaticEngine::layerAssign ( unsigned int method ); + //! Perform the layer assignment. The global routing loading stage uses only + //! the two bottom most layers, this method spread them on all the availables + //! routing layers, according to GCell and RoutingPad density criterions. + //! + //! Two algorithms are availables: + //! - \b EngineLayerAssignByLength : the global wires are moved up one by + //! one. + //! - \b EngineLayerAssignByTrunk : if one global wire of a net is to be + //! moved up, then all the global trunk of the net is moved along. + //! This methods gives the best results for now. + + //! \function void KatabaticEngine::finalizeLayout (); + //! Transform the Katabatic wires into the Hurricane data-structure. + //! Mostly by removing the AutoSegment/AutoContact \e without removing + //! their Hurricane conterparts. May also fill gaps that may have appeared. + //! + //! \remark The tool state must be \b EngineActive \e before calling this method + //! and will be set to \b EngineGutted on exit. + + //! \function void KatabaticEngine::slackenBorder ( Box bb, Layer::Mask mask, unsigned int flags ); + //! \param bb The bounding box, defines the edges. + //! \param mask Consider only layers that are fully included in that mask. + //! \param flags Consider only segment in that direction. + //! + //! Perform a preventive break on all global segments going through the + //! \e vertical left and right edges of the \c bb box. The set of global + //! segments to be broken could be further restricted using \c mask and + //! \c flags. + //! + //! The Semantic of \c flags is not clear, must review the + //! code more closely. + + //! \function void KatabaticEngine::slackenBlockIos ( Instance* core ); + //! Perform a preventive break on horizontal segments in the GCell immediatly + //! \e outside the instance \c core area in the routing layer of index \c 1. + //! + //! \red{This method is too much hardwired to the \c SxLib gauge. It's effect is to break all \b METAL2 outside the core (in a chip).} + + //! \function bool KatabaticEngine::moveUpNetTrunk ( AutoSegment* seed, set& globalNets, GCell::SetIndex& invalidateds ); + //! \param seed The AutoSegment to take the net from. + //! \param globalNets The set of nets that has been moved up. + //! \param invalidateds The set of GCells that have been invalidated. + //! \sreturn \true if the net trunk have been moved up. + //! + //! Try to move up a whole net trunk. The net is supplied through the \c seed + //! argument (the segment that triggers the move). If the net is actually moved + //! up, it is added to \c globalNets and all GCells that have been invalidateds + //! are added to \c invalidateds. + //! + //! An individual AutoSegment of the net is moved up if it's length + //! is greater that \c 150 lambdas, that is, three times the side of a GCell. This is + //! hard-wired and should be parametrized in the future. + + //! \function void KatabaticEngine::computeNetConstraints ( Net* net ); + //! Compute the box constraints on AutoContacts (and therefore those applied to + //! AutoSegments). Constraints comes from AutoContacts anchoreds on RoutingPads + //! and transmitted through AutoContactHTee or AutoContactVTee. Constraints are + //! applied to all AutoContacts of an aligned set. + //! + //! \remark The \c net must have been canonized before this function to be called. + + //! \function void KatabaticEngine::toOptimals ( Net* net ); + //! Move all AutoSegment of \c net so that their axis are inside their + //! optimals interval. If a AutoSegment is already inside the interval is + //! not moved, otherwise it is put on the nearest bound of the optimal + //! interval. } diff --git a/katabatic/doc/LayerAssign.dox b/katabatic/doc/LayerAssign.dox deleted file mode 100644 index ce8526d8..00000000 --- a/katabatic/doc/LayerAssign.dox +++ /dev/null @@ -1,143 +0,0 @@ - - // -*- C++ -*- - - - namespace Katabatic { - - /*! \defgroup layerAssign 4. Layer Assignment (internal) - * - * This modules documents how layer assignment is performed. It is intented - * for developpers only. - * - * Layer Assignment functions works in two steps : - *
    - *
  1. For a given net, go through the \c AutoSegment and migrate them - * to upper (global) layers if needed. - *
  2. For each \c AutoContact of which at least one \c AutoSegment has been - * migrated, split the \c AutoContact (with SplitAutoContact()). - *
- * - * SplitAutoContact() relies on the hypothesis that the split occurs - * between two sets of \b HV layers. For example between \b M2/M3 and - * \b M4/M5 but not between \b M2/M3 and \b M6/M7. - * - * The following figures shows all possible configurations, except for - * the most obvious : when all \c AutoSegment are migrated from \b M2/M3 to - * \b M4/M5 we just change the layer of the \c AutoContact from \b C23 to \b C34. - * SplitAutoContact() compute the layer span of the AutoContact, - * that is, the distance between the lowest layer and the higher one (it - * cannot exceed 3 as from \b M2 to \b M5). Then it detach the higher - * \c AutoSegment and re-attach them to a newly created \c AutoContact. - * In turn this new \c AutoContact is connected to the previous one. - *
    - *
  • The span is 3 (\b M2 to \b M5) : creates 2 \c AutoContact and - * 2 \c AutoSegment. - *
  • The span is 2 (\b M2 to \b M4 or \b M3 to \b M5) : creates one - * \c AutoContact and one \c AutoSegment. - *
  • The span is 1 (\b M3 to \b M4) : just change the layer of the - * \c AutoContact to \b C34. - *
- * Simpler rules could be formulated : if \b M2 is present creates the - * \b M3 additionnal \c AutoSegment. If \b M5 is present, created the - * \b M4 additionnal \c AutoSegment. - * - * In M2+M3+M4+M5, M3+M4+M5 and M2+M3+M4 configurations - * two separates \b M4 \c AutoSegment (resp. \b M3 \c AutoSegment) are needed - * to avoid the incomplete AutoContact wiring problem - * (see \ref ssecFaultyTopologies). - * - * \image html SplitAutoContact-1.png "Full Configuration" - * \image latex SplitAutoContact-1.pdf "Full Configuration" width=0.4\textwidth - * \image html SplitAutoContact-2.png "No M3 Configuration" - * \image latex SplitAutoContact-2.pdf "No M3 Configuration" width=0.4\textwidth - * \image html SplitAutoContact-3.png "No M3,M4 Configuration" - * \image latex SplitAutoContact-3.pdf "No M3,M4 Configuration" width=0.4\textwidth - * \image html SplitAutoContact-4.png "No M2 Configuration (degenerate)" - * \image latex SplitAutoContact-4.pdf "No M2 Configuration (degenerate)" width=0.4\textwidth - * \image html SplitAutoContact-5.png "No M5 Configuration (degenerate)" - * \image latex SplitAutoContact-5.pdf "No M5 Configuration (degenerate)" width=0.4\textwidth - * \image html SplitAutoContact-6.png "No M2,M5 Configuration (degenerate)" - * \image latex SplitAutoContact-6.pdf "No M2,M5 Configuration (degenerate)" width=0.4\textwidth - */ - - - /*! \enum LayerAssignMethod - * List all avalaible global layer assignment algorithm avalaible for - * layerAssign(). - */ - - /*! \var LayerAssign LayerAssignByLength - * See layerAssign(). - */ - - /*! \var LayerAssign LayerAssignByTrunk - * See layerAssign(). - */ - - - /*! \function void KatabaticEngine::layerAssign ( unsigned int method ) - * \param method specify the algorithm used to perform the layer assignement. - * - * The loadGlobalRouting() method build a topology for each net using only the - * two first routing layers avalaibles (usually \e metal2 and \e metal3). - * To use upper routing layer we needs to go through a layer assignment - * step. The layerAssign() method provides two simples approaches to do so : - *
    - *
  • layerAssignByLength : every global AutoSegment which - * length is superior to the global threshold is moved to the upper layer. - *
  • layerAssignByTrunk : if any AutoSegment of a net - * exceed the global threshold, then all the global wiring of this - * net is put into the upper layers. - *
- * - * This method is a switch to _layerAssignByLength() or _layerAssignByTrunk(). - * - * The global threshold is to be sets using the setGlobalThreshold() - * method. - */ - - - //! \addtogroup layerAssign - //! \{ - - - /*! \function void KatabaticEngine::_layerAssignByLength ( unsigned long& total, unsigned long& global, set& globalNets ); - * - * Perform the layer assignment on all nets, using the - * layerAssignByLength algorithm. See layerAssign(). - */ - - /*! \function void KatabaticEngine::_layerAssignByLength ( Net* net, unsigned long& total, unsigned long& global, set& globalNets ); - * \param net The net to process. - * \param total The total number of AutoSegment. - * \param global The number of AutoSegment that have been sets global. - * \param globalNets Set of global Nets. - * - * Perform the layer assignment on one net, using the - * layerAssignByLength algorithm. See layerAssign(). - */ - - /*! \function void KatabaticEngine::_layerAssignByTrunk ( unsigned long& total, unsigned long& global, set& globalNets ); - * - * Perform the layer assignment on all nets, using the - * layerAssignByTrunk algorithm. See layerAssign(). - */ - - /*! \function void KatabaticEngine::_layerAssignByTrunk ( Net* net, unsigned long& total, unsigned long& global, set& globalNets ); - * \param net The net to process. - * \param total The total number of AutoSegment. - * \param global The number of AutoSegment that have been sets global. - * \param globalNets Set of global Nets. - * - * Perform the layer assignment on one net, using the - * layerAssignByTrunk algorithm. See layerAssign(). - */ - - //! \} - -} - - - namespace { - - } diff --git a/katabatic/doc/LoadGrByNet.dox b/katabatic/doc/LoadGrByNet.dox deleted file mode 100644 index 786d9c62..00000000 --- a/katabatic/doc/LoadGrByNet.dox +++ /dev/null @@ -1,27 +0,0 @@ - - // -*- C++ -*- - - - namespace Katabatic { - - /*! \function void KatabaticEngine::_loadGrByNet () - * Load the global routing from the Nimbus structure (built by the Tornado - * global router) into the Katabatic ToolEngine. - */ - - /*! \function void KatabaticEngine::_loadNetGlobalRouting ( Net* net ) - * \param net The net for which to build the final routing. - * - * Load the global routing from the Nimbus structure. Do a recursive - * walk through the GCells. Recursivity is handled with the - * ForkStack stack. - */ - - } - - - - - namespace { - - } diff --git a/katabatic/doc/NetConstraints.dox b/katabatic/doc/NetConstraints.dox deleted file mode 100644 index 534f7555..00000000 --- a/katabatic/doc/NetConstraints.dox +++ /dev/null @@ -1,128 +0,0 @@ - - // -*- C++ -*- - - - namespace Katabatic { - - /*! \defgroup NetConstraints 5. Constraints Computations (internal) - * - * This module documents how constraints computation are performed. - * It is intented for developpers only. - * - * Constraints gives the absolute minimal and maximal position an - * \c AutoSegment axis can be set. They materialize the bounds over - * which we may have an electrical disconnection. - * - * Practically, due to the magic of \c AutoContact, disconnections - * can only occurs on \c AutoContact anchored on \c RoutingPad : - * if they go outside the \c RoutingPad area, we are in trouble. - * Those \c AutoContact can be spotted either by the fact they have - * an anchor or the AutoContact::isTerminal() flag is set. - * - * - * \section secConstraintsOrgan Organisation - * - * Due to algorithmic consideration, instead of storing constraint - * interval (one axis) in \c AutoSegment, we store constraint \c Box - * (both axis) in \c AutoContact. They are easier to propagate during the - * computation stage and should takes less memory as \c AutoContact - * are often shared by more than two \c AutoSegment. - * - * To spare memory, each coordinate of the constraint \c Box is expressed - * as a strictly positive offset in \e lambdas from the lower left corner - * of the \c FCell owning the \c AutoContact. Offsets are 8 bits unsigned int, - * thus a \c Box takes one word (32 bits). This leads to two restrictions : - *
    - *
  • A \c FCell side cannot be greater than 256 \e lambdas. - *
  • The constraint \c Box minimal precision is the \e lambda. - *
- * In all cases I can foresee, none of them should be a problem. - * - * Constraint interval on \c AutoSegment can be deduced from any of - * the source or target \c AutoContact. For an horizontal \c AutoSegment - * we take the constraint \c Box vertical interval and for a vertical, - * the horizontal interval. - * - * - * \section secNativeConstraints Native Constraints - * - * Before the contraints computation starts, we needs to initialize - * each \c AutoContact \c Box to a reasonable default : the - * Native Constraint Box. Wich is : - *
    - *
  • For an anchored/passive \c AutoContact : the bounding box - * of the underlying terminal. - *
  • For any other \c AutoContact : the bounding box of the - * \c FCell owner. - *
- * - * - * \section secConstraintsPropagation Constraints Propagation - * - * The only source of constraints being the anchored \c AutoContact - * we do a full propagation from each of them. Propagation is done - * through \c AutoSegment as follow : - *
    - *
  • Horizontal \c AutoSegment propagate the vertical (\b DY) - * constraint part. - *
  • Vertical \c AutoSegment propagate the horizontal (\b DX) - * constraint part. - *
- * Obviously, any constraint diseapear after we have gone through - * exactly one horizontal and one vertical, thus the propagation is - * somewhat limited. - * - * Case of collapsed \c AutoSegment : those are to be kept at - * zero-length, thus they act as a bypass between two \c AutoContact. - * Their source and target can be considered as stacked - * and propagate both vertical and horizontal constraint (that is : - * the whole constraint \c Box). - * - * - * \section secCollapseUncollapse Collapsing & Uncollapsing - * - * Only local \c AutoSegment can be collapsed, as a global - * \c AutoSegment crosses the boundary of at least one \c FCell - * it can't have a null length. - * - * When collapsing a new \c AutoSegment, we can do an incremental - * constraint computation as it will result in a further increase - * of constraint (if any). - * - * When uncollapsing an \c AutoSegment we may have to slacken the - * constraint, but we do not know to which extend. So to make it - * simple we fully recompute constraints from scratch. - * - * Note that collapsing/uncollapsing are exceptionnal operations, - * so we can afford losing a little time there. - * - * - * \section secCollapseExample progressive Collapsing Example - * - * In this set of example we show how constraints propagate along the - * \c AutoSegment, depending on the collapsed ones. We starts we no - * collapse and ends with all \e local \c AutoSegment collapseds. - * - * \image html NetConstraints-1.png "Fully expanded" - * \image latex NetConstraints-1.pdf "Fully expanded" width=0.4\textwidth - * \image html NetConstraints-2.png "After One Vertical collapse" - * \image latex NetConstraints-2.pdf "After One Vertical collapse" width=0.4\textwidth - * \image html NetConstraints-3.png "After Horizontal collapse" - * \image latex NetConstraints-3.pdf "After Horizontal collapse" width=0.4\textwidth - * \image html NetConstraints-4.png "Fully collapsed" - * \image latex NetConstraints-4.pdf "Fully collapsed" width=0.4\textwidth - */ - - - //! \addtogroup NetConstraints - //! \{ - - /*! \function void KatabaticEngine::_computeNetConstraints ( Net* net ); - * \param net The net for which to compute constraints. - * - * compute constraints on a net. - */ - - //! \} - - } diff --git a/katabatic/doc/NetOptimals.dox b/katabatic/doc/NetOptimals.dox deleted file mode 100644 index 25109761..00000000 --- a/katabatic/doc/NetOptimals.dox +++ /dev/null @@ -1,59 +0,0 @@ - - // -*- C++ -*- - - - namespace Katabatic { - - /*! \defgroup NetOptimals 6. AutoSegment Optimal Placement (internal) - * - * This modules documents how \c AutoSegment optimal placement are computed. - * It is intented for developpers only. - * - * The principle is quite simple : for any given \c AutoSegment, for example - * a vertical one (\b A), we want to find the optimal position so the wire - * length of \c AutoSegment perpandicular to \b A would be minimal. This - * optimal position is an interval of X positions, possibly reduced to a - * point. - * - * Given an \c AutoSegment, we will take into account : - *
    - *
  • Perpandicular global \c AutoSegment. - *
  • Terminals linked to the \c AutoSegment through any number of - * local \c AutoSegment (collapsed or not). - *
- * - * How to find the optimal interval : - * - * First we build an histogram in the direction perpandicular to the - * \c AutoSegment. For \b A : in horizontal direction. We populate the - * histogram with the axis coordinate of global \c AutoSegment and - * terminals linked to \b A. Note that for global \c AutoSegment the - * "axis" coordinate is the position of the side of the \c FCell. - * For terminal depending on their orientation relative to \b A we - * add either their axis or their two extremities. - * - * The optimal interval is then the median interval of the histogram. - * - * The set of examples below shows some representative cases. - * - * \image html NetOptimals-1.png "Multiple Verticals Terminals" - * \image latex NetOptimals-1.pdf "Multiple Verticals Terminals" width=0.6\textwidth - * \image html NetOptimals-2.png "Globals Only" - * \image latex NetOptimals-2.pdf "Globals Only" width=0.6\textwidth - * \image html NetOptimals-3.png "One Horizontal Terminal" - * \image latex NetOptimals-3.pdf "One Horizontal Terminal" width=0.6\textwidth - */ - - - //! \addtogroup NetOptimals - //! \{ - - /*! \function void KatabaticEngine::_computeNetOptimals ( Net* net ); - * \param net The net for which to compute optimal placement. - * - * compute optimal placement of all net's AutoSegment. - */ - - //! \} - - } diff --git a/katabatic/doc/Session.dox b/katabatic/doc/Session.dox index 8fd7e15f..567239f0 100644 --- a/katabatic/doc/Session.dox +++ b/katabatic/doc/Session.dox @@ -1,153 +1,218 @@ - - // -*- C++ -*- - + // -*- mode: C++; explicit-buffer-name: "Session.dox" -*- namespace Katabatic { - /*! \defgroup katabaticSession 7. Katabatic update Session Mechanism (internal) - * - * This module documents the Katabatic update Session Mechanism. - * It is intented for developpers only. - * - * - * \section secSessionGoal Goal of The Katabatic::Session - * - * Due to obvious performance issue, we do not recompute the - * geometry of source and target of a Katabatic::AutoSegment - * each time it's moved by the router. Instead we uses a simple - * queuing mechanism : the Katabatic::Session. - * - * Note that, most of the time, the router only moves segments, - * that is, never modifies directly Katabatic::AutoContact. - * The only exceptions being during the initial building stage - * or when the router decide to change the topology of a net. - * - * The router knows which Katabatic::AutoSegment it has moved, - * but during the update of a Katabatic::AutoContact geometry - * more segments will be modified. The modification being a - * change in their soure and/or target extention. And of thoses - * the router will not know about. To solve this problem, - * the router has to set a callback Katabatic::SegmentRevalidateCB - * which will be called for each modificated Katabatic::AutoSegment. - * - * Note that, in order to uniformize the procedure, this callback - * will also be run on Katabatic::AutoSegment modificated by - * the router. - * - * - * \section secSectionLookup The lookup function. - * - * To find a Katabatic::AutoSegment from it's associated \Hurricane - * segment, we build a simple \STL map in the Katabatic \c ToolEngine. - * This lookup table, can be accessed through the Session lookup() - * function, once the session is open. - * - * - * \section secSessionRevalidate The Revalidate procedure - * - * The sequence of calls is as follow : - *
    - *
  1. The Router modifies some Katabatic::AutoSegment by moving - * their axis. For example, horizontal segments in an horizontal - * routing channel. - *
  2. The Katabatic::AutoSegment is then invalidated : put in the - * invalidated segment set. It's Katabatic::AutoContact anchors - * are also invalidated and put in the set of invalidated contacts. - *
  3. At some point, a global revalidation is performed : - * Katabatic::Session::revalidate(). Says, when the channel - * is successfully routed. - *
  4. Katabatic::updateGeometry() is called and update the - * geometry of all invalided Katabatic::AutoContact. Doing so - * almost surely leads to the invalidation of more Katabatic::AutoSegment - * which are added to the invalidated set. In this example, as - * we moved horizontal segments, the new invalidated segments - * will be vertical ones incident to the formers. - *
  5. Finally we call Katabatic::AutoSegment::onRevalidate() - * fonction for each Katabatic::AutoSegment. - * This function encapsulate the callback from the router, so it - * can take into account the segment extension change. - *
- * - * \image html AutoInvalidate-1.png "Revalidate Procedure" - * \image latex AutoInvalidate-1.pdf "Revalidate Procedure" width=0.9\textwidth - * - * - * \section secStaticAccess The Static Member choice - * - * Almost all Session function members are \c static, this is - * because they refers to the currently opened Session which is - * kept entirely internal to the \c KatabaticSession module. - * This avoid carrying a global variable for the Session object. - */ - - /*! \class Session - * \brief Katabatic update Session (\b API). * - * The Katabatic Session is mandatory before any AutoSegment / - * AutoContact to be modified (supposedly by a router). + * \brief Modification Session for Katabatic * - * Unlike \Hurricane \c update \c Session only one session - * can be opened at a time (no stacking mechanism). Opening a - * Katabatic update Session also opens an \Hurricane \c update - * \c Session. + * To perform modifications, the Katabatic data structure uses a session + * mechanism built on top of the Hurricane::UpdateSession one. Sessions + * obeys very simples rules: + * - Only one Session can be opened at a time with Session::open(). + * - Subsequent calls to Session::open() returns the currently + * opened session until Session::close() is called. + * - Revalidation can take place whithout closing the Session by + * calling Session::revalidate(). * - * For details on how Katabatic Sessions works, have a look to - * \ref katabaticSession. + * The task of a Session is to keep track of the AutoContact and + * AutoSegment that have been modificateds (i.e. invalidated) and, + * to restore connexity and/or topology when closed. + * + * Two kinds of revalidation could be performed: + *
    + *
  • \b Geometrical : only positions of AutoContacts and AutoSegments + * extensions are recomputed. + *
  • \b Topological : a whole net have been invalidated because of a + * dogleg creation or a move up/move down of a segment. + *
      + *
    • \b Dogleg : needs to insert the newly created AutoSegments + * and AutoContacts. + *
    • Move up/Move down : may needs to create additional + * dogleg to restore connexity (gaps), and then insert them + * like above. + *
    + * After a topological mofication has been done, the net needs to + * be re-canonized then the geometrical step takes place. + *
+ * + * The kind of revalidation needed is automatically detected by + * the Session. + * + * In addition to it's main purpose, Session also provides cached + * access to frequently needed variables either from Hurricane + * or Katabatic Configuration and access to the AutoContact & + * AutoSegment LUTs of KatabaticEngine. + * + * From a software point of view, Session is a singleton object. + * + * + * \section secSessionAlgo Session Algorithm + * + * Main attributes of a Session: + * - \c _netInvalidateds, nets on which topology has changed. + * - \c _autoSegments, that have been moved or createds. + * - \c _autoContacts, that have been created or one of their + * slave segment has moved. + * - \c _revalidateds, the list of AutoSegments that have just + * been revalidated (after calling \c revalidate()). + * + * Schematic description of how a Session works: + * + *
    + *
  • If at least one net has been invalidated, meaning that it's + * topology has changed, perform \c _revalidateTopology(). + *
      + *
    • Update net topology: correct the topology of each + * contacts, making dogleg when needed. The AutoContact + * segment caching is updated at this point. + *
    • Compute net constraints (on AutoContacts & AutoSegments). + *
    • Compute net optimal positions (on AutoSegments). + *
    • Compute the state of the segments regarding to terminals. + *
    • Canonize sets of aligneds segments. The canonical segment + * is the one with the lowest \c id. + *
    • If the segments has just been created, put it on its + * optimal axis. + *
    + * This stage can add itself more invalidated AutoSegments and + * AutoContacts as it create doglegs. + * + *
  • Revalidate geometry of AutoContacts. That is, expand or shrink + * the extremities of the invalidated AutoSegments. Note that + * AutoSegments are already at on their final axis position. + * + *
  • Revalidate AutoSegments. Just before this stage, they are + * on the correct axis and their extensions are also correct, + * so we may update the caching of their characteristics + * (mostly the extension). + *
*/ - /*! \function static Session* Session::get (); - * \return The currently opened session, \c NULL if no session has - * been opened. - */ + //! \function Session* Session::get ( const char* message=NULL ); + //! Return the Session singleton, if no session is currently open + //! throw an exception carrying \c message. - /*! \function static Katabatic* Session::getKatabatic (); - * \return The Katabatic ToolEngine associated to the current update - * session. - */ + //! \function Technology* Session::getTechnology (); + //! Hurricane shortcut. - /*! \function static AutoSegment* Session::lookup ( Segment* segment ); - * \param segment An \Hurricane segment. - * \return The associated Katabatic AutoSegment. - * - * For this function to work, a Katabatic Session must be opened - * as it's a simple bypass to the Katabatic::_Lookup() member. - */ + //! \function KatabaticEngine* Session::getKatabatic (); + //! Katabatic shortcut. - /*! \function static Session* Session::open ( KatabaticEngine* ktbt ); - * \param ktbt A Katabatic ToolEngine on which to work. - * - * Open a new Katabatic update Session on the \c ktbt \c ToolEngine. - * At this point only one session can be opened at a time. Attempt - * to open a second one will result in an exception. - */ + //! \function const Configuration* Session::getConfiguration (); + //! Katabatic shortcut. - /*! \function static size_t Session::close (); - * \return The number of AutoContact / AutoSegment that have been revalidateds. - * - * Ends an update Session. This functions made a call to Revalidate to - * ensure that no AutoContact / AutoSegment remains invalidated. - */ + //! \function RoutingGauge* Session::getRoutingGauge (); + //! Katabatic shortcut. - /*! \function static size_t Session::revalidate (); - * \return The number of AutoContact / AutoSegment that have been revalidateds. - * - * Revalidate all AutoContact / AutoSegment currently in the queue : - * that is, update the AutoContact geometry and AutoSegment extentions. - */ + //! \function unsigned int Session::getLayerDirection ( const Layer* layer ); + //! Returns the preferred routing direction of \c layer, as per defined + //! in the RoutingGauge. + //! + //! \remark The value returned is transformed from the CRL Constants value + //! into Katabatic constants (Katabatic::KbHorizontal, Katabatic::KbVertical). - /*! \function void Session::invalidate ( AutoSegment* segment ); - * \param segment An AutoSegment that has been moved. - * - * The invalidated AutoSegment are stored into a \STL set, - * so it can be added multiples times without problems. - */ + //! \function bool Session::isInDemoMode (); + //! Katabatic shortcut. - /*! \function void Session::invalidate ( AutoContact* contact ); - * \param contact An AutoContact of which a AutoSegment has been moved. - * - * The invalidated AutoContact are stored into a \STL set, - * so it can be added multiples times without problems. - */ + //! \function float Session::getSaturateRatio (); + //! Katabatic shortcut. + + //! \function size_t Session::getSaturateRp (); + //! Katabatic shortcut. + + //! \function bool Session::doWarnGCellOverload (); + //! Katabatic shortcut. + + //! \function DbU::Unit Session::getExtensionCap (); + //! Katabatic shortcut. + + //! \function const Layer* Session::getRoutingLayer ( size_t ); + //! Katabatic shortcut. + + //! \function const Layer* Session::getContactLayer ( size_t ); + //! Katabatic shortcut. + + //! \function size_t Session::getSegmentStackSize (); + //! \sreturn The number of AutoSegment in the invalidated stack. + + //! \function size_t Session::getContactStackSize (); + //! \sreturn The number of AutoSegment in the invalidated stack. + + //! \function const vector& Session::getInvalidateds (); + //! \sreturn The stack (vector) of invalidateds AutoSegments. + + //! \function const vector& Session::getRevalidateds (); + //! \sreturn The stack (vector) of AutoSegments that have been revalidateds. + + //! \function const vector& Session::getDoglegs (); + //! \sreturn The vector of AutoSegments part of a newly created dogleg. + //! The dogleg creation functions in AutoHorizontal and AutoVertical + //! put a triplet (for example in horizontal direction \c (h1,v1,h2) ) + //! for each dogleg composed of: + //! - \b h1 the segment \e before the dogleg (which is also the original one). + //! - \b v1 the segment \b perpandicular (new). + //! - \b h2 the segment \b after (new). + + //! \function const set& Session::getNetsModificateds (); + //! \sreturn The set of Nets that needs either a topological update or a new + //! canonization. + + //! \function Session* Session::open ( KatabaticEngine* ); + //! Opens a new session or returns the already opened one, if any. + + //! \function void Session::close (); + //! Close the Session, triggering the revalidation of the AutoSegemnts + //! and AutoContacts. If no Session is opened, throws an execption. + + //! \function void Session::setKatabaticFlags ( unsigned int ); + //! Katabatic shortcut. + + //! \function void Session::dogleg ( AutoSegment* ); + //! Adds an AutoSegment to the dogleg vector. + + // \function void Session::doglegReset (); + // Clears the dogleg vector. + + //! \function void Session::revalidateTopology (); + //! Revalidate Net that have been invalidateds and re-canonize them. + + //! \function void Session::setInvalidateMask ( unsigned int flags ); + //! Tells what kind of revalidation must be performed. + + //! \function void Session::invalidate ( Net* net ); + //! Schedule \c net for a full revalidation, topological correction + //! and canonization. + + //! \function void Session::invalidate ( AutoSegment* segment ); + //! Schedule \c segment for revalidation. + + //! \function void Session::invalidate ( AutoContact* contact ); + //! Schedule \c contact for revalidation. + + //! \function size_t Session::revalidate (); + //! Perform the revalidation. Returns the sum of AutoContacts and + //! AutoSegemnts that have been revalidated. + + //! \function void Session::link ( AutoContact* ac ); + //! Adds \c ac in the AutoContact lookup table (allow to retrieve an + //! AutoContact by it's base Contact). + + //! \function void Session::link ( AutoSegment* as ); + //! Adds \c as in the AutoSegment lookup table (allow to retrieve an + //! AutoSegment by it's base Segment). + + //! \function void Session::unlink ( AutoContact* ac ); + //! Removes \c ac from the AutoContact lookup table. + + //! \function void Session::unlink ( AutoSegment* as ); + //! Removes \c as from the AutoSegment lookup table. + + //! \function AutoContact* Session::lookup ( Contact* contact ); + //! Lookup the AutoContact associated with \c contact. \c NULL if not found. + + //! \function AutoSegment* Session::lookup ( Segment* segment ); + //! Lookup the AutoSegment associated with \c segment. \c NULL if not found. } + + diff --git a/katabatic/doc/customHierarchy.html b/katabatic/doc/customHierarchy.html index 2b27d725..1a19f907 100644 --- a/katabatic/doc/customHierarchy.html +++ b/katabatic/doc/customHierarchy.html @@ -1,22 +1,21 @@ + Katabatic Documentation - +

Katabatic Documentation

- - - - - - - - +
SummaryNamespacesClass HierarchyClassesMember Index
Summary + Namespaces + Class Hierarchy + Classes + Member Index +

@@ -31,80 +30,73 @@ Legend :
       
-        
-        
+        
+        
ClassA  ClassA is abstract
ClassB  ClassB is instanciable
ClassA  ClassA is abstract
ClassB  ClassB is instanciable

+

Utilities

+ +
BaseObserver +
+ +
Observer +
+ +
Observable +
+

Katabatic Engine

- - - +
Katabatic
Session
DataAlgorithm
Katabatic +
ChipTools +
KatabaticEngine +
Session +
DataAlgorithm

Contacts

- +
AutoContact
AutoContact +
+ +
AutoContactTerminal +
AutoContactTurn +
AutoContactHTee +
AutoContactVTee

Segments

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

FCells

+

GCell

- +
FCell
GCell +
BaseGrid::Axis +
BaseGrid
- - +
FCellDecorator
FCellConcrete
Grid
- +
FCellGrid
GCellGrid
- - - -
FCellGridConcrete
- - - -
FCellConfiguration
FCellConfiguration::UState
- -

Miscellaneous Utilities

- - - - - -
DebugSession
RPSortX
RPSortY
SplitterForkList
-
- - - - +
Customized Class HierarchyReturn to top of page
Customized Class Hierarchy + Return to top of page
- - - - +
Katabatic DocumentationCopyright © 2000-2007 Bull S.A. All rights reserved
Katabatic Documentation + Copyright © 2008-2013 UPMC. All rights reserved
diff --git a/katabatic/doc/customSummary.html b/katabatic/doc/customSummary.html index 377b97ad..4e0c9a7f 100644 --- a/katabatic/doc/customSummary.html +++ b/katabatic/doc/customSummary.html @@ -4,7 +4,7 @@ Katabatic Documentation - +

Katabatic Documentation

@@ -27,6 +27,8 @@

Katabatic Documentation Summary


The classical Doxygen module documentation could be accessed here.

+ + +

API documentations

  • Synthetic Class Hierarchy. diff --git a/katabatic/doc/doxyfile b/katabatic/doc/doxyfile index bf987084..edde9311 100644 --- a/katabatic/doc/doxyfile +++ b/katabatic/doc/doxyfile @@ -1,3 +1,4 @@ +# -*- explicit-buffer-name: "doxyfile" -*- # Doxyfile 1.3.4 # -------------------------------------------------------------------- @@ -7,7 +8,8 @@ PROJECT_NAME = "Katabatic - Routing Toolbox" PROJECT_NUMBER = 1.0 OUTPUT_DIRECTORY = . OUTPUT_LANGUAGE = English -#USE_WINDOWS_ENCODING = NO +#USE_WINDOWS_ENCODING = NO +#LAYOUT_FILE = DoxygenLayout.xml BRIEF_MEMBER_DESC = YES REPEAT_BRIEF = YES ALWAYS_DETAILED_SEC = NO @@ -24,6 +26,7 @@ TAB_SIZE = 2 ALIASES = "function=\fn"\ "important=\par Important:\n"\ "remark=\par Remark:\n"\ + "sreturn=\b Returns:"\ "True=\b True"\ "true=\b true"\ "False=\b False"\ @@ -57,9 +60,10 @@ ALIASES = "function=\fn"\ "SplitterContact=\c SplitterContact"\ "SplitterContacts=\c SplitterContacts"\ "Hurricane=Hurricane"\ - "STL=STL" + "STL=STL"\ + "red{1}=\1" OPTIMIZE_OUTPUT_FOR_C = NO -OPTIMIZE_OUTPUT_JAVA = YES +OPTIMIZE_OUTPUT_JAVA = NO SUBGROUPING = YES # -------------------------------------------------------------------- @@ -69,13 +73,14 @@ 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 +HIDE_SCOPE_NAMES = YES SHOW_INCLUDE_FILES = YES INLINE_INFO = YES SORT_MEMBER_DOCS = NO @@ -101,19 +106,26 @@ WARN_LOGFILE = # Configuration options related to the input files INPUT = \ - ../src/katabatic/KatabaticEngine.h ../src/KatabaticEngine.cpp KatabaticEngine.dox \ - ../src/LoadGrByNet.cpp LoadGrByNet.dox \ - ../src/LayerAssign.cpp LayerAssign.dox \ - ../src/NetConstraints.cpp NetConstraints.dox \ - ../src/NetOptimals.cpp NetOptimals.dox \ + Katabatic.dox \ + ../src/katabatic/Observer.h ../src/Observer.cpp Observer.dox \ + ../src/katabatic/Constants.h Constants.dox \ ../src/katabatic/AutoContact.h ../src/AutoContact.cpp AutoContact.dox \ + ../src/katabatic/AutoContactTerminal.h ../src/AutoContactTerminal.cpp AutoContactTerminal.dox \ + ../src/katabatic/AutoContactTurn.h ../src/AutoContactTurn.cpp AutoContactTurn.dox \ + ../src/katabatic/AutoContactHTee.h ../src/AutoContactHTee.cpp AutoContactHTee.dox \ + ../src/katabatic/AutoContactVTee.h ../src/AutoContactVTee.cpp AutoContactVTee.dox \ ../src/katabatic/AutoSegment.h ../src/AutoSegment.cpp AutoSegment.dox \ - ../src/katabatic/AutoHorizontal.h ../src/AutoHorizontal.cpp \ - ../src/katabatic/AutoVertical.h ../src/AutoVertical.cpp \ - ../src/katabatic/Grid.h ../src/Grid.cpp Grid.dox \ + ../src/katabatic/AutoSegments.h AutoSegments.dox \ + ../src/katabatic/AutoHorizontal.h ../src/AutoHorizontal.cpp AutoHorizontal.dox \ + ../src/katabatic/AutoVertical.h ../src/AutoVertical.cpp AutoVertical.dox \ ../src/katabatic/GCell.h ../src/GCell.cpp GCell.dox \ + ../src/katabatic/GCells.h GCells.dox \ + ../src/katabatic/Grid.h ../src/Grid.cpp Grid.dox \ ../src/katabatic/GCellGrid.h ../src/GCellGrid.cpp GCellGrid.dox \ - ../src/katabatic/Session.h ../src/Session.cpp Session.dox + ../src/katabatic/Session.h ../src/Session.cpp Session.dox \ + ../src/katabatic/ChipTools.h ../src/ChipTools.cpp ChipTools.dox \ + ../src/LoadGrByNet.cpp \ + ../src/katabatic/KatabaticEngine.h ../src/KatabaticEngine.cpp KatabaticEngine.dox FILE_PATTERNS = *.h \ *.cpp \ @@ -156,7 +168,7 @@ HTML_OUTPUT = html HTML_FILE_EXTENSION = .html HTML_HEADER = header.html HTML_FOOTER = footer.html -HTML_STYLESHEET = ASIM.css +HTML_STYLESHEET = SoC.css HTML_ALIGN_MEMBERS = YES GENERATE_HTMLHELP = NO CHM_FILE = @@ -240,7 +252,7 @@ SKIP_FUNCTION_MACROS = YES # -------------------------------------------------------------------- # Configuration::addtions related to external references -TAGFILES = ../../../../hurricane/doc/hurricane/html/hurricane.tag=../hurricane +TAGFILES = ../../hurricane/doc/hurricane/html/hurricane.tag=../hurricane GENERATE_TAGFILE = html/katabatic.tag ALLEXTERNALS = NO EXTERNAL_GROUPS = YES diff --git a/katabatic/doc/footer.html b/katabatic/doc/footer.html index 3bbb05ce..ed206ab8 100644 --- a/katabatic/doc/footer.html +++ b/katabatic/doc/footer.html @@ -9,7 +9,7 @@ - +
    Katabatic - Routing ToolboxCopyright © 2008-2009 LIP6. All rights reservedCopyright © 2008-2013 UPMC. All rights reserved
    diff --git a/katabatic/doc/header.html b/katabatic/doc/header.html index 3d287482..b4276297 100644 --- a/katabatic/doc/header.html +++ b/katabatic/doc/header.html @@ -2,7 +2,7 @@ Katabatic - Routing Toolbox: Routing Toolbox Documentation - +

    Katabatic - Routing Toolbox

    diff --git a/katabatic/doc/images/AutoContact-1.fig b/katabatic/doc/images/AutoContact-1.fig deleted file mode 100644 index 47adcccb..00000000 --- a/katabatic/doc/images/AutoContact-1.fig +++ /dev/null @@ -1,107 +0,0 @@ -#FIG 3.2 -Landscape -Center -Inches -Letter -100.00 -Single --2 -1200 2 -6 11025 2325 13275 2925 -2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 - 11100 2400 13200 2400 13200 2850 11100 2850 11100 2400 -4 1 0 50 -1 18 16 0.0000 4 240 1635 12150 2700 AutoSegment\001 --6 -6 11025 5925 13275 6525 -2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 - 11100 6000 13200 6000 13200 6450 11100 6450 11100 6000 -4 1 0 50 -1 18 16 0.0000 4 180 1500 12150 6300 AutoContact\001 --6 -6 11025 7425 13275 8025 -2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 - 11100 7500 13200 7500 13200 7950 11100 7950 11100 7500 -4 1 0 50 -1 18 16 0.0000 4 240 1635 12150 7800 AutoSegment\001 --6 -2 1 0 2 0 7 50 -1 15 0.000 0 0 -1 0 0 4 - 5700 0 5700 3300 6000 3300 6000 0 -2 1 0 2 0 7 50 -1 15 0.000 0 0 -1 0 0 4 - 12300 3900 9000 3900 9000 4200 12300 4200 -2 2 3 2 0 7 60 -1 -1 15.000 0 0 -1 0 0 5 - 2100 2100 10200 2100 10200 9600 2100 9600 2100 2100 -2 2 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 5 - 8100 7200 8400 7200 8400 9000 8100 9000 8100 7200 -2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 7950 7950 8550 7950 8550 8550 7950 8550 7950 7950 -2 2 0 2 0 7 45 -1 15 6.000 0 0 -1 0 0 5 - 6900 8100 8400 8100 8400 8400 6900 8400 6900 8100 -2 2 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 7350 6150 7950 6150 7950 6750 7350 6750 7350 6150 -2 1 0 4 20 7 50 -1 -1 10.000 0 0 -1 0 0 3 - 5850 3450 5850 8250 6750 8250 -2 1 0 4 20 7 50 -1 -1 10.000 0 0 -1 0 0 2 - 3450 6450 5850 6450 -2 1 0 4 20 7 50 -1 -1 10.000 0 0 -1 0 0 2 - 8850 4050 5850 4050 -2 2 0 4 20 7 50 -1 -1 10.000 0 0 -1 0 0 5 - 5700 6300 6000 6300 6000 6600 5700 6600 5700 6300 -2 2 0 4 20 7 50 -1 -1 10.000 0 0 -1 0 0 5 - 5700 3900 6000 3900 6000 4200 5700 4200 5700 3900 -2 1 0 4 4 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 7500 6450 7800 6450 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5850 2850 5850 3150 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 9150 4050 9450 4050 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 7050 8250 7350 8250 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2850 6450 3150 6450 -2 1 0 2 0 7 50 -1 15 0.000 0 0 -1 0 0 4 - 0 6300 3300 6300 3300 6600 0 6600 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 1 0 4 - 1 1 2.00 120.00 240.00 - 11400 2850 11400 3300 9450 3300 9450 3975 -2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 2 - 1 1 2.00 120.00 240.00 - 12600 2850 12600 6000 -2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 3 - 1 1 2.00 120.00 240.00 - 12900 2850 12900 3300 13725 3300 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 1 0 3 - 1 1 2.00 120.00 240.00 - 11100 7725 7350 7725 7350 8250 -2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 2 - 1 1 2.00 120.00 240.00 - 12600 7500 12600 6450 -2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 3 - 1 1 2.00 120.00 240.00 - 12900 7950 12900 8400 13800 8400 -2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 1 0 2 - 1 1 2.00 120.00 240.00 - 11100 6300 7950 6300 -3 0 0 2 4 7 40 -1 -1 6.000 0 1 0 4 - 3 0 2.00 120.00 240.00 - 7650 6450 7650 6900 7200 7500 7200 8250 - 0.000 1.000 1.000 0.000 -3 0 0 2 4 7 40 -1 -1 6.000 0 1 0 6 - 3 0 2.00 120.00 240.00 - 7200 8325 7200 8700 6900 9000 4800 9000 3000 7200 3000 6450 - 0.000 1.000 1.000 1.000 1.000 0.000 -3 0 0 2 4 7 40 -1 -1 6.000 0 1 0 4 - 3 0 2.00 120.00 240.00 - 3000 6450 3000 5100 5100 3000 5850 3000 - 0.000 1.000 1.000 0.000 -3 0 0 2 4 7 40 -1 -1 6.000 0 1 0 4 - 3 0 2.00 120.00 240.00 - 5850 3000 8700 3000 9300 3600 9300 4050 - 0.000 1.000 1.000 0.000 -3 0 0 2 4 7 40 -1 -1 0.000 0 1 0 4 - 3 1 2.00 120.00 240.00 - 9300 4050 9300 4800 7650 5700 7650 6450 - 0.000 1.000 1.000 0.000 -4 1 0 50 -1 18 16 1.5708 4 180 360 12525 5100 AC\001 -4 1 0 50 -1 18 16 1.5708 4 180 360 12525 7050 AC\001 -4 1 0 50 -1 18 16 0.0000 4 180 165 11550 3300 S\001 -4 1 0 50 -1 18 16 0.0000 4 180 150 13050 3150 T\001 -4 1 0 50 -1 18 16 0.0000 4 180 165 10950 8025 S\001 -4 1 0 50 -1 18 16 0.0000 4 180 150 13050 8250 T\001 diff --git a/katabatic/doc/images/AutoContact-10.fig b/katabatic/doc/images/AutoContact-10.fig deleted file mode 100644 index 5c4f4236..00000000 --- a/katabatic/doc/images/AutoContact-10.fig +++ /dev/null @@ -1,72 +0,0 @@ -#FIG 3.2 -Landscape -Center -Inches -Letter -70.00 -Single --2 -1200 2 -6 825 1125 6000 6300 -6 825 1125 3075 1575 -2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 900 1200 3000 1200 3000 1500 900 1500 900 1200 -4 0 0 50 -1 14 12 0.0000 4 135 1890 975 1425 HExtended - case 1\001 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 1875 2550 1875 2550 2100 1800 2100 1800 1875 -2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2625 3450 4725 3450 4725 3750 2625 3750 2625 3450 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 2100 5400 2100 5400 5400 1800 5400 1800 2100 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 900 1200 6000 1200 6000 6300 900 6300 900 1200 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2625 3600 1575 3600 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2700 2700 2700 3450 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 3300 3750 3300 5700 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 4500 3750 4500 4500 -4 1 0 50 -1 14 12 0.0000 4 135 525 2175 2025 GCell\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 2850 2925 L\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 1650 3900 G\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 4650 4500 L\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 3450 5625 G\001 --6 -1 2 0 2 4 7 50 -1 -1 0.000 1 0.0000 9450 3600 150 300 9300 3300 9600 3900 -1 4 0 2 4 7 50 -1 -1 0.000 1 0.0000 8550 3600 150 150 8400 3600 8700 3600 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 8100 1875 8850 1875 8850 2100 8100 2100 8100 1875 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 8100 2100 11700 2100 11700 5400 8100 5400 8100 2100 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 7200 1200 12300 1200 12300 6300 7200 6300 7200 1200 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 8850 3600 7800 3600 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 9000 2700 9000 3450 -2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 7200 1200 9300 1200 9300 1500 7200 1500 7200 1200 -2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 8850 3450 9150 3450 9150 3750 8850 3750 8850 3450 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9150 3525 9900 3525 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 9150 3675 12000 3675 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 8925 3600 9075 3600 -2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 2.00 120.00 240.00 - 8550 3750 8700 4500 -2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 2.00 120.00 240.00 - 9450 3900 9300 4500 -4 1 0 50 -1 14 12 0.0000 4 135 525 8475 2025 GCell\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 9150 2925 L\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 7950 3900 G\001 -4 0 0 50 -1 14 12 0.0000 4 135 1890 7275 1425 HExtended - case 2\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 11925 3975 G\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 9750 3450 L\001 -4 1 4 50 -1 18 12 0.0000 4 180 1170 9000 4650 kept aligneds\001 diff --git a/katabatic/doc/images/AutoContact-11.fig b/katabatic/doc/images/AutoContact-11.fig deleted file mode 100644 index 7baf87c6..00000000 --- a/katabatic/doc/images/AutoContact-11.fig +++ /dev/null @@ -1,68 +0,0 @@ -#FIG 3.2 -Landscape -Center -Inches -Letter -70.00 -Single --2 -1200 2 -1 2 0 2 4 7 50 -1 -1 0.000 1 0.0000 10200 3150 300 150 9900 3000 10500 3300 -1 4 0 2 4 7 50 -1 -1 0.000 1 0.0000 10200 4050 150 150 10050 4050 10350 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 8100 1875 8850 1875 8850 2100 8100 2100 8100 1875 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 8100 2100 11700 2100 11700 5400 8100 5400 8100 2100 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 7200 1200 12300 1200 12300 6300 7200 6300 7200 1200 -2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 7200 1200 9300 1200 9300 1500 7200 1500 7200 1200 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 1875 2550 1875 2550 2100 1800 2100 1800 1875 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 2100 5400 2100 5400 5400 1800 5400 1800 2100 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 900 1200 6000 1200 6000 6300 900 6300 900 1200 -2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 900 1200 3000 1200 3000 1500 900 1500 900 1200 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 3750 3600 1500 3600 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 3900 4650 3900 5700 -2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 3750 2850 4050 2850 4050 4650 3750 4650 3750 2850 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 3750 3000 3000 3000 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 4800 4500 4050 4500 -2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 10050 3450 10350 3450 10350 3750 10050 3750 10050 3450 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 10200 5700 10200 3750 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 10275 1800 10275 3450 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 10125 3450 10125 2700 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 10350 3600 11100 3600 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 10200 3675 10200 3525 -2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 2.00 120.00 240.00 - 9900 3150 8850 3375 -2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 2.00 120.00 240.00 - 10050 4050 8850 3750 -4 1 0 50 -1 14 12 0.0000 4 135 525 8475 2025 GCell\001 -4 0 0 50 -1 14 12 0.0000 4 135 1890 7275 1425 VExtended - case 2\001 -4 1 0 50 -1 14 12 0.0000 4 135 525 2175 2025 GCell\001 -4 0 0 50 -1 14 12 0.0000 4 135 1890 975 1425 VExtended - case 1\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 4050 5625 G\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 4725 4425 L\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 3075 2925 L\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 1650 3900 G\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 11025 3900 L\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 9975 2925 L\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 10425 2025 G\001 -4 1 4 50 -1 18 12 0.0000 4 180 1170 8775 3600 kept aligneds\001 -4 1 0 50 -1 14 18 0.0000 4 165 165 10350 5700 G\001 diff --git a/katabatic/doc/images/AutoContact-12.fig b/katabatic/doc/images/AutoContact-12.fig deleted file mode 100644 index dffaf863..00000000 --- a/katabatic/doc/images/AutoContact-12.fig +++ /dev/null @@ -1,91 +0,0 @@ -#FIG 3.2 -Landscape -Center -Inches -Letter -70.00 -Single --2 -1200 2 -6 6600 1875 10200 5400 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6600 1875 7350 1875 7350 2100 6600 2100 6600 1875 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6600 2100 10200 2100 10200 5400 6600 5400 6600 2100 -4 1 0 50 -1 14 12 0.0000 4 135 525 6975 2025 GCell\001 --6 -1 4 0 2 4 7 45 -1 -1 0.000 1 0.0000 3300 4200 150 150 3150 4200 3450 4200 -1 4 0 2 4 7 45 -1 -1 0.000 1 0.0000 4500 4050 150 150 4350 4050 4650 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 1875 2550 1875 2550 2100 1800 2100 1800 1875 -2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2625 3450 4725 3450 4725 3750 2625 3750 2625 3450 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 2100 5400 2100 5400 5400 1800 5400 1800 2100 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2625 3600 1500 3600 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2700 2700 2700 3450 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 4500 3750 4500 4500 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 900 1200 11100 1200 11100 6225 900 6225 900 1200 -2 1 0 2 4 7 45 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 2.00 120.00 240.00 - 3375 4350 3900 4800 -2 1 0 2 4 7 45 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 2.00 120.00 240.00 - 4425 4125 3975 4800 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 7350 3600 6300 3600 -2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 7350 3450 8250 3450 8250 3750 7350 3750 7350 3450 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 3300 3750 3300 5700 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 7500 2700 7500 3450 -2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 900 1200 3900 1200 3900 1500 900 1500 900 1200 -2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 - 7950 4050 8250 4050 8250 4350 7950 4350 7950 4050 -2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 - 8100 3750 8100 4050 -2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 - 8250 4200 8550 4200 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 8700 4350 8700 5700 -2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 - 8550 4050 8850 4050 8850 4350 8550 4350 8550 4050 -2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 - 9750 4050 10050 4050 10050 4350 9750 4350 9750 4050 -2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 - 8850 4200 9750 4200 -2 4 0 1 4 7 45 -1 -1 0.000 0 0 7 0 0 5 - 10125 4425 10125 3975 8475 3975 8475 4425 10125 4425 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 9900 3300 9900 4050 -2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 - 8625 4200 8775 4200 -3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 - 3 0 1.00 60.00 120.00 - 3 0 1.00 60.00 120.00 - 6900 3600 6900 3450 7200 3150 8100 3150 8400 3450 8400 4200 - 0.000 1.000 1.000 1.000 1.000 0.000 -3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 - 3 0 1.00 60.00 120.00 - 3 0 1.00 60.00 120.00 - 8100 3900 7800 3900 7500 4200 7500 4500 7800 4800 8700 4800 - 0.000 1.000 1.000 1.000 1.000 0.000 -4 1 0 50 -1 14 12 0.0000 4 135 525 2175 2025 GCell\001 -4 0 0 50 -1 14 12 0.0000 4 180 2520 975 1425 Split HExtended - case 1\001 -4 1 4 45 -1 18 12 0.0000 4 135 840 3900 4950 M3 -> M5\001 -4 0 0 50 -1 14 14 0.0000 4 150 540 1500 3825 G.M2\001 -4 0 0 50 -1 14 14 0.0000 4 150 540 2775 2850 L.M3\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 4575 4500 L.M3\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 3375 5700 G.M3\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 6300 3825 G.M2\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 6975 2850 L.M3\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 8775 5700 G.M5\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 9975 3450 L.M5\001 -4 1 4 45 -1 18 12 0.0000 4 135 120 7425 4425 Y\001 -4 1 4 45 -1 18 12 0.0000 4 135 120 7800 3150 X\001 diff --git a/katabatic/doc/images/AutoContact-13.fig b/katabatic/doc/images/AutoContact-13.fig deleted file mode 100644 index 1696be33..00000000 --- a/katabatic/doc/images/AutoContact-13.fig +++ /dev/null @@ -1,104 +0,0 @@ -#FIG 3.2 -Landscape -Center -Inches -Letter -70.00 -Single --2 -1200 2 -6 6600 1875 10200 5400 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6600 1875 7350 1875 7350 2100 6600 2100 6600 1875 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6600 2100 10200 2100 10200 5400 6600 5400 6600 2100 -4 1 0 50 -1 14 12 0.0000 4 135 525 6975 2025 GCell\001 --6 -1 4 0 2 4 7 45 -1 -1 0.000 1 0.0000 2250 3600 150 150 2100 3600 2400 3600 -1 4 0 2 4 7 45 -1 -1 0.000 1 0.0000 3600 3150 150 150 3750 3150 3450 3150 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 1875 2550 1875 2550 2100 1800 2100 1800 1875 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 2100 5400 2100 5400 5400 1800 5400 1800 2100 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2625 3600 1575 3600 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 900 1200 11100 1200 11100 6225 900 6225 900 1200 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 7350 3600 6300 3600 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 3300 3750 3300 5700 -2 1 0 2 4 7 45 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 2.00 120.00 240.00 - 2250 3750 2250 4200 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2700 3750 2700 4500 -2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 900 1200 3900 1200 3900 1500 900 1500 900 1200 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 3600 2700 3600 3450 -2 1 0 2 4 7 45 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 2.00 120.00 240.00 - 3450 3075 2925 2475 -2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2625 3450 3750 3450 3750 3750 2625 3750 2625 3450 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 8400 2700 8400 3450 -2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 - 7350 3450 8550 3450 8550 3750 7350 3750 7350 3450 -2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 - 8850 3450 9150 3450 9150 3750 8850 3750 8850 3450 -2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 - 9000 3750 9000 4050 -2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 - 8550 3600 8850 3600 -2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 - 8550 4200 8850 4200 -2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 8850 4050 9150 4050 9150 4350 8850 4350 8850 4050 -2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 - 8250 4050 8550 4050 8550 4350 8250 4350 8250 4050 -2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 - 7425 3600 8475 3600 -2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 - 7650 4050 7950 4050 7950 4350 7650 4350 7650 4050 -2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 - 7950 4200 8250 4200 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 7800 4350 7800 5100 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 8400 4350 8400 5700 -2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 - 8325 4200 8475 4200 -2 4 0 1 4 7 45 -1 -1 0.000 0 0 7 0 0 5 - 9225 4425 9225 3975 7575 3975 7575 4425 9225 4425 -3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 - 3 0 1.00 60.00 120.00 - 3 0 1.00 60.00 120.00 - 6900 3600 6900 3300 7200 3000 8550 3000 8700 3300 8700 3600 - 0.000 1.000 1.000 1.000 1.000 0.000 -3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 - 3 0 1.00 60.00 120.00 - 3 0 1.00 60.00 120.00 - 8400 4800 9300 4800 9600 4500 9600 4050 9300 3900 9000 3900 - 0.000 1.000 1.000 1.000 1.000 0.000 -3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 - 3 0 1.00 60.00 120.00 - 3 0 1.00 60.00 120.00 - 6900 3600 6900 4500 7200 4800 7950 4800 8100 4500 8100 4200 - 0.000 1.000 1.000 1.000 1.000 0.000 -4 1 0 50 -1 14 12 0.0000 4 135 525 2175 2025 GCell\001 -4 1 4 45 -1 18 12 0.0000 4 135 840 2250 4350 M2 -> M4\001 -4 0 0 50 -1 14 12 0.0000 4 180 2520 975 1425 Split HExtended - case 2\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 1575 3825 G.M2\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 2775 4500 L.M3\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 3375 5700 G.M3\001 -4 1 4 45 -1 18 12 0.0000 4 135 840 2925 2475 M3 -> M5\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 3675 2850 L.M3\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 6300 3825 G.M4\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 8475 2850 L.M5\001 -4 1 4 45 -1 18 12 0.0000 4 135 120 7800 2925 Y\001 -4 1 4 45 -1 18 12 0.0000 4 135 120 9675 4350 X\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 8475 5700 G.M3\001 -4 2 0 45 -1 14 14 0.0000 4 150 540 7725 5100 L.M3\001 -4 1 4 45 -1 18 12 0.0000 4 135 120 7125 4500 Y\001 diff --git a/katabatic/doc/images/AutoContact-14.fig b/katabatic/doc/images/AutoContact-14.fig deleted file mode 100644 index 2d69f744..00000000 --- a/katabatic/doc/images/AutoContact-14.fig +++ /dev/null @@ -1,79 +0,0 @@ -#FIG 3.2 -Landscape -Center -Inches -Letter -70.00 -Single --2 -1200 2 -6 6600 1875 10200 5400 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6600 1875 7350 1875 7350 2100 6600 2100 6600 1875 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6600 2100 10200 2100 10200 5400 6600 5400 6600 2100 -4 1 0 50 -1 14 12 0.0000 4 135 525 6975 2025 GCell\001 --6 -1 4 0 2 4 7 45 -1 -1 0.000 1 0.0000 4500 4050 150 150 4350 4050 4650 4050 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 1875 2550 1875 2550 2100 1800 2100 1800 1875 -2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2625 3450 4725 3450 4725 3750 2625 3750 2625 3450 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 2100 5400 2100 5400 5400 1800 5400 1800 2100 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2625 3600 1500 3600 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2700 2700 2700 3450 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 4500 3750 4500 4500 -2 1 0 2 4 7 45 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 2.00 120.00 240.00 - 4425 4125 3900 4800 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 7350 3600 6300 3600 -2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 7350 3450 8250 3450 8250 3750 7350 3750 7350 3450 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 8100 3750 8100 5700 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 3300 3750 3300 5700 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 7500 2700 7500 3450 -2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 900 1200 3900 1200 3900 1500 900 1500 900 1200 -2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 - 7950 2850 8250 2850 8250 3150 7950 3150 7950 2850 -2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 - 8100 3150 8100 3450 -2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 - 8250 3000 9150 3000 -2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 - 9150 2850 9450 2850 9450 3150 9150 3150 9150 2850 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 9300 3150 9300 4200 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 900 1200 11100 1200 11100 6300 900 6300 900 1200 -3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 - 3 0 1.00 60.00 120.00 - 3 0 1.00 60.00 120.00 - 7800 3450 7800 2700 8100 2400 8400 2400 8700 2700 8700 3000 - 0.000 1.000 1.000 1.000 1.000 0.000 -3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 2 - 3 0 1.00 60.00 120.00 - 3 0 1.00 60.00 120.00 - 8100 3300 9300 3300 - 0.000 0.000 -4 1 0 50 -1 14 12 0.0000 4 135 525 2175 2025 GCell\001 -4 0 0 50 -1 14 12 0.0000 4 180 2520 975 1425 Split HExtended - case 3\001 -4 1 4 45 -1 18 12 0.0000 4 135 840 3900 4950 M3 -> M5\001 -4 1 4 45 -1 18 12 0.0000 4 135 120 8250 2325 Y\001 -4 1 4 45 -1 18 12 0.0000 4 135 120 8700 3525 X\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 2775 2850 L.M3\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 1500 3825 G.M2\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 4575 4500 L.M3\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 3375 5700 G.M3\001 -4 2 0 45 -1 14 14 0.0000 4 150 540 7425 2850 L.M3\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 6300 3825 G.M2\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 9375 4200 L.M5\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 8175 5700 G.M3\001 diff --git a/katabatic/doc/images/AutoContact-15.fig b/katabatic/doc/images/AutoContact-15.fig deleted file mode 100644 index ea1af2ec..00000000 --- a/katabatic/doc/images/AutoContact-15.fig +++ /dev/null @@ -1,73 +0,0 @@ -#FIG 3.2 -Landscape -Center -Inches -Letter -70.00 -Single --2 -1200 2 -6 6600 1875 10200 5400 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6600 1875 7350 1875 7350 2100 6600 2100 6600 1875 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6600 2100 10200 2100 10200 5400 6600 5400 6600 2100 -4 1 0 50 -1 14 12 0.0000 4 135 525 6975 2025 GCell\001 --6 -1 4 0 2 4 7 45 -1 -1 0.000 1 0.0000 4050 3675 150 150 3900 3675 4200 3675 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 1875 2550 1875 2550 2100 1800 2100 1800 1875 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1800 2100 5400 2100 5400 5400 1800 5400 1800 2100 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2550 3600 1500 3600 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2700 2700 2700 3450 -2 1 0 2 4 7 45 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 2.00 120.00 240.00 - 4050 3825 4050 4200 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 7350 3600 6300 3600 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 7500 2700 7500 3450 -2 2 0 2 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 900 1200 3900 1200 3900 1500 900 1500 900 1200 -2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 2550 3450 2850 3450 2850 3750 2550 3750 2550 3450 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2850 3675 5700 3675 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2850 3525 3600 3525 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2625 3600 2775 3600 -2 2 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 7350 3450 7650 3450 7650 3750 7350 3750 7350 3450 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 7650 3525 8400 3525 -2 1 0 4 4 7 55 -1 -1 0.000 0 0 -1 0 0 2 - 7500 3750 7500 4050 -2 2 0 4 4 7 45 -1 -1 0.000 0 0 7 0 0 5 - 7350 4050 7650 4050 7650 4350 7350 4350 7350 4050 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 7650 4200 10500 4200 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 7425 3600 7575 3600 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 900 1200 11100 1200 11100 6300 900 6300 900 1200 -3 0 0 1 4 7 45 -1 -1 0.000 0 1 1 6 - 3 0 1.00 60.00 120.00 - 3 0 1.00 60.00 120.00 - 7500 3150 7200 3150 6900 3450 6900 3750 7200 3900 7500 3900 - 0.000 1.000 1.000 1.000 1.000 0.000 -4 1 0 50 -1 14 12 0.0000 4 135 525 2175 2025 GCell\001 -4 0 0 50 -1 14 12 0.0000 4 180 2520 975 1425 Split HExtended - case 4\001 -4 1 4 45 -1 18 12 0.0000 4 135 840 4050 4350 M2 -> M4\001 -4 1 4 45 -1 18 12 0.0000 4 135 120 6900 3450 X\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 2775 2850 L.M3\001 -4 2 0 45 -1 14 14 0.0000 4 150 540 3600 3450 L.M2\001 -4 2 0 45 -1 14 14 0.0000 4 150 540 5700 3900 G.M2\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 6300 3825 G.M2\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 1500 3825 G.M2\001 -4 2 0 45 -1 14 14 0.0000 4 150 540 8400 3450 L.M2\001 -4 0 0 45 -1 14 14 0.0000 4 150 540 7575 2850 L.M3\001 -4 2 0 45 -1 14 14 0.0000 4 150 540 10500 4425 G.M4\001 diff --git a/katabatic/doc/images/AutoContact-2.fig b/katabatic/doc/images/AutoContact-2.fig deleted file mode 100644 index f345f9fd..00000000 --- a/katabatic/doc/images/AutoContact-2.fig +++ /dev/null @@ -1,43 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 0 0 5625 2475 -2 2 0 1 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 765 945 4635 945 4635 1260 765 1260 765 945 -2 1 0 4 0 7 45 -1 45 0.000 0 0 -1 0 0 2 - 900 990 900 1215 -2 1 0 4 0 7 45 -1 45 0.000 0 0 -1 0 0 2 - 4500 990 4500 1215 -2 1 3 1 0 7 45 -1 45 8.000 0 0 -1 0 0 2 - 900 1350 900 2070 -2 1 3 1 0 7 45 -1 45 8.000 0 0 -1 0 0 2 - 4500 1350 4500 2070 -2 1 3 1 0 7 45 -1 45 8.000 0 0 -1 0 0 2 - 4725 1125 5220 1125 -2 1 0 1 0 7 45 -1 45 4.000 0 0 -1 1 1 2 - 3 0 1.00 60.00 120.00 - 3 0 1.00 60.00 120.00 - 450 2025 1350 2025 -2 1 0 1 0 7 45 -1 45 4.000 0 0 -1 1 1 2 - 3 0 1.00 60.00 120.00 - 3 0 1.00 60.00 120.00 - 4050 2025 4950 2025 -2 1 0 1 0 7 45 -1 45 4.000 0 0 -1 1 1 2 - 3 0 1.00 60.00 120.00 - 3 0 1.00 60.00 120.00 - 5175 675 5175 1575 -2 2 0 1 0 7 55 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5625 0 5625 2475 0 2475 0 0 -2 1 0 1 0 7 55 -1 -1 0.000 0 0 -1 0 0 3 - 0 315 2025 315 2025 0 -4 1 0 45 -1 14 12 0.0000 4 120 1155 4500 2250 AutoContact\001 -4 1 0 45 -1 14 12 0.0000 4 120 1155 900 2250 AutoContact\001 -4 1 0 45 -1 14 12 1.5708 4 120 630 5400 1125 Router\001 -4 0 0 55 -1 18 12 0.0000 4 180 1740 90 225 Horizontal Segment\001 --6 diff --git a/katabatic/doc/images/AutoContact-3.fig b/katabatic/doc/images/AutoContact-3.fig deleted file mode 100644 index 7af9a7a1..00000000 --- a/katabatic/doc/images/AutoContact-3.fig +++ /dev/null @@ -1,54 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 0 0 5400 3150 -6 765 1620 4635 1980 -2 2 0 1 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 765 1620 4635 1620 4635 1980 765 1980 765 1620 -2 1 0 4 0 7 45 -1 45 0.000 0 0 -1 0 0 2 - 900 1671 900 1929 -2 1 0 4 0 7 45 -1 45 0.000 0 0 -1 0 0 2 - 4500 1671 4500 1929 --6 -6 4320 1665 4680 2835 -2 2 0 1 12 7 60 -1 45 0.000 0 0 -1 0 0 5 - 4320 2835 4680 2835 4680 1665 4320 1665 4320 2835 -2 1 0 4 12 7 45 -1 45 0.000 0 0 -1 0 0 2 - 4371 1800 4629 1800 -2 1 0 4 12 7 45 -1 45 0.000 0 0 -1 0 0 2 - 4371 2700 4629 2700 --6 -6 3420 765 3780 1935 -2 2 0 1 12 7 60 -1 45 0.000 0 0 -1 0 0 5 - 3420 1935 3780 1935 3780 765 3420 765 3420 1935 -2 1 0 4 12 7 45 -1 45 0.000 0 0 -1 0 0 2 - 3471 900 3729 900 -2 1 0 4 12 7 45 -1 45 0.000 0 0 -1 0 0 2 - 3471 1800 3729 1800 --6 -2 1 3 1 12 7 45 -1 -1 8.000 0 0 -1 0 0 2 - 3690 1800 5085 1800 -2 1 0 4 12 7 45 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 4.00 120.00 240.00 - 3600 1845 3600 2475 -2 1 0 4 12 7 45 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 4.00 120.00 240.00 - 4950 1800 4950 2475 -2 1 0 4 0 7 45 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 4.00 120.00 240.00 - 450 1800 450 2475 -2 1 3 1 0 7 45 -1 -1 8.000 0 0 -1 0 0 2 - 225 1800 900 1800 -2 2 0 1 0 7 45 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5400 0 5400 3150 0 3150 0 0 -2 1 0 1 0 7 45 -1 -1 0.000 0 0 -1 0 0 3 - 0 540 2115 540 2115 0 -4 0 0 45 -1 18 12 0.0000 4 180 1545 90 225 Moved by Router\001 -4 0 12 45 -1 18 12 0.0000 4 180 2025 90 495 Moved by Autocontact\001 --6 diff --git a/katabatic/doc/images/AutoContactG1-1.fig b/katabatic/doc/images/AutoContactG1-1.fig deleted file mode 100644 index e8826d8f..00000000 --- a/katabatic/doc/images/AutoContactG1-1.fig +++ /dev/null @@ -1,33 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 585 -225 765 3375 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 765 -225 765 450 585 450 585 -225 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 675 450 675 3375 --6 -6 540 2115 810 2385 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 675 2160 675 2340 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 585 2250 765 2250 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 3150 0 3150 3150 0 3150 0 0 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 -2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 - 1125 2160 1575 2160 1575 2340 1125 2340 1125 2160 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 450 2250 1125 2250 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 810 2385 540 2385 540 2115 810 2115 810 2385 -4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 -4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G1.1\001 diff --git a/katabatic/doc/images/AutoContactG2-1.fig b/katabatic/doc/images/AutoContactG2-1.fig deleted file mode 100644 index cbf4162a..00000000 --- a/katabatic/doc/images/AutoContactG2-1.fig +++ /dev/null @@ -1,75 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 585 -225 765 3375 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 765 -225 765 450 585 450 585 -225 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 675 450 675 3375 --6 -6 -225 810 3375 990 -6 -225 810 450 990 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - -225 810 450 810 450 990 -225 990 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 450 900 3375 900 --6 -6 5535 -180 5715 3420 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 5715 -180 5715 495 5535 495 5535 -180 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5625 495 5625 3420 --6 -6 4725 2385 8325 2565 -6 4725 2385 5400 2565 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 4725 2385 5400 2385 5400 2565 4725 2565 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5400 2475 8325 2475 --6 -6 5490 765 5760 1035 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 5625 810 5625 990 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 5535 900 5715 900 --6 -6 540 2115 810 2385 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 675 2160 675 2340 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 585 2250 765 2250 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 4950 0 8100 0 8100 3150 4950 3150 4950 0 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6300 3600 6750 3600 6750 3825 6300 3825 6300 3600 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 3150 0 3150 3150 0 3150 0 0 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 5760 2610 5490 2610 5490 2340 5760 2340 5760 2610 -2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 - 1125 2160 1575 2160 1575 2340 1125 2340 1125 2160 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 450 2250 1125 2250 -2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 - 6075 810 6525 810 6525 990 6075 990 6075 810 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5400 900 6075 900 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 765 990 585 990 585 810 765 810 765 990 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 810 2385 540 2385 540 765 810 765 810 2385 -4 0 0 50 -1 18 12 0.0000 4 135 465 4950 -45 FCell\001 -4 1 0 50 -1 0 12 0.0000 4 135 360 6525 3780 G2.2\001 -4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 -4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G2.1\001 diff --git a/katabatic/doc/images/AutoContactG3-1.fig b/katabatic/doc/images/AutoContactG3-1.fig deleted file mode 100644 index 3e72139c..00000000 --- a/katabatic/doc/images/AutoContactG3-1.fig +++ /dev/null @@ -1,89 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 585 -225 765 3375 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 765 -225 765 450 585 450 585 -225 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 675 450 675 3375 --6 -6 2385 -225 2565 3375 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 2475 2700 2475 -225 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 2385 3375 2385 2700 2565 2700 2565 3375 --6 -6 450 2160 2700 2340 -2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 - 1125 2160 1575 2160 1575 2340 1125 2340 1125 2160 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 450 2250 2700 2250 --6 -6 2340 2115 2610 2385 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2475 2160 2475 2340 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2385 2250 2565 2250 --6 -6 -225 810 3375 990 -6 -225 810 450 990 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - -225 810 450 810 450 990 -225 990 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 450 900 3375 900 --6 -6 5535 -180 5715 3420 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 5715 -180 5715 495 5535 495 5535 -180 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5625 495 5625 3420 --6 -6 7335 -225 7515 3375 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 7425 2700 7425 -225 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 7335 3375 7335 2700 7515 2700 7515 3375 --6 -6 4725 2385 8325 2565 -6 4725 2385 5400 2565 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 4725 2385 5400 2385 5400 2565 4725 2565 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5400 2475 8325 2475 --6 -6 5400 810 7650 990 -2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 - 6075 810 6525 810 6525 990 6075 990 6075 810 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5400 900 7650 900 --6 -6 5490 765 5760 1035 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 5625 810 5625 990 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 5535 900 5715 900 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 4950 0 8100 0 8100 3150 4950 3150 4950 0 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6300 3600 6750 3600 6750 3825 6300 3825 6300 3600 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 3150 0 3150 3150 0 3150 0 0 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 2610 1035 540 1035 540 765 2610 765 2610 1035 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 7560 2610 5490 2610 5490 2340 7560 2340 7560 2610 -4 0 0 50 -1 18 12 0.0000 4 135 465 4950 -45 FCell\001 -4 1 0 50 -1 0 12 0.0000 4 135 360 6525 3780 G3.2\001 -4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 -4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G3.1\001 diff --git a/katabatic/doc/images/AutoContactG3-2.fig b/katabatic/doc/images/AutoContactG3-2.fig deleted file mode 100644 index 01cff739..00000000 --- a/katabatic/doc/images/AutoContactG3-2.fig +++ /dev/null @@ -1,91 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 585 -225 765 3375 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 765 -225 765 450 585 450 585 -225 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 675 450 675 3375 --6 -6 -225 810 3375 990 -6 -225 810 450 990 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - -225 810 450 810 450 990 -225 990 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 450 900 3375 900 --6 -6 5535 -180 5715 3420 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 5715 -180 5715 495 5535 495 5535 -180 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5625 495 5625 3420 --6 -6 5400 1485 7650 1665 -2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 - 6075 1485 6525 1485 6525 1665 6075 1665 6075 1485 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5400 1575 7650 1575 --6 -6 5490 1440 5760 1710 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 5625 1485 5625 1665 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 5535 1575 5715 1575 --6 -6 4725 810 8325 990 -6 4725 810 5400 990 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 4725 810 5400 810 5400 990 4725 990 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5400 900 8325 900 --6 -6 4725 2385 8325 2565 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 7650 2475 4725 2475 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 8325 2565 7650 2565 7650 2385 8325 2385 --6 -6 450 2385 2700 2565 -2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 - 1125 2385 1575 2385 1575 2565 1125 2565 1125 2385 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 450 2475 2700 2475 --6 -6 540 2340 810 2610 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 675 2385 675 2565 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 585 2475 765 2475 --6 -6 -225 1485 3375 1665 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 2700 1575 -225 1575 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 3375 1665 2700 1665 2700 1485 3375 1485 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 4950 0 8100 0 8100 3150 4950 3150 4950 0 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6300 3600 6750 3600 6750 3825 6300 3825 6300 3600 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 3150 0 3150 3150 0 3150 0 0 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 5760 2565 5490 2565 5490 765 5760 765 5760 2565 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 765 1665 585 1665 585 810 765 810 765 1665 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 810 2610 540 2610 540 765 810 765 810 2610 -4 0 0 50 -1 18 12 0.0000 4 135 465 4950 -45 FCell\001 -4 1 0 50 -1 0 12 0.0000 4 135 360 6525 3780 G3.2\001 -4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 -4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G3.1\001 diff --git a/katabatic/doc/images/AutoContactG3-3.fig b/katabatic/doc/images/AutoContactG3-3.fig deleted file mode 100644 index 8e10a1da..00000000 --- a/katabatic/doc/images/AutoContactG3-3.fig +++ /dev/null @@ -1,124 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5625 3645 5625 4050 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6750 2565 6750 4050 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 1125 0 8325 0 8325 8550 1125 8550 1125 0 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 6300 1935 6300 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 4950 4275 4950 4275 7650 1575 7650 1575 4950 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 4950 7875 4950 7875 7650 5175 7650 5175 4950 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3915 7290 3915 5265 1935 5265 1935 7290 3915 7290 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 6255 7425 6255 7425 6345 4950 6345 4950 6255 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 6210 5715 6210 5715 6390 5535 6390 5535 6210 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 6210 7515 6210 7515 6390 7335 6390 7335 6210 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6300 5760 6300 4275 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 2925 4005 5625 4005 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 2925 4320 6300 4320 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 6975 4005 6750 4005 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 7650 4320 7425 4320 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5625 4005 6750 4005 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6300 4320 7425 4320 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 675 4275 675 4275 3375 1575 3375 1575 675 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 675 7875 675 7875 3375 5175 3375 5175 675 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 2025 1935 2025 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3915 3015 3915 990 1935 990 1935 3015 3915 3015 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 1980 7425 1980 7425 2070 4950 2070 4950 1980 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 1935 5715 1935 5715 2115 5535 2115 5535 1935 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 1935 7515 1935 7515 2115 7335 2115 7335 1935 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 3015 2025 3600 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1935 2475 2700 2475 -2 2 0 2 0 7 40 -1 45 0.000 0 0 -1 0 0 5 - 2700 2430 3150 2430 3150 2520 2700 2520 2700 2430 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 2925 2385 2925 1620 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 7290 2025 7875 -2 2 0 2 0 7 40 -1 45 0.000 0 0 -1 0 0 5 - 2700 5805 3150 5805 3150 5895 2700 5895 2700 5805 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 5850 3915 5850 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 4725 3825 5265 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 450 3825 990 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 2025 5670 2025 5670 3600 5580 3600 5580 2025 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5625 2430 6750 2430 6750 2520 5625 2520 5625 2430 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 2385 5715 2385 5715 2565 5535 2565 5535 2385 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7470 2025 7380 2025 7380 450 7470 450 7470 2025 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 6300 5670 6300 5670 7875 5580 7875 5580 6300 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 6300 5805 7425 5805 7425 5895 6300 5895 6300 5805 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 5760 7515 5760 7515 5940 7335 5940 7335 5760 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7470 6300 7380 6300 7380 4725 7470 4725 7470 6300 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7425 4635 7425 4275 -3 0 0 1 18 7 50 -1 -1 0.000 0 1 0 6 - 3 0 1.00 60.00 120.00 - 2250 5895 2250 6120 2475 6570 3375 6570 3600 6120 3600 5895 - 0.000 1.000 1.000 1.000 1.000 0.000 -4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 225 Physical Mapping\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1440 6255 G2\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 3015 5220 AC1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 6210 G2\001 -4 0 0 50 -1 19 12 0.0000 4 180 2055 3105 3960 L1 before displacement\001 -4 0 0 50 -1 19 12 0.0000 4 180 1905 3105 4500 L1 after displacement\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1440 1980 G2\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 3015 945 AC1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 1935 G2\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 3600 G1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 210 2925 2700 L1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 7875 G1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 210 2925 5760 L1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 4005 4860 G3\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 4005 585 G3\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 3600 G1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 210 6525 2385 L1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 7650 585 G3\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 7875 G1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 7650 4860 G3\001 -4 1 -1 40 -1 18 12 0.0000 4 135 210 6570 5760 L1\001 diff --git a/katabatic/doc/images/AutoContactG3-4.fig b/katabatic/doc/images/AutoContactG3-4.fig deleted file mode 100644 index da66a163..00000000 --- a/katabatic/doc/images/AutoContactG3-4.fig +++ /dev/null @@ -1,146 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5625 3645 5625 4050 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6750 2565 6750 4050 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 1125 0 8325 0 8325 8550 1125 8550 1125 0 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 6300 1935 6300 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 4950 4275 4950 4275 7650 1575 7650 1575 4950 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 4950 7875 4950 7875 7650 5175 7650 5175 4950 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 6255 7425 6255 7425 6345 4950 6345 4950 6255 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 6210 5715 6210 5715 6390 5535 6390 5535 6210 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 6210 7515 6210 7515 6390 7335 6390 7335 6210 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 2925 4005 5625 4005 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 2925 4320 5625 4320 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 6975 4005 6750 4005 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 6975 4320 6750 4320 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5625 4005 6750 4005 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5580 4320 6750 4320 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 675 4275 675 4275 3375 1575 3375 1575 675 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 675 7875 675 7875 3375 5175 3375 5175 675 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 2025 1935 2025 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 1980 7425 1980 7425 2070 4950 2070 4950 1980 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 1935 5715 1935 5715 2115 5535 2115 5535 1935 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 1935 7515 1935 7515 2115 7335 2115 7335 1935 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 3015 2025 3600 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2115 2475 2700 2475 -2 2 0 2 0 7 40 -1 45 0.000 0 0 -1 0 0 5 - 2700 2430 3150 2430 3150 2520 2700 2520 2700 2430 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 2925 2385 2925 1620 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 7290 2025 7875 -2 2 0 2 0 7 40 -1 45 0.000 0 0 -1 0 0 5 - 2700 5805 3150 5805 3150 5895 2700 5895 2700 5805 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 4725 3825 6255 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 450 3825 1935 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 2025 5670 2025 5670 3600 5580 3600 5580 2025 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5625 2430 6750 2430 6750 2520 5625 2520 5625 2430 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 2385 5715 2385 5715 2565 5535 2565 5535 2385 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7470 2025 7380 2025 7380 450 7470 450 7470 2025 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7470 6300 7380 6300 7380 4725 7470 4725 7470 6300 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2115 3015 2115 1935 1935 1935 1935 3015 2115 3015 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3915 2115 3915 1935 3735 1935 3735 2115 3915 2115 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2115 2025 3735 2025 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5085 2475 5535 2115 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5085 2475 5535 2475 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2115 7290 2115 5760 1935 5760 1935 7290 2115 7290 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2115 5850 2700 5850 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3915 6390 3915 6210 3735 6210 3735 6390 3915 6390 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2115 6300 3735 6300 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5625 5805 6750 5805 6750 5895 5625 5895 5625 5805 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 5760 5715 5760 5715 5940 5535 5940 5535 5760 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 5625 5760 5625 4275 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6750 5760 6750 4275 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5130 5850 5535 5850 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5130 5850 5535 6210 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 5850 5670 5850 5670 7875 5580 7875 5580 5850 -4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 225 Physical Mapping\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1440 6255 G2\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 6210 G2\001 -4 0 0 50 -1 19 12 0.0000 4 180 2055 3105 3960 L1 before displacement\001 -4 0 0 50 -1 19 12 0.0000 4 180 1905 3105 4500 L1 after displacement\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1440 1980 G2\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 1935 G2\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 3600 G1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 210 2925 2700 L1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 7875 G1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 210 2925 5760 L1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 4005 4860 G3\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 4005 585 G3\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 3600 G1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 210 6525 2385 L1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 7650 585 G3\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 7875 G1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 7650 4860 G3\001 -4 1 -1 40 -1 18 12 0.0000 4 135 210 6570 5760 L1\001 -4 1 18 40 -1 18 12 0.0000 4 135 600 2025 1845 AC-SW\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 3825 2295 AC-NE\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 7425 2340 AC-NE\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 7425 6615 AC-NE\001 -4 2 18 40 -1 18 12 0.0000 4 135 600 5040 2565 AC-SW\001 -4 2 18 40 -1 18 12 0.0000 4 135 600 5085 5895 AC-SW\001 -4 1 18 40 -1 18 12 0.0000 4 135 600 2025 5670 AC-SW\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 3825 6570 AC-NE\001 diff --git a/katabatic/doc/images/AutoContactG4-1.fig b/katabatic/doc/images/AutoContactG4-1.fig deleted file mode 100644 index 164eb255..00000000 --- a/katabatic/doc/images/AutoContactG4-1.fig +++ /dev/null @@ -1,111 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 -225 -225 3375 3825 -6 -225 1260 3375 1440 -6 -225 1260 450 1440 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - -225 1260 450 1260 450 1440 -225 1440 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 450 1350 3375 1350 --6 -6 -225 810 3375 990 -6 2700 810 3375 990 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 3375 990 2700 990 2700 810 3375 810 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 2700 900 -225 900 --6 -6 585 -225 765 3375 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 765 -225 765 450 585 450 585 -225 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 675 450 675 3375 --6 -6 2385 -225 2565 3375 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 2475 2700 2475 -225 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 2385 3375 2385 2700 2565 2700 2565 3375 --6 -6 450 2160 2700 2340 -2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 - 1125 2160 1575 2160 1575 2340 1125 2340 1125 2160 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 450 2250 2700 2250 --6 -6 2340 2115 2610 2385 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2475 2160 2475 2340 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2385 2250 2565 2250 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 3150 0 3150 3150 0 3150 0 0 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 -2 4 0 2 4 7 55 -1 20 0.000 0 0 7 0 0 5 - 2610 1440 540 1440 540 765 2610 765 2610 1440 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 4 - 675 1350 675 900 2475 900 2475 1350 -4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 -4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G4.1\001 --6 -6 5400 2160 7650 2340 -2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 - 6075 2160 6525 2160 6525 2340 6075 2340 6075 2160 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5400 2250 7650 2250 --6 -6 5490 2115 5760 2385 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 5625 2160 5625 2340 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 5535 2250 5715 2250 --6 -6 5535 -225 5715 3375 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5625 2700 5625 -225 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 5535 3375 5535 2700 5715 2700 5715 3375 --6 -6 7335 -225 7515 3375 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 7515 -225 7515 450 7335 450 7335 -225 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 7425 450 7425 3375 --6 -6 4725 1260 8325 1440 -6 7650 1260 8325 1440 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 8325 1440 7650 1440 7650 1260 8325 1260 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 7650 1350 4725 1350 --6 -6 4725 810 8325 990 -6 4725 810 5400 990 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 4725 810 5400 810 5400 990 4725 990 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5400 900 8325 900 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 4950 0 8100 0 8100 3150 4950 3150 4950 0 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6300 3600 6750 3600 6750 3825 6300 3825 6300 3600 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 7560 1440 5490 1440 5490 765 7560 765 7560 1440 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 4 - 5625 900 5625 1350 7425 1350 7425 900 -4 0 0 50 -1 18 12 0.0000 4 135 465 4950 -45 FCell\001 -4 1 0 50 -1 0 12 0.0000 4 135 360 6525 3780 G5.1\001 diff --git a/katabatic/doc/images/AutoContactG4-2.fig b/katabatic/doc/images/AutoContactG4-2.fig deleted file mode 100644 index 6f9fbaba..00000000 --- a/katabatic/doc/images/AutoContactG4-2.fig +++ /dev/null @@ -1,109 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 5535 -225 5715 3375 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5625 2700 5625 -225 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 5535 3375 5535 2700 5715 2700 5715 3375 --6 -6 7335 -225 7515 3375 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 7515 -225 7515 450 7335 450 7335 -225 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 7425 450 7425 3375 --6 -6 4725 810 8325 990 -6 4725 810 5400 990 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 4725 810 5400 810 5400 990 4725 990 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5400 900 8325 900 --6 -6 -225 810 3375 990 -6 2700 810 3375 990 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 3375 990 2700 990 2700 810 3375 810 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 2700 900 -225 900 --6 -6 2385 -225 2565 3375 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 2475 2700 2475 -225 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 2385 3375 2385 2700 2565 2700 2565 3375 --6 -6 585 -225 765 3375 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 765 -225 765 450 585 450 585 -225 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 675 450 675 3375 --6 -6 540 1215 810 1485 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 675 1260 675 1440 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 585 1350 765 1350 --6 -6 450 1260 2700 1440 -2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 - 1125 1260 1575 1260 1575 1440 1125 1440 1125 1260 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 450 1350 2700 1350 --6 -6 5490 1215 5760 1485 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 5625 1260 5625 1440 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 5535 1350 5715 1350 --6 -6 5400 1260 7650 1440 -2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 - 6075 1260 6525 1260 6525 1440 6075 1440 6075 1260 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5400 1350 7650 1350 --6 -6 -225 1935 3375 2115 -6 -225 1935 450 2115 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - -225 1935 450 1935 450 2115 -225 2115 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 450 2025 3375 2025 --6 -6 4725 1935 8325 2115 -6 7650 1935 8325 2115 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 8325 2115 7650 2115 7650 1935 8325 1935 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 7650 2025 4725 2025 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 4950 0 8100 0 8100 3150 4950 3150 4950 0 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6300 3600 6750 3600 6750 3825 6300 3825 6300 3600 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 4 - 5625 900 5625 2025 7425 2025 7425 900 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 3150 0 3150 3150 0 3150 0 0 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 4 - 675 2025 675 900 2475 900 2475 2025 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 7560 2160 5490 2160 5490 765 7560 765 7560 2160 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 2565 2160 540 2160 540 765 2565 765 2565 2160 -4 0 0 50 -1 18 12 0.0000 4 135 465 4950 -45 FCell\001 -4 1 0 50 -1 0 12 0.0000 4 135 360 6525 3780 G4.4\001 -4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 -4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G4.3\001 diff --git a/katabatic/doc/images/AutoContactG4-3.fig b/katabatic/doc/images/AutoContactG4-3.fig deleted file mode 100644 index e4b2fcbc..00000000 --- a/katabatic/doc/images/AutoContactG4-3.fig +++ /dev/null @@ -1,109 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 5400 2160 7650 2340 -2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 - 6075 2160 6525 2160 6525 2340 6075 2340 6075 2160 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5400 2250 7650 2250 --6 -6 5490 2115 5760 2385 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 5625 2160 5625 2340 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 5535 2250 5715 2250 --6 -6 5535 -225 5715 3375 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5625 2700 5625 -225 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 5535 3375 5535 2700 5715 2700 5715 3375 --6 -6 7335 -225 7515 3375 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 7515 -225 7515 450 7335 450 7335 -225 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 7425 450 7425 3375 --6 -6 585 -225 765 3375 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 765 -225 765 450 585 450 585 -225 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 675 450 675 3375 --6 -6 2385 -225 2565 3375 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 2475 2700 2475 -225 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 2385 3375 2385 2700 2565 2700 2565 3375 --6 -6 450 2160 2700 2340 -2 2 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 5 - 1125 2160 1575 2160 1575 2340 1125 2340 1125 2160 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 450 2250 2700 2250 --6 -6 2340 2115 2610 2385 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2475 2160 2475 2340 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 7 0 0 2 - 2385 2250 2565 2250 --6 -6 -225 1260 3375 1440 -6 2700 1260 3375 1440 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 3375 1440 2700 1440 2700 1260 3375 1260 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 2700 1350 -225 1350 --6 -6 -225 810 3375 990 -6 -225 810 450 990 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - -225 810 450 810 450 990 -225 990 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 450 900 3375 900 --6 -6 4725 585 8325 765 -6 7650 585 8325 765 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 8325 765 7650 765 7650 585 8325 585 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 7650 675 4725 675 --6 -6 4725 1035 8325 1215 -6 4725 1035 5400 1215 -2 1 0 1 0 7 40 -1 15 0.000 0 0 -1 0 0 4 - 4725 1035 5400 1035 5400 1215 4725 1215 --6 -2 1 3 1 0 7 45 -1 20 10.000 0 0 -1 0 0 2 - 5400 1125 8325 1125 --6 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 4950 0 8100 0 8100 3150 4950 3150 4950 0 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 6300 3600 6750 3600 6750 3825 6300 3825 6300 3600 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 3150 0 3150 3150 0 3150 0 0 -2 2 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 5 - 1350 3600 1800 3600 1800 3825 1350 3825 1350 3600 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 675 900 2475 900 2475 1350 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 5625 1125 5625 675 7425 675 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 2610 1440 540 1440 540 765 2610 765 2610 1440 -2 4 0 2 4 7 55 -1 -1 0.000 0 0 7 0 0 5 - 7560 1215 5490 1215 5490 540 7560 540 7560 1215 -4 0 0 50 -1 18 12 0.0000 4 135 465 4950 -45 FCell\001 -4 1 0 50 -1 0 12 0.0000 4 135 360 6525 3780 G4.6\001 -4 0 0 50 -1 18 12 0.0000 4 135 465 0 -45 FCell\001 -4 1 0 50 -1 0 12 0.0000 4 135 360 1575 3780 G4.5\001 diff --git a/katabatic/doc/images/AutoContactG4-4.fig b/katabatic/doc/images/AutoContactG4-4.fig deleted file mode 100644 index 967c82cb..00000000 --- a/katabatic/doc/images/AutoContactG4-4.fig +++ /dev/null @@ -1,108 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 4500 4275 4500 4275 7200 1575 7200 1575 4500 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 4500 7875 4500 7875 7200 5175 7200 5175 4500 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 4950 1935 4950 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3915 5850 4500 5850 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 5940 2025 7425 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 4860 5715 4860 5715 5040 5535 5040 5535 4860 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 4950 5670 4950 5670 7425 5580 7425 5580 4950 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 4275 3825 4860 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3915 5940 3915 4860 1935 4860 1935 5940 3915 5940 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 0 0 4 - 2025 4950 2025 5850 3825 5850 3825 4950 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 4905 5625 4905 5625 4995 4950 4995 4950 4905 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 2520 900 3780 900 -2 1 0 4 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6075 4905 6075 4995 -2 1 0 4 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 7155 4950 7245 4950 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 1125 0 8325 0 8325 7875 1125 7875 1125 0 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 675 4275 675 4275 3375 1575 3375 1575 675 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 675 7875 675 7875 3375 5175 3375 5175 675 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 1125 1935 1125 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2565 2025 4500 2025 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 2115 2025 3600 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2565 2115 2565 1035 1935 1035 1935 2115 2565 2115 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2475 450 2475 1035 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 1035 5715 1035 5715 1215 5535 1215 5535 1035 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 1125 5670 1125 5670 3600 5580 3600 5580 1125 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 0 0 4 - 2475 1125 2025 1125 2025 2025 2475 2025 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 6165 1125 6075 1125 6075 450 6165 450 6165 1125 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6030 1035 6210 1035 6210 1215 6030 1215 6030 1035 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5625 1980 8100 1980 8100 2070 5625 2070 5625 1980 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 1935 5715 1935 5715 2115 5535 2115 5535 1935 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 1080 6120 1080 6120 1170 4950 1170 4950 1080 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5625 5805 8100 5805 8100 5895 5625 5895 5625 5805 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 5760 5715 5760 5715 5940 5535 5940 5535 5760 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 5760 7515 5760 7515 5940 7335 5940 7335 5760 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7470 5850 7380 5850 7380 4275 7470 4275 7470 5850 -3 0 0 1 18 7 50 -1 -1 0.000 0 1 0 2 - 3 0 1.00 60.00 120.00 - 6075 4950 5715 4950 - 0.000 0.000 -3 0 0 1 18 7 50 -1 -1 0.000 0 1 0 2 - 3 0 1.00 60.00 120.00 - 7200 4950 7200 5760 - 0.000 0.000 -4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 7425 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1395 4905 G2\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 4410 6030 G4\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 7425 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 4860 G2\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 2250 5490 AC1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 4005 4410 G3\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 7650 4410 G3\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 6525 5265 AC1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 3600 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1395 1080 G2\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 4410 2205 G4\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 3600 G1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 2655 585 G3\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 6525 585 G3\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 1035 G2\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 5985 1530 AC1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 2250 1665 AC1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 8010 2250 G4\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 8010 6075 G4\001 diff --git a/katabatic/doc/images/AutoContactG4-5.fig b/katabatic/doc/images/AutoContactG4-5.fig deleted file mode 100644 index 77143572..00000000 --- a/katabatic/doc/images/AutoContactG4-5.fig +++ /dev/null @@ -1,151 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 1260 405 8145 3645 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 2520 900 3780 900 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 675 7875 675 7875 3375 5175 3375 5175 675 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 1125 1935 1125 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2565 2025 4500 2025 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 2115 2025 3600 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2475 450 2475 1035 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 1035 5715 1035 5715 1215 5535 1215 5535 1035 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 1125 5670 1125 5670 3600 5580 3600 5580 1125 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2115 2115 2115 1035 1935 1035 1935 2115 2115 2115 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2565 2115 2565 1035 2385 1035 2385 2115 2565 2115 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2115 1575 2385 1575 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 1080 5625 1080 5625 1170 4950 1170 4950 1080 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 1485 5715 1485 5715 1665 5535 1665 5535 1485 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 6165 2025 6075 2025 6075 450 6165 450 6165 2025 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6030 1485 6210 1485 6210 1665 6030 1665 6030 1485 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6030 1935 6210 1935 6210 2115 6030 2115 6030 1935 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5625 1530 6120 1530 6120 1620 5625 1620 5625 1530 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 6120 1980 8100 1980 8100 2070 6120 2070 6120 1980 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5085 1575 5535 1575 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5085 1575 5535 1215 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 675 4275 675 4275 3375 1575 3375 1575 675 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6750 1575 6210 1575 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6750 1575 6210 1935 -4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 3600 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1395 1080 G2\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 4410 2205 G4\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 3600 G1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 2655 585 G3\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 1035 G2\001 -4 1 -1 40 -1 18 12 0.0000 4 135 210 2250 1755 L1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 8010 2250 G4\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 6345 585 G3\001 -4 0 18 40 -1 18 12 0.0000 4 135 570 2655 1665 AC-NE\001 -4 2 18 40 -1 18 12 0.0000 4 135 600 5040 1620 AC-SW\001 -4 0 18 40 -1 18 12 0.0000 4 135 570 6795 1620 AC-NE\001 --6 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 1125 0 8325 0 8325 7875 1125 7875 1125 0 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 4500 7875 4500 7875 7200 5175 7200 5175 4500 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 4950 1935 4950 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3915 5850 4500 5850 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 5940 2025 7425 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 4860 5715 4860 5715 5040 5535 5040 5535 4860 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 4950 5670 4950 5670 7425 5580 7425 5580 4950 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2115 5940 2115 4860 1935 4860 1935 5940 2115 5940 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2115 5400 3735 5400 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 4905 5625 4905 5625 4995 4950 4995 4950 4905 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 5310 5715 5310 5715 5490 5535 5490 5535 5310 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5085 5400 5535 5400 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5085 5400 5535 5040 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 4500 4275 4500 4275 7200 1575 7200 1575 4500 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 4275 3825 4860 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3915 5940 3915 4860 3735 4860 3735 5940 3915 5940 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7425 5850 7335 5850 7335 4275 7425 4275 7425 5850 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7290 5310 7470 5310 7470 5490 7290 5490 7290 5310 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7290 5760 7470 5760 7470 5940 7290 5940 7290 5760 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7380 5805 8100 5805 8100 5895 7380 5895 7380 5805 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5625 5355 7380 5355 7380 5445 5625 5445 5625 5355 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6975 6255 7290 5490 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6975 6255 7290 5940 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6075 5175 7290 5175 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6075 5850 7290 5850 -2 1 0 4 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6075 5805 6075 5895 -2 1 0 4 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6075 5130 6075 5220 -4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 -4 2 18 40 -1 18 12 0.0000 4 135 600 1845 1665 AC-SW\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 5850 7425 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1395 4905 G2\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 4410 6030 G4\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 2205 7425 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 4860 G2\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 8010 6075 G4\001 -4 2 18 40 -1 18 12 0.0000 4 135 600 5040 5445 AC-SW\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 4005 4410 G3\001 -4 2 18 40 -1 18 12 0.0000 4 135 570 3645 5850 AC-NE\001 -4 2 18 40 -1 18 12 0.0000 4 135 600 1845 5490 AC-SW\001 -4 1 -1 40 -1 18 12 0.0000 4 135 255 7605 4410 G3\001 -4 2 18 40 -1 18 12 0.0000 4 135 570 6930 6345 AC-NE\001 -4 1 -1 40 -1 18 12 0.0000 4 135 210 2925 5580 L1\001 -4 1 -1 40 -1 18 12 0.0000 4 135 210 6525 5625 L1\001 diff --git a/katabatic/doc/images/AutoInvalidate-1.fig b/katabatic/doc/images/AutoInvalidate-1.fig deleted file mode 100644 index 373d2de4..00000000 --- a/katabatic/doc/images/AutoInvalidate-1.fig +++ /dev/null @@ -1,66 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -0 32 #000000 -0 33 #ddcccc -0 34 #611616 -0 35 #ccccdd -6 4050 3195 7200 3690 -2 2 0 0 0 35 60 -1 20 0.000 0 0 -1 0 0 5 - 4050 3195 7200 3195 7200 3690 4050 3690 4050 3195 -4 0 0 50 -1 18 12 0.0000 4 180 1455 4950 3375 AutoInvalidate()\001 -4 0 0 50 -1 18 12 0.0000 4 180 2235 4950 3600 anchor->AutoInvalidate()\001 --6 -6 4050 2700 7200 3195 -2 2 0 0 -1 33 60 -1 20 0.000 0 0 -1 0 0 5 - 4050 2700 7200 2700 7200 3195 4050 3195 4050 2700 -4 0 34 50 -1 18 12 0.0000 4 135 600 4275 2925 Router\001 -4 0 34 50 -1 18 12 0.0000 4 180 2535 4275 3150 autoSegment->SetAxis( ... )\001 --6 -6 8325 4275 12825 7515 -6 8325 4275 12825 4545 -6 8325 4275 12825 4545 -2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 - 8325 4275 12825 4275 12825 4545 8325 4545 8325 4275 -4 0 0 50 -1 18 12 0.0000 4 180 2490 8550 4455 _autoContacts (invalidated)\001 --6 --6 -2 2 0 0 0 35 60 -1 20 0.000 0 0 -1 0 0 5 - 8325 4725 12825 4725 12825 5490 8325 5490 8325 4725 -2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 2.00 120.00 240.00 - 11205 5445 11205 6300 -2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 - 8325 6300 12825 6300 12825 6615 8325 6615 8325 6300 -2 2 0 0 0 35 60 -1 20 0.000 0 0 -1 0 0 5 - 8325 6750 12825 6750 12825 7515 8325 7515 8325 6750 -4 0 0 50 -1 19 12 0.0000 4 135 750 8550 4950 For each\001 -4 0 0 50 -1 18 12 0.0000 4 180 2970 9225 5175 autoContact->UpdateGeometry()\001 -4 0 0 50 -1 18 12 0.0000 4 180 2820 9900 5400 autoSegment->AutoInvalidate()\001 -4 0 0 50 -1 18 12 0.0000 4 135 1080 9360 4950 autoContact\001 -4 0 0 50 -1 19 12 0.0000 4 135 750 8505 6975 For each\001 -4 0 0 50 -1 18 12 0.0000 4 180 2745 9225 7200 autoSegment->OnRevalidate()\001 -4 0 0 50 -1 18 12 0.0000 4 180 3300 9225 7425 _revalidateCallBack ( autoSegment )\001 -4 0 0 50 -1 18 12 0.0000 4 180 1185 9360 6975 autoSegment\001 -4 0 0 50 -1 18 12 0.0000 4 180 2595 8550 6525 _autoSegments (invalidated)\001 --6 -6 4050 4725 7200 5040 -2 2 0 0 -1 33 55 -1 20 0.000 0 0 -1 0 0 5 - 4050 4725 7200 4725 7200 5040 4050 5040 4050 4725 -4 0 34 50 -1 18 12 0.0000 4 180 1950 4275 4950 Session::Revalidate()\001 --6 -2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 1 0 4 - 3 0 2.00 120.00 240.00 - 5670 3645 5670 5850 9225 5850 9225 6300 -2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 1 0 3 - 3 0 2.00 120.00 240.00 - 7200 3555 10530 3555 10530 4275 -2 1 0 4 33 35 50 -1 -1 0.000 0 0 -1 1 0 2 - 1 1 2.00 120.00 240.00 - 7200 4905 8325 4905 diff --git a/katabatic/doc/images/AutoSegmentCollapse-1.fig b/katabatic/doc/images/AutoSegmentCollapse-1.fig deleted file mode 100644 index 7e71742d..00000000 --- a/katabatic/doc/images/AutoSegmentCollapse-1.fig +++ /dev/null @@ -1,87 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 3420 3195 5265 4500 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3960 3465 5040 3465 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4050 3465 4050 3690 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4365 3465 4365 3915 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4950 3465 4950 4320 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4635 3465 4635 4095 -4 1 0 40 -1 14 14 0.0000 4 195 945 4500 3375 C c g t\001 -4 2 0 40 -1 18 12 0.0000 4 135 840 4275 3825 Canonical\001 -4 2 0 40 -1 18 12 0.0000 4 180 840 4545 4050 Collapsed\001 -4 2 0 40 -1 18 12 0.0000 4 135 555 4860 4275 Global\001 -4 2 0 40 -1 18 12 0.0000 4 135 765 5265 4500 Terminal\001 --6 -6 3555 4680 4995 4860 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 1 2 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 3555 4770 4005 4770 -4 0 0 40 -1 18 12 0.0000 4 180 735 4230 4815 Collapse\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 2700 90 90 360 2700 540 2700 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 2700 90 90 2610 2700 2790 2700 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 3825 90 90 1485 3825 1665 3825 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 1575 90 90 2610 1575 2790 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 1575 90 90 3735 1575 3915 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 450 90 90 3735 450 3915 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4950 450 90 90 4860 450 5040 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 2700 90 90 1485 2700 1665 2700 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5400 0 5400 4950 0 4950 0 0 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 540 2700 1485 2700 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1665 2700 2610 2700 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1575 2790 1575 3735 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 1665 2700 2610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2790 1575 3735 1575 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 540 3825 1485 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3915 450 4860 450 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 5400 3150 3150 3150 3150 4950 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 4545 5400 4545 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 720 2385 1260 2385 1260 2655 720 2655 720 2385 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1845 2385 2385 2385 2385 2655 1845 2655 1845 2385 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1620 3150 2160 3150 2160 3420 1620 3420 1620 3150 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2745 2025 3285 2025 3285 2295 2745 2295 2745 2025 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2970 1260 3510 1260 3510 1530 2970 1530 2970 1260 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3870 900 4410 900 4410 1170 3870 1170 3870 900 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4095 135 4635 135 4635 405 4095 405 4095 135 -3 2 0 1 12 7 40 -1 -1 0.000 0 1 1 4 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 3735 495 3600 765 3600 1215 3780 1530 - 0.000 -1.000 -1.000 0.000 -4 1 0 40 -1 14 12 0.0000 4 165 420 990 2565 C-g-\001 -4 1 0 40 -1 14 12 0.0000 4 120 420 2115 2565 C---\001 -4 1 0 40 -1 14 12 0.0000 4 165 420 1890 3330 C-g-\001 -4 1 0 40 -1 14 12 0.0000 4 120 420 3015 2205 C---\001 -4 1 0 40 -1 14 12 0.0000 4 165 420 3240 1440 C-g-\001 -4 1 0 40 -1 14 12 0.0000 4 120 420 4140 1080 C---\001 -4 1 0 40 -1 14 12 0.0000 4 165 420 4365 315 C-g-\001 diff --git a/katabatic/doc/images/AutoSegmentCollapse-2.fig b/katabatic/doc/images/AutoSegmentCollapse-2.fig deleted file mode 100644 index 4362414c..00000000 --- a/katabatic/doc/images/AutoSegmentCollapse-2.fig +++ /dev/null @@ -1,87 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 3420 2295 5265 3600 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3960 2565 5040 2565 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4050 2565 4050 2790 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4365 2565 4365 3015 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4950 2565 4950 3420 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4635 2565 4635 3195 -4 1 0 40 -1 14 14 0.0000 4 195 945 4500 2475 C c g t\001 -4 2 0 40 -1 18 12 0.0000 4 135 840 4275 2925 Canonical\001 -4 2 0 40 -1 18 12 0.0000 4 180 840 4545 3150 Collapsed\001 -4 2 0 40 -1 18 12 0.0000 4 135 555 4860 3375 Global\001 -4 2 0 40 -1 18 12 0.0000 4 135 765 5265 3600 Terminal\001 --6 -6 3555 3780 4995 3960 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 1 2 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 3555 3870 4005 3870 -4 0 0 40 -1 18 12 0.0000 4 180 735 4230 3915 Collapse\001 --6 -6 4140 360 4680 630 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4140 360 4680 360 4680 630 4140 630 4140 360 -4 1 0 40 -1 14 12 0.0000 4 135 420 4410 540 --g-\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 1800 90 90 360 1800 540 1800 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 1800 90 90 2610 1800 2790 1800 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 2925 90 90 1485 2925 1665 2925 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 675 90 90 2610 675 2790 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 675 90 90 3735 675 3915 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1800 90 90 1485 1800 1665 1800 -1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 3825 675 135 135 3690 675 3960 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4950 675 90 90 4860 675 5040 675 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 540 1800 1485 1800 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1665 1800 2610 1800 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1575 1890 1575 2835 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 765 2700 1710 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 5400 2250 3150 2250 3150 4050 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 3645 5400 3645 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 720 1485 1260 1485 1260 1755 720 1755 720 1485 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1845 1485 2385 1485 2385 1755 1845 1755 1845 1485 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1620 2250 2160 2250 2160 2520 1620 2520 1620 2250 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2745 1125 3285 1125 3285 1395 2745 1395 2745 1125 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2970 360 3510 360 3510 630 2970 630 2970 360 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2790 675 3690 675 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5400 0 5400 4050 0 4050 0 0 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3915 675 4860 675 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3555 855 4095 855 4095 1125 3555 1125 3555 855 -3 2 0 1 12 7 40 -1 -1 0.000 0 1 1 4 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 1620 1710 1890 1350 2430 1350 2655 1710 - 0.000 -1.000 -1.000 0.000 -4 1 0 40 -1 14 12 0.0000 4 165 420 990 1665 C-g-\001 -4 1 0 40 -1 14 12 0.0000 4 120 420 2115 1665 C---\001 -4 1 0 40 -1 14 12 0.0000 4 165 420 1890 2430 C-g-\001 -4 1 0 40 -1 14 12 0.0000 4 120 420 3015 1305 C---\001 -4 1 0 40 -1 14 12 0.0000 4 165 420 3240 540 C-g-\001 -4 1 0 40 -1 14 12 0.0000 4 90 420 3825 1035 -c--\001 diff --git a/katabatic/doc/images/AutoSegmentCollapse-3.fig b/katabatic/doc/images/AutoSegmentCollapse-3.fig deleted file mode 100644 index a7d777ba..00000000 --- a/katabatic/doc/images/AutoSegmentCollapse-3.fig +++ /dev/null @@ -1,85 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 3420 2295 5265 3600 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3960 2565 5040 2565 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4050 2565 4050 2790 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4365 2565 4365 3015 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4950 2565 4950 3420 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4635 2565 4635 3195 -4 1 0 40 -1 14 14 0.0000 4 195 945 4500 2475 C c g t\001 -4 2 0 40 -1 18 12 0.0000 4 135 840 4275 2925 Canonical\001 -4 2 0 40 -1 18 12 0.0000 4 180 840 4545 3150 Collapsed\001 -4 2 0 40 -1 18 12 0.0000 4 135 555 4860 3375 Global\001 -4 2 0 40 -1 18 12 0.0000 4 135 765 5265 3600 Terminal\001 --6 -6 3555 3780 4995 3960 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 1 2 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 3555 3870 4005 3870 -4 0 0 40 -1 18 12 0.0000 4 180 735 4230 3915 Collapse\001 --6 -6 3015 360 3555 630 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3015 360 3555 360 3555 630 3015 630 3015 360 -4 1 0 40 -1 14 12 0.0000 4 135 420 3285 540 --g-\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 1800 90 90 360 1800 540 1800 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 2925 90 90 1485 2925 1665 2925 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1800 90 90 1485 1800 1665 1800 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1800 135 135 1440 1800 1710 1800 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 675 90 90 2610 675 2790 675 -1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 2700 675 135 135 2565 675 2835 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 675 90 90 3735 675 3915 675 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 540 1800 1440 1800 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1575 1935 1575 2835 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 5400 2250 3150 2250 3150 4050 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 3645 5400 3645 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 720 1485 1260 1485 1260 1755 720 1755 720 1485 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1620 2250 2160 2250 2160 2520 1620 2520 1620 2250 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5400 0 5400 4050 0 4050 0 0 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1575 765 1575 1665 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1845 360 2385 360 2385 630 1845 630 1845 360 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1665 675 2565 675 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2790 675 3735 675 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2430 855 2970 855 2970 1125 2430 1125 2430 855 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1620 1125 2160 1125 2160 1395 1620 1395 1620 1125 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1845 1665 2385 1665 2385 1935 1845 1935 1845 1665 -3 2 0 1 12 7 40 -1 -1 0.000 0 1 1 4 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 1485 720 1215 945 1215 1395 1485 1710 - 0.000 -1.000 -1.000 0.000 -4 1 0 40 -1 14 12 0.0000 4 165 420 990 1665 C-g-\001 -4 1 0 40 -1 14 12 0.0000 4 165 420 1890 2430 C-g-\001 -4 1 0 40 -1 14 12 0.0000 4 165 420 2115 540 C-g-\001 -4 1 0 40 -1 14 12 0.0000 4 120 420 1890 1305 C---\001 -4 1 0 40 -1 14 12 0.0000 4 90 420 2700 1035 -c--\001 -4 1 0 40 -1 14 12 0.0000 4 90 420 2115 1845 -c--\001 diff --git a/katabatic/doc/images/AutoSegmentCollapse-4.fig b/katabatic/doc/images/AutoSegmentCollapse-4.fig deleted file mode 100644 index d9e860d9..00000000 --- a/katabatic/doc/images/AutoSegmentCollapse-4.fig +++ /dev/null @@ -1,90 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 3420 2295 5265 3600 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3960 2565 5040 2565 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4050 2565 4050 2790 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4365 2565 4365 3015 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4950 2565 4950 3420 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4635 2565 4635 3195 -4 1 0 40 -1 14 14 0.0000 4 195 945 4500 2475 C c g t\001 -4 2 0 40 -1 18 12 0.0000 4 135 840 4275 2925 Canonical\001 -4 2 0 40 -1 18 12 0.0000 4 180 840 4545 3150 Collapsed\001 -4 2 0 40 -1 18 12 0.0000 4 135 555 4860 3375 Global\001 -4 2 0 40 -1 18 12 0.0000 4 135 765 5265 3600 Terminal\001 --6 -6 3555 3780 4995 3960 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 1 2 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 3555 3870 4005 3870 -4 0 0 40 -1 18 12 0.0000 4 180 735 4230 3915 Collapse\001 --6 -6 3015 360 3555 630 -6 3015 360 3555 630 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3015 360 3555 360 3555 630 3015 630 3015 360 -4 1 0 40 -1 14 12 0.0000 4 135 420 3285 540 --g-\001 --6 --6 -6 1845 360 2385 630 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1845 360 2385 360 2385 630 1845 630 1845 360 -4 1 0 40 -1 14 12 0.0000 4 135 420 2115 540 --g-\001 --6 -6 2430 225 2970 495 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2430 225 2970 225 2970 495 2430 495 2430 225 -4 1 0 40 -1 14 12 0.0000 4 90 420 2700 405 -c--\001 --6 -6 1620 1305 2160 1575 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1620 1305 2160 1305 2160 1575 1620 1575 1620 1305 -4 1 0 40 -1 14 12 0.0000 4 165 420 1890 1485 C-g-\001 --6 -6 1755 855 2295 1125 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1755 855 2295 855 2295 1125 1755 1125 1755 855 -4 1 0 40 -1 14 12 0.0000 4 90 420 2025 1035 -c--\001 --6 -6 2340 855 2880 1125 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2340 855 2880 855 2880 1125 2340 1125 2340 855 -4 1 0 40 -1 14 12 0.0000 4 90 420 2610 1035 -c--\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 675 90 90 2610 675 2790 675 -1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 2700 675 135 135 2565 675 2835 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 675 90 90 3735 675 3915 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 675 90 90 360 675 540 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1800 90 90 1485 1800 1665 1800 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 135 135 1440 675 1710 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 180 180 1395 675 1755 675 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 5400 2250 3150 2250 3150 4050 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 3645 5400 3645 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5400 0 5400 4050 0 4050 0 0 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1755 675 2565 675 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2790 675 3735 675 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 720 360 1260 360 1260 630 720 630 720 360 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 540 675 1395 675 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1575 855 1575 1710 -4 1 0 40 -1 14 12 0.0000 4 165 420 990 540 C-g-\001 diff --git a/katabatic/doc/images/AutoSegmentCollapse-5.fig b/katabatic/doc/images/AutoSegmentCollapse-5.fig deleted file mode 100644 index cd67a788..00000000 --- a/katabatic/doc/images/AutoSegmentCollapse-5.fig +++ /dev/null @@ -1,81 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 4230 1710 4770 1980 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4230 1710 4770 1710 4770 1980 4230 1980 4230 1710 -4 1 0 40 -1 14 12 0.0000 4 165 420 4500 1890 C-g-\001 --6 -6 4905 1530 5445 1800 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4905 1530 5445 1530 5445 1800 4905 1800 4905 1530 -4 1 0 40 -1 14 12 0.0000 4 90 420 5175 1710 -c--\001 --6 -6 5670 1710 6210 1980 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5670 1710 6210 1710 6210 1980 5670 1980 5670 1710 -4 1 0 40 -1 14 12 0.0000 4 135 420 5940 1890 --g-\001 --6 -6 4950 2655 6795 3960 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5490 2925 6570 2925 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5580 2925 5580 3150 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5895 2925 5895 3375 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 6480 2925 6480 3780 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 6165 2925 6165 3555 -4 1 0 40 -1 14 14 0.0000 4 195 945 6030 2835 C c g t\001 -4 2 0 40 -1 18 12 0.0000 4 135 840 5805 3285 Canonical\001 -4 2 0 40 -1 18 12 0.0000 4 180 840 6075 3510 Collapsed\001 -4 2 0 40 -1 18 12 0.0000 4 135 555 6390 3735 Global\001 -4 2 0 40 -1 18 12 0.0000 4 135 765 6795 3960 Terminal\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3870 2025 90 90 3780 2025 3960 2025 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 2025 135 135 5040 2025 5310 2025 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 2025 90 90 5085 2025 5265 2025 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 6525 2025 90 90 6435 2025 6615 2025 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 2025 90 90 360 2025 540 2025 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 2025 90 90 1710 2025 1890 2025 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 675 90 90 1710 675 1890 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3150 675 90 90 3060 675 3240 675 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3960 2025 5040 2025 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5310 2025 6435 2025 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 540 2025 1710 2025 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1800 765 1800 1935 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1890 675 3060 675 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 810 1710 1350 1710 1350 1980 810 1980 810 1710 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1845 1215 2385 1215 2385 1485 1845 1485 1845 1215 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2160 360 2700 360 2700 630 2160 630 2160 360 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 6975 2475 4725 2475 4725 4050 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 6975 0 6975 4050 0 4050 0 0 -4 1 0 40 -1 14 12 0.0000 4 165 420 1080 1890 C-g-\001 -4 1 0 40 -1 14 12 0.0000 4 120 420 2115 1395 C---\001 -4 1 0 40 -1 14 12 0.0000 4 165 420 2430 540 C-g-\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1125 2205 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 1665 1440 L1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 2430 855 G2\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 4500 2205 G1\001 -4 1 18 40 -1 18 12 0.0000 4 135 255 5940 2205 G2\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 5175 2340 L1\001 -4 1 0 40 -1 18 12 0.0000 4 135 345 1800 540 AC2\001 -4 1 0 40 -1 18 12 0.0000 4 135 345 1800 2340 AC1\001 -4 1 0 40 -1 18 12 0.0000 4 135 945 5175 1485 AC1 & AC2\001 diff --git a/katabatic/doc/images/AutoSegmentCollapse-6.fig b/katabatic/doc/images/AutoSegmentCollapse-6.fig deleted file mode 100644 index 710d28a4..00000000 --- a/katabatic/doc/images/AutoSegmentCollapse-6.fig +++ /dev/null @@ -1,82 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 4950 2655 6795 3960 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5490 2925 6570 2925 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5580 2925 5580 3150 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5895 2925 5895 3375 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 6480 2925 6480 3780 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 6165 2925 6165 3555 -4 1 0 40 -1 14 14 0.0000 4 195 945 6030 2835 C c g t\001 -4 2 0 40 -1 18 12 0.0000 4 135 840 5805 3285 Canonical\001 -4 2 0 40 -1 18 12 0.0000 4 180 840 6075 3510 Collapsed\001 -4 2 0 40 -1 18 12 0.0000 4 135 555 6390 3735 Global\001 -4 2 0 40 -1 18 12 0.0000 4 135 765 6795 3960 Terminal\001 --6 -6 810 360 1350 630 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 810 360 1350 360 1350 630 810 630 810 360 -4 1 0 40 -1 14 12 0.0000 4 165 420 1080 540 C-g-\001 --6 -6 4185 360 4725 630 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 360 4725 360 4725 630 4185 630 4185 360 -4 1 0 40 -1 14 12 0.0000 4 165 420 4455 540 C-g-\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 2025 90 90 1710 2025 1890 2025 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 675 90 90 1710 675 1890 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3150 675 90 90 3060 675 3240 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 675 90 90 360 675 540 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 2025 90 90 5085 2025 5265 2025 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 675 90 90 5085 675 5265 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 6525 675 90 90 6435 675 6615 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 675 90 90 3735 675 3915 675 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 6975 2475 4725 2475 4725 4050 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 6975 0 6975 4050 0 4050 0 0 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1800 765 1800 1935 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1890 675 3060 675 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1845 1215 2385 1215 2385 1485 1845 1485 1845 1215 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2160 360 2700 360 2700 630 2160 630 2160 360 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 540 675 1710 675 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5175 765 5175 1935 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5265 675 6435 675 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5220 1215 5760 1215 5760 1485 5220 1485 5220 1215 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 360 6075 360 6075 630 5535 630 5535 360 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3915 675 5085 675 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5085 675 5310 675 -4 1 0 40 -1 14 12 0.0000 4 120 420 2115 1395 C---\001 -4 1 0 40 -1 14 12 0.0000 4 165 420 2430 540 C-g-\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 1665 1440 L1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 2430 855 G2\001 -4 1 0 40 -1 18 12 0.0000 4 135 345 1800 540 AC1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1080 855 G1\001 -4 1 0 40 -1 14 12 0.0000 4 120 420 5490 1395 C---\001 -4 1 0 40 -1 14 12 0.0000 4 135 420 5805 540 --g-\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 5040 1440 L1\001 -4 1 18 40 -1 18 12 0.0000 4 135 255 5805 855 G2\001 -4 1 0 40 -1 18 12 0.0000 4 135 345 5175 540 AC1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 4455 855 G1\001 diff --git a/katabatic/doc/images/GCellConfiguration-1.fig b/katabatic/doc/images/GCellConfiguration-1.fig deleted file mode 100644 index 2ba8ad76..00000000 --- a/katabatic/doc/images/GCellConfiguration-1.fig +++ /dev/null @@ -1,65 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 1350 90 90 2610 1350 2790 1350 -1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 2700 2025 90 90 2610 2025 2790 2025 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1125 2025 90 90 1035 2025 1215 2025 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3600 2025 90 90 3510 2025 3690 2025 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 890 2965 90 90 800 2965 980 2965 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2025 900 2115 900 2115 1800 2025 1800 2025 900 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1980 1260 2160 1260 2160 1440 1980 1440 1980 1260 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2160 1350 2610 1350 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 1440 2700 1935 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1215 2025 2610 2025 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2790 2025 3510 2025 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5130 900 5220 900 5220 1800 5130 1800 5130 900 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 5175 1305 5850 1305 5850 1395 5175 1395 5175 1305 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 5805 1350 5895 1350 5895 2250 5805 2250 5805 1350 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 4500 2205 5850 2205 5850 2295 4500 2295 4500 2205 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 5850 630 6750 630 6750 720 5850 720 5850 630 -2 1 0 2 18 7 40 -1 45 0.000 0 0 -1 0 0 2 - 5850 765 5850 1260 -2 1 0 1 18 7 30 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6525 1125 5850 990 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 675 2745 3375 2745 3375 3375 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 450 3150 450 3150 2475 1575 2475 1575 450 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 4725 450 6300 450 6300 2475 4725 2475 4725 450 -2 4 0 1 18 7 30 -1 -1 0.000 0 0 7 0 0 5 - 6030 2430 6030 495 5670 495 5670 2430 6030 2430 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 675 0 7200 0 7200 3375 675 3375 675 0 -4 1 12 40 -1 18 12 0.0000 4 135 210 2385 1305 L1\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 6030 1845 L2\001 -4 0 18 30 -1 14 12 0.0000 4 135 315 6615 1170 gap\001 -4 0 0 30 -1 18 12 0.0000 4 180 930 2250 3285 G: "global"\001 -4 0 0 30 -1 18 12 0.0000 4 135 1095 1125 3015 AutoContact\001 -4 0 0 30 -1 18 12 0.0000 4 135 780 1125 3285 L: "local"\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 6660 585 G2\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 4590 2475 G1\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 5445 1260 L1\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 1350 2205 G1\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 3375 2205 G2\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 2835 1755 L2\001 -4 1 0 30 -1 14 12 0.0000 4 120 2205 2340 270 AutoContact Structure\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 5490 225 Physical Mapping\001 diff --git a/katabatic/doc/images/GCellConfiguration-10.fig b/katabatic/doc/images/GCellConfiguration-10.fig deleted file mode 100644 index f799106a..00000000 --- a/katabatic/doc/images/GCellConfiguration-10.fig +++ /dev/null @@ -1,20 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 900 900 90 90 810 900 990 900 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 225 2925 225 2925 1575 0 1575 0 225 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2430 450 2520 450 2520 1350 2430 1350 2430 450 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 810 2565 810 2565 990 2385 990 2385 810 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2385 900 990 900 -4 1 0 40 -1 18 12 0.0000 4 180 1335 900 1170 _targetContact\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 1575 855 Lt\001 diff --git a/katabatic/doc/images/GCellConfiguration-11.fig b/katabatic/doc/images/GCellConfiguration-11.fig deleted file mode 100644 index 7344480f..00000000 --- a/katabatic/doc/images/GCellConfiguration-11.fig +++ /dev/null @@ -1,24 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 900 1575 90 90 810 1575 990 1575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 890 670 90 90 800 670 980 670 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 225 2925 225 2925 2250 0 2250 0 225 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2430 1125 2520 1125 2520 2025 2430 2025 2430 1125 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 1485 2565 1485 2565 1665 2385 1665 2385 1485 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2385 1575 990 1575 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 900 765 900 1485 -4 1 0 40 -1 18 12 0.0000 4 180 1335 900 495 _targetContact\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 1710 1755 Lt\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 1035 1170 Lt\001 diff --git a/katabatic/doc/images/GCellConfiguration-12.fig b/katabatic/doc/images/GCellConfiguration-12.fig deleted file mode 100644 index 855304c2..00000000 --- a/katabatic/doc/images/GCellConfiguration-12.fig +++ /dev/null @@ -1,31 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 180 405 4410 1485 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1890 1350 90 90 1800 1350 1980 1350 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1890 675 90 90 1800 675 1980 675 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3375 1260 3555 1260 3555 1440 3375 1440 3375 1260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3375 1350 1980 1350 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 765 1890 1260 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1035 585 1215 585 1215 765 1035 765 1035 585 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1800 675 1260 675 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 225 720 225 630 1125 630 1125 720 225 720 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 3465 1395 3465 1305 4365 1305 4365 1395 3465 1395 -4 1 0 40 -1 18 12 0.0000 4 180 285 720 540 rp1\001 -4 1 0 40 -1 18 12 0.0000 4 180 285 3915 1215 rp2\001 --6 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 225 4725 225 4725 1800 0 1800 0 225 diff --git a/katabatic/doc/images/GCellConfiguration-13.fig b/katabatic/doc/images/GCellConfiguration-13.fig deleted file mode 100644 index 6f170f76..00000000 --- a/katabatic/doc/images/GCellConfiguration-13.fig +++ /dev/null @@ -1,29 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 450 2025 90 90 360 2025 540 2025 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1125 2025 90 90 1035 2025 1215 2025 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 405 450 495 450 495 1350 405 1350 405 450 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 360 1260 540 1260 540 1440 360 1440 360 1260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 450 1440 450 1935 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1035 2025 540 2025 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1125 2385 1125 2115 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1035 2385 1215 2385 1215 2565 1035 2565 1035 2385 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 1080 2475 1170 2475 1170 3375 1080 3375 1080 2475 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 225 1800 225 1800 3600 0 3600 0 225 -4 1 0 40 -1 18 12 0.0000 4 180 285 720 900 rp1\001 -4 1 0 40 -1 18 12 0.0000 4 180 285 1395 2970 rp2\001 diff --git a/katabatic/doc/images/GCellConfiguration-14.fig b/katabatic/doc/images/GCellConfiguration-14.fig deleted file mode 100644 index 348653bc..00000000 --- a/katabatic/doc/images/GCellConfiguration-14.fig +++ /dev/null @@ -1,76 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 5220 2745 5400 2880 -4 1 18 30 -1 18 12 0.0000 4 135 150 5310 2880 G\001 --6 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3825 1575 90 90 3735 1575 3915 1575 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 1575 1800 90 90 1485 1800 1665 1800 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 2700 2250 90 90 2610 2250 2790 2250 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 1125 90 90 2610 1125 2790 1125 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 2700 1800 90 90 2610 1800 2790 1800 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 3825 2700 90 90 3735 2700 3915 2700 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 3825 2250 90 90 3735 2250 3915 2250 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1350 90 90 1485 1350 1665 1350 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3825 1665 3825 2160 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4185 1575 3915 1575 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 1485 4365 1485 4365 1665 4185 1665 4185 1485 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 1125 4320 1125 4320 2025 4230 2025 4230 1125 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3735 2250 2790 2250 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2700 2160 2700 1890 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2610 1800 1665 1800 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1575 1710 1575 1440 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 1980 225 2070 225 2070 1125 1980 1125 1980 225 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1935 585 2115 585 2115 765 1935 765 1935 585 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1935 675 1665 675 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1575 765 1575 1260 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 3105 675 3195 675 3195 1575 3105 1575 3105 675 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 1035 3240 1035 3240 1215 3060 1215 3060 1035 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3060 1125 2790 1125 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2700 1215 2700 1710 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5175 0 5175 3600 0 3600 0 0 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 3150 2700 3150 2700 3600 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 1485 1350 -225 1350 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3825 2610 3825 2340 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 1575 1440 1575 1440 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 2700 1710 2700 1890 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 3825 2160 3825 2385 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 5400 2700 3915 2700 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 945 1575 3555 East+West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 2-3-0-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 1530 G\001 -4 1 0 40 -1 18 12 0.0000 4 180 1665 3825 3015 _northEastContact\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 1485 1215 _southWestContact\001 diff --git a/katabatic/doc/images/GCellConfiguration-15.fig b/katabatic/doc/images/GCellConfiguration-15.fig deleted file mode 100644 index ce0ba8b9..00000000 --- a/katabatic/doc/images/GCellConfiguration-15.fig +++ /dev/null @@ -1,22 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 665 670 90 90 575 670 755 670 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2250 1575 90 90 2160 1575 2340 1575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2250 675 90 90 2160 675 2340 675 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 765 2250 1485 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 675 765 675 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 2925 0 2925 2025 0 2025 0 0 -4 1 0 40 -1 18 12 0.0000 4 180 540 675 495 target\001 -4 1 0 40 -1 18 12 0.0000 4 105 600 2250 1845 source\001 -4 1 12 40 -1 18 12 0.0000 4 135 105 1440 630 L\001 -4 1 12 40 -1 18 12 0.0000 4 135 105 2340 1215 L\001 diff --git a/katabatic/doc/images/GCellConfiguration-16.fig b/katabatic/doc/images/GCellConfiguration-16.fig deleted file mode 100644 index f1d7de0d..00000000 --- a/katabatic/doc/images/GCellConfiguration-16.fig +++ /dev/null @@ -1,22 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 665 670 90 90 575 670 755 670 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2250 1575 90 90 2160 1575 2340 1575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 675 1575 90 90 585 1575 765 1575 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 2925 0 2925 2025 0 2025 0 0 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 1575 765 1575 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 675 765 675 1485 -4 1 0 40 -1 18 12 0.0000 4 180 540 675 495 target\001 -4 1 0 40 -1 18 12 0.0000 4 105 600 2250 1845 source\001 -4 1 12 40 -1 18 12 0.0000 4 135 105 1575 1530 L\001 -4 1 12 40 -1 18 12 0.0000 4 135 105 765 1170 L\001 diff --git a/katabatic/doc/images/GCellConfiguration-17.fig b/katabatic/doc/images/GCellConfiguration-17.fig deleted file mode 100644 index b6d79a4d..00000000 --- a/katabatic/doc/images/GCellConfiguration-17.fig +++ /dev/null @@ -1,458 +0,0 @@ -#FIG 3.2 -Portrait -Center -Metric -A4 -55.00 -Single --2 -1200 2 -6 -270 22230 5490 26370 -6 4140 23355 4410 24345 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 23760 4365 23760 4365 23940 4185 23940 4185 23760 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 23400 4320 23400 4320 24300 4230 24300 4230 23400 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 24525 90 90 2835 24525 3015 24525 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 22500 5175 22500 5175 26100 0 26100 0 22500 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 25650 4050 25650 4050 26100 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2250 25155 3825 25155 3825 25245 2250 25245 2250 25155 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2835 25110 3015 25110 3015 25290 2835 25290 2835 25110 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 25110 2925 24615 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 2115 23850 3510 23850 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 4185 23850 3690 23850 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3600 24615 3600 26325 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 2025 22275 2025 23085 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3015 24525 3510 24525 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 3690 24615 3510 24615 3510 23760 3690 23760 3690 24615 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 5400 23175 2115 23175 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 2115 23940 1935 23940 1935 23085 2115 23085 2115 23940 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3510 24300 -225 24300 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 3510 24210 3690 24210 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 26055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 25830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 25830 4-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 2175 1575 26055 North+South+East+West\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 3915 23805 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 3060 24930 Lt\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 1890 23715 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 1890 22410 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3510 26325 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 3735 24660 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5355 23130 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 24525 G\001 --6 -6 -270 17730 5445 21600 -6 4140 18405 4410 19395 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 18810 4365 18810 4365 18990 4185 18990 4185 18810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 18450 4320 18450 4320 19350 4230 19350 4230 18450 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 19575 90 90 2835 19575 3015 19575 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 3600 20700 90 90 3510 20700 3690 20700 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 18000 5175 18000 5175 21600 0 21600 0 18000 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 21150 3375 21150 3375 21600 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3600 17775 3600 18810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2250 20205 3825 20205 3825 20295 2250 20295 2250 20205 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2835 20160 3015 20160 3015 20340 2835 20340 2835 20160 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 20160 2925 19665 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 4185 18900 3690 18900 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3015 19575 3510 19575 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 3690 19665 3510 19665 3510 18810 3690 18810 3690 19665 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 5400 19575 3690 19575 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3600 19665 3600 20610 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - -225 20700 3510 20700 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 3510 19260 3690 19260 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 21555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 21330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 21330 3-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 1545 1575 21555 North+East+West\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3510 17910 G\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 3915 18855 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 3060 19980 Lt\001 -4 0 0 40 -1 18 12 0.0000 4 180 1665 3780 19800 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5310 19530 G\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 3420 20610 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -180 20655 G\001 --6 -6 5805 18000 11565 21870 -6 10215 18855 10485 19845 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 19260 10440 19260 10440 19440 10260 19440 10260 19260 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 10305 18900 10395 18900 10395 19800 10305 19800 10305 18900 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 9000 20025 90 90 8910 20025 9090 20025 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 6075 18000 11250 18000 11250 21600 6075 21600 6075 18000 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 6075 21150 9450 21150 9450 21600 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8325 20655 9900 20655 9900 20745 8325 20745 8325 20655 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 20610 9090 20610 9090 20790 8910 20790 8910 20610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 9000 20610 9000 20115 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 10260 19350 9765 19350 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 9675 20115 9675 21825 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 9090 20025 9585 20025 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 9765 20115 9585 20115 9585 19260 9765 19260 9765 20115 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 9585 19800 5850 19800 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 9765 18540 9585 18540 9585 18360 9765 18360 9765 18540 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 9675 18540 9675 19260 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 11475 18450 9765 18450 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 9585 19710 9765 19710 -4 0 0 30 -1 18 12 0.0000 4 135 615 6120 21555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 21330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7650 21330 3-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 1575 7650 21555 South+East+West\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 9990 19305 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 9135 20430 Lt\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 9585 21825 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 9810 20160 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5940 19710 G\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 9495 18495 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 11385 18360 G\001 --6 -6 -270 13230 5490 17370 -6 4140 14355 4410 15345 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 14760 4365 14760 4365 14940 4185 14940 4185 14760 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 14400 4320 14400 4320 15300 4230 15300 4230 14400 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2025 14850 90 90 1935 14850 2115 14850 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 15525 90 90 2835 15525 3015 15525 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 13500 5175 13500 5175 17100 0 17100 0 13500 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 16650 3375 16650 3375 17100 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2250 16155 3825 16155 3825 16245 2250 16245 2250 16155 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2835 16110 3015 16110 3015 16290 2835 16290 2835 16110 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 16110 2925 15615 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 2115 14850 3510 14850 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 4185 14850 3690 14850 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3600 15615 3600 17325 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 2025 13275 2025 14760 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3015 15525 3510 15525 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 3690 15615 3510 15615 3510 14760 3690 14760 3690 15615 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3510 15300 -225 15300 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 3510 15255 3690 15255 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 17055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 16830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 16830 3-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 1665 1575 17055 North+South+West\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 3915 14805 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 3060 15930 Lt\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 1890 14715 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 1890 13410 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3510 17325 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 3735 15660 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -180 15255 G\001 --6 -6 6075 13230 11565 17370 -6 10215 14355 10485 15345 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 14760 10440 14760 10440 14940 10260 14940 10260 14760 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 10305 14400 10395 14400 10395 15300 10305 15300 10305 14400 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 9000 15525 90 90 8910 15525 9090 15525 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 6075 13500 11250 13500 11250 17100 6075 17100 6075 13500 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 6075 16650 9450 16650 9450 17100 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8325 16155 9900 16155 9900 16245 8325 16245 8325 16155 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 16110 9090 16110 9090 16290 8910 16290 8910 16110 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 9000 16110 9000 15615 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 8190 14850 9585 14850 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 10260 14850 9765 14850 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 9675 15615 9675 17325 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 8100 13275 8100 14085 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 9090 15525 9585 15525 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 9765 15615 9585 15615 9585 14760 9765 14760 9765 15615 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 11475 14175 8190 14175 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 8190 14940 8010 14940 8010 14085 8190 14085 8190 14940 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 9585 15210 9765 15210 -4 0 0 30 -1 18 12 0.0000 4 135 615 6120 17055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 16830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7650 16830 3-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 1635 7650 17055 North+South+East\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 9990 14805 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 9135 15930 Lt\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 7965 14715 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 7965 13410 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 9585 17325 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 9810 15660 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 11430 14130 G\001 --6 -6 -270 9000 5490 12600 -6 4140 9855 4410 10845 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 10260 4365 10260 4365 10440 4185 10440 4185 10260 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 9900 4320 9900 4320 10800 4230 10800 4230 9900 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 9720 90 90 2835 9720 3015 9720 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3590 10345 90 90 3500 10345 3680 10345 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 9000 5175 9000 5175 12600 0 12600 0 9000 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 12150 3375 12150 3375 12600 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 2835 11025 -225 11025 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2250 11655 3825 11655 3825 11745 2250 11745 2250 11655 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2835 11610 3015 11610 3015 11790 2835 11790 2835 11610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 11610 2925 11115 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 5445 9720 3015 9720 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 2925 9810 2925 10935 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 4185 10350 3690 10350 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3600 10440 3600 10935 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 3690 11115 2835 11115 2835 10935 3690 10935 3690 11115 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 3285 10935 3285 11115 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 12555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 12330 Configuration:\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 10980 G\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 12330 2-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 945 1575 12555 West+East\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 3915 10305 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 3060 11430 Lt\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 2745 10935 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5355 9675 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1665 2925 9540 _northEastContact\001 -4 0 12 40 -1 18 12 0.0000 4 135 180 3645 10755 Lt\001 --6 -6 6075 8730 11565 12870 -6 10215 9855 10485 10845 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 10260 10440 10260 10440 10440 10260 10440 10260 10260 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 10305 9900 10395 9900 10395 10800 10305 10800 10305 9900 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 8100 10350 90 90 8010 10350 8190 10350 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 9000 11025 90 90 8910 11025 9090 11025 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 6075 9000 11250 9000 11250 12600 6075 12600 6075 9000 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 6075 12150 9450 12150 9450 12600 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8325 11655 9900 11655 9900 11745 8325 11745 8325 11655 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 11610 9090 11610 9090 11790 8910 11790 8910 11610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 9000 11610 9000 11115 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 8190 10350 9585 10350 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 10260 10350 9765 10350 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 9675 11115 9675 12825 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 8100 8775 8100 10260 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 9090 11025 9585 11025 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 9765 11115 9585 11115 9585 10260 9765 10260 9765 11115 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 9585 10710 9765 10710 -4 0 0 30 -1 18 12 0.0000 4 135 615 6120 12555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 12330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7650 12330 2-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 1125 7650 12555 North+South\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 9990 10305 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 9135 11430 Lt\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 7965 10215 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 7965 8910 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 9585 12825 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 9810 11160 _southWestContact\001 --6 -6 -270 4500 5175 8100 -6 4140 5355 4410 6345 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 5760 4365 5760 4365 5940 4185 5940 4185 5760 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 5400 4320 5400 4320 6300 4230 6300 4230 5400 --6 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3600 5850 90 90 3510 5850 3690 5850 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 4500 5175 4500 5175 8100 0 8100 0 4500 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 7650 3375 7650 3375 8100 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 2835 6525 -225 6525 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 4185 5850 3690 5850 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3600 5940 3600 6435 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2250 7155 3825 7155 3825 7245 2250 7245 2250 7155 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2835 7110 3015 7110 3015 7290 2835 7290 2835 7110 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 7110 2925 6615 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 3735 6615 2835 6615 2835 6435 3735 6435 3735 6615 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 3285 6435 3285 6615 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 8055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 7830 Configuration:\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 6480 G\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 7830 1-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 435 1575 8055 West\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 3915 5805 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 3060 6930 Lt\001 -4 0 12 40 -1 18 12 0.0000 4 135 180 3645 6255 Lt\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 2745 6435 _southWestContact\001 --6 -6 6075 4500 11250 8370 -6 10215 5355 10485 6345 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 5760 10440 5760 10440 5940 10260 5940 10260 5760 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 10305 5400 10395 5400 10395 6300 10305 6300 10305 5400 --6 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 9675 6615 9675 8325 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 6075 4500 11250 4500 11250 8100 6075 8100 6075 4500 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 6075 7650 9450 7650 9450 8100 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 10260 5850 9765 5850 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8325 7155 9900 7155 9900 7245 8325 7245 8325 7155 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 7110 9090 7110 9090 7290 8910 7290 8910 7110 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 9000 7110 9000 6615 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 9765 5760 9585 5760 9585 6615 9765 6615 9765 5760 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 9090 6435 8910 6435 8910 6615 9090 6615 9090 6435 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 9585 6525 9090 6525 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 9585 6210 9765 6210 -4 0 0 30 -1 18 12 0.0000 4 135 615 6120 8055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 7830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7650 7830 1-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 525 7650 8055 South\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 9990 5805 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 9135 6930 Lt\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 9810 8280 G\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 9495 5850 _southWestContact\001 --6 -6 -270 26730 5490 30600 -6 4140 27855 4410 28845 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 28260 4365 28260 4365 28440 4185 28440 4185 28260 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 27900 4320 27900 4320 28800 4230 28800 4230 27900 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 29025 90 90 2835 29025 3015 29025 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 27000 5175 27000 5175 30600 0 30600 0 27000 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 30150 4050 30150 4050 30600 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2250 29655 3825 29655 3825 29745 2250 29745 2250 29655 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2835 29610 3015 29610 3015 29790 2835 29790 2835 29610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 29610 2925 29115 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 4185 28350 3690 28350 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3015 29025 3510 29025 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 3690 29115 3510 29115 3510 28260 3690 28260 3690 29115 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3510 28800 -225 28800 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 3510 28710 3690 28710 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3600 26775 3600 28260 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 30555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 30330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 30330 2-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 1035 1575 30555 North+West\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 3915 28305 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 3060 29430 Lt\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 3735 29160 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5355 27630 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 29025 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3465 26910 G\001 --6 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 1 - -990 25695 diff --git a/katabatic/doc/images/GCellConfiguration-18.fig b/katabatic/doc/images/GCellConfiguration-18.fig deleted file mode 100644 index f3bae363..00000000 --- a/katabatic/doc/images/GCellConfiguration-18.fig +++ /dev/null @@ -1,123 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 675 3870 3375 4500 -6 675 3870 3375 4500 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 890 4090 90 90 800 4090 980 4090 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 675 3870 3375 3870 3375 4500 -4 0 0 30 -1 18 12 0.0000 4 180 930 2250 4410 G: "global"\001 -4 0 0 30 -1 18 12 0.0000 4 135 1095 1125 4140 AutoContact\001 -4 0 0 30 -1 18 12 0.0000 4 135 780 1125 4410 L: "local"\001 --6 --6 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1125 2025 90 90 1035 2025 1215 2025 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2025 2025 90 90 1935 2025 2115 2025 -1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 2025 2475 90 90 1935 2475 2115 2475 -1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 3150 2475 90 90 3060 2475 3240 2475 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2025 1350 90 90 1935 1350 2115 1350 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3150 1800 90 90 3060 1800 3240 1800 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3150 3150 90 90 3060 3150 3240 3150 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 5175 3150 90 90 5085 3150 5265 3150 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1215 2025 1935 2025 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 450 4950 450 4950 3600 1575 3600 1575 450 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3060 2475 2115 2475 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 2115 2025 2385 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 1440 2025 1935 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 1890 3150 2385 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 2565 3150 3060 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3240 3150 5085 3150 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5850 450 9900 450 9900 3600 5850 3600 5850 450 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 9225 3105 10125 3105 10125 3195 9225 3195 9225 3105 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 6930 900 7020 900 7020 1800 6930 1800 6930 900 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8055 1350 8145 1350 8145 2250 8055 2250 8055 1350 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 6975 1080 7470 1080 7470 1170 6975 1170 6975 1080 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 6975 1980 8100 1980 8100 2070 6975 2070 6975 1980 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 7380 1125 7470 1125 7470 2475 7380 2475 7380 1125 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 5625 2430 7425 2430 7425 2520 5625 2520 5625 2430 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 6930 2025 7020 2025 7020 2925 6930 2925 6930 2025 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 7380 2475 7470 2475 7470 2925 7380 2925 7380 2475 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 9180 2925 9270 2925 9270 3150 9180 3150 9180 2925 -2 2 0 2 18 7 40 -1 45 0.000 0 0 -1 0 0 5 - 7425 2880 9225 2880 9225 2970 7425 2970 7425 2880 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 7065 2925 7335 2925 -2 4 0 1 18 7 30 -1 -1 0.000 0 0 7 0 0 5 - 7650 3060 7650 2790 6750 2790 6750 3060 7650 3060 -2 1 0 1 18 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 7200 3240 7200 2925 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 675 0 10350 0 10350 4500 675 4500 675 0 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 2115 1350 2160 1350 2610 1350 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 3240 1800 3285 1800 3735 1800 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2655 900 2745 900 2745 1800 2655 1800 2655 900 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2610 1260 2790 1260 2790 1440 2610 1440 2610 1260 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 3780 1350 3870 1350 3870 2250 3780 2250 3780 1350 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3735 1710 3915 1710 3915 1890 3735 1890 3735 1710 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 1035 7515 1035 7515 1215 7335 1215 7335 1035 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6885 1935 7065 1935 7065 2115 6885 2115 6885 1935 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 2835 7515 2835 7515 3015 7335 3015 7335 2835 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 9135 2835 9315 2835 9315 3015 9135 3015 9135 2835 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 9135 3060 9315 3060 9315 3240 9135 3240 9135 3060 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 2385 7515 2385 7515 2565 7335 2565 7335 2385 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6885 1035 7065 1035 7065 1215 6885 1215 6885 1035 -4 1 12 40 -1 18 12 0.0000 4 135 255 1350 2205 G1\001 -4 1 18 40 -1 18 12 0.0000 4 135 210 2610 2655 L4\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 2385 1305 L1\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 2160 1755 L2\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 3510 1755 L5\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 3285 2205 L6\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 10035 3060 G2\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 4680 3375 G2\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 5715 2700 G1\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 7245 1035 L1\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 7605 1575 L2\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 7740 2250 L5\001 -4 1 18 40 -1 18 12 0.0000 4 135 210 8325 3150 L4\001 -4 1 18 40 -1 18 12 0.0000 4 150 315 7200 3375 gap\001 -4 1 0 30 -1 14 12 0.0000 4 120 2205 3375 270 AutoContact Structure\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 7875 225 Physical Mapping\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 2160 2340 L3\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 3285 2880 L7\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 7605 2745 L3\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 9450 3060 L7\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 6795 2340 L6\001 diff --git a/katabatic/doc/images/GCellConfiguration-19.fig b/katabatic/doc/images/GCellConfiguration-19.fig deleted file mode 100644 index 769c42c0..00000000 --- a/katabatic/doc/images/GCellConfiguration-19.fig +++ /dev/null @@ -1,119 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 675 3870 3375 4500 -6 675 3870 3375 4500 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 890 4090 90 90 800 4090 980 4090 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 675 3870 3375 3870 3375 4500 -4 0 0 30 -1 18 12 0.0000 4 180 930 2250 4410 G: "global"\001 -4 0 0 30 -1 18 12 0.0000 4 135 1095 1125 4140 AutoContact\001 -4 0 0 30 -1 18 12 0.0000 4 135 780 1125 4410 L: "local"\001 --6 --6 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1125 2025 90 90 1035 2025 1215 2025 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2025 2025 90 90 1935 2025 2115 2025 -1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 2025 2475 90 90 1935 2475 2115 2475 -1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 3150 2475 90 90 3060 2475 3240 2475 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2025 1350 90 90 1935 1350 2115 1350 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3150 1800 90 90 3060 1800 3240 1800 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3150 3150 90 90 3060 3150 3240 3150 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 5175 3150 90 90 5085 3150 5265 3150 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1215 2025 1935 2025 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 450 4950 450 4950 3600 1575 3600 1575 450 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3060 2475 2115 2475 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 2115 2025 2385 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 1440 2025 1935 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 1890 3150 2385 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 2565 3150 3060 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3240 3150 5085 3150 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5850 450 9900 450 9900 3600 5850 3600 5850 450 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 6930 900 7020 900 7020 1800 6930 1800 6930 900 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8055 1350 8145 1350 8145 2250 8055 2250 8055 1350 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 6975 1080 7470 1080 7470 1170 6975 1170 6975 1080 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 6975 1980 8100 1980 8100 2070 6975 2070 6975 1980 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 7380 1125 7470 1125 7470 2475 7380 2475 7380 1125 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 5625 2430 7425 2430 7425 2520 5625 2520 5625 2430 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 6930 2025 7020 2025 7020 2925 6930 2925 6930 2025 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 7380 2475 7470 2475 7470 2925 7380 2925 7380 2475 -2 4 0 1 18 7 30 -1 -1 0.000 0 0 7 0 0 5 - 7650 3060 7650 2790 6750 2790 6750 3060 7650 3060 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 675 0 10350 0 10350 4500 675 4500 675 0 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 2115 1350 2160 1350 2610 1350 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 3240 1800 3285 1800 3735 1800 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2655 900 2745 900 2745 1800 2655 1800 2655 900 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2610 1260 2790 1260 2790 1440 2610 1440 2610 1260 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 3780 1350 3870 1350 3870 2250 3780 2250 3780 1350 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3735 1710 3915 1710 3915 1890 3735 1890 3735 1710 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 1035 7515 1035 7515 1215 7335 1215 7335 1035 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6885 1935 7065 1935 7065 2115 6885 2115 6885 1935 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 2835 7515 2835 7515 3015 7335 3015 7335 2835 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 2385 7515 2385 7515 2565 7335 2565 7335 2385 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6885 1035 7065 1035 7065 1215 6885 1215 6885 1035 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 2385 3150 2565 -2 2 0 2 18 7 40 -1 45 0.000 0 0 -1 0 0 5 - 7425 2880 6975 2880 6975 2970 7425 2970 7425 2880 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6885 2835 7065 2835 7065 3015 6885 3015 6885 2835 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 6930 2925 7020 2925 7020 3150 6930 3150 6930 2925 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6885 3060 7065 3060 7065 3240 6885 3240 6885 3060 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 6975 3105 10125 3105 10125 3195 6975 3195 6975 3105 -4 1 12 40 -1 18 12 0.0000 4 135 255 1350 2205 G1\001 -4 1 18 40 -1 18 12 0.0000 4 135 210 2610 2655 L4\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 2385 1305 L1\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 2160 1755 L2\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 3510 1755 L5\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 3285 2205 L6\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 3285 2880 L7\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 10035 3060 G2\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 4680 3375 G2\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 5715 2700 G1\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 7245 1035 L1\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 7605 1575 L2\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 7740 2250 L5\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 6795 2250 L6\001 -4 1 0 30 -1 14 12 0.0000 4 120 2205 3375 270 AutoContact Structure\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 7875 225 Physical Mapping\001 -4 1 18 40 -1 18 12 0.0000 4 135 210 7200 2745 L4\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 6615 3105 L7\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 2160 2340 L3\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 7605 2790 L3\001 diff --git a/katabatic/doc/images/GCellConfiguration-2.fig b/katabatic/doc/images/GCellConfiguration-2.fig deleted file mode 100644 index ca0ba438..00000000 --- a/katabatic/doc/images/GCellConfiguration-2.fig +++ /dev/null @@ -1,70 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 675 3195 3375 3825 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 890 3415 90 90 800 3415 980 3415 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 675 3195 3375 3195 3375 3825 -4 0 0 30 -1 18 12 0.0000 4 180 930 2250 3735 G: "global"\001 -4 0 0 30 -1 18 12 0.0000 4 135 1095 1125 3465 AutoContact\001 -4 0 0 30 -1 18 12 0.0000 4 135 780 1125 3735 L: "local"\001 --6 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 1350 90 90 2610 1350 2790 1350 -1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 2700 2025 90 90 2610 2025 2790 2025 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1125 2025 90 90 1035 2025 1215 2025 -1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 2700 2475 90 90 2610 2475 2790 2475 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3600 2475 90 90 3510 2475 3690 2475 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2025 900 2115 900 2115 1800 2025 1800 2025 900 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1980 1260 2160 1260 2160 1440 1980 1440 1980 1260 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2160 1350 2610 1350 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 1440 2700 1935 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1215 2025 2610 2025 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5130 900 5220 900 5220 1800 5130 1800 5130 900 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 450 3150 450 3150 2925 1575 2925 1575 450 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2790 2475 3510 2475 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 2385 2700 2115 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 5625 1350 5715 1350 5715 2250 5625 2250 5625 1350 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 5175 1305 5670 1305 5670 1395 5175 1395 5175 1305 -2 2 0 2 18 7 40 -1 45 0.000 0 0 -1 0 0 5 - 6030 675 6120 675 6120 2250 6030 2250 6030 675 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 4500 2205 6075 2205 6075 2295 4500 2295 4500 2205 -2 4 0 1 18 7 30 -1 -1 0.000 0 0 7 0 0 5 - 6255 2430 6255 495 5895 495 5895 2430 6255 2430 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 6075 630 6975 630 6975 720 6075 720 6075 630 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 4725 450 6750 450 6750 2925 4725 2925 4725 450 -2 4 0 1 18 7 30 -1 -1 0.000 0 0 7 0 0 5 - 6210 2385 6210 2115 5535 2115 5535 2385 6210 2385 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 675 0 7200 0 7200 3825 675 3825 675 0 -4 1 12 40 -1 18 12 0.0000 4 135 210 2385 1305 L1\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 4590 2475 G1\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 5445 1260 L1\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 1350 2205 G1\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 2835 1755 L2\001 -4 1 0 30 -1 14 12 0.0000 4 120 2205 2340 270 AutoContact Structure\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 3375 2700 G2\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 5490 1845 L2\001 -4 1 18 40 -1 18 12 0.0000 4 135 210 2835 2340 L3\001 -4 1 12 40 -1 18 12 0.0000 4 135 255 6885 585 G2\001 -4 1 18 40 -1 18 12 0.0000 4 135 210 6390 1530 L3\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 5715 225 Physical Mapping\001 diff --git a/katabatic/doc/images/GCellConfiguration-20.fig b/katabatic/doc/images/GCellConfiguration-20.fig deleted file mode 100644 index f86dc05f..00000000 --- a/katabatic/doc/images/GCellConfiguration-20.fig +++ /dev/null @@ -1,66 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 2250 1800 90 90 2160 1800 2340 1800 -1 4 0 2 18 7 40 -1 -1 0.000 1 0.0000 3375 1800 90 90 3285 1800 3465 1800 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 450 4050 450 4050 3150 1575 3150 1575 450 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3285 1800 2340 1800 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2250 1125 2250 1710 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3375 1125 3375 1710 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3375 1890 3375 2475 -2 2 0 2 18 7 40 -1 45 0.000 0 0 -1 0 0 5 - 5850 1755 7650 1755 7650 1845 5850 1845 5850 1755 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5760 1710 5940 1710 5940 1890 5760 1890 5760 1710 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7560 1710 7740 1710 7740 1890 7560 1890 7560 1710 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 5805 900 5895 900 5895 1800 5805 1800 5805 900 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 4905 900 4995 900 4995 1800 4905 1800 4905 900 -2 2 0 2 12 7 40 -1 45 0.000 0 0 -1 0 0 5 - 7605 1800 7695 1800 7695 2700 7605 2700 7605 1800 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 4500 450 8100 450 8100 3150 4500 3150 4500 450 -2 1 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5085 1800 5670 1800 -2 1 0 1 18 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5400 720 5400 1755 -2 1 0 1 18 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6300 2700 4950 1800 -2 1 0 1 18 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6300 2700 7560 1890 -2 1 0 1 18 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6975 945 5940 1710 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 1125 0 8550 0 8550 3600 1125 3600 1125 0 -4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 -4 1 18 40 -1 18 12 0.0000 4 135 210 2835 1980 L4\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 3510 1530 L6\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 2385 1665 L3\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 3510 2205 L7\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 1935 1890 AC1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 3690 1890 AC2\001 -4 1 18 40 -1 18 12 0.0000 4 135 210 6750 2025 L4\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 6030 1620 L3\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 7830 2115 L7\001 -4 1 12 40 -1 18 12 0.0000 4 135 210 4770 1215 L6\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 6300 225 Physical Mapping\001 -4 1 18 40 -1 18 12 0.0000 4 150 315 5400 675 gap\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 6975 900 AC1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 6300 2925 AC2\001 diff --git a/katabatic/doc/images/GCellConfiguration-21.fig b/katabatic/doc/images/GCellConfiguration-21.fig deleted file mode 100644 index 4510ae6b..00000000 --- a/katabatic/doc/images/GCellConfiguration-21.fig +++ /dev/null @@ -1,92 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 0 -270 5175 3870 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 1125 90 90 3735 1125 3915 1125 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5175 0 5175 3600 0 3600 0 0 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 3150 2925 3150 2925 3600 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2610 2385 2790 2385 2790 2565 2610 2565 2610 2385 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2655 2025 2745 2025 2745 2925 2655 2925 2655 2025 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 405 675 495 675 495 1575 405 1575 405 675 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 360 1035 540 1035 540 1215 360 1215 360 1035 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 1530 1350 1620 1350 1620 2250 1530 2250 1530 1350 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1485 1710 1665 1710 1665 1890 1485 1890 1485 1710 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3060 1125 540 1125 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3060 1800 1665 1800 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3060 2475 2790 2475 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 - 3240 2565 3240 1035 3060 1035 3060 2565 3240 2565 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 3150 3825 3150 2565 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3735 1125 3240 1125 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 3825 1035 3825 -225 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1125 1575 3555 North+South\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 2-3-0-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3960 -90 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3285 3825 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 3285 2610 _southWestContact\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 3735 945 _northEastContact\001 --6 -6 5805 -270 11250 3870 -6 7515 630 9180 1620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7605 675 7695 675 7695 1575 7605 1575 7605 675 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7560 1035 7740 1035 7740 1215 7560 1215 7560 1035 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9135 1125 7740 1125 --6 -6 8640 1305 9180 2295 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8685 1710 8865 1710 8865 1890 8685 1890 8685 1710 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8730 1350 8820 1350 8820 2250 8730 2250 8730 1350 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9135 1800 8865 1800 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 9900 1125 90 90 9810 1125 9990 1125 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 6075 0 11250 0 11250 3600 6075 3600 6075 0 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 6075 3150 9675 3150 9675 3600 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 - 9315 2565 9315 1035 9135 1035 9135 2565 9315 2565 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 9225 3825 9225 2565 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9810 1125 9315 1125 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 9900 1035 9900 -225 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 9135 2475 5850 2475 -4 0 0 30 -1 18 12 0.0000 4 135 615 6120 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1665 7650 3555 North+South+West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7650 3330 3-2-0-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 10035 -90 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 9360 3825 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 9360 2610 _southWestContact\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 9810 945 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5895 2700 G\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-22.fig b/katabatic/doc/images/GCellConfiguration-22.fig deleted file mode 100644 index d9ace215..00000000 --- a/katabatic/doc/images/GCellConfiguration-22.fig +++ /dev/null @@ -1,96 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 0 -270 5445 3870 -6 1440 630 3105 1620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 1530 675 1620 675 1620 1575 1530 1575 1530 675 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1485 1035 1665 1035 1665 1215 1485 1215 1485 1035 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3060 1125 1665 1125 --6 -6 2565 1305 3105 2295 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2610 1710 2790 1710 2790 1890 2610 1890 2610 1710 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2655 1350 2745 1350 2745 2250 2655 2250 2655 1350 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3060 1800 2790 1800 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 1125 90 90 3735 1125 3915 1125 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5175 0 5175 3600 0 3600 0 0 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 3150 3600 3150 3600 3600 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 - 3240 2565 3240 1035 3060 1035 3060 2565 3240 2565 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 3150 3825 3150 2565 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3735 1125 3240 1125 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 3825 1035 3825 -225 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 5400 1125 3915 1125 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1635 1575 3555 North+South+East\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 3-2-0-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3960 -90 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3285 3825 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 3285 2610 _southWestContact\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 3735 945 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5310 1350 G\001 --6 -6 5805 -270 11520 3870 -6 7515 630 9180 1620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7605 675 7695 675 7695 1575 7605 1575 7605 675 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7560 1035 7740 1035 7740 1215 7560 1215 7560 1035 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9135 1125 7740 1125 --6 -6 8640 1305 9180 2295 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8685 1710 8865 1710 8865 1890 8685 1890 8685 1710 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8730 1350 8820 1350 8820 2250 8730 2250 8730 1350 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9135 1800 8865 1800 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 9900 1125 90 90 9810 1125 9990 1125 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 6075 0 11250 0 11250 3600 6075 3600 6075 0 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 6075 3150 10125 3150 10125 3600 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 - 9315 2565 9315 1035 9135 1035 9135 2565 9315 2565 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 9225 3825 9225 2565 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9810 1125 9315 1125 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 9900 1035 9900 -225 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 9135 2475 5850 2475 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 11475 1125 9990 1125 -4 0 0 30 -1 18 12 0.0000 4 135 615 6120 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 2175 7650 3555 North+South+West+East\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7650 3330 4-2-0-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 10035 -90 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 9360 3825 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 9360 2610 _southWestContact\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 9810 945 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5895 2700 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 11385 1350 G\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-23.fig b/katabatic/doc/images/GCellConfiguration-23.fig deleted file mode 100644 index 37cbdf0d..00000000 --- a/katabatic/doc/images/GCellConfiguration-23.fig +++ /dev/null @@ -1,91 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 1440 630 3105 1620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 1530 675 1620 675 1620 1575 1530 1575 1530 675 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1485 1035 1665 1035 1665 1215 1485 1215 1485 1035 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3060 1125 1665 1125 --6 -6 2565 1305 3105 2295 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2610 1710 2790 1710 2790 1890 2610 1890 2610 1710 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2655 1350 2745 1350 2745 2250 2655 2250 2655 1350 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3060 1800 2790 1800 --6 -6 7515 180 9180 1170 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7605 225 7695 225 7695 1125 7605 1125 7605 225 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7560 585 7740 585 7740 765 7560 765 7560 585 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9135 675 7740 675 --6 -6 8640 855 9180 1845 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8685 1260 8865 1260 8865 1440 8685 1440 8685 1260 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8730 900 8820 900 8820 1800 8730 1800 8730 900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9135 1350 8865 1350 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3150 450 90 90 3060 450 3240 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 9225 2925 90 90 9135 2925 9315 2925 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5175 0 5175 3600 0 3600 0 0 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 3150 3600 3150 3600 3600 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 3060 2475 -225 2475 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3150 540 3150 1035 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 - 3240 2565 3240 1035 3060 1035 3060 2565 3240 2565 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 3150 3825 3150 2565 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 5400 450 3240 450 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 6075 0 11250 0 11250 3600 6075 3600 6075 0 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 6075 3150 9675 3150 9675 3600 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 11475 1125 9315 1125 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 5850 2925 9135 2925 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 - 9315 2115 9315 585 9135 585 9135 2115 9315 2115 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9225 2835 9225 585 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 9225 585 9225 -225 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3150 1035 3150 2520 -4 0 0 40 -1 18 12 0.0000 4 180 1725 3285 2610 _southWestContact\001 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1575 1575 3555 South+East+West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 3-2-0-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3285 3825 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 2700 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5310 675 G\001 -4 1 0 40 -1 18 12 0.0000 4 180 1665 3150 270 _northEastContact\001 -4 0 0 30 -1 18 12 0.0000 4 135 615 6120 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1545 7650 3555 North+East+West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7650 3330 3-2-0-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 11385 1350 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5940 3105 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 9360 2970 _southWestContact\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 9810 495 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 9360 -90 G\001 diff --git a/katabatic/doc/images/GCellConfiguration-24.fig b/katabatic/doc/images/GCellConfiguration-24.fig deleted file mode 100644 index a3d425f9..00000000 --- a/katabatic/doc/images/GCellConfiguration-24.fig +++ /dev/null @@ -1,45 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 -270 -270 5175 3600 -6 1440 630 3105 1620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 1530 675 1620 675 1620 1575 1530 1575 1530 675 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1485 1035 1665 1035 1665 1215 1485 1215 1485 1035 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3060 1125 1665 1125 --6 -6 2565 1305 3105 2295 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2610 1710 2790 1710 2790 1890 2610 1890 2610 1710 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2655 1350 2745 1350 2745 2250 2655 2250 2655 1350 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3060 1800 2790 1800 --6 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5175 0 5175 3600 0 3600 0 0 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 3150 3600 3150 3600 3600 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 3060 2475 -225 2475 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 - 3240 2565 3240 1035 3060 1035 3060 2565 3240 2565 -2 1 1 2 18 7 30 -1 -1 6.000 0 0 -1 0 0 2 - 3150 -225 3150 1035 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1035 1575 3555 North+West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 2-2-0-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 2700 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3285 -90 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 3285 2925 _southWestContact\001 -4 0 0 40 -1 18 12 0.0000 4 180 1665 3285 2700 _northEastContact\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-3.fig b/katabatic/doc/images/GCellConfiguration-3.fig deleted file mode 100644 index b4e5958a..00000000 --- a/katabatic/doc/images/GCellConfiguration-3.fig +++ /dev/null @@ -1,171 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9450 2475 90 90 9360 2475 9540 2475 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9450 1800 90 90 9360 1800 9540 1800 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 7200 2025 90 90 7110 2025 7290 2025 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 8325 2475 90 90 8235 2475 8415 2475 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9450 3150 90 90 9360 3150 9540 3150 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 7200 900 90 90 7110 900 7290 900 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 8325 1350 90 90 8235 1350 8415 1350 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 8325 2025 90 90 8235 2025 8415 2025 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 7200 1575 90 90 7110 1575 7290 1575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3825 1800 90 90 3735 1800 3915 1800 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 1575 2025 90 90 1485 2025 1665 2025 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 2700 2475 90 90 2610 2475 2790 2475 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3825 3150 90 90 3735 3150 3915 3150 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 1575 900 90 90 1485 900 1665 900 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 1350 90 90 2610 1350 2790 1350 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 2700 2025 90 90 2610 2025 2790 2025 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 1575 1575 90 90 1485 1575 1665 1575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3825 2475 90 90 3735 2475 3915 2475 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 6525 1575 90 90 6435 1575 6615 1575 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 10305 2700 10395 2700 10395 3600 10305 3600 10305 2700 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 3060 10440 3060 10440 3240 10260 3240 10260 3060 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10260 3150 9540 3150 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9450 2565 9450 3060 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9450 1890 9450 2385 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9810 1800 9540 1800 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 9810 1710 9990 1710 9990 1890 9810 1890 9810 1710 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 9855 1350 9945 1350 9945 2250 9855 2250 9855 1350 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9360 2475 8415 2475 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 8325 2385 8325 2115 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 8235 2025 7290 2025 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 7200 1935 7200 1665 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7605 450 7695 450 7695 1350 7605 1350 7605 450 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7560 810 7740 810 7740 990 7560 990 7560 810 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 7560 900 7290 900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 7200 990 7200 1485 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8730 900 8820 900 8820 1800 8730 1800 8730 900 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8685 1260 8865 1260 8865 1440 8685 1440 8685 1260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 8685 1350 8415 1350 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 8325 1440 8325 1935 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 5625 225 10800 225 10800 3825 5625 3825 5625 225 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 5625 3375 8100 3375 8100 3825 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6525 2925 6525 1710 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 6525 1485 6525 0 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4680 2700 4770 2700 4770 3600 4680 3600 4680 2700 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4635 3060 4815 3060 4815 3240 4635 3240 4635 3060 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4635 3150 3915 3150 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3825 2565 3825 3060 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3825 1890 3825 2385 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4185 1800 3915 1800 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 1710 4365 1710 4365 1890 4185 1890 4185 1710 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 1350 4320 1350 4320 2250 4230 2250 4230 1350 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3735 2475 2790 2475 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2700 2385 2700 2115 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2610 2025 1665 2025 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1575 1935 1575 1665 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 1980 450 2070 450 2070 1350 1980 1350 1980 450 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1935 810 2115 810 2115 990 1935 990 1935 810 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1935 900 1665 900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1575 990 1575 1485 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 3105 900 3195 900 3195 1800 3105 1800 3105 900 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 1260 3240 1260 3240 1440 3060 1440 3060 1260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3060 1350 2790 1350 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2700 1440 2700 1935 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 225 5175 225 5175 3825 0 3825 0 225 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 1575 2925 1575 2160 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 3375 2475 3375 2475 3825 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 1935 2700 2115 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1575 1485 1575 1665 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 1485 1575 -225 1575 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3825 2385 3825 2565 -2 1 0 2 0 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 6615 1575 7110 1575 -4 0 0 30 -1 18 12 0.0000 4 135 615 5670 3780 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 5670 3555 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 495 7200 3780 North\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7200 3555 1-4-0-0\001 -4 1 0 40 -1 18 12 0.0000 4 180 1725 6525 3150 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 6615 135 G\001 -4 1 0 40 -1 18 12 0.0000 4 180 1725 1620 3150 _southWestContact\001 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 3780 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3555 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 435 1575 3780 West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3555 1-4-0-0\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 4275 3105 Lt\001 -4 1 12 40 -1 18 12 0.0000 4 135 285 4050 1665 Lct\001 -4 1 12 40 -1 18 12 0.0000 4 135 285 2925 1215 Lct\001 -4 1 12 40 -1 18 12 0.0000 4 135 285 1755 765 Lct\001 -4 1 0 40 -1 18 12 0.0000 4 135 105 3240 2655 L\001 -4 1 12 40 -1 18 12 0.0000 4 135 105 3915 2205 L\001 -4 1 12 40 -1 18 12 0.0000 4 135 105 3915 2880 L\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 2835 2340 Lc\001 -4 1 0 40 -1 18 12 0.0000 4 135 105 2115 2205 L\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 1710 1890 Lc\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 9945 3105 Lt\001 -4 1 12 40 -1 18 12 0.0000 4 135 285 9675 1710 Lct\001 -4 1 12 40 -1 18 12 0.0000 4 135 285 8550 1260 Lct\001 -4 1 12 40 -1 18 12 0.0000 4 135 285 7425 810 Lct\001 -4 1 12 40 -1 18 12 0.0000 4 135 105 9540 2880 L\001 -4 1 12 40 -1 18 12 0.0000 4 135 105 9540 2205 L\001 -4 1 0 40 -1 18 12 0.0000 4 135 105 8865 2655 L\001 -4 1 0 40 -1 18 12 0.0000 4 135 105 7740 2205 L\001 -4 1 0 40 -1 18 12 0.0000 4 135 105 6840 2205 L\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 8460 2340 Lc\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 7335 1890 Lc\001 -4 1 12 40 -1 18 12 0.0000 4 135 105 2790 1755 L\001 -4 1 12 40 -1 18 12 0.0000 4 135 105 1665 1305 L\001 -4 1 12 40 -1 18 12 0.0000 4 135 105 8415 1755 L\001 -4 1 12 40 -1 18 12 0.0000 4 135 105 7290 1305 L\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 1800 G\001 diff --git a/katabatic/doc/images/GCellConfiguration-30.fig b/katabatic/doc/images/GCellConfiguration-30.fig deleted file mode 100644 index 79c79d7c..00000000 --- a/katabatic/doc/images/GCellConfiguration-30.fig +++ /dev/null @@ -1,128 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 -270 0 6570 3600 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 1575 90 90 2070 1575 2250 1575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 900 90 90 2070 900 2250 900 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 895 90 90 3430 895 3610 895 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 1350 90 90 3420 1350 3600 1350 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1353 1578 183 183 1170 1578 1536 1578 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4953 1350 183 183 4770 1350 5136 1350 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4950 450 90 90 4860 450 5040 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1350 450 90 90 1260 450 1440 450 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 3150 2700 3150 2700 3600 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 6300 0 6300 3600 0 3600 0 0 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - -225 450 1260 450 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 5040 450 6525 450 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 1620 900 1530 1800 1530 1800 1620 900 1620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 945 2475 855 3150 855 3150 945 2475 945 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 1485 1890 1485 1890 1665 1710 1665 1710 1485 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 810 2565 810 2565 990 2385 990 2385 810 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 810 3240 810 3240 990 3060 990 3060 810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 1395 4275 1305 5400 1305 5400 1395 4275 1395 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 1260 4365 1260 4365 1440 4185 1440 4185 1260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 1575 2070 1575 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 990 2160 1485 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 900 2385 900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 900 3420 900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 990 3510 1260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 1350 4185 1350 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1350 1395 1350 540 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4950 1170 4950 540 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 945 1575 3555 East+West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 2-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 675 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 6435 675 G\001 -4 1 0 40 -1 18 12 0.0000 4 180 765 4860 1755 _rightRP\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 1485 1035 L1\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 5085 945 L2\001 -4 1 0 40 -1 18 12 0.0000 4 180 660 1350 1935 _leftRP\001 -4 1 0 40 -1 18 12 0.0000 4 180 1725 1350 270 _southWestContact\001 -4 1 0 40 -1 18 12 0.0000 4 180 1665 4950 270 _northEastContact\001 --6 -6 7200 -270 13500 3870 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 1575 90 90 9270 1575 9450 1575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 900 90 90 9270 900 9450 900 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 895 90 90 10630 895 10810 895 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 1350 90 90 10620 1350 10800 1350 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 10350 1800 90 90 10260 1800 10440 1800 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12825 900 90 90 12735 900 12915 900 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 7200 3150 10125 3150 10125 3600 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 7200 0 13500 0 13500 3600 7200 3600 7200 0 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 12825 810 12825 -225 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 10350 3825 10350 1890 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8100 1620 8100 1530 9000 1530 9000 1620 8100 1620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 9675 945 9675 855 10350 855 10350 945 9675 945 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 1485 9090 1485 9090 1665 8910 1665 8910 1485 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 9585 810 9765 810 9765 990 9585 990 9585 810 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 810 10440 810 10440 990 10260 990 10260 810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 11475 1395 11475 1305 12600 1305 12600 1395 11475 1395 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 11385 1260 11565 1260 11565 1440 11385 1440 11385 1260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9090 1575 9270 1575 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9360 990 9360 1485 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9450 900 9585 900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10440 900 10620 900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10710 990 10710 1260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10800 1350 11385 1350 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 12735 900 12105 900 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 11925 1800 10440 1800 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 12105 1890 11925 1890 11925 810 12105 810 12105 1890 -4 0 0 30 -1 18 12 0.0000 4 135 615 7245 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1125 8775 3555 North+South\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 8775 3330 2-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 12960 -45 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 10485 3825 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 12465 1080 L2\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 11160 1980 L1\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 12735 675 _northEastContact\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 12240 1845 biggestRP\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 10170 1890 _southWestContact\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-31.fig b/katabatic/doc/images/GCellConfiguration-31.fig deleted file mode 100644 index ccb44fc4..00000000 --- a/katabatic/doc/images/GCellConfiguration-31.fig +++ /dev/null @@ -1,133 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 6930 4230 13770 8100 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 6120 90 90 9270 6120 9450 6120 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 5445 90 90 9270 5445 9450 5445 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 5440 90 90 10630 5440 10810 5440 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 5895 90 90 10620 5895 10800 5895 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12015 4950 90 90 11925 4950 12105 4950 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12015 7200 90 90 11925 7200 12105 7200 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 7200 7650 10800 7650 10800 8100 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 7200 4500 13500 4500 13500 8100 7200 8100 7200 4500 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 11925 7200 6975 7200 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8100 6165 8100 6075 9000 6075 9000 6165 8100 6165 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 9675 5490 9675 5400 10350 5400 10350 5490 9675 5490 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 6030 9090 6030 9090 6210 8910 6210 8910 6030 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 9585 5355 9765 5355 9765 5535 9585 5535 9585 5355 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 5355 10440 5355 10440 5535 10260 5535 10260 5355 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 11475 5940 11475 5850 12600 5850 12600 5940 11475 5940 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 11385 5805 11565 5805 11565 5985 11385 5985 11385 5805 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9090 6120 9270 6120 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9360 5535 9360 6030 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9450 5445 9585 5445 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10440 5445 10620 5445 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10710 5535 10710 5805 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10800 5895 11385 5895 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 12015 5040 12015 5355 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 12105 4950 13725 4950 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 12015 6435 12015 7110 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 12015 4860 12015 4275 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 12105 6435 11925 6435 11925 5355 12105 5355 12105 6435 -4 0 0 30 -1 18 12 0.0000 4 135 615 7245 8055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 7830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 8775 7830 3-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 7065 7425 G\001 -4 0 0 30 -1 18 12 0.0000 4 135 1575 8775 8055 South+East+West\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 12240 6390 biggestRP\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 11925 5265 _northEastContact\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 12150 5265 L2\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 13635 5175 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 12150 6840 L1\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 12150 4410 G\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 11835 7110 _southWestContact\001 --6 -6 -270 4500 6570 8370 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 6120 90 90 2070 6120 2250 6120 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 5445 90 90 2070 5445 2250 5445 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 5440 90 90 3430 5440 3610 5440 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 5895 90 90 3420 5895 3600 5895 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 4950 90 90 4725 4950 4905 4950 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 7200 90 90 4725 7200 4905 7200 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 7650 3600 7650 3600 8100 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 4500 6300 4500 6300 8100 0 8100 0 4500 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4725 7200 -225 7200 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 6165 900 6075 1800 6075 1800 6165 900 6165 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 5490 2475 5400 3150 5400 3150 5490 2475 5490 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 6030 1890 6030 1890 6210 1710 6210 1710 6030 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 5355 2565 5355 2565 5535 2385 5535 2385 5355 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 5355 3240 5355 3240 5535 3060 5535 3060 5355 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 5940 4275 5850 5400 5850 5400 5940 4275 5940 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 5805 4365 5805 4365 5985 4185 5985 4185 5805 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 6120 2070 6120 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 5535 2160 6030 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 5445 2385 5445 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 5445 3420 5445 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 5535 3510 5805 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 5895 4185 5895 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 5040 4815 5355 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4905 4950 6525 4950 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4815 8325 4815 7290 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 6435 4815 7110 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 4905 6435 4725 6435 4725 5355 4905 5355 4905 6435 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 8055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 7830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 7830 3-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 7425 G\001 -4 0 0 30 -1 18 12 0.0000 4 135 1575 1575 8055 South+East+West\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 5040 6390 biggestRP\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 4725 5265 _northEastContact\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4950 5265 L2\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 6435 5175 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 4950 8325 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4950 6840 L1\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 4680 7110 _southWestContact\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-32.fig b/katabatic/doc/images/GCellConfiguration-32.fig deleted file mode 100644 index 20ac81a3..00000000 --- a/katabatic/doc/images/GCellConfiguration-32.fig +++ /dev/null @@ -1,133 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 0 8730 6570 12870 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 10575 90 90 2070 10575 2250 10575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 9900 90 90 2070 9900 2250 9900 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 9895 90 90 3430 9895 3610 9895 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 10350 90 90 3420 10350 3600 10350 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 10800 90 90 3735 10800 3915 10800 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 9450 90 90 4725 9450 4905 9450 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 12150 3600 12150 3600 12600 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 9000 6300 9000 6300 12600 0 12600 0 9000 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3825 12825 3825 10890 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 10620 900 10530 1800 10530 1800 10620 900 10620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 9945 2475 9855 3150 9855 3150 9945 2475 9945 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 10485 1890 10485 1890 10665 1710 10665 1710 10485 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 9810 2565 9810 2565 9990 2385 9990 2385 9810 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 9810 3240 9810 3240 9990 3060 9990 3060 9810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 10395 4275 10305 5400 10305 5400 10395 4275 10395 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 10260 4365 10260 4365 10440 4185 10440 4185 10260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 10575 2070 10575 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 9990 2160 10485 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 9900 2385 9900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 9900 3420 9900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 9990 3510 10260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 10350 4185 10350 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4725 10800 3915 10800 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4815 9360 4815 8775 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4905 9450 6525 9450 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 9540 4815 9810 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 4905 10890 4725 10890 4725 9810 4905 9810 4905 10890 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 12555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 12330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1635 1575 12555 North+South+East\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 12330 3-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3690 12825 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 5040 10845 biggestRP\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4320 11025 L1\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 4590 9450 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 6435 9675 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4995 9720 L2\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 4950 8910 G\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 3645 10890 _southWestContact\001 --6 -6 6930 8730 13500 12870 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 10575 90 90 9270 10575 9450 10575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 9900 90 90 9270 9900 9450 9900 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 9895 90 90 10630 9895 10810 9895 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 10350 90 90 10620 10350 10800 10350 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12825 9900 90 90 12735 9900 12915 9900 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12015 11700 90 90 11925 11700 12105 11700 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 7200 12150 10800 12150 10800 12600 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 7200 9000 13500 9000 13500 12600 7200 12600 7200 9000 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 6975 11700 11925 11700 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 12825 9810 12825 8775 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8100 10620 8100 10530 9000 10530 9000 10620 8100 10620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 9675 9945 9675 9855 10350 9855 10350 9945 9675 9945 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 10485 9090 10485 9090 10665 8910 10665 8910 10485 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 9585 9810 9765 9810 9765 9990 9585 9990 9585 9810 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 9810 10440 9810 10440 9990 10260 9990 10260 9810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 11475 10395 11475 10305 12600 10305 12600 10395 11475 10395 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 11385 10260 11565 10260 11565 10440 11385 10440 11385 10260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9090 10575 9270 10575 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9360 9990 9360 10485 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9450 9900 9585 9900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10440 9900 10620 9900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10710 9990 10710 10260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10800 10350 11385 10350 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 12735 9900 12105 9900 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 12015 12825 12015 11790 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 12015 10890 12015 11610 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 12105 10890 11925 10890 11925 9810 12105 9810 12105 10890 -4 0 0 30 -1 18 12 0.0000 4 135 615 7245 12555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 12330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1665 8775 12555 North+South+West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 8775 12330 3-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 12960 8955 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 7065 11925 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 12465 10080 L2\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 12735 9675 _northEastContact\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 12240 10845 biggestRP\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 11925 12825 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 11880 11295 L1\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 11880 11610 _southWestContact\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-33.fig b/katabatic/doc/images/GCellConfiguration-33.fig deleted file mode 100644 index 37ea4802..00000000 --- a/katabatic/doc/images/GCellConfiguration-33.fig +++ /dev/null @@ -1,74 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 -270 13230 6570 17370 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 15075 90 90 2070 15075 2250 15075 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 14400 90 90 2070 14400 2250 14400 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 14395 90 90 3430 14395 3610 14395 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 14850 90 90 3420 14850 3600 14850 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 16200 90 90 4725 16200 4905 16200 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 13950 90 90 4725 13950 4905 13950 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 16650 3780 16650 3780 17100 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 13500 6300 13500 6300 17100 0 17100 0 13500 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 15120 900 15030 1800 15030 1800 15120 900 15120 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 14445 2475 14355 3150 14355 3150 14445 2475 14445 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 14985 1890 14985 1890 15165 1710 15165 1710 14985 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 14310 2565 14310 2565 14490 2385 14490 2385 14310 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 14310 3240 14310 3240 14490 3060 14490 3060 14310 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 14895 4275 14805 5400 14805 5400 14895 4275 14895 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 14760 4365 14760 4365 14940 4185 14940 4185 14760 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 15075 2070 15075 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 14490 2160 14985 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 14400 2385 14400 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 14400 3420 14400 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 14490 3510 14760 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 14850 4185 14850 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 15390 4815 16110 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4815 17325 4815 16290 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - -225 16200 4725 16200 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4905 13950 6525 13950 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4815 13860 4815 13275 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 14040 4815 14310 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 4905 15390 4725 15390 4725 14310 4905 14310 4905 15390 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 17055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 16830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 2175 1575 17055 North+South+East+West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 16830 4-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 16425 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 5040 15345 biggestRP\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4680 15840 L1\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 4725 17325 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 6435 14175 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 4950 13410 G\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 4635 13995 _northEastContact\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4995 14265 L2\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 4680 16110 _southWestContact\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-34.fig b/katabatic/doc/images/GCellConfiguration-34.fig deleted file mode 100644 index 5b2aac4b..00000000 --- a/katabatic/doc/images/GCellConfiguration-34.fig +++ /dev/null @@ -1,67 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 -270 18000 6300 21870 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 19575 90 90 2070 19575 2250 19575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 18900 90 90 2070 18900 2250 18900 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 18895 90 90 3430 18895 3610 18895 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 19350 90 90 3420 19350 3600 19350 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 20250 90 90 4725 20250 4905 20250 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 18000 6300 18000 6300 21600 0 21600 0 18000 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 19620 900 19530 1800 19530 1800 19620 900 19620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 18945 2475 18855 3150 18855 3150 18945 2475 18945 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 19485 1890 19485 1890 19665 1710 19665 1710 19485 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 18810 2565 18810 2565 18990 2385 18990 2385 18810 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 18810 3240 18810 3240 18990 3060 18990 3060 18810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 19395 4275 19305 5400 19305 5400 19395 4275 19395 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 19260 4365 19260 4365 19440 4185 19440 4185 19260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 19575 2070 19575 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 18990 2160 19485 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 18900 2385 18900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 18900 3420 18900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 18990 3510 19260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 19350 4185 19350 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - -225 20700 5535 20700 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 19530 4815 20160 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 4905 19530 4725 19530 4725 19170 4905 19170 4905 19530 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4905 20250 5535 20250 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 5715 20790 5535 20790 5535 20160 5715 20160 5715 20790 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 5625 21825 5625 20790 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 21150 3780 21150 3780 21600 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 21555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 21330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1065 1575 21555 South+West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 21330 2-0-3-0\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 5040 19620 biggestRP\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5535 21825 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -180 20880 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 465 4545 19890 L1-tc\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 5490 20565 _southWestContact\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-35.fig b/katabatic/doc/images/GCellConfiguration-35.fig deleted file mode 100644 index c30ff532..00000000 --- a/katabatic/doc/images/GCellConfiguration-35.fig +++ /dev/null @@ -1,111 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 0 22500 6570 26100 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 24075 90 90 2070 24075 2250 24075 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 23400 90 90 2070 23400 2250 23400 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 23395 90 90 3430 23395 3610 23395 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 23850 90 90 3420 23850 3600 23850 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 24750 90 90 4725 24750 4905 24750 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 22500 6300 22500 6300 26100 0 26100 0 22500 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 24120 900 24030 1800 24030 1800 24120 900 24120 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 23445 2475 23355 3150 23355 3150 23445 2475 23445 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 23985 1890 23985 1890 24165 1710 24165 1710 23985 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 23310 2565 23310 2565 23490 2385 23490 2385 23310 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 23310 3240 23310 3240 23490 3060 23490 3060 23310 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 23895 4275 23805 5400 23805 5400 23895 4275 23895 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 23760 4365 23760 4365 23940 4185 23940 4185 23760 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 24075 2070 24075 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 23490 2160 23985 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 23400 2385 23400 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 23400 3420 23400 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 23490 3510 23760 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 23850 4185 23850 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 24030 4815 24660 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 4905 24030 4725 24030 4725 23670 4905 23670 4905 24030 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 25650 3780 25650 3780 26100 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4905 24750 6525 24750 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 26055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 25830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 405 1575 26055 East\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 25830 1-0-3-0\001 -4 0 0 40 -1 18 12 0.0000 4 180 660 5040 24120 rightRP\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4680 24390 L1\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 4635 24660 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 6480 24930 G\001 --6 -6 6930 22500 13500 26100 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 24075 90 90 9270 24075 9450 24075 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 23400 90 90 9270 23400 9450 23400 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 23395 90 90 10630 23395 10810 23395 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 23850 90 90 10620 23850 10800 23850 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 8550 24750 90 90 8460 24750 8640 24750 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 7200 22500 13500 22500 13500 26100 7200 26100 7200 22500 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8100 24120 8100 24030 9000 24030 9000 24120 8100 24120 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 9675 23445 9675 23355 10350 23355 10350 23445 9675 23445 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 23985 9090 23985 9090 24165 8910 24165 8910 23985 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 9585 23310 9765 23310 9765 23490 9585 23490 9585 23310 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 23310 10440 23310 10440 23490 10260 23490 10260 23310 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 11475 23895 11475 23805 12600 23805 12600 23895 11475 23895 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 11385 23760 11565 23760 11565 23940 11385 23940 11385 23760 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9090 24075 9270 24075 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9360 23490 9360 23985 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9450 23400 9585 23400 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10440 23400 10620 23400 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10710 23490 10710 23760 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10800 23850 11385 23850 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 7200 25650 10980 25650 10980 26100 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 8640 24255 8460 24255 8460 23895 8640 23895 8640 24255 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 8550 24255 8550 24660 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 6975 24750 8460 24750 -4 0 0 30 -1 18 12 0.0000 4 135 615 7245 26055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 25830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 435 8775 26055 West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 8775 25830 1-0-3-0\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 8415 24525 L1\001 -4 2 0 40 -1 18 12 0.0000 4 135 555 8325 23940 leftRP\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 8685 24795 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 7020 24930 G\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-36.fig b/katabatic/doc/images/GCellConfiguration-36.fig deleted file mode 100644 index 43e883bc..00000000 --- a/katabatic/doc/images/GCellConfiguration-36.fig +++ /dev/null @@ -1,64 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 0 26775 6300 30645 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 28350 90 90 2070 28350 2250 28350 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 27675 90 90 2070 27675 2250 27675 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 27670 90 90 3430 27670 3610 27670 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 28125 90 90 3420 28125 3600 28125 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 29025 90 90 4725 29025 4905 29025 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 26775 6300 26775 6300 30375 0 30375 0 26775 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 28395 900 28305 1800 28305 1800 28395 900 28395 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 27720 2475 27630 3150 27630 3150 27720 2475 27720 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 28260 1890 28260 1890 28440 1710 28440 1710 28260 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 27585 2565 27585 2565 27765 2385 27765 2385 27585 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 27585 3240 27585 3240 27765 3060 27765 3060 27585 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 28170 4275 28080 5400 28080 5400 28170 4275 28170 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 28035 4365 28035 4365 28215 4185 28215 4185 28035 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 28350 2070 28350 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 27765 2160 28260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 27675 2385 27675 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 27675 3420 27675 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 27765 3510 28035 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 28125 4185 28125 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 28305 4815 28935 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 4905 28305 4725 28305 4725 27945 4905 27945 4905 28305 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4905 29025 5535 29025 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 5625 30600 5625 29115 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 29925 3780 29925 3780 30375 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 5715 29115 5535 29115 5535 28935 5715 28935 5715 29115 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 30330 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 30105 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 525 1575 30330 South\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 30105 1-0-3-0\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 5040 28395 biggestRP\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5535 30600 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 465 4545 28665 L1-tc\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 5490 29340 _southWestContact\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-4.fig b/katabatic/doc/images/GCellConfiguration-4.fig deleted file mode 100644 index 1bd6fbe1..00000000 --- a/katabatic/doc/images/GCellConfiguration-4.fig +++ /dev/null @@ -1,86 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 10215 2430 10485 3420 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 10305 2475 10395 2475 10395 3375 10305 3375 10305 2475 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 2835 10440 2835 10440 3015 10260 3015 10260 2835 --6 -6 9315 1755 9585 2745 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 9360 2160 9540 2160 9540 2340 9360 2340 9360 2160 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 9405 1800 9495 1800 9495 2700 9405 2700 9405 1800 --6 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2697 1574 183 183 2514 1573 2880 1575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2790 2250 90 90 2700 2250 2880 2250 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2610 2925 90 90 2520 2925 2700 2925 -1 4 0 2 0 7 40 -1 -1 6.000 1 0.0000 2700 900 90 90 2610 900 2790 900 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 8328 2026 183 183 8145 2025 8511 2027 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 5625 225 10800 225 10800 3825 5625 3825 5625 225 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 5625 3375 8325 3375 8325 3825 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 225 5175 225 5175 3825 0 3825 0 225 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 3375 2700 3375 2700 3825 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2610 1755 2610 2835 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2790 1755 2790 2160 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3735 2250 2880 2250 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4680 2475 4770 2475 4770 3375 4680 3375 4680 2475 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4635 2835 4815 2835 4815 3015 4635 3015 4635 2835 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4635 2925 2700 2925 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3735 2160 3915 2160 3915 2340 3735 2340 3735 2160 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 3780 1800 3870 1800 3870 2700 3780 2700 3780 1800 -2 1 0 2 18 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 2520 1575 -225 1575 -2 1 0 2 0 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 2700 990 2700 1395 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 1350 2295 2520 1665 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 8325 1845 8325 0 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 5400 900 2790 900 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 4 - 9360 2250 9225 2250 8775 1935 8505 1935 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 4 - 10260 2925 9225 2925 8775 2115 8505 2115 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 8100 2025 5400 2025 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 7200 2745 8190 2115 -4 0 0 30 -1 18 12 0.0000 4 135 615 5670 3780 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 5670 3555 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1035 7200 3780 West+North\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7200 3555 2-2-0-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 3780 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3555 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 945 1575 3780 West+East\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3555 2-2-0-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 1755 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5310 1080 G\001 -4 1 0 30 -1 18 10 0.0000 4 150 1620 855 1530 _hasSourceWire=true\001 -4 1 0 40 -1 18 12 0.0000 4 180 1335 2700 720 _targetContact\001 -4 1 0 40 -1 18 12 0.0000 4 135 1110 1350 2475 subContact1\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 8460 135 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5490 2205 G\001 -4 1 0 40 -1 18 12 0.0000 4 180 1335 7245 2925 _targetContact\001 diff --git a/katabatic/doc/images/GCellConfiguration-40.fig b/katabatic/doc/images/GCellConfiguration-40.fig deleted file mode 100644 index bf5e41fa..00000000 --- a/katabatic/doc/images/GCellConfiguration-40.fig +++ /dev/null @@ -1,81 +0,0 @@ -#FIG 3.2 -Portrait -Center -Metric -A4 -55.00 -Single --2 -1200 2 -6 4140 5355 4410 6345 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 5760 4365 5760 4365 5940 4185 5940 4185 5760 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 5400 4320 5400 4320 6300 4230 6300 4230 5400 --6 -6 10215 5355 10485 6345 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 5760 10440 5760 10440 5940 10260 5940 10260 5760 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 10305 5400 10395 5400 10395 6300 10305 6300 10305 5400 --6 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3600 5850 90 90 3510 5850 3690 5850 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 4500 5175 4500 5175 8100 0 8100 0 4500 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 7650 3375 7650 3375 8100 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 2835 6525 -225 6525 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 4185 5850 3690 5850 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3600 5940 3600 6435 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2250 7155 3825 7155 3825 7245 2250 7245 2250 7155 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2835 7110 3015 7110 3015 7290 2835 7290 2835 7110 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 7110 2925 6615 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 3735 6615 2835 6615 2835 6435 3735 6435 3735 6615 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 9675 6615 9675 8325 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 6075 4500 11250 4500 11250 8100 6075 8100 6075 4500 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 6075 7650 9450 7650 9450 8100 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 10260 5850 9765 5850 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8325 7155 9900 7155 9900 7245 8325 7245 8325 7155 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 7110 9090 7110 9090 7290 8910 7290 8910 7110 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 9000 7110 9000 6615 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 9765 5760 9585 5760 9585 6615 9765 6615 9765 5760 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 9090 6435 8910 6435 8910 6615 9090 6615 9090 6435 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 9585 6525 9090 6525 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 3285 6435 3285 6615 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 9585 6210 9765 6210 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 8055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 7830 Configuration:\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 6480 G\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 7830 1-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 435 1575 8055 West\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 3915 5805 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 3060 6930 Lt\001 -4 0 12 40 -1 18 12 0.0000 4 135 180 3645 6255 Lt\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 2745 6435 _southWestContact\001 -4 0 0 30 -1 18 12 0.0000 4 135 615 6120 8055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 7830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7650 7830 1-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 525 7650 8055 South\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 9990 5805 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 9135 6930 Lt\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 9810 8280 G\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 9495 5850 _southWestContact\001 diff --git a/katabatic/doc/images/GCellConfiguration-41.fig b/katabatic/doc/images/GCellConfiguration-41.fig deleted file mode 100644 index c3a293ba..00000000 --- a/katabatic/doc/images/GCellConfiguration-41.fig +++ /dev/null @@ -1,98 +0,0 @@ -#FIG 3.2 -Portrait -Center -Metric -A4 -55.00 -Single --2 -1200 2 -6 -270 9000 5490 12600 -6 4140 9855 4410 10845 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 10260 4365 10260 4365 10440 4185 10440 4185 10260 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 9900 4320 9900 4320 10800 4230 10800 4230 9900 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 9720 90 90 2835 9720 3015 9720 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3590 10345 90 90 3500 10345 3680 10345 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 9000 5175 9000 5175 12600 0 12600 0 9000 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 12150 3375 12150 3375 12600 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 2835 11025 -225 11025 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2250 11655 3825 11655 3825 11745 2250 11745 2250 11655 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2835 11610 3015 11610 3015 11790 2835 11790 2835 11610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 11610 2925 11115 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 5445 9720 3015 9720 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 2925 9810 2925 10935 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 4185 10350 3690 10350 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3600 10440 3600 10935 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 3690 11115 2835 11115 2835 10935 3690 10935 3690 11115 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 3285 10935 3285 11115 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 12555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 12330 Configuration:\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 10980 G\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 12330 2-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 945 1575 12555 West+East\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 3915 10305 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 3060 11430 Lt\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 2745 10935 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5355 9675 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1665 2925 9540 _northEastContact\001 -4 0 12 40 -1 18 12 0.0000 4 135 180 3645 10755 Lt\001 --6 -6 6075 8730 11565 12870 -6 10215 9855 10485 10845 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 10260 10440 10260 10440 10440 10260 10440 10260 10260 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 10305 9900 10395 9900 10395 10800 10305 10800 10305 9900 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 8100 10350 90 90 8010 10350 8190 10350 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 9000 11025 90 90 8910 11025 9090 11025 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 6075 9000 11250 9000 11250 12600 6075 12600 6075 9000 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 6075 12150 9450 12150 9450 12600 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8325 11655 9900 11655 9900 11745 8325 11745 8325 11655 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 11610 9090 11610 9090 11790 8910 11790 8910 11610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 9000 11610 9000 11115 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 8190 10350 9585 10350 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 10260 10350 9765 10350 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 9675 11115 9675 12825 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 8100 8775 8100 10260 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 9090 11025 9585 11025 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 9765 11115 9585 11115 9585 10260 9765 10260 9765 11115 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 9585 10710 9765 10710 -4 0 0 30 -1 18 12 0.0000 4 135 615 6120 12555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 12330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7650 12330 2-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 1125 7650 12555 North+South\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 9990 10305 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 9135 11430 Lt\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 7965 10215 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 7965 8910 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 9585 12825 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 9810 11160 _southWestContact\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-42.fig b/katabatic/doc/images/GCellConfiguration-42.fig deleted file mode 100644 index 7b1ddad1..00000000 --- a/katabatic/doc/images/GCellConfiguration-42.fig +++ /dev/null @@ -1,104 +0,0 @@ -#FIG 3.2 -Portrait -Center -Metric -A4 -55.00 -Single --2 -1200 2 -6 -270 13230 5490 17370 -6 4140 14355 4410 15345 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 14760 4365 14760 4365 14940 4185 14940 4185 14760 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 14400 4320 14400 4320 15300 4230 15300 4230 14400 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2025 14850 90 90 1935 14850 2115 14850 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 15525 90 90 2835 15525 3015 15525 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 13500 5175 13500 5175 17100 0 17100 0 13500 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 16650 3375 16650 3375 17100 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2250 16155 3825 16155 3825 16245 2250 16245 2250 16155 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2835 16110 3015 16110 3015 16290 2835 16290 2835 16110 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 16110 2925 15615 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 2115 14850 3510 14850 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 4185 14850 3690 14850 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3600 15615 3600 17325 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 2025 13275 2025 14760 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3015 15525 3510 15525 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 3690 15615 3510 15615 3510 14760 3690 14760 3690 15615 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3510 15300 -225 15300 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 3510 15255 3690 15255 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 17055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 16830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 16830 3-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 1665 1575 17055 North+South+West\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 3915 14805 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 3060 15930 Lt\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 1890 14715 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 1890 13410 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3510 17325 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 3735 15660 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -180 15255 G\001 --6 -6 6075 13230 11565 17370 -6 10215 14355 10485 15345 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 14760 10440 14760 10440 14940 10260 14940 10260 14760 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 10305 14400 10395 14400 10395 15300 10305 15300 10305 14400 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 9000 15525 90 90 8910 15525 9090 15525 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 6075 13500 11250 13500 11250 17100 6075 17100 6075 13500 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 6075 16650 9450 16650 9450 17100 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8325 16155 9900 16155 9900 16245 8325 16245 8325 16155 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 16110 9090 16110 9090 16290 8910 16290 8910 16110 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 9000 16110 9000 15615 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 8190 14850 9585 14850 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 10260 14850 9765 14850 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 9675 15615 9675 17325 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 8100 13275 8100 14085 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 9090 15525 9585 15525 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 9765 15615 9585 15615 9585 14760 9765 14760 9765 15615 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 11475 14175 8190 14175 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 8190 14940 8010 14940 8010 14085 8190 14085 8190 14940 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 9585 15210 9765 15210 -4 0 0 30 -1 18 12 0.0000 4 135 615 6120 17055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 16830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7650 16830 3-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 1635 7650 17055 North+South+East\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 9990 14805 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 9135 15930 Lt\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 7965 14715 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 7965 13410 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 9585 17325 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 9810 15660 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 11430 14130 G\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-43.fig b/katabatic/doc/images/GCellConfiguration-43.fig deleted file mode 100644 index 0ae754e1..00000000 --- a/katabatic/doc/images/GCellConfiguration-43.fig +++ /dev/null @@ -1,104 +0,0 @@ -#FIG 3.2 -Portrait -Center -Metric -A4 -55.00 -Single --2 -1200 2 -6 -270 17730 5445 21600 -6 4140 18405 4410 19395 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 18810 4365 18810 4365 18990 4185 18990 4185 18810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 18450 4320 18450 4320 19350 4230 19350 4230 18450 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 19575 90 90 2835 19575 3015 19575 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 3600 20700 90 90 3510 20700 3690 20700 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 18000 5175 18000 5175 21600 0 21600 0 18000 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 21150 3375 21150 3375 21600 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3600 17775 3600 18810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2250 20205 3825 20205 3825 20295 2250 20295 2250 20205 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2835 20160 3015 20160 3015 20340 2835 20340 2835 20160 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 20160 2925 19665 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 4185 18900 3690 18900 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3015 19575 3510 19575 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 3690 19665 3510 19665 3510 18810 3690 18810 3690 19665 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 5400 19575 3690 19575 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3600 19665 3600 20610 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - -225 20700 3510 20700 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 3510 19260 3690 19260 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 21555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 21330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 21330 3-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 1545 1575 21555 North+East+West\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3510 17910 G\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 3915 18855 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 3060 19980 Lt\001 -4 0 0 40 -1 18 12 0.0000 4 180 1665 3780 19800 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5310 19530 G\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 3420 20610 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -180 20655 G\001 --6 -6 5805 18000 11565 21870 -6 10215 18855 10485 19845 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 19260 10440 19260 10440 19440 10260 19440 10260 19260 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 10305 18900 10395 18900 10395 19800 10305 19800 10305 18900 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 9000 20025 90 90 8910 20025 9090 20025 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 6075 18000 11250 18000 11250 21600 6075 21600 6075 18000 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 6075 21150 9450 21150 9450 21600 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8325 20655 9900 20655 9900 20745 8325 20745 8325 20655 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 20610 9090 20610 9090 20790 8910 20790 8910 20610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 9000 20610 9000 20115 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 10260 19350 9765 19350 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 9675 20115 9675 21825 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 9090 20025 9585 20025 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 9765 20115 9585 20115 9585 19260 9765 19260 9765 20115 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 9585 19800 5850 19800 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 9765 18540 9585 18540 9585 18360 9765 18360 9765 18540 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 9675 18540 9675 19260 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 11475 18450 9765 18450 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 9585 19710 9765 19710 -4 0 0 30 -1 18 12 0.0000 4 135 615 6120 21555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 6120 21330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7650 21330 3-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 1575 7650 21555 South+East+West\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 9990 19305 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 9135 20430 Lt\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 9585 21825 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 9810 20160 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5940 19710 G\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 9495 18495 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 11385 18360 G\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-44.fig b/katabatic/doc/images/GCellConfiguration-44.fig deleted file mode 100644 index cf11f1af..00000000 --- a/katabatic/doc/images/GCellConfiguration-44.fig +++ /dev/null @@ -1,60 +0,0 @@ -#FIG 3.2 -Portrait -Center -Metric -A4 -55.00 -Single --2 -1200 2 -6 -270 22230 5490 26370 -6 4140 23355 4410 24345 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 23760 4365 23760 4365 23940 4185 23940 4185 23760 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 23400 4320 23400 4320 24300 4230 24300 4230 23400 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 24525 90 90 2835 24525 3015 24525 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 22500 5175 22500 5175 26100 0 26100 0 22500 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 25650 4050 25650 4050 26100 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2250 25155 3825 25155 3825 25245 2250 25245 2250 25155 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2835 25110 3015 25110 3015 25290 2835 25290 2835 25110 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 25110 2925 24615 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 2115 23850 3510 23850 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 4185 23850 3690 23850 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3600 24615 3600 26325 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 2025 22275 2025 23085 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3015 24525 3510 24525 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 3690 24615 3510 24615 3510 23760 3690 23760 3690 24615 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 5400 23175 2115 23175 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 2115 23940 1935 23940 1935 23085 2115 23085 2115 23940 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3510 24300 -225 24300 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 3510 24210 3690 24210 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 26055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 25830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 25830 4-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 2175 1575 26055 North+South+East+West\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 3915 23805 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 3060 24930 Lt\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 1890 23715 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 1890 22410 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3510 26325 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 3735 24660 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5355 23130 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 24525 G\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-45.fig b/katabatic/doc/images/GCellConfiguration-45.fig deleted file mode 100644 index 1c0ba1d5..00000000 --- a/katabatic/doc/images/GCellConfiguration-45.fig +++ /dev/null @@ -1,50 +0,0 @@ -#FIG 3.2 -Portrait -Center -Metric -A4 -55.00 -Single --2 -1200 2 -6 -270 26730 5490 30600 -6 4140 27855 4410 28845 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 28260 4365 28260 4365 28440 4185 28440 4185 28260 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4230 27900 4320 27900 4320 28800 4230 28800 4230 27900 --6 -1 4 0 2 -1 7 40 -1 -1 0.000 1 0.0000 2925 29025 90 90 2835 29025 3015 29025 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 27000 5175 27000 5175 30600 0 30600 0 27000 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 30150 4050 30150 4050 30600 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2250 29655 3825 29655 3825 29745 2250 29745 2250 29655 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2835 29610 3015 29610 3015 29790 2835 29790 2835 29610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 29610 2925 29115 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 4185 28350 3690 28350 -2 1 0 2 -1 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3015 29025 3510 29025 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 6 0 0 5 - 3690 29115 3510 29115 3510 28260 3690 28260 3690 29115 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3510 28800 -225 28800 -2 1 0 2 0 7 38 -1 -1 0.000 0 0 -1 0 0 2 - 3510 28710 3690 28710 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3600 26775 3600 28260 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 30555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 30330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 30330 2-1-1-0\001 -4 0 0 30 -1 18 12 0.0000 4 135 1035 1575 30555 North+West\001 -4 1 12 40 -1 18 12 0.0000 4 135 180 3915 28305 Lt\001 -4 1 0 40 -1 18 12 0.0000 4 135 180 3060 29430 Lt\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 3735 29160 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5355 27630 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 29025 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3465 26910 G\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-5.fig b/katabatic/doc/images/GCellConfiguration-5.fig deleted file mode 100644 index 110d200b..00000000 --- a/katabatic/doc/images/GCellConfiguration-5.fig +++ /dev/null @@ -1,90 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 10215 2205 10485 3195 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 10305 2250 10395 2250 10395 3150 10305 3150 10305 2250 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 2610 10440 2610 10440 2790 10260 2790 10260 2610 --6 -6 9315 1530 9585 2520 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 9360 1935 9540 1935 9540 2115 9360 2115 9360 1935 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 9405 1575 9495 1575 9495 2475 9405 2475 9405 1575 --6 -6 4590 2205 4860 3195 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4680 2250 4770 2250 4770 3150 4680 3150 4680 2250 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4635 2610 4815 2610 4815 2790 4635 2790 4635 2610 --6 -6 3690 1530 3960 2520 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3735 1935 3915 1935 3915 2115 3735 2115 3735 1935 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 3780 1575 3870 1575 3870 2475 3780 2475 3780 1575 --6 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 5625 0 10800 0 10800 3600 5625 3600 5625 0 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 5625 3150 9675 3150 9675 3600 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 8325 1260 8325 -225 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 8235 1800 5400 1800 -2 1 1 2 18 7 50 -1 -1 4.000 0 0 -1 0 0 2 - 8325 2790 8325 3105 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5175 0 5175 3600 0 3600 0 0 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 3150 3375 3150 3375 3600 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 2610 1800 -225 1800 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 1350 720 2565 1305 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 - 2790 2790 2790 1260 2610 1260 2610 2790 2790 2790 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 2700 1260 2700 -225 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 2790 1350 5400 1350 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 4635 2700 2790 2700 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 3735 2025 2790 2025 -2 4 0 2 0 7 38 -1 -1 0.000 0 0 7 0 0 5 - 8415 2790 8415 1260 8235 1260 8235 2790 8415 2790 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 8415 1350 11025 1350 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 9360 2025 8415 2025 -2 1 0 2 12 7 30 -1 -1 0.000 0 0 -1 0 0 2 - 10260 2700 8415 2700 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6975 495 8190 1260 -4 0 0 30 -1 18 12 0.0000 4 135 615 5670 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 5670 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 2175 7200 3555 West+East+South+North\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 8460 -90 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5490 1980 G\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 7200 3330 4-2-0-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 10935 1530 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 8460 3105 G\001 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1545 1575 3555 West+East+North\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 2835 -90 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 1980 G\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 3-2-0-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5310 1530 G\001 -4 1 0 40 -1 18 12 0.0000 4 180 1335 1350 675 _targetContact\001 -4 1 0 40 -1 18 12 0.0000 4 180 1335 6975 450 _targetContact\001 diff --git a/katabatic/doc/images/GCellConfiguration-6.fig b/katabatic/doc/images/GCellConfiguration-6.fig deleted file mode 100644 index 5023988c..00000000 --- a/katabatic/doc/images/GCellConfiguration-6.fig +++ /dev/null @@ -1,656 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 -270 0 6570 3600 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 1575 90 90 2070 1575 2250 1575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 900 90 90 2070 900 2250 900 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 895 90 90 3430 895 3610 895 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 1350 90 90 3420 1350 3600 1350 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1353 1578 183 183 1170 1578 1536 1578 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4953 1350 183 183 4770 1350 5136 1350 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4950 450 90 90 4860 450 5040 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1350 450 90 90 1260 450 1440 450 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 3150 2700 3150 2700 3600 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 6300 0 6300 3600 0 3600 0 0 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - -225 450 1260 450 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 5040 450 6525 450 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 1620 900 1530 1800 1530 1800 1620 900 1620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 945 2475 855 3150 855 3150 945 2475 945 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 1485 1890 1485 1890 1665 1710 1665 1710 1485 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 810 2565 810 2565 990 2385 990 2385 810 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 810 3240 810 3240 990 3060 990 3060 810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 1395 4275 1305 5400 1305 5400 1395 4275 1395 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 1260 4365 1260 4365 1440 4185 1440 4185 1260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 1575 2070 1575 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 990 2160 1485 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 900 2385 900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 900 3420 900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 990 3510 1260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 1350 4185 1350 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1350 1395 1350 540 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4950 1170 4950 540 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 945 1575 3555 East+West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3330 2-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 675 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 6435 675 G\001 -4 1 0 40 -1 18 12 0.0000 4 180 765 4860 1755 _rightRP\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 1485 1035 L1\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 5085 945 L2\001 -4 1 0 40 -1 18 12 0.0000 4 180 660 1350 1935 _leftRP\001 -4 1 0 40 -1 18 12 0.0000 4 180 1725 1350 270 _southWestContact\001 -4 1 0 40 -1 18 12 0.0000 4 180 1665 4950 270 _northEastContact\001 --6 -6 -270 18000 6300 21870 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 19575 90 90 2070 19575 2250 19575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 18900 90 90 2070 18900 2250 18900 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 18895 90 90 3430 18895 3610 18895 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 19350 90 90 3420 19350 3600 19350 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 20250 90 90 4725 20250 4905 20250 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 18000 6300 18000 6300 21600 0 21600 0 18000 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 19620 900 19530 1800 19530 1800 19620 900 19620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 18945 2475 18855 3150 18855 3150 18945 2475 18945 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 19485 1890 19485 1890 19665 1710 19665 1710 19485 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 18810 2565 18810 2565 18990 2385 18990 2385 18810 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 18810 3240 18810 3240 18990 3060 18990 3060 18810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 19395 4275 19305 5400 19305 5400 19395 4275 19395 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 19260 4365 19260 4365 19440 4185 19440 4185 19260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 19575 2070 19575 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 18990 2160 19485 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 18900 2385 18900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 18900 3420 18900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 18990 3510 19260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 19350 4185 19350 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - -225 20700 5535 20700 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 19530 4815 20160 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 4905 19530 4725 19530 4725 19170 4905 19170 4905 19530 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4905 20250 5535 20250 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 5715 20790 5535 20790 5535 20160 5715 20160 5715 20790 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 5625 21825 5625 20790 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 21150 3780 21150 3780 21600 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 21555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 21330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1065 1575 21555 South+West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 21330 2-0-3-0\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 5040 19620 biggestRP\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5535 21825 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -180 20880 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 465 4545 19890 L1-tc\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 5490 20565 _southWestContact\001 --6 -6 -270 13230 6570 17370 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 15075 90 90 2070 15075 2250 15075 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 14400 90 90 2070 14400 2250 14400 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 14395 90 90 3430 14395 3610 14395 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 14850 90 90 3420 14850 3600 14850 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 16200 90 90 4725 16200 4905 16200 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 13950 90 90 4725 13950 4905 13950 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 16650 3780 16650 3780 17100 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 13500 6300 13500 6300 17100 0 17100 0 13500 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 15120 900 15030 1800 15030 1800 15120 900 15120 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 14445 2475 14355 3150 14355 3150 14445 2475 14445 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 14985 1890 14985 1890 15165 1710 15165 1710 14985 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 14310 2565 14310 2565 14490 2385 14490 2385 14310 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 14310 3240 14310 3240 14490 3060 14490 3060 14310 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 14895 4275 14805 5400 14805 5400 14895 4275 14895 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 14760 4365 14760 4365 14940 4185 14940 4185 14760 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 15075 2070 15075 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 14490 2160 14985 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 14400 2385 14400 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 14400 3420 14400 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 14490 3510 14760 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 14850 4185 14850 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 15390 4815 16110 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4815 17325 4815 16290 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - -225 16200 4725 16200 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4905 13950 6525 13950 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4815 13860 4815 13275 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 14040 4815 14310 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 4905 15390 4725 15390 4725 14310 4905 14310 4905 15390 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 17055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 16830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 2175 1575 17055 North+South+East+West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 16830 4-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 16425 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 5040 15345 biggestRP\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4680 15840 L1\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 4725 17325 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 6435 14175 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 4950 13410 G\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 4635 13995 _northEastContact\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4995 14265 L2\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 4680 16110 _southWestContact\001 --6 -6 0 8730 6570 12870 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 10575 90 90 2070 10575 2250 10575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 9900 90 90 2070 9900 2250 9900 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 9895 90 90 3430 9895 3610 9895 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 10350 90 90 3420 10350 3600 10350 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 10800 90 90 3735 10800 3915 10800 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 9450 90 90 4725 9450 4905 9450 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 12150 3600 12150 3600 12600 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 9000 6300 9000 6300 12600 0 12600 0 9000 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 3825 12825 3825 10890 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 10620 900 10530 1800 10530 1800 10620 900 10620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 9945 2475 9855 3150 9855 3150 9945 2475 9945 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 10485 1890 10485 1890 10665 1710 10665 1710 10485 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 9810 2565 9810 2565 9990 2385 9990 2385 9810 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 9810 3240 9810 3240 9990 3060 9990 3060 9810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 10395 4275 10305 5400 10305 5400 10395 4275 10395 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 10260 4365 10260 4365 10440 4185 10440 4185 10260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 10575 2070 10575 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 9990 2160 10485 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 9900 2385 9900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 9900 3420 9900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 9990 3510 10260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 10350 4185 10350 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4725 10800 3915 10800 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4815 9360 4815 8775 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4905 9450 6525 9450 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 9540 4815 9810 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 4905 10890 4725 10890 4725 9810 4905 9810 4905 10890 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 12555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 12330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1635 1575 12555 North+South+East\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 12330 3-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 3690 12825 G\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 5040 10845 biggestRP\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4320 11025 L1\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 4590 9450 _northEastContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 6435 9675 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4995 9720 L2\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 4950 8910 G\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 3645 10890 _southWestContact\001 --6 -6 6930 4230 13770 8100 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 6120 90 90 9270 6120 9450 6120 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 5445 90 90 9270 5445 9450 5445 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 5440 90 90 10630 5440 10810 5440 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 5895 90 90 10620 5895 10800 5895 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12015 4950 90 90 11925 4950 12105 4950 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12015 7200 90 90 11925 7200 12105 7200 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 7200 7650 10800 7650 10800 8100 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 7200 4500 13500 4500 13500 8100 7200 8100 7200 4500 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 11925 7200 6975 7200 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8100 6165 8100 6075 9000 6075 9000 6165 8100 6165 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 9675 5490 9675 5400 10350 5400 10350 5490 9675 5490 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 6030 9090 6030 9090 6210 8910 6210 8910 6030 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 9585 5355 9765 5355 9765 5535 9585 5535 9585 5355 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 5355 10440 5355 10440 5535 10260 5535 10260 5355 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 11475 5940 11475 5850 12600 5850 12600 5940 11475 5940 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 11385 5805 11565 5805 11565 5985 11385 5985 11385 5805 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9090 6120 9270 6120 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9360 5535 9360 6030 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9450 5445 9585 5445 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10440 5445 10620 5445 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10710 5535 10710 5805 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10800 5895 11385 5895 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 12015 5040 12015 5355 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 12105 4950 13725 4950 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 12015 6435 12015 7110 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 12015 4860 12015 4275 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 12105 6435 11925 6435 11925 5355 12105 5355 12105 6435 -4 0 0 30 -1 18 12 0.0000 4 135 615 7245 8055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 7830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 8775 7830 3-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 7065 7425 G\001 -4 0 0 30 -1 18 12 0.0000 4 135 1575 8775 8055 South+East+West\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 12240 6390 biggestRP\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 11925 5265 _northEastContact\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 12150 5265 L2\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 13635 5175 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 12150 6840 L1\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 12150 4410 G\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 11835 7110 _southWestContact\001 --6 -6 -270 4500 6570 8370 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 6120 90 90 2070 6120 2250 6120 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 5445 90 90 2070 5445 2250 5445 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 5440 90 90 3430 5440 3610 5440 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 5895 90 90 3420 5895 3600 5895 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 4950 90 90 4725 4950 4905 4950 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 7200 90 90 4725 7200 4905 7200 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 7650 3600 7650 3600 8100 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 4500 6300 4500 6300 8100 0 8100 0 4500 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4725 7200 -225 7200 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 6165 900 6075 1800 6075 1800 6165 900 6165 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 5490 2475 5400 3150 5400 3150 5490 2475 5490 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 6030 1890 6030 1890 6210 1710 6210 1710 6030 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 5355 2565 5355 2565 5535 2385 5535 2385 5355 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 5355 3240 5355 3240 5535 3060 5535 3060 5355 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 5940 4275 5850 5400 5850 5400 5940 4275 5940 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 5805 4365 5805 4365 5985 4185 5985 4185 5805 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 6120 2070 6120 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 5535 2160 6030 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 5445 2385 5445 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 5445 3420 5445 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 5535 3510 5805 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 5895 4185 5895 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 5040 4815 5355 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4905 4950 6525 4950 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4815 8325 4815 7290 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 6435 4815 7110 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 4905 6435 4725 6435 4725 5355 4905 5355 4905 6435 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 8055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 7830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 7830 3-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 7425 G\001 -4 0 0 30 -1 18 12 0.0000 4 135 1575 1575 8055 South+East+West\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 5040 6390 biggestRP\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 4725 5265 _northEastContact\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4950 5265 L2\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 6435 5175 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 4950 8325 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4950 6840 L1\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 4680 7110 _southWestContact\001 --6 -6 7200 -270 13500 3870 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 1575 90 90 9270 1575 9450 1575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 900 90 90 9270 900 9450 900 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 895 90 90 10630 895 10810 895 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 1350 90 90 10620 1350 10800 1350 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 10350 1800 90 90 10260 1800 10440 1800 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12825 900 90 90 12735 900 12915 900 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 7200 3150 10125 3150 10125 3600 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 7200 0 13500 0 13500 3600 7200 3600 7200 0 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 12825 810 12825 -225 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 10350 3825 10350 1890 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8100 1620 8100 1530 9000 1530 9000 1620 8100 1620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 9675 945 9675 855 10350 855 10350 945 9675 945 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 1485 9090 1485 9090 1665 8910 1665 8910 1485 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 9585 810 9765 810 9765 990 9585 990 9585 810 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 810 10440 810 10440 990 10260 990 10260 810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 11475 1395 11475 1305 12600 1305 12600 1395 11475 1395 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 11385 1260 11565 1260 11565 1440 11385 1440 11385 1260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9090 1575 9270 1575 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9360 990 9360 1485 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9450 900 9585 900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10440 900 10620 900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10710 990 10710 1260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10800 1350 11385 1350 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 12735 900 12105 900 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 11925 1800 10440 1800 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 12105 1890 11925 1890 11925 810 12105 810 12105 1890 -4 0 0 30 -1 18 12 0.0000 4 135 615 7245 3555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 3330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1125 8775 3555 North+South\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 8775 3330 2-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 12960 -45 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 10485 3825 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 12465 1080 L2\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 11160 1980 L1\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 12735 675 _northEastContact\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 12240 1845 biggestRP\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 10170 1890 _southWestContact\001 --6 -6 6930 8730 13500 12870 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 10575 90 90 9270 10575 9450 10575 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 9900 90 90 9270 9900 9450 9900 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 9895 90 90 10630 9895 10810 9895 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 10350 90 90 10620 10350 10800 10350 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12825 9900 90 90 12735 9900 12915 9900 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 12015 11700 90 90 11925 11700 12105 11700 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 7200 12150 10800 12150 10800 12600 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 7200 9000 13500 9000 13500 12600 7200 12600 7200 9000 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 6975 11700 11925 11700 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 12825 9810 12825 8775 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8100 10620 8100 10530 9000 10530 9000 10620 8100 10620 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 9675 9945 9675 9855 10350 9855 10350 9945 9675 9945 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 10485 9090 10485 9090 10665 8910 10665 8910 10485 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 9585 9810 9765 9810 9765 9990 9585 9990 9585 9810 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 9810 10440 9810 10440 9990 10260 9990 10260 9810 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 11475 10395 11475 10305 12600 10305 12600 10395 11475 10395 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 11385 10260 11565 10260 11565 10440 11385 10440 11385 10260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9090 10575 9270 10575 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9360 9990 9360 10485 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9450 9900 9585 9900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10440 9900 10620 9900 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10710 9990 10710 10260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10800 10350 11385 10350 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 12735 9900 12105 9900 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 12015 12825 12015 11790 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 12015 10890 12015 11610 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 12105 10890 11925 10890 11925 9810 12105 9810 12105 10890 -4 0 0 30 -1 18 12 0.0000 4 135 615 7245 12555 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 12330 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1665 8775 12555 North+South+West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 8775 12330 3-0-3-0\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 12960 8955 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 7065 11925 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 12465 10080 L2\001 -4 2 0 40 -1 18 12 0.0000 4 180 1665 12735 9675 _northEastContact\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 12240 10845 biggestRP\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 11925 12825 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 11880 11295 L1\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 11880 11610 _southWestContact\001 --6 -6 0 22500 6570 26100 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 24075 90 90 2070 24075 2250 24075 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 23400 90 90 2070 23400 2250 23400 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 23395 90 90 3430 23395 3610 23395 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 23850 90 90 3420 23850 3600 23850 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 24750 90 90 4725 24750 4905 24750 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 22500 6300 22500 6300 26100 0 26100 0 22500 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 24120 900 24030 1800 24030 1800 24120 900 24120 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 23445 2475 23355 3150 23355 3150 23445 2475 23445 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 23985 1890 23985 1890 24165 1710 24165 1710 23985 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 23310 2565 23310 2565 23490 2385 23490 2385 23310 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 23310 3240 23310 3240 23490 3060 23490 3060 23310 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 23895 4275 23805 5400 23805 5400 23895 4275 23895 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 23760 4365 23760 4365 23940 4185 23940 4185 23760 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 24075 2070 24075 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 23490 2160 23985 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 23400 2385 23400 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 23400 3420 23400 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 23490 3510 23760 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 23850 4185 23850 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 24030 4815 24660 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 4905 24030 4725 24030 4725 23670 4905 23670 4905 24030 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 25650 3780 25650 3780 26100 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4905 24750 6525 24750 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 26055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 25830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 405 1575 26055 East\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 25830 1-0-3-0\001 -4 0 0 40 -1 18 12 0.0000 4 180 660 5040 24120 rightRP\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 4680 24390 L1\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 4635 24660 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 6480 24930 G\001 --6 -6 6930 22500 13500 26100 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 24075 90 90 9270 24075 9450 24075 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 9360 23400 90 90 9270 23400 9450 23400 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10720 23395 90 90 10630 23395 10810 23395 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 10710 23850 90 90 10620 23850 10800 23850 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 8550 24750 90 90 8460 24750 8640 24750 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 7200 22500 13500 22500 13500 26100 7200 26100 7200 22500 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 8100 24120 8100 24030 9000 24030 9000 24120 8100 24120 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 9675 23445 9675 23355 10350 23355 10350 23445 9675 23445 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 8910 23985 9090 23985 9090 24165 8910 24165 8910 23985 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 9585 23310 9765 23310 9765 23490 9585 23490 9585 23310 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 10260 23310 10440 23310 10440 23490 10260 23490 10260 23310 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 11475 23895 11475 23805 12600 23805 12600 23895 11475 23895 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 11385 23760 11565 23760 11565 23940 11385 23940 11385 23760 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9090 24075 9270 24075 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9360 23490 9360 23985 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 9450 23400 9585 23400 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10440 23400 10620 23400 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10710 23490 10710 23760 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 10800 23850 11385 23850 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 7200 25650 10980 25650 10980 26100 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 8640 24255 8460 24255 8460 23895 8640 23895 8640 24255 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 8550 24255 8550 24660 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 6975 24750 8460 24750 -4 0 0 30 -1 18 12 0.0000 4 135 615 7245 26055 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 7245 25830 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 435 8775 26055 West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 8775 25830 1-0-3-0\001 -4 1 -1 30 -1 18 12 0.0000 4 135 210 8415 24525 L1\001 -4 2 0 40 -1 18 12 0.0000 4 135 555 8325 23940 leftRP\001 -4 0 0 40 -1 18 12 0.0000 4 180 1725 8685 24795 _southWestContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 7020 24930 G\001 --6 -6 0 26775 6300 30645 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 28350 90 90 2070 28350 2250 28350 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 2160 27675 90 90 2070 27675 2250 27675 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3520 27670 90 90 3430 27670 3610 27670 -1 4 0 2 12 7 40 -1 -1 0.000 1 0.0000 3510 28125 90 90 3420 28125 3600 28125 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4815 29025 90 90 4725 29025 4905 29025 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 26775 6300 26775 6300 30375 0 30375 0 26775 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 900 28395 900 28305 1800 28305 1800 28395 900 28395 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2475 27720 2475 27630 3150 27630 3150 27720 2475 27720 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 28260 1890 28260 1890 28440 1710 28440 1710 28260 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 27585 2565 27585 2565 27765 2385 27765 2385 27585 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3060 27585 3240 27585 3240 27765 3060 27765 3060 27585 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4275 28170 4275 28080 5400 28080 5400 28170 4275 28170 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4185 28035 4365 28035 4365 28215 4185 28215 4185 28035 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 28350 2070 28350 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2160 27765 2160 28260 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 27675 2385 27675 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3240 27675 3420 27675 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3510 27765 3510 28035 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 3600 28125 4185 28125 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 28305 4815 28935 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 4905 28305 4725 28305 4725 27945 4905 27945 4905 28305 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4905 29025 5535 29025 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 5625 30600 5625 29115 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 29925 3780 29925 3780 30375 -2 4 0 2 0 7 40 -1 -1 0.000 0 0 6 0 0 5 - 5715 29115 5535 29115 5535 28935 5715 28935 5715 29115 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 30330 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 30105 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 525 1575 30330 South\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 30105 1-0-3-0\001 -4 0 0 40 -1 18 12 0.0000 4 180 900 5040 28395 biggestRP\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 5535 30600 G\001 -4 1 -1 30 -1 18 12 0.0000 4 135 465 4545 28665 L1-tc\001 -4 2 0 40 -1 18 12 0.0000 4 180 1725 5490 29340 _southWestContact\001 --6 diff --git a/katabatic/doc/images/GCellConfiguration-7.fig b/katabatic/doc/images/GCellConfiguration-7.fig deleted file mode 100644 index b2bb7a5b..00000000 --- a/katabatic/doc/images/GCellConfiguration-7.fig +++ /dev/null @@ -1,106 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 -270 -1575 3150 3825 -6 1665 -1395 2610 3195 -1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 2475 1890 90 90 2475 1980 2475 1800 -1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 1800 1890 90 90 1800 1980 1800 1800 -1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 1795 530 90 90 1795 620 1795 440 -1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 2250 540 90 90 2250 630 2250 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 1.5708 2251 -768 183 183 2251 -585 2251 -951 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2520 3150 2430 3150 2430 2250 2520 2250 2520 3150 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 1845 1575 1755 1575 1755 900 1845 900 1845 1575 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 2340 2385 2160 2565 2160 2565 2340 2385 2340 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 1665 1710 1485 1890 1485 1890 1665 1710 1665 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1710 990 1710 810 1890 810 1890 990 1710 990 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 2295 -225 2205 -225 2205 -1350 2295 -1350 2295 -225 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2160 -135 2160 -315 2340 -315 2340 -135 2160 -135 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2475 2160 2475 1980 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 1890 2385 1890 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1800 1800 1800 1665 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1800 810 1800 630 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1890 540 2160 540 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2250 450 2250 -135 --6 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 0 3375 2700 3375 2700 3825 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 0 -1575 3150 -1575 3150 3825 0 3825 0 -1575 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - -225 -765 2070 -765 -4 0 0 30 -1 18 12 0.0000 4 135 615 45 3780 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 45 3555 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 435 1575 3780 West\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 1575 3555 1-0-0-3\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 -135 -585 G\001 -4 1 0 40 -1 18 12 0.0000 4 180 1335 1350 -585 _targetContact\001 --6 -1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 7470 1890 90 90 7470 1980 7470 1800 -1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 6795 1890 90 90 6795 1980 6795 1800 -1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 6790 530 90 90 6790 620 6790 440 -1 4 0 2 12 7 40 -1 -1 0.000 1 1.5708 7245 540 90 90 7245 630 7245 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 1.5708 7246 -768 183 183 7246 -585 7246 -951 -1 4 0 2 0 7 40 -1 -1 0.000 1 1.5708 6075 -768 93 93 6075 -675 6075 -861 -2 1 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 3 - 4995 3375 7695 3375 7695 3825 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 4995 -1575 8145 -1575 8145 3825 4995 3825 4995 -1575 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7515 3150 7425 3150 7425 2250 7515 2250 7515 3150 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 6840 1575 6750 1575 6750 900 6840 900 6840 1575 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7380 2340 7380 2160 7560 2160 7560 2340 7380 2340 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6705 1665 6705 1485 6885 1485 6885 1665 6705 1665 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6705 990 6705 810 6885 810 6885 990 6705 990 -2 2 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7290 -225 7200 -225 7200 -1350 7290 -1350 7290 -225 -2 2 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7155 -135 7155 -315 7335 -315 7335 -135 7155 -135 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 7470 2160 7470 1980 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 6885 1890 7380 1890 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 6795 1800 6795 1665 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 6795 810 6795 630 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 6885 540 7155 540 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 7245 450 7245 -135 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 7065 -765 6165 -765 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 4725 -765 5985 -765 -2 1 1 2 18 7 30 -1 -1 4.000 0 0 -1 0 0 2 - 6075 -900 6075 -1800 -4 0 0 30 -1 18 12 0.0000 4 135 615 5040 3780 Global:\001 -4 0 0 30 -1 18 12 0.0000 4 180 1230 5040 3555 Configuration:\001 -4 0 0 30 -1 18 12 0.0000 4 135 1035 6570 3780 West+North\001 -4 0 0 30 -1 18 12 0.0000 4 135 645 6570 3555 2-0-0-3\001 -4 1 0 40 -1 18 12 0.0000 4 180 1335 6075 -495 _targetContact\001 -4 1 0 40 -1 18 12 1.5708 4 135 1005 7605 -810 subContact\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 4815 -585 G\001 -4 1 18 30 -1 18 12 0.0000 4 135 150 6165 -1665 G\001 diff --git a/katabatic/doc/images/LegalConstruct-1.fig b/katabatic/doc/images/LegalConstruct-1.fig deleted file mode 100644 index 580037c3..00000000 --- a/katabatic/doc/images/LegalConstruct-1.fig +++ /dev/null @@ -1,136 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 675 4275 675 4275 3375 1575 3375 1575 675 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 675 7875 675 7875 3375 5175 3375 5175 675 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 1125 1935 1125 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2115 2025 3780 2025 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2115 2115 2115 1035 1935 1035 1935 2115 2115 2115 -2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5 - 3870 2475 3780 2475 3780 1800 3870 1800 3870 2475 -2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5 - 7470 2475 7380 2475 7380 1800 7470 1800 7470 2475 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 1935 7515 1935 7515 2115 7335 2115 7335 1935 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6435 1035 6615 1035 6615 1215 6435 1215 6435 1035 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6435 1935 6615 1935 6615 2115 6435 2115 6435 1935 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 1080 6525 1080 6525 1170 4950 1170 4950 1080 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 6525 1980 7425 1980 7425 2070 6525 2070 6525 1980 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6930 1485 6615 1215 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6930 1485 6615 1935 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 6525 1215 6525 1935 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 6120 1575 6480 1575 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 1125 0 8325 0 8325 10125 1125 10125 1125 0 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 6975 4275 6975 4275 9675 1575 9675 1575 6975 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 6975 7875 6975 7875 9675 5175 9675 5175 6975 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 7425 1935 7425 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2115 8325 3780 8325 -2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5 - 3870 8775 3780 8775 3780 8100 3870 8100 3870 8775 -2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5 - 7470 8775 7380 8775 7380 8100 7470 8100 7470 8775 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 8235 7515 8235 7515 8415 7335 8415 7335 8235 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2115 7515 2115 7335 1935 7335 1935 7515 2115 7515 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2115 8415 2115 8235 1935 8235 1935 8415 2115 8415 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 7515 2025 8235 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 8235 5715 8235 5715 8415 5535 8415 5535 8235 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5625 8280 7425 8280 7425 8370 5625 8370 5625 8280 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 8280 5625 8280 5625 8370 4950 8370 4950 8280 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 3825 4275 3825 4275 6525 1575 6525 1575 3825 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 3825 7875 3825 7875 6525 5175 6525 5175 3825 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 4275 1935 4275 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2115 5175 3780 5175 -2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5 - 3870 5625 3780 5625 3780 4950 3870 4950 3870 5625 -2 2 0 2 0 7 50 -1 10 0.000 0 0 -1 0 0 5 - 7470 5625 7380 5625 7380 4950 7470 4950 7470 5625 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 5085 7515 5085 7515 5265 7335 5265 7335 5085 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2115 4365 2115 4185 1935 4185 1935 4365 2115 4365 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2115 5265 2115 5085 1935 5085 1935 5265 2115 5265 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 4365 2025 5085 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 4275 5670 4275 5670 5175 5580 5175 5580 4275 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 4185 5715 4185 5715 4365 5535 4365 5535 4185 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 5085 5715 5085 5715 5265 5535 5265 5535 5085 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5625 5130 7425 5130 7425 5220 5625 5220 5625 5130 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 4230 5625 4230 5625 4320 4950 4320 4950 4230 -4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1395 1080 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 1035 G1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 2025 2340 AC1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 2925 1980 L1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 7155 1575 AC1\001 -4 1 0 40 -1 18 12 0.0000 4 135 120 4050 2205 T\001 -4 1 0 40 -1 18 12 0.0000 4 135 120 7650 2205 T\001 -4 2 18 50 -1 19 12 0.0000 4 150 300 6030 1620 gap\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1395 7380 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 2925 8280 L1\001 -4 1 0 40 -1 18 12 0.0000 4 135 120 4050 8505 T\001 -4 1 0 40 -1 18 12 0.0000 4 135 120 7650 8505 T\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 2385 7470 AC1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 6525 8235 L1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 2025 8640 AC2\001 -4 1 0 40 -1 18 12 0.0000 4 135 390 2250 7920 L2-c\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 4995 8235 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 390 5625 8190 L2-c\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 5625 8595 AC1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 5625 8775 AC2\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1395 4230 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 4185 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 2925 5130 L1\001 -4 1 0 40 -1 18 12 0.0000 4 135 120 4050 5355 T\001 -4 1 0 40 -1 18 12 0.0000 4 135 120 7650 5355 T\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 2385 4320 AC1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 2205 4770 L2\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 5850 4770 L2\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 6525 5085 L1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 6030 4365 AC1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 5625 5490 AC2\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 2025 5490 AC2\001 diff --git a/katabatic/doc/images/LegalConstruct-2.fig b/katabatic/doc/images/LegalConstruct-2.fig deleted file mode 100644 index 773af630..00000000 --- a/katabatic/doc/images/LegalConstruct-2.fig +++ /dev/null @@ -1,151 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 1260 675 7875 3645 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 675 4275 675 4275 3375 1575 3375 1575 675 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 675 7875 675 7875 3375 5175 3375 5175 675 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 2025 1935 2025 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 1935 2700 1215 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2790 2160 2790 1935 1935 1935 1935 2160 2790 2160 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 3600 2025 2160 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2790 1215 2790 1035 2610 1035 2610 1215 2790 1215 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 1935 5715 1935 5715 2115 5535 2115 5535 1935 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 6255 2025 6345 2025 6345 1125 6255 1125 6255 2025 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 1980 6300 1980 6300 2070 4950 2070 4950 1980 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6210 1935 6390 1935 6390 2115 6210 2115 6210 1935 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6210 1035 6390 1035 6390 1215 6210 1215 6210 1035 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5625 1395 5625 1935 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5625 1395 6210 1935 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 3600 5670 3600 5670 2025 5580 2025 5580 3600 -4 1 0 40 -1 18 12 0.0000 4 135 255 1395 1980 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 2835 1620 L1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 2340 1890 AC1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 1935 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 6480 1665 L1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 5580 1350 AC1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 2205 3600 G2\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5850 3600 G2\001 --6 -6 1260 4050 7875 6750 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 4050 4275 4050 4275 6750 1575 6750 1575 4050 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 4050 7875 4050 7875 6750 5175 6750 5175 4050 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 5400 1935 5400 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 5310 2700 4590 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2790 5535 2790 5310 1935 5310 1935 5535 2790 5535 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 6210 2025 5535 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2790 4590 2790 4410 2610 4410 2610 4590 2790 4590 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2115 6390 2115 6210 1935 6210 1935 6390 2115 6390 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 5310 5715 5310 5715 5490 5535 5490 5535 5310 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 6300 5670 6300 5670 5400 5580 5400 5580 6300 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 6255 5400 6345 5400 6345 4500 6255 4500 6255 5400 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 5355 6300 5355 6300 5445 4950 5445 4950 5355 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6210 5310 6390 5310 6390 5490 6210 5490 6210 5310 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6210 4410 6390 4410 6390 4590 6210 4590 6210 4410 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 6210 5715 6210 5715 6390 5535 6390 5535 6210 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5625 4770 5625 5310 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5625 4770 6210 5310 -4 1 0 40 -1 18 12 0.0000 4 135 255 1395 5355 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 2160 5940 L2\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 2835 4995 L1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 2340 5265 AC1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 5310 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 5805 5940 L2\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 6480 5040 L1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 5580 4725 AC1\001 --6 -6 1575 7200 7875 9900 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 7200 4275 7200 4275 9900 1575 9900 1575 7200 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 7200 7875 7200 7875 9900 5175 9900 5175 7200 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2115 8550 3060 8550 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 8460 3825 7740 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3915 8685 3915 8460 3060 8460 3060 8685 3915 8685 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 9360 3150 8685 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3915 7740 3915 7560 3735 7560 3735 7740 3915 7740 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3240 9540 3240 9360 3060 9360 3060 9540 3240 9540 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6660 8460 6840 8460 6840 8640 6660 8640 6660 8460 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 6705 9450 6795 9450 6795 8550 6705 8550 6705 9450 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6660 9360 6840 9360 6840 9540 6660 9540 6660 9360 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2115 8640 2115 8460 1935 8460 1935 8640 2115 8640 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 8460 5715 8460 5715 8640 5535 8640 5535 8460 -2 1 0 2 18 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 3510 8460 3510 8685 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 6705 8550 6795 8550 6795 7650 6705 7650 6705 8550 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6660 7560 6840 7560 6840 7740 6660 7740 6660 7560 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5625 8505 6750 8505 6750 8595 5625 8595 5625 8505 -2 1 0 1 -1 7 50 -1 -1 0.000 0 0 -1 1 1 4 - 3 0 1.00 60.00 120.00 - 3 0 1.00 60.00 120.00 - 7110 8100 7425 8100 7425 9000 7110 9000 -4 1 0 40 -1 18 12 0.0000 4 135 210 2520 8505 L3\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 3285 9090 L2\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 3960 8145 L1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 3465 8415 AC1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 6165 8460 L3\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 6930 9090 L2\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 2025 8415 AC2\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 5580 8415 AC2\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 6930 8145 L1\001 -4 1 18 40 -1 18 12 0.0000 4 135 345 7110 8640 AC1\001 --6 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 1125 0 8325 0 8325 10350 1125 10350 1125 0 -4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 diff --git a/katabatic/doc/images/LegalConstruct-3.fig b/katabatic/doc/images/LegalConstruct-3.fig deleted file mode 100644 index d0747f65..00000000 --- a/katabatic/doc/images/LegalConstruct-3.fig +++ /dev/null @@ -1,55 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 1260 630 7875 3600 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 900 4275 900 4275 3600 1575 3600 1575 900 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 900 7875 900 7875 3600 5175 3600 5175 900 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 2250 1935 2250 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 2160 2700 675 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2790 2385 2790 2160 1935 2160 1935 2385 2790 2385 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 3060 2025 2385 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2115 3240 2115 3060 1935 3060 1935 3240 2115 3240 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 2160 5715 2160 5715 2340 5535 2340 5535 2160 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 3150 5670 3150 5670 2250 5580 2250 5580 3150 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 2205 6300 2205 6300 2295 4950 2295 4950 2205 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6210 2160 6390 2160 6390 2340 6210 2340 6210 2160 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 3060 5715 3060 5715 3240 5535 3240 5535 3060 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5625 1620 5625 2160 -2 1 0 1 18 7 50 -1 -1 0.000 0 0 -1 1 0 2 - 3 0 1.00 60.00 120.00 - 5625 1620 6210 2160 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 6255 2250 6345 2250 6345 675 6255 675 6255 2250 -4 1 0 40 -1 18 12 0.0000 4 135 255 1395 2205 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 2160 2790 L2\001 -4 1 18 40 -1 18 12 0.0000 4 135 555 2340 2115 AC-BL\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 2160 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 5805 2790 L2\001 -4 1 18 40 -1 18 12 0.0000 4 135 555 5580 1575 AC-BL\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 2880 810 G3\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 6525 810 G3\001 --6 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 1125 0 8325 0 8325 4050 1125 4050 1125 0 -4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 diff --git a/katabatic/doc/images/LegalConstruct-4.fig b/katabatic/doc/images/LegalConstruct-4.fig deleted file mode 100644 index f36a2629..00000000 --- a/katabatic/doc/images/LegalConstruct-4.fig +++ /dev/null @@ -1,91 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 1125 0 8325 0 8325 7875 1125 7875 1125 0 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 4500 4275 4500 4275 7200 1575 7200 1575 4500 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 4500 7875 4500 7875 7200 5175 7200 5175 4500 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 5850 1935 5850 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 7425 2025 5985 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 5760 5715 5760 5715 5940 5535 5940 5535 5760 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2160 5985 2160 5760 1935 5760 1935 5985 2160 5985 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 7425 5670 7425 5670 5850 5580 5850 5580 7425 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2160 5040 2160 4815 1935 4815 1935 5040 2160 5040 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 5760 2025 5040 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4500 4950 2160 4950 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 4860 5715 4860 5715 5040 5535 5040 5535 4860 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 5805 5625 5805 5625 5895 4950 5895 4950 5805 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 5850 5670 5850 5670 4950 5580 4950 5580 5850 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5625 4905 8100 4905 8100 4995 5625 4995 5625 4905 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 900 4275 900 4275 3600 1575 3600 1575 900 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 900 7875 900 7875 3600 5175 3600 5175 900 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 2250 1935 2250 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 3825 2025 2385 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 2160 5715 2160 5715 2340 5535 2340 5535 2160 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2160 2385 2160 2160 1935 2160 1935 2385 2160 2385 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 2160 3825 675 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3960 2385 3960 2160 3735 2160 3735 2385 3960 2385 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3735 2250 2160 2250 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7380 2250 7470 2250 7470 675 7380 675 7380 2250 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 2160 7515 2160 7515 2340 7335 2340 7335 2160 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 3825 5670 3825 5670 2250 5580 2250 5580 3825 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 2205 7425 2205 7425 2295 4950 2295 4950 2205 -4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1395 5805 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 5760 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 2205 7425 G2\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5850 7425 G2\001 -4 1 18 40 -1 18 12 0.0000 4 135 600 1620 6120 AC-SW\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 4455 4905 G4\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 2025 4725 AC-NE\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 8055 4860 G4\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 5580 4770 AC-NE\001 -4 1 18 40 -1 18 12 0.0000 4 135 600 5220 6165 AC-SW\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1395 2205 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 2160 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 4005 810 G3\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 2205 3825 G2\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 7650 810 G3\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5850 3825 G2\001 -4 1 18 40 -1 18 12 0.0000 4 135 600 2070 2070 AC-SW\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 3825 2610 AC-NE\001 -4 1 18 40 -1 18 12 0.0000 4 135 600 5625 2070 AC-SW\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 7425 2610 AC-NE\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 2925 2205 L1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 6570 2160 L1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 2205 5490 L1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 5850 5490 L1\001 diff --git a/katabatic/doc/images/LegalConstruct-5.fig b/katabatic/doc/images/LegalConstruct-5.fig deleted file mode 100644 index 4899adff..00000000 --- a/katabatic/doc/images/LegalConstruct-5.fig +++ /dev/null @@ -1,94 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 1125 0 8325 0 8325 7875 1125 7875 1125 0 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 4500 4275 4500 4275 7200 1575 7200 1575 4500 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 4500 7875 4500 7875 7200 5175 7200 5175 4500 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 5850 3735 5850 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4500 4950 3960 4950 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 900 4275 900 4275 3600 1575 3600 1575 900 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 900 7875 900 7875 3600 5175 3600 5175 900 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 3825 2025 2385 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 2160 5715 2160 5715 2340 5535 2340 5535 2160 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2160 2385 2160 2160 1935 2160 1935 2385 2160 2385 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 2160 3825 675 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3960 2385 3960 2160 3735 2160 3735 2385 3960 2385 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3735 2250 2160 2250 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7380 2250 7470 2250 7470 675 7380 675 7380 2250 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 2160 7515 2160 7515 2340 7335 2340 7335 2160 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 3825 5670 3825 5670 2250 5580 2250 5580 3825 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3960 2250 4545 2250 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5625 2205 7425 2205 7425 2295 5625 2295 5625 2205 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7425 2205 8100 2205 8100 2295 7425 2295 7425 2205 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3960 5085 3960 4860 3735 4860 3735 5085 3960 5085 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 5760 3825 5085 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 4860 3825 4275 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3960 5985 3960 5760 3735 5760 3735 5985 3960 5985 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 4860 7515 4860 7515 5040 7335 5040 7335 4860 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 5760 7515 5760 7515 5940 7335 5940 7335 5760 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7425 4905 8100 4905 8100 4995 7425 4995 7425 4905 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7380 5850 7470 5850 7470 4950 7380 4950 7380 5850 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7380 4950 7470 4950 7470 4275 7380 4275 7380 4950 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 5805 7425 5805 7425 5895 4950 5895 4950 5805 -4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 5760 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 2160 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 4005 810 G3\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 2205 3825 G2\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 7650 810 G3\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5850 3825 G2\001 -4 1 18 40 -1 18 12 0.0000 4 135 600 2070 2070 AC-SW\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 3825 2610 AC-NE\001 -4 1 18 40 -1 18 12 0.0000 4 135 600 5625 2070 AC-SW\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 7425 2610 AC-NE\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 4455 2205 G4\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 8055 2160 G4\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 4005 4410 G3\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 4455 4905 G4\001 -4 1 18 40 -1 18 12 0.0000 4 135 600 3825 6210 AC-SW\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 3330 5040 AC-NE\001 -4 1 18 40 -1 18 12 0.0000 4 135 600 7425 6210 AC-SW\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 7650 4410 G3\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 8055 4860 G4\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 2925 2475 L1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 6525 2475 L1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 7200 5445 L1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 3645 5490 L1\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 6975 5040 AC-NE\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1440 5805 G1\001 diff --git a/katabatic/doc/images/LegalConstruct-6.fig b/katabatic/doc/images/LegalConstruct-6.fig deleted file mode 100644 index 0e99e7d4..00000000 --- a/katabatic/doc/images/LegalConstruct-6.fig +++ /dev/null @@ -1,59 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 1575 900 4275 900 4275 3600 1575 3600 1575 900 -2 2 3 1 0 7 30 -1 -1 8.000 0 0 -1 0 0 5 - 5175 900 7875 900 7875 3600 5175 3600 5175 900 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2025 3825 2025 2385 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5535 2160 5715 2160 5715 2340 5535 2340 5535 2160 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 2160 2385 2160 2160 1935 2160 1935 2385 2160 2385 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 2160 3825 675 -2 4 0 2 18 7 50 -1 -1 0.000 0 0 7 0 0 5 - 3960 2385 3960 2160 3735 2160 3735 2385 3960 2385 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3735 2250 2160 2250 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7380 2250 7470 2250 7470 675 7380 675 7380 2250 -2 2 0 2 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 7335 2160 7515 2160 7515 2340 7335 2340 7335 2160 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5580 3825 5670 3825 5670 2250 5580 2250 5580 3825 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3960 2250 4545 2250 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 5625 2205 7425 2205 7425 2295 5625 2295 5625 2205 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 7425 2205 8100 2205 8100 2295 7425 2295 7425 2205 -2 1 0 2 -1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 2250 1935 2250 -2 2 0 2 -1 7 50 -1 45 0.000 0 0 -1 0 0 5 - 4950 2205 5625 2205 5625 2295 4950 2295 4950 2205 -2 2 0 1 0 7 30 -1 -1 0.000 0 0 -1 0 0 5 - 1125 0 8325 0 8325 4275 1125 4275 1125 0 -4 1 0 30 -1 14 12 0.0000 4 120 2205 2790 270 AutoContact Structure\001 -4 1 0 30 -1 14 12 0.0000 4 180 1680 6390 270 Physical Mapping\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5040 2160 G1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 4005 810 G3\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 2205 3825 G2\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 7650 810 G3\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 5850 3825 G2\001 -4 1 18 40 -1 18 12 0.0000 4 135 600 2070 2070 AC-SW\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 3825 2610 AC-NE\001 -4 1 18 40 -1 18 12 0.0000 4 135 600 5625 2070 AC-SW\001 -4 1 18 40 -1 18 12 0.0000 4 135 570 7425 2610 AC-NE\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 4455 2205 G4\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 8055 2160 G4\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 2925 2475 L1\001 -4 1 0 40 -1 18 12 0.0000 4 135 210 6525 2475 L1\001 -4 1 0 40 -1 18 12 0.0000 4 135 255 1440 2205 G1\001 diff --git a/katabatic/doc/images/Makefile.am b/katabatic/doc/images/Makefile.am deleted file mode 100644 index 68eb5a0e..00000000 --- a/katabatic/doc/images/Makefile.am +++ /dev/null @@ -1,65 +0,0 @@ - - -EXTRA_DIST = AutoInvalidate-1.fig \ - AutoContact-1.fig \ - AutoContact-2.fig \ - AutoContact-3.fig \ - AutoContactG1-1.fig \ - AutoContactG2-1.fig \ - AutoContactG3-1.fig \ - AutoContactG3-2.fig \ - AutoContactG3-3.fig \ - AutoContactG3-4.fig \ - AutoContactG4-1.fig \ - AutoContactG4-2.fig \ - AutoContactG4-3.fig \ - AutoContactG4-4.fig \ - AutoContactG4-5.fig \ - LegalConstruct-1.fig \ - LegalConstruct-2.fig \ - LegalConstruct-3.fig \ - LegalConstruct-4.fig \ - LegalConstruct-5.fig \ - LegalConstruct-6.fig \ - AutoSegmentCollapse-1.fig \ - AutoSegmentCollapse-2.fig \ - AutoSegmentCollapse-3.fig \ - AutoSegmentCollapse-4.fig \ - AutoSegmentCollapse-5.fig \ - AutoSegmentCollapse-6.fig \ - PerpandicularState-1.fig \ - PerpandicularState-2.fig \ - PerpandicularState-3.fig \ - PerpandicularState-4.fig \ - NetConstraints-1.fig \ - NetConstraints-2.fig \ - NetConstraints-3.fig \ - NetConstraints-4.fig \ - NetOptimals-1.fig \ - NetOptimals-2.fig \ - NetOptimals-3.fig \ - NetOptimals-4.fig \ - SplitAutoContact-1.fig \ - SplitAutoContact-2.fig \ - SplitAutoContact-3.fig \ - SplitAutoContact-4.fig \ - SplitAutoContact-5.fig \ - SplitAutoContact-6.fig \ - FCellConfiguration-1.fig \ - FCellConfiguration-2.fig \ - FCellConfiguration-3.fig \ - FCellConfiguration-4.fig \ - FCellConfiguration-5.fig \ - FCellConfiguration-6.fig \ - FCellConfiguration-7.fig \ - FCellConfiguration-10.fig \ - FCellConfiguration-11.fig \ - FCellConfiguration-12.fig \ - FCellConfiguration-13.fig \ - FCellConfiguration-14.fig \ - FCellConfiguration-15.fig \ - FCellConfiguration-16.fig \ - FCellConfiguration-17.fig \ - FCellConfiguration-18.fig \ - FCellConfiguration-19.fig \ - FCellConfiguration-20.fig diff --git a/katabatic/doc/images/Makefile.in b/katabatic/doc/images/Makefile.in deleted file mode 100644 index 19113af0..00000000 --- a/katabatic/doc/images/Makefile.in +++ /dev/null @@ -1,403 +0,0 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = ../.. -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -build_triplet = @build@ -host_triplet = @host@ -subdir = doc/images -DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_CLEAN_FILES = -SOURCES = -DIST_SOURCES = -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CORIOLIS_CFLAGS = @CORIOLIS_CFLAGS@ -CORIOLIS_CONFIG = @CORIOLIS_CONFIG@ -CORIOLIS_LIBS = @CORIOLIS_LIBS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DEVEL_LIBS = @DEVEL_LIBS@ -ECHO = @ECHO@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -F77 = @F77@ -FFLAGS = @FFLAGS@ -GTK_CFLAGS = @GTK_CFLAGS@ -GTK_CONFIG = @GTK_CONFIG@ -GTK_LIBS = @GTK_LIBS@ -HURRICANE_CFLAGS = @HURRICANE_CFLAGS@ -HURRICANE_LIBS = @HURRICANE_LIBS@ -HUR_CONFIG = @HUR_CONFIG@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -KATABATIC_DLL_VERSION = @KATABATIC_DLL_VERSION@ -LDFLAGS = @LDFLAGS@ -LEFDEF_CFLAGS = @LEFDEF_CFLAGS@ -LEFDEF_CONFIG = @LEFDEF_CONFIG@ -LEFDEF_LIBS = @LEFDEF_LIBS@ -LEFDEF_LIBXXS = @LEFDEF_LIBXXS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PYTHON = @PYTHON@ -PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@ -PYTHON_LIBS = @PYTHON_LIBS@ -PYTHON_LIB_PATH = @PYTHON_LIB_PATH@ -PYTHON_PLATFORM = @PYTHON_PLATFORM@ -PYTHON_PREFIX = @PYTHON_PREFIX@ -PYTHON_VERSION = @PYTHON_VERSION@ -RANLIB = @RANLIB@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -SUNLD_FALSE = @SUNLD_FALSE@ -SUNLD_TRUE = @SUNLD_TRUE@ -VERSION = @VERSION@ -XML2_CONFIG = @XML2_CONFIG@ -XML_CPPFLAGS = @XML_CPPFLAGS@ -XML_LIBS = @XML_LIBS@ -ac_ct_AR = @ac_ct_AR@ -ac_ct_CC = @ac_ct_CC@ -ac_ct_CXX = @ac_ct_CXX@ -ac_ct_F77 = @ac_ct_F77@ -ac_ct_RANLIB = @ac_ct_RANLIB@ -ac_ct_STRIP = @ac_ct_STRIP@ -am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ -am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build = @build@ -build_alias = @build_alias@ -build_cpu = @build_cpu@ -build_os = @build_os@ -build_vendor = @build_vendor@ -datadir = @datadir@ -exec_prefix = @exec_prefix@ -host = @host@ -host_alias = @host_alias@ -host_cpu = @host_cpu@ -host_os = @host_os@ -host_vendor = @host_vendor@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pkgpyexecdir = @pkgpyexecdir@ -pkgpythondir = @pkgpythondir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -pyexecdir = @pyexecdir@ -pythondir = @pythondir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -EXTRA_DIST = AutoInvalidate-1.fig \ - AutoContact-1.fig \ - AutoContact-2.fig \ - AutoContact-3.fig \ - AutoContactG1-1.fig \ - AutoContactG2-1.fig \ - AutoContactG3-1.fig \ - AutoContactG3-2.fig \ - AutoContactG3-3.fig \ - AutoContactG3-4.fig \ - AutoContactG4-1.fig \ - AutoContactG4-2.fig \ - AutoContactG4-3.fig \ - AutoContactG4-4.fig \ - AutoContactG4-5.fig \ - LegalConstruct-1.fig \ - LegalConstruct-2.fig \ - LegalConstruct-3.fig \ - LegalConstruct-4.fig \ - LegalConstruct-5.fig \ - LegalConstruct-6.fig \ - AutoSegmentCollapse-1.fig \ - AutoSegmentCollapse-2.fig \ - AutoSegmentCollapse-3.fig \ - AutoSegmentCollapse-4.fig \ - AutoSegmentCollapse-5.fig \ - AutoSegmentCollapse-6.fig \ - PerpandicularState-1.fig \ - PerpandicularState-2.fig \ - PerpandicularState-3.fig \ - PerpandicularState-4.fig \ - NetConstraints-1.fig \ - NetConstraints-2.fig \ - NetConstraints-3.fig \ - NetConstraints-4.fig \ - NetOptimals-1.fig \ - NetOptimals-2.fig \ - NetOptimals-3.fig \ - NetOptimals-4.fig \ - SplitAutoContact-1.fig \ - SplitAutoContact-2.fig \ - SplitAutoContact-3.fig \ - SplitAutoContact-4.fig \ - SplitAutoContact-5.fig \ - SplitAutoContact-6.fig \ - FCellConfiguration-1.fig \ - FCellConfiguration-2.fig \ - FCellConfiguration-3.fig \ - FCellConfiguration-4.fig \ - FCellConfiguration-5.fig \ - FCellConfiguration-6.fig \ - FCellConfiguration-7.fig \ - FCellConfiguration-10.fig \ - FCellConfiguration-11.fig \ - FCellConfiguration-12.fig \ - FCellConfiguration-13.fig \ - FCellConfiguration-14.fig \ - FCellConfiguration-15.fig \ - FCellConfiguration-16.fig \ - FCellConfiguration-17.fig \ - FCellConfiguration-18.fig \ - FCellConfiguration-19.fig \ - FCellConfiguration-20.fig - -all: all-am - -.SUFFIXES: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/images/Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign doc/images/Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -distclean-libtool: - -rm -f libtool -uninstall-info-am: -tags: TAGS -TAGS: - -ctags: CTAGS -CTAGS: - - -distdir: $(DISTFILES) - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done -check-am: all-am -check: check-am -all-am: Makefile -installdirs: -install: install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." -clean: clean-am - -clean-am: clean-generic clean-libtool mostlyclean-am - -distclean: distclean-am - -rm -f Makefile -distclean-am: clean-am distclean-generic distclean-libtool - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-generic mostlyclean-libtool - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: all all-am check check-am clean clean-generic clean-libtool \ - distclean distclean-generic distclean-libtool distdir dvi \ - dvi-am html html-am info info-am install install-am \ - install-data install-data-am install-exec install-exec-am \ - install-info install-info-am install-man install-strip \ - installcheck installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-generic \ - mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \ - uninstall-info-am - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/katabatic/doc/images/NetConstraints-1.fig b/katabatic/doc/images/NetConstraints-1.fig deleted file mode 100644 index 55487b6a..00000000 --- a/katabatic/doc/images/NetConstraints-1.fig +++ /dev/null @@ -1,78 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 0 4185 4275 4950 -1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 270 4770 90 90 180 4770 360 4770 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 45 4590 495 4590 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 1 2 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 45 4365 495 4365 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 4185 2925 4950 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 0 4185 4275 4185 4275 4950 -4 0 0 40 -1 18 12 0.0000 4 180 1230 720 4860 Starting Point\001 -4 0 0 40 -1 18 12 0.0000 4 180 2025 720 4635 Constraint Propagation\001 -4 0 0 40 -1 18 12 0.0000 4 180 735 720 4410 Collapse\001 -4 0 0 40 -1 18 12 0.0000 4 135 165 3195 4500 L:\001 -4 0 0 40 -1 18 12 0.0000 4 135 210 3195 4770 G:\001 -4 0 0 40 -1 18 12 0.0000 4 135 465 3510 4500 Local\001 -4 0 0 40 -1 18 12 0.0000 4 135 555 3510 4770 Global\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 2700 90 90 360 2700 540 2700 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 2700 90 90 2610 2700 2790 2700 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 3825 90 90 1485 3825 1665 3825 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 1575 90 90 2610 1575 2790 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 1575 90 90 3735 1575 3915 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 450 90 90 3735 450 3915 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4950 450 90 90 4860 450 5040 450 -1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 1575 2700 90 90 1485 2700 1665 2700 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5400 0 5400 4950 0 4950 0 0 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 540 2700 1485 2700 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1665 2700 2610 2700 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1575 2790 1575 3735 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 1665 2700 2610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2790 1575 3735 1575 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3825 540 3825 1485 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3915 450 4860 450 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 - 3 1 1.00 60.00 120.00 - 1350 2790 675 2790 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 - 3 1 1.00 60.00 120.00 - 1485 2925 1485 3600 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 - 3 1 1.00 60.00 120.00 - 1800 2790 2475 2790 -3 2 0 1 12 7 40 -1 -1 0.000 0 1 1 4 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 3735 495 3600 765 3600 1215 3780 1530 - 0.000 -1.000 -1.000 0.000 -4 1 0 40 -1 18 12 0.0000 4 135 150 990 2655 G\001 -4 1 0 40 -1 18 12 0.0000 4 135 150 1710 3330 G\001 -4 1 0 40 -1 18 12 0.0000 4 135 150 3240 1530 G\001 -4 1 0 40 -1 18 12 0.0000 4 135 150 4365 405 G\001 -4 1 0 40 -1 18 12 0.0000 4 135 105 2115 2655 L\001 -4 1 0 40 -1 18 12 0.0000 4 135 105 2835 2205 L\001 -4 1 0 40 -1 18 12 0.0000 4 135 105 3960 1080 L\001 -4 1 12 40 -1 19 12 0.0000 4 135 240 1035 2970 dX\001 -4 1 12 40 -1 19 12 0.0000 4 135 210 1305 3330 dY\001 -4 1 12 40 -1 19 12 0.0000 4 135 240 2115 2970 dX\001 diff --git a/katabatic/doc/images/NetConstraints-2.fig b/katabatic/doc/images/NetConstraints-2.fig deleted file mode 100644 index 9a20b85c..00000000 --- a/katabatic/doc/images/NetConstraints-2.fig +++ /dev/null @@ -1,75 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 0 3060 4275 3825 -1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 270 3645 90 90 180 3645 360 3645 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 45 3465 495 3465 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 1 2 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 45 3240 495 3240 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 3060 2925 3825 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 0 3060 4275 3060 4275 3825 -4 0 0 40 -1 18 12 0.0000 4 180 1230 720 3735 Starting Point\001 -4 0 0 40 -1 18 12 0.0000 4 180 2025 720 3510 Constraint Propagation\001 -4 0 0 40 -1 18 12 0.0000 4 180 735 720 3285 Collapse\001 -4 0 0 40 -1 18 12 0.0000 4 135 165 3195 3375 L:\001 -4 0 0 40 -1 18 12 0.0000 4 135 210 3195 3645 G:\001 -4 0 0 40 -1 18 12 0.0000 4 135 465 3510 3375 Local\001 -4 0 0 40 -1 18 12 0.0000 4 135 555 3510 3645 Global\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 1575 90 90 360 1575 540 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 1575 90 90 2610 1575 2790 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 2700 90 90 1485 2700 1665 2700 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 450 90 90 2610 450 2790 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 450 90 90 3735 450 3915 450 -1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 1575 1575 90 90 1485 1575 1665 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 450 135 135 3690 450 3960 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4950 450 90 90 4860 450 5040 450 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 540 1575 1485 1575 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1665 1575 2610 1575 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1575 1665 1575 2610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 540 2700 1485 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 - 3 1 1.00 60.00 120.00 - 1350 1665 675 1665 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 - 3 1 1.00 60.00 120.00 - 1485 1800 1485 2475 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 - 3 1 1.00 60.00 120.00 - 1800 1665 2475 1665 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2790 450 3690 450 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3960 450 4860 450 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5400 0 5400 3825 0 3825 0 0 -3 2 0 1 12 7 40 -1 -1 0.000 0 1 1 4 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 1620 1485 1890 1350 2385 1350 2655 1485 - 0.000 -1.000 -1.000 0.000 -4 1 0 40 -1 18 12 0.0000 4 135 150 990 1530 G\001 -4 1 0 40 -1 18 12 0.0000 4 135 150 1710 2205 G\001 -4 1 0 40 -1 18 12 0.0000 4 135 150 3240 405 G\001 -4 1 0 40 -1 18 12 0.0000 4 135 105 2115 1530 L\001 -4 1 0 40 -1 18 12 0.0000 4 135 105 2835 1080 L\001 -4 1 12 40 -1 19 12 0.0000 4 135 240 1035 1845 dX\001 -4 1 12 40 -1 19 12 0.0000 4 135 210 1305 2205 dY\001 -4 1 12 40 -1 19 12 0.0000 4 135 240 2115 1845 dX\001 -4 1 0 40 -1 18 12 0.0000 4 135 150 4365 405 G\001 diff --git a/katabatic/doc/images/NetConstraints-3.fig b/katabatic/doc/images/NetConstraints-3.fig deleted file mode 100644 index fcce99ce..00000000 --- a/katabatic/doc/images/NetConstraints-3.fig +++ /dev/null @@ -1,72 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 0 3060 4275 3825 -1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 270 3645 90 90 180 3645 360 3645 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 45 3465 495 3465 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 1 2 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 45 3240 495 3240 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 3060 2925 3825 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 0 3060 4275 3060 4275 3825 -4 0 0 40 -1 18 12 0.0000 4 180 1230 720 3735 Starting Point\001 -4 0 0 40 -1 18 12 0.0000 4 180 2025 720 3510 Constraint Propagation\001 -4 0 0 40 -1 18 12 0.0000 4 180 735 720 3285 Collapse\001 -4 0 0 40 -1 18 12 0.0000 4 135 165 3195 3375 L:\001 -4 0 0 40 -1 18 12 0.0000 4 135 210 3195 3645 G:\001 -4 0 0 40 -1 18 12 0.0000 4 135 465 3510 3375 Local\001 -4 0 0 40 -1 18 12 0.0000 4 135 555 3510 3645 Global\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 1575 90 90 360 1575 540 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 2700 90 90 1485 2700 1665 2700 -1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 1575 1575 90 90 1485 1575 1665 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1575 135 135 1440 1575 1710 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 450 90 90 1485 450 1665 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 450 90 90 2610 450 2790 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 450 135 135 2565 450 2835 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 450 90 90 3735 450 3915 450 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 - 3 1 1.00 60.00 120.00 - 1350 1665 675 1665 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 - 3 1 1.00 60.00 120.00 - 1485 1800 1485 2475 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5400 0 5400 3825 0 3825 0 0 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1665 450 2565 450 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2835 450 3735 450 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1575 540 1575 1440 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 540 1575 1440 1575 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1575 1710 1575 2610 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 - 3 1 1.00 60.00 120.00 - 1485 1350 1485 675 -3 2 0 1 12 7 40 -1 -1 0.000 0 1 1 4 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 1665 495 2025 765 2025 1260 1665 1485 - 0.000 -1.000 -1.000 0.000 -4 1 0 40 -1 18 12 0.0000 4 135 150 990 1530 G\001 -4 1 0 40 -1 18 12 0.0000 4 135 150 1710 2205 G\001 -4 1 12 40 -1 19 12 0.0000 4 135 240 1035 1845 dX\001 -4 1 12 40 -1 19 12 0.0000 4 135 210 1305 2205 dY\001 -4 1 0 40 -1 18 12 0.0000 4 135 150 2115 405 G\001 -4 1 0 40 -1 18 12 0.0000 4 135 150 3240 405 G\001 -4 1 0 40 -1 18 12 0.0000 4 135 105 1710 1080 L\001 -4 1 12 40 -1 19 12 0.0000 4 135 210 1305 1125 dY\001 diff --git a/katabatic/doc/images/NetConstraints-4.fig b/katabatic/doc/images/NetConstraints-4.fig deleted file mode 100644 index 63a05d53..00000000 --- a/katabatic/doc/images/NetConstraints-4.fig +++ /dev/null @@ -1,68 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 0 2160 4275 2925 -1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 270 2745 90 90 180 2745 360 2745 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 45 2565 495 2565 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 -1 1 1 2 - 3 1 1.00 60.00 120.00 - 3 1 1.00 60.00 120.00 - 45 2340 495 2340 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2925 2160 2925 2925 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 0 2160 4275 2160 4275 2925 -4 0 0 40 -1 18 12 0.0000 4 180 1230 720 2835 Starting Point\001 -4 0 0 40 -1 18 12 0.0000 4 180 2025 720 2610 Constraint Propagation\001 -4 0 0 40 -1 18 12 0.0000 4 180 735 720 2385 Collapse\001 -4 0 0 40 -1 18 12 0.0000 4 135 165 3195 2475 L:\001 -4 0 0 40 -1 18 12 0.0000 4 135 210 3195 2745 G:\001 -4 0 0 40 -1 18 12 0.0000 4 135 465 3510 2475 Local\001 -4 0 0 40 -1 18 12 0.0000 4 135 555 3510 2745 Global\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 450 675 90 90 360 675 540 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 1800 90 90 1485 1800 1665 1800 -1 4 0 2 0 0 40 -1 20 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 135 135 1440 675 1710 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 180 180 1395 675 1755 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 675 90 90 2610 675 2790 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2700 675 135 135 2565 675 2835 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3825 675 90 90 3735 675 3915 675 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 - 3 1 1.00 60.00 120.00 - 1350 765 675 765 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 1 0 2 - 3 1 1.00 60.00 120.00 - 1485 900 1485 1575 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 540 675 1395 675 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1575 855 1575 1710 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2835 675 3735 675 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1755 675 2565 675 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 0 1 2 - 3 1 1.00 60.00 120.00 - 2475 765 1800 765 -2 1 0 1 12 7 40 -1 -1 0.000 0 0 7 0 1 2 - 3 1 1.00 60.00 120.00 - 3600 765 2925 765 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 5400 0 5400 2925 0 2925 0 0 -4 1 0 40 -1 18 12 0.0000 4 135 150 990 630 G\001 -4 1 0 40 -1 18 12 0.0000 4 135 150 1710 1305 G\001 -4 1 12 40 -1 19 12 0.0000 4 135 240 1035 945 dX\001 -4 1 12 40 -1 19 12 0.0000 4 135 210 1305 1305 dY\001 -4 1 0 40 -1 18 12 0.0000 4 135 150 2115 630 G\001 -4 1 0 40 -1 18 12 0.0000 4 135 150 3240 630 G\001 -4 1 12 40 -1 19 12 0.0000 4 135 240 2070 945 dX\001 -4 1 12 40 -1 19 12 0.0000 4 135 240 3195 945 dX\001 diff --git a/katabatic/doc/images/NetOptimals-1.fig b/katabatic/doc/images/NetOptimals-1.fig deleted file mode 100644 index 3b00a325..00000000 --- a/katabatic/doc/images/NetOptimals-1.fig +++ /dev/null @@ -1,146 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 405 225 3195 6795 -6 2340 1305 2610 2070 -2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 - 2430 1350 2520 1350 2520 2025 2430 2025 2430 1350 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 1710 2565 1710 2565 1890 2385 1890 2385 1710 --6 -6 990 3105 1260 3870 -2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 - 1080 3150 1170 3150 1170 3825 1080 3825 1080 3150 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1035 3285 1215 3285 1215 3465 1035 3465 1035 3285 --6 -6 2340 2880 2610 3645 -2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 - 2430 2925 2520 2925 2520 3600 2430 3600 2430 2925 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2385 3060 2565 3060 2565 3240 2385 3240 2385 3060 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 4275 90 90 1485 4275 1665 4275 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 450 5625 3150 5625 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 675 4770 675 5850 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 1125 3870 1125 5850 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 2475 3645 2475 5850 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 2925 4770 2925 5850 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 2475 2070 2475 2880 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 675 5400 675 5625 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 1125 5400 1125 5625 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 2475 5400 2475 5625 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 2925 5400 2925 5625 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 1 0 2 - 3 1 2.00 120.00 240.00 - 2475 6525 2475 5940 -2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 2 - 675 2475 2880 2475 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1485 675 450 675 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1665 4275 3150 4275 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1215 3375 1575 3375 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2385 3150 1575 3150 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 2385 1800 1575 1800 -2 2 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 5 - 675 225 2925 225 2925 4725 675 4725 675 225 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1575 765 1575 4185 -4 0 12 40 -1 18 12 0.0000 4 135 105 765 5580 1\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 1215 5580 1\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 2565 5580 2\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 3015 5580 1\001 -4 1 12 40 -1 19 12 0.0000 4 180 660 2475 6750 Optimal\001 --6 -6 4005 225 6750 6345 -6 5940 1305 6210 2070 -2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 - 6030 1350 6120 1350 6120 2025 6030 2025 6030 1350 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5985 1710 6165 1710 6165 1890 5985 1890 5985 1710 --6 -6 4590 3105 4860 3870 -2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 - 4680 3150 4770 3150 4770 3825 4680 3825 4680 3150 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4635 3285 4815 3285 4815 3465 4635 3465 4635 3285 --6 -6 5940 2880 6210 3645 -2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 - 6030 2925 6120 2925 6120 3600 6030 3600 6030 2925 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5985 3060 6165 3060 6165 3240 5985 3240 5985 3060 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 675 90 90 5085 675 5265 675 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 4050 5625 6750 5625 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 4275 4770 4275 5850 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 4725 3870 4725 5850 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 6075 3645 6075 5850 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 6075 2070 6075 2880 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 4275 5400 4275 5625 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 4725 5400 4725 5625 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 6075 5400 6075 5625 -2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 2 - 4275 2475 6480 2475 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 5085 675 4050 675 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 4815 3375 5175 3375 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 5985 3150 5175 3150 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 5985 1800 5175 1800 -2 2 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 5 - 4275 225 6525 225 6525 4725 4275 4725 4275 225 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 5175 765 5175 3375 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 1 1 2 - 3 1 2.00 120.00 240.00 - 3 1 2.00 120.00 240.00 - 4725 6075 6075 6075 -4 0 12 40 -1 18 12 0.0000 4 135 105 4365 5580 1\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 4815 5580 1\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 6165 5580 2\001 -4 1 12 40 -1 19 12 0.0000 4 180 660 5400 6300 Optimal\001 --6 -6 1305 1980 1575 2295 -2 2 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 5 - 1350 2025 1530 2025 1530 2250 1350 2250 1350 2025 -4 1 0 40 -1 18 12 0.0000 4 135 120 1440 2205 A\001 --6 -6 4905 1980 5175 2295 -2 2 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 5 - 4950 2025 5130 2025 5130 2250 4950 2250 4950 2025 -4 1 0 40 -1 18 12 0.0000 4 135 120 5040 2205 A\001 --6 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 7200 0 7200 6975 0 6975 0 0 diff --git a/katabatic/doc/images/NetOptimals-2.fig b/katabatic/doc/images/NetOptimals-2.fig deleted file mode 100644 index e9cc4a9e..00000000 --- a/katabatic/doc/images/NetOptimals-2.fig +++ /dev/null @@ -1,80 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 1575 1755 1845 2070 -2 2 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 5 - 1620 1800 1800 1800 1800 2025 1620 2025 1620 1800 -4 1 0 40 -1 18 12 0.0000 4 135 120 1710 1980 A\001 --6 -6 5175 1755 5445 2070 -2 2 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 5 - 5220 1800 5400 1800 5400 2025 5220 2025 5220 1800 -4 1 0 40 -1 18 12 0.0000 4 135 120 5310 1980 A\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 4275 90 90 1485 4275 1665 4275 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 675 90 90 5085 675 5265 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 4275 90 90 5085 4275 5265 4275 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 7200 0 7200 6975 0 6975 0 0 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 450 5625 3150 5625 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 675 4770 675 5850 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 2925 4770 2925 5850 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 675 5400 675 5625 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 2925 5400 2925 5625 -2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 2 - 675 2475 2880 2475 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1485 675 450 675 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1665 4275 3150 4275 -2 2 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 5 - 675 225 2925 225 2925 4725 675 4725 675 225 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1575 765 1575 4185 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 4050 5625 6750 5625 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 4275 4770 4275 5850 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 4275 5400 4275 5625 -2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 2 - 4275 2475 6480 2475 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 5085 675 4050 675 -2 2 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 5 - 4275 225 6525 225 6525 4725 4275 4725 4275 225 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 5175 765 5175 4185 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 6750 4275 5265 4275 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 6750 675 5265 675 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 6525 5400 6525 5625 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 6525 4770 6525 5850 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 1 0 2 - 3 1 2.00 120.00 240.00 - 6525 6570 6525 5985 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 1 1 2 - 3 1 2.00 120.00 240.00 - 3 1 2.00 120.00 240.00 - 675 6075 2925 6075 -4 0 12 40 -1 18 12 0.0000 4 135 105 765 5580 1\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 3015 5580 1\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 4365 5580 1\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 6615 5580 2\001 -4 1 12 40 -1 19 12 0.0000 4 180 660 6525 6750 Optimal\001 -4 1 12 40 -1 19 12 0.0000 4 180 660 1800 6255 Optimal\001 diff --git a/katabatic/doc/images/NetOptimals-3.fig b/katabatic/doc/images/NetOptimals-3.fig deleted file mode 100644 index 3a96cb69..00000000 --- a/katabatic/doc/images/NetOptimals-3.fig +++ /dev/null @@ -1,109 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 405 225 3150 5850 -6 1980 3240 2745 3510 -2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 - 2025 3420 2025 3330 2700 3330 2700 3420 2025 3420 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2160 3465 2160 3285 2340 3285 2340 3465 2160 3465 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 675 90 90 1485 675 1665 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1575 3375 90 90 1485 3375 1665 3375 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 450 5625 3150 5625 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 675 4770 675 5850 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 675 5400 675 5625 -2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 2 - 675 2475 2880 2475 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1485 675 450 675 -2 2 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 5 - 675 225 2925 225 2925 4725 675 4725 675 225 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1575 765 1575 3285 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 1665 3375 2160 3375 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 2025 3465 2025 5850 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 2700 3465 2700 5850 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 2025 5400 2025 5625 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 2700 5400 2700 5625 -4 0 12 40 -1 18 12 0.0000 4 135 105 765 5580 1\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 2115 5580 1\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 2790 5580 1\001 --6 -6 5580 3240 6345 3510 -2 2 0 2 0 7 50 -1 44 0.000 0 0 -1 0 0 5 - 5625 3420 5625 3330 6300 3330 6300 3420 5625 3420 -2 2 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5760 3465 5760 3285 5940 3285 5940 3465 5760 3465 --6 -6 5175 1305 5445 1620 -2 2 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 5 - 5220 1350 5400 1350 5400 1575 5220 1575 5220 1350 -4 1 0 40 -1 18 12 0.0000 4 135 120 5310 1530 A\001 --6 -6 1575 1350 1845 1665 -2 2 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 5 - 1620 1395 1800 1395 1800 1620 1620 1620 1620 1395 -4 1 0 40 -1 18 12 0.0000 4 135 120 1710 1575 A\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5175 675 90 90 5085 675 5265 675 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5180 4285 90 90 5090 4285 5270 4285 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 7200 0 7200 6975 0 6975 0 0 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 1 0 2 - 3 1 2.00 120.00 240.00 - 2025 6525 2025 5940 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 4050 5625 6750 5625 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 4275 4770 4275 5850 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 4275 5400 4275 5625 -2 1 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 2 - 4275 2475 6480 2475 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 5085 675 4050 675 -2 2 3 1 0 7 40 -1 -1 4.000 0 0 -1 0 0 5 - 4275 225 6525 225 6525 4725 4275 4725 4275 225 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 5175 765 5175 4185 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 5175 3375 5760 3375 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 5625 3465 5625 5850 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 6300 3465 6300 5850 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 5625 5400 5625 5625 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 6300 5400 6300 5625 -2 1 0 2 0 7 40 -1 -1 6.000 0 0 -1 0 0 2 - 6750 4275 5265 4275 -2 1 0 1 12 7 40 -1 -1 4.000 0 0 7 0 0 2 - 6525 4770 6525 5850 -2 1 0 4 12 7 40 -1 -1 10.000 0 0 -1 0 0 2 - 6525 5400 6525 5625 -2 1 0 2 12 7 40 -1 -1 6.000 0 0 -1 1 1 2 - 3 1 2.00 120.00 240.00 - 3 1 2.00 120.00 240.00 - 5625 6075 6300 6075 -4 1 12 40 -1 19 12 0.0000 4 180 660 2025 6750 Optimal\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 4365 5580 1\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 5715 5580 1\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 6390 5580 1\001 -4 0 12 40 -1 18 12 0.0000 4 135 105 6615 5580 1\001 -4 1 12 40 -1 19 12 0.0000 4 180 660 5940 6300 Optimal\001 diff --git a/katabatic/doc/images/PerpandicularState-1.fig b/katabatic/doc/images/PerpandicularState-1.fig deleted file mode 100644 index ebdb61a7..00000000 --- a/katabatic/doc/images/PerpandicularState-1.fig +++ /dev/null @@ -1,102 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 90 315 3105 1755 -6 495 1215 1035 1485 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 495 1215 1035 1215 1035 1485 495 1485 495 1215 -4 1 0 40 -1 14 12 0.0000 4 165 420 765 1395 Cg--\001 --6 -6 1620 1215 2160 1485 -2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1620 1215 2160 1215 2160 1485 1620 1485 1620 1215 -4 1 18 40 -1 14 12 0.0000 4 135 420 1890 1395 --g-\001 --6 -6 2565 855 3105 1125 -2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2565 855 3105 855 3105 1125 2565 1125 2565 855 -4 1 1 40 -1 14 12 0.0000 4 15 420 2835 1035 ----\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 225 1575 90 90 135 1575 315 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 90 90 1260 1575 1440 1575 -1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 135 135 1215 1575 1485 1575 -1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 2475 1575 90 90 2385 1575 2565 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2475 450 90 90 2385 450 2565 450 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 315 1575 1215 1575 -2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1485 1575 2385 1575 -2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2475 540 2475 1485 --6 -6 3465 315 7875 2835 -6 4770 2025 5310 2295 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4770 2025 5310 2025 5310 2295 4770 2295 4770 2025 -4 1 0 40 -1 14 12 0.0000 4 90 420 5040 2205 -c--\001 --6 -6 3870 2340 4410 2610 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3870 2340 4410 2340 4410 2610 3870 2610 3870 2340 -4 1 0 40 -1 14 12 0.0000 4 165 420 4140 2520 Cg--\001 --6 -6 4995 1215 5535 1485 -2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4995 1215 5535 1215 5535 1485 4995 1485 4995 1215 -4 1 18 40 -1 14 12 0.0000 4 135 420 5265 1395 --g-\001 --6 -6 5940 900 6480 1170 -2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5940 900 6480 900 6480 1170 5940 1170 5940 900 -4 1 1 40 -1 14 12 0.0000 4 15 420 6210 1080 ----\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4725 2700 90 90 4635 2700 4815 2700 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4725 1575 90 90 4635 1575 4815 1575 -1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 5850 1575 90 90 5760 1575 5940 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5850 450 90 90 5760 450 5940 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3600 2700 90 90 3510 2700 3690 2700 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4725 1665 4725 2610 -2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4815 1575 5760 1575 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3690 2700 4635 2700 -2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5850 540 5850 1485 -2 1 0 1 1 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 6165 1845 6165 1170 -4 0 1 40 -1 14 12 0.0000 4 150 1785 6075 2025 PERPANDICULAR_ANY\001 --6 -6 2025 3555 3870 4860 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2565 3825 3645 3825 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2655 3825 2655 4050 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2970 3825 2970 4275 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3555 3825 3555 4680 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3240 3825 3240 4455 -4 1 0 40 -1 14 14 0.0000 4 195 945 3105 3735 C c g t\001 -4 2 0 40 -1 18 12 0.0000 4 135 840 2880 4185 Canonical\001 -4 2 0 40 -1 18 12 0.0000 4 180 840 3150 4410 Collapsed\001 -4 2 0 40 -1 18 12 0.0000 4 135 555 3465 4635 Global\001 -4 2 0 40 -1 18 12 0.0000 4 135 765 3870 4860 Terminal\001 --6 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 8325 0 8325 4950 0 4950 0 0 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1845 3375 1845 4950 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 0 3375 4050 3375 4050 4950 -4 0 1 40 -1 18 12 0.0000 4 135 645 90 3780 current\001 -4 0 0 40 -1 18 12 0.0000 4 135 630 90 4230 master\001 -4 0 18 40 -1 18 12 0.0000 4 135 1530 90 4680 source & contact\001 diff --git a/katabatic/doc/images/PerpandicularState-2.fig b/katabatic/doc/images/PerpandicularState-2.fig deleted file mode 100644 index 397bbe6e..00000000 --- a/katabatic/doc/images/PerpandicularState-2.fig +++ /dev/null @@ -1,113 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 2025 3555 3870 4860 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2565 3825 3645 3825 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2655 3825 2655 4050 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2970 3825 2970 4275 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3555 3825 3555 4680 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3240 3825 3240 4455 -4 1 0 40 -1 14 14 0.0000 4 195 945 3105 3735 C c g t\001 -4 2 0 40 -1 18 12 0.0000 4 135 840 2880 4185 Canonical\001 -4 2 0 40 -1 18 12 0.0000 4 180 840 3150 4410 Collapsed\001 -4 2 0 40 -1 18 12 0.0000 4 135 555 3465 4635 Global\001 -4 2 0 40 -1 18 12 0.0000 4 135 765 3870 4860 Terminal\001 --6 -6 5670 3150 6210 3420 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5670 3150 6210 3150 6210 3420 5670 3420 5670 3150 -4 1 0 40 -1 14 12 0.0000 4 90 420 5940 3330 -c--\001 --6 -6 4770 3465 5310 3735 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4770 3465 5310 3465 5310 3735 4770 3735 4770 3465 -4 1 0 40 -1 14 12 0.0000 4 165 420 5040 3645 Cg--\001 --6 -6 6840 900 7380 1170 -2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6840 900 7380 900 7380 1170 6840 1170 6840 900 -4 1 1 40 -1 14 12 0.0000 4 15 420 7110 1080 ----\001 --6 -6 495 1215 1035 1485 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 495 1215 1035 1215 1035 1485 495 1485 495 1215 -4 1 0 40 -1 14 12 0.0000 4 165 420 765 1395 Cg--\001 --6 -6 2565 855 3105 1125 -2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2565 855 3105 855 3105 1125 2565 1125 2565 855 -4 1 1 40 -1 14 12 0.0000 4 15 420 2835 1035 ----\001 --6 -6 5895 2385 6435 2655 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5895 2385 6435 2385 6435 2655 5895 2655 5895 2385 -4 1 0 40 -1 14 12 0.0000 4 135 420 6165 2565 -g--\001 --6 -6 1620 1260 2160 1530 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1620 1260 2160 1260 2160 1530 1620 1530 1620 1260 -4 1 0 40 -1 14 12 0.0000 4 135 420 1890 1440 -g--\001 --6 -6 6120 1980 6660 2250 -2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6120 1980 6660 1980 6660 2250 6120 2250 6120 1980 -4 1 18 40 -1 14 12 0.0000 4 90 420 6390 2160 -c--\001 --6 -6 2700 1755 3240 2025 -2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2700 1755 3240 1755 3240 2025 2700 2025 2700 1755 -4 1 18 40 -1 14 12 0.0000 4 90 420 2970 1935 -c--\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5625 3825 90 90 5535 3825 5715 3825 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5625 2700 90 90 5535 2700 5715 2700 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4500 3825 90 90 4410 3825 4590 3825 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 6750 450 90 90 6660 450 6840 450 -1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 6750 1575 90 90 6660 1575 6840 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 6750 2700 90 90 6660 2700 6840 2700 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 225 1575 90 90 135 1575 315 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 90 90 1260 1575 1440 1575 -1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 135 135 1215 1575 1485 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2475 450 90 90 2385 450 2565 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2475 1575 90 90 2385 1575 2565 1575 -1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 2475 1575 180 180 2295 1575 2655 1575 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1845 3375 1845 4950 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 0 3375 4050 3375 4050 4950 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 9675 0 9675 4950 0 4950 0 0 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5625 2790 5625 3735 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4590 3825 5535 3825 -2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 6750 540 6750 1485 -2 1 0 1 1 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 7065 1845 7065 1170 -2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 6750 1665 6750 2610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5715 2700 6660 2700 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 315 1575 1215 1575 -2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2475 540 2475 1395 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1485 1575 2295 1575 -4 0 1 40 -1 18 12 0.0000 4 135 645 90 3780 current\001 -4 0 0 40 -1 18 12 0.0000 4 135 630 90 4230 master\001 -4 0 18 40 -1 18 12 0.0000 4 135 1530 90 4680 source & contact\001 -4 0 1 40 -1 14 12 0.0000 4 150 1785 7020 2025 PERPANDICULAR_ANY\001 -4 0 1 40 -1 14 12 0.0000 4 150 2310 7020 2250 PERPANDICULAR_INDIRECT\001 diff --git a/katabatic/doc/images/PerpandicularState-3.fig b/katabatic/doc/images/PerpandicularState-3.fig deleted file mode 100644 index 30ee9aa4..00000000 --- a/katabatic/doc/images/PerpandicularState-3.fig +++ /dev/null @@ -1,108 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 2025 3555 3870 4860 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2565 3825 3645 3825 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2655 3825 2655 4050 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2970 3825 2970 4275 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3555 3825 3555 4680 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3240 3825 3240 4455 -4 1 0 40 -1 14 14 0.0000 4 195 945 3105 3735 C c g t\001 -4 2 0 40 -1 18 12 0.0000 4 135 840 2880 4185 Canonical\001 -4 2 0 40 -1 18 12 0.0000 4 180 840 3150 4410 Collapsed\001 -4 2 0 40 -1 18 12 0.0000 4 135 555 3465 4635 Global\001 -4 2 0 40 -1 18 12 0.0000 4 135 765 3870 4860 Terminal\001 --6 -6 4770 2025 5310 2295 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4770 2025 5310 2025 5310 2295 4770 2295 4770 2025 -4 1 0 40 -1 14 12 0.0000 4 90 420 5040 2205 -c--\001 --6 -6 3870 2340 4410 2610 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3870 2340 4410 2340 4410 2610 3870 2610 3870 2340 -4 1 0 40 -1 14 12 0.0000 4 165 420 4140 2520 Cg--\001 --6 -6 4995 1215 5535 1485 -2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4995 1215 5535 1215 5535 1485 4995 1485 4995 1215 -4 1 18 40 -1 14 12 0.0000 4 135 420 5265 1395 --g-\001 --6 -6 495 1215 1035 1485 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 495 1215 1035 1215 1035 1485 495 1485 495 1215 -4 1 0 40 -1 14 12 0.0000 4 165 420 765 1395 Cg--\001 --6 -6 1620 1215 2160 1485 -2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1620 1215 2160 1215 2160 1485 1620 1485 1620 1215 -4 1 18 40 -1 14 12 0.0000 4 135 420 1890 1395 --g-\001 --6 -6 2565 855 3105 1125 -2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2565 855 3105 855 3105 1125 2565 1125 2565 855 -4 1 1 40 -1 14 12 0.0000 4 15 420 2835 1035 ----\001 --6 -6 5940 900 6480 1170 -2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5940 900 6480 900 6480 1170 5940 1170 5940 900 -4 1 1 40 -1 14 12 0.0000 4 90 420 6210 1080 -c--\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4725 2700 90 90 4635 2700 4815 2700 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4725 1575 90 90 4635 1575 4815 1575 -1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 5850 1575 90 90 5760 1575 5940 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5850 450 90 90 5760 450 5940 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3600 2700 90 90 3510 2700 3690 2700 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 225 1575 90 90 135 1575 315 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 90 90 1260 1575 1440 1575 -1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 135 135 1215 1575 1485 1575 -1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 2475 1575 90 90 2385 1575 2565 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2475 450 90 90 2385 450 2565 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 6975 1575 90 90 6885 1575 7065 1575 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 8325 0 8325 4950 0 4950 0 0 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1845 3375 1845 4950 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 0 3375 4050 3375 4050 4950 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4725 1665 4725 2610 -2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4815 1575 5760 1575 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3690 2700 4635 2700 -2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5850 540 5850 1485 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 315 1575 1215 1575 -2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1485 1575 2385 1575 -2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2475 540 2475 1485 -2 1 0 1 1 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 6165 495 6165 900 -2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5940 1575 6885 1575 -2 1 0 1 1 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 6345 2340 6345 1935 -2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6120 1665 6660 1665 6660 1935 6120 1935 6120 1665 -4 0 1 40 -1 18 12 0.0000 4 135 645 90 3780 current\001 -4 0 0 40 -1 18 12 0.0000 4 135 630 90 4230 master\001 -4 0 18 40 -1 18 12 0.0000 4 135 1530 90 4680 source & contact\001 -4 0 1 40 -1 14 12 0.0000 4 90 420 6075 405 zero\001 -4 0 1 40 -1 14 12 0.0000 4 150 2100 5265 2520 PARALLEL_OR_EXPANDED\001 -4 1 1 40 -1 14 12 0.0000 4 165 420 6390 1845 Cg--\001 diff --git a/katabatic/doc/images/PerpandicularState-4.fig b/katabatic/doc/images/PerpandicularState-4.fig deleted file mode 100644 index c83e4aec..00000000 --- a/katabatic/doc/images/PerpandicularState-4.fig +++ /dev/null @@ -1,108 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 2025 3555 3870 4860 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2565 3825 3645 3825 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2655 3825 2655 4050 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2970 3825 2970 4275 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3555 3825 3555 4680 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3240 3825 3240 4455 -4 1 0 40 -1 14 14 0.0000 4 195 945 3105 3735 C c g t\001 -4 2 0 40 -1 18 12 0.0000 4 135 840 2880 4185 Canonical\001 -4 2 0 40 -1 18 12 0.0000 4 180 840 3150 4410 Collapsed\001 -4 2 0 40 -1 18 12 0.0000 4 135 555 3465 4635 Global\001 -4 2 0 40 -1 18 12 0.0000 4 135 765 3870 4860 Terminal\001 --6 -6 4770 2025 5310 2295 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4770 2025 5310 2025 5310 2295 4770 2295 4770 2025 -4 1 0 40 -1 14 12 0.0000 4 90 420 5040 2205 -c--\001 --6 -6 3870 2340 4410 2610 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 3870 2340 4410 2340 4410 2610 3870 2610 3870 2340 -4 1 0 40 -1 14 12 0.0000 4 165 420 4140 2520 Cg--\001 --6 -6 4995 1215 5535 1485 -2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 4995 1215 5535 1215 5535 1485 4995 1485 4995 1215 -4 1 18 40 -1 14 12 0.0000 4 135 420 5265 1395 --g-\001 --6 -6 495 1215 1035 1485 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 495 1215 1035 1215 1035 1485 495 1485 495 1215 -4 1 0 40 -1 14 12 0.0000 4 165 420 765 1395 Cg--\001 --6 -6 1620 1215 2160 1485 -2 2 0 1 18 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 1620 1215 2160 1215 2160 1485 1620 1485 1620 1215 -4 1 18 40 -1 14 12 0.0000 4 135 420 1890 1395 --g-\001 --6 -6 2565 855 3105 1125 -2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 2565 855 3105 855 3105 1125 2565 1125 2565 855 -4 1 1 40 -1 14 12 0.0000 4 15 420 2835 1035 ----\001 --6 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4725 2700 90 90 4635 2700 4815 2700 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 4725 1575 90 90 4635 1575 4815 1575 -1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 5850 1575 90 90 5760 1575 5940 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 5850 450 90 90 5760 450 5940 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 3600 2700 90 90 3510 2700 3690 2700 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 225 1575 90 90 135 1575 315 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 90 90 1260 1575 1440 1575 -1 4 0 1 0 7 40 -1 -1 0.000 1 0.0000 1350 1575 135 135 1215 1575 1485 1575 -1 4 0 4 18 7 40 -1 -1 0.000 1 0.0000 2475 1575 90 90 2385 1575 2565 1575 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 2475 450 90 90 2385 450 2565 450 -1 4 0 2 0 7 40 -1 -1 0.000 1 0.0000 6975 1575 90 90 6885 1575 7065 1575 -2 2 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 8325 0 8325 4950 0 4950 0 0 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1845 3375 1845 4950 -2 1 0 1 0 7 40 -1 -1 0.000 0 0 -1 0 0 3 - 0 3375 4050 3375 4050 4950 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4725 1665 4725 2610 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3690 2700 4635 2700 -2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5850 540 5850 1485 -2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 315 1575 1215 1575 -2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1485 1575 2385 1575 -2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2475 540 2475 1485 -2 1 0 1 1 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 6165 495 6165 900 -2 1 0 4 1 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 5940 1575 6885 1575 -2 1 0 1 1 7 40 -1 -1 0.000 0 0 -1 1 0 2 - 3 1 1.00 60.00 120.00 - 6345 2340 6345 1935 -2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 6120 1665 6660 1665 6660 1935 6120 1935 6120 1665 -2 2 0 1 1 7 40 -1 -1 0.000 0 0 -1 0 0 5 - 5940 900 6480 900 6480 1170 5940 1170 5940 900 -2 1 0 4 18 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 4815 1575 5895 1575 -4 0 1 40 -1 18 12 0.0000 4 135 645 90 3780 current\001 -4 0 0 40 -1 18 12 0.0000 4 135 630 90 4230 master\001 -4 0 18 40 -1 18 12 0.0000 4 135 1530 90 4680 source & contact\001 -4 1 1 40 -1 14 12 0.0000 4 135 420 6390 1845 -g--\001 -4 1 1 40 -1 14 12 0.0000 4 90 420 6210 1080 -c--\001 -# zero -4 0 1 40 -1 14 12 0.0000 4 90 420 6030 450 zero\001 -# zero -4 0 1 40 -1 14 12 0.0000 4 90 420 6120 2520 zero\001 diff --git a/katabatic/doc/images/SplitAutoContact-1.fig b/katabatic/doc/images/SplitAutoContact-1.fig deleted file mode 100644 index fedf34fc..00000000 --- a/katabatic/doc/images/SplitAutoContact-1.fig +++ /dev/null @@ -1,58 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 1710 90 2610 225 -4 0 0 50 -1 18 12 0.0000 4 135 270 1710 225 M2\001 -4 0 0 50 -1 19 12 0.0000 4 135 180 2070 225 to\001 -4 0 0 50 -1 18 12 0.0000 4 135 270 2340 225 M5\001 --6 -1 3 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 1800 90 90 1800 1800 1890 1800 -1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 1800 2700 90 90 1800 2700 1890 2700 -1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 2700 90 90 2700 2700 2790 2700 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 675 1845 1350 1845 1350 1755 675 1755 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 1800 1710 1800 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1800 1350 1800 1710 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 2700 2790 2700 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 2790 2700 3150 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1800 1890 1800 2610 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1890 2700 2610 2700 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 1755 675 1755 1350 1845 1350 1845 675 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 2745 3825 2745 3150 2655 3150 2655 3825 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 3825 2745 3150 2745 3150 2655 3825 2655 -2 2 3 1 0 7 60 -1 -1 8.000 0 0 -1 0 0 5 - 1080 1125 3375 1125 3375 3375 1080 3375 1080 1125 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 225 4140 675 4140 -2 1 0 4 12 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 225 4365 675 4365 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 - 0 3960 2025 3960 2025 4500 -2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 4275 0 4275 4500 0 4500 0 0 -4 1 0 40 -1 18 12 0.0000 4 135 270 3690 2610 M4\001 -4 1 0 40 -1 18 12 0.0000 4 135 270 2925 3825 M5\001 -4 1 0 40 -1 18 12 0.0000 4 135 270 2025 810 M3\001 -4 1 0 40 -1 18 12 0.0000 4 135 270 810 1710 M2\001 -4 1 0 60 -1 18 12 0.0000 4 135 330 2115 1845 C23\001 -4 1 12 60 -1 18 12 0.0000 4 135 330 1485 2745 C34\001 -4 1 12 60 -1 18 12 0.0000 4 135 330 2655 2565 C45\001 -4 0 0 50 -1 18 12 0.0000 4 135 405 810 4410 New\001 -4 0 0 50 -1 18 12 0.0000 4 180 1065 810 4185 Pre-existing\001 -4 1 12 60 -1 18 12 0.0000 4 135 270 1980 2340 M3\001 -4 1 12 60 -1 18 12 0.0000 4 135 270 2250 2655 M4\001 diff --git a/katabatic/doc/images/SplitAutoContact-2.fig b/katabatic/doc/images/SplitAutoContact-2.fig deleted file mode 100644 index a93b4700..00000000 --- a/katabatic/doc/images/SplitAutoContact-2.fig +++ /dev/null @@ -1,53 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 1710 90 2610 225 -4 0 0 50 -1 18 12 0.0000 4 135 270 1710 225 M2\001 -4 0 0 50 -1 19 12 0.0000 4 135 180 2070 225 to\001 -4 0 0 50 -1 18 12 0.0000 4 135 270 2340 225 M5\001 --6 -1 3 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 1800 90 90 1800 1800 1890 1800 -1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 1800 2700 90 90 1800 2700 1890 2700 -1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 2700 90 90 2700 2700 2790 2700 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 675 1845 1350 1845 1350 1755 675 1755 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 1800 1710 1800 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 2700 2790 2700 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 2790 2700 3150 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1800 1890 1800 2610 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1890 2700 2610 2700 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 2745 3825 2745 3150 2655 3150 2655 3825 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 3825 2745 3150 2745 3150 2655 3825 2655 -2 2 3 1 0 7 60 -1 -1 8.000 0 0 -1 0 0 5 - 1080 1125 3375 1125 3375 3375 1080 3375 1080 1125 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 225 4140 675 4140 -2 1 0 4 12 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 225 4365 675 4365 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 - 0 3960 2025 3960 2025 4500 -2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 4275 0 4275 4500 0 4500 0 0 -4 1 0 40 -1 18 12 0.0000 4 135 270 3690 2610 M4\001 -4 1 0 40 -1 18 12 0.0000 4 135 270 2925 3825 M5\001 -4 1 0 40 -1 18 12 0.0000 4 135 270 810 1710 M2\001 -4 1 0 60 -1 18 12 0.0000 4 135 330 2115 1845 C23\001 -4 1 12 60 -1 18 12 0.0000 4 135 330 1485 2745 C34\001 -4 1 12 60 -1 18 12 0.0000 4 135 330 2655 2565 C45\001 -4 0 0 50 -1 18 12 0.0000 4 135 405 810 4410 New\001 -4 0 0 50 -1 18 12 0.0000 4 180 1065 810 4185 Pre-existing\001 -4 1 12 60 -1 18 12 0.0000 4 135 270 1980 2340 M3\001 -4 1 12 60 -1 18 12 0.0000 4 135 270 2250 2655 M4\001 diff --git a/katabatic/doc/images/SplitAutoContact-3.fig b/katabatic/doc/images/SplitAutoContact-3.fig deleted file mode 100644 index 16aa86ce..00000000 --- a/katabatic/doc/images/SplitAutoContact-3.fig +++ /dev/null @@ -1,48 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -6 1710 90 2610 225 -4 0 0 50 -1 18 12 0.0000 4 135 270 1710 225 M2\001 -4 0 0 50 -1 19 12 0.0000 4 135 180 2070 225 to\001 -4 0 0 50 -1 18 12 0.0000 4 135 270 2340 225 M5\001 --6 -1 3 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 1800 90 90 1800 1800 1890 1800 -1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 1800 2700 90 90 1800 2700 1890 2700 -1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 2700 90 90 2700 2700 2790 2700 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 675 1845 1350 1845 1350 1755 675 1755 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 1800 1710 1800 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 2790 2700 3150 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1800 1890 1800 2610 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1890 2700 2610 2700 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 2745 3825 2745 3150 2655 3150 2655 3825 -2 2 3 1 0 7 60 -1 -1 8.000 0 0 -1 0 0 5 - 1080 1125 3375 1125 3375 3375 1080 3375 1080 1125 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 225 4140 675 4140 -2 1 0 4 12 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 225 4365 675 4365 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 - 0 3960 2025 3960 2025 4500 -2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 4275 0 4275 4500 0 4500 0 0 -4 1 0 40 -1 18 12 0.0000 4 135 270 2925 3825 M5\001 -4 1 0 40 -1 18 12 0.0000 4 135 270 810 1710 M2\001 -4 1 0 60 -1 18 12 0.0000 4 135 330 2115 1845 C23\001 -4 1 12 60 -1 18 12 0.0000 4 135 330 1485 2745 C34\001 -4 1 12 60 -1 18 12 0.0000 4 135 330 2655 2565 C45\001 -4 0 0 50 -1 18 12 0.0000 4 135 405 810 4410 New\001 -4 0 0 50 -1 18 12 0.0000 4 180 1065 810 4185 Pre-existing\001 -4 1 12 60 -1 18 12 0.0000 4 135 270 1980 2340 M3\001 -4 1 12 60 -1 18 12 0.0000 4 135 270 2250 2655 M4\001 diff --git a/katabatic/doc/images/SplitAutoContact-4.fig b/katabatic/doc/images/SplitAutoContact-4.fig deleted file mode 100644 index 4afaa7d3..00000000 --- a/katabatic/doc/images/SplitAutoContact-4.fig +++ /dev/null @@ -1,46 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 2700 2700 90 90 2700 2700 2790 2700 -1 3 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 2700 90 90 1800 2700 1890 2700 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1800 1350 1800 2610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 2700 2790 2700 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 2700 2790 2700 3150 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1890 2700 2610 2700 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 1755 675 1755 1350 1845 1350 1845 675 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 2745 3825 2745 3150 2655 3150 2655 3825 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 3825 2745 3150 2745 3150 2655 3825 2655 -2 2 3 1 0 7 60 -1 -1 8.000 0 0 -1 0 0 5 - 1080 1125 3375 1125 3375 3375 1080 3375 1080 1125 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 225 4140 675 4140 -2 1 0 4 12 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 225 4365 675 4365 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 - 0 3960 2025 3960 2025 4500 -2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 4275 0 4275 4500 0 4500 0 0 -4 1 0 40 -1 18 12 0.0000 4 135 270 3690 2610 M4\001 -4 1 0 40 -1 18 12 0.0000 4 135 270 2925 3825 M5\001 -4 1 0 40 -1 18 12 0.0000 4 135 270 2025 810 M3\001 -4 1 12 60 -1 18 12 0.0000 4 135 330 2655 2565 C45\001 -4 0 0 50 -1 18 12 0.0000 4 135 405 810 4410 New\001 -4 0 0 50 -1 18 12 0.0000 4 180 1065 810 4185 Pre-existing\001 -4 1 12 60 -1 18 12 0.0000 4 135 270 2250 2655 M4\001 -4 0 0 50 -1 19 12 0.0000 4 135 180 2070 225 to\001 -4 0 0 50 -1 18 12 0.0000 4 135 270 2340 225 M5\001 -4 0 0 50 -1 18 12 0.0000 4 135 270 1710 225 M3\001 -4 1 0 60 -1 18 12 0.0000 4 135 330 1485 2745 C34\001 diff --git a/katabatic/doc/images/SplitAutoContact-5.fig b/katabatic/doc/images/SplitAutoContact-5.fig deleted file mode 100644 index 17371c26..00000000 --- a/katabatic/doc/images/SplitAutoContact-5.fig +++ /dev/null @@ -1,46 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -1 3 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 1800 90 90 1800 1800 1890 1800 -1 3 0 2 12 7 40 -1 -1 0.000 1 0.0000 1800 2700 90 90 1800 2700 1890 2700 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 675 1845 1350 1845 1350 1755 675 1755 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1350 1800 1710 1800 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1800 1350 1800 1710 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 2700 1890 2700 -2 1 0 2 12 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1800 1890 1800 2610 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 1755 675 1755 1350 1845 1350 1845 675 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 3825 2745 3150 2745 3150 2655 3825 2655 -2 2 3 1 0 7 60 -1 -1 8.000 0 0 -1 0 0 5 - 1080 1125 3375 1125 3375 3375 1080 3375 1080 1125 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 225 4140 675 4140 -2 1 0 4 12 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 225 4365 675 4365 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 - 0 3960 2025 3960 2025 4500 -2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 4275 0 4275 4500 0 4500 0 0 -4 1 0 40 -1 18 12 0.0000 4 135 270 3690 2610 M4\001 -4 1 0 40 -1 18 12 0.0000 4 135 270 2025 810 M3\001 -4 1 0 40 -1 18 12 0.0000 4 135 270 810 1710 M2\001 -4 1 0 60 -1 18 12 0.0000 4 135 330 2115 1845 C23\001 -4 1 12 60 -1 18 12 0.0000 4 135 330 1485 2745 C34\001 -4 0 0 50 -1 18 12 0.0000 4 135 405 810 4410 New\001 -4 0 0 50 -1 18 12 0.0000 4 180 1065 810 4185 Pre-existing\001 -4 1 12 60 -1 18 12 0.0000 4 135 270 1980 2340 M3\001 -4 0 0 50 -1 18 12 0.0000 4 135 270 1710 225 M2\001 -4 0 0 50 -1 19 12 0.0000 4 135 180 2070 225 to\001 -4 0 0 50 -1 18 12 0.0000 4 135 270 2340 225 M4\001 diff --git a/katabatic/doc/images/SplitAutoContact-6.fig b/katabatic/doc/images/SplitAutoContact-6.fig deleted file mode 100644 index 34fb0bb0..00000000 --- a/katabatic/doc/images/SplitAutoContact-6.fig +++ /dev/null @@ -1,36 +0,0 @@ -#FIG 3.2 -Landscape -Center -Metric -Letter -100.00 -Single --2 -1200 2 -1 3 0 2 0 7 40 -1 -1 0.000 1 0.0000 1800 2700 90 90 1800 2700 1890 2700 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 1800 1350 1800 2610 -2 1 0 2 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 - 3150 2700 1890 2700 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 1755 675 1755 1350 1845 1350 1845 675 -2 1 0 2 0 7 50 -1 45 0.000 0 0 -1 0 0 4 - 3825 2745 3150 2745 3150 2655 3825 2655 -2 2 3 1 0 7 60 -1 -1 8.000 0 0 -1 0 0 5 - 1080 1125 3375 1125 3375 3375 1080 3375 1080 1125 -2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 225 4140 675 4140 -2 1 0 4 12 7 50 -1 -1 0.000 0 0 -1 0 0 2 - 225 4365 675 4365 -2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 - 0 3960 2025 3960 2025 4500 -2 2 0 1 0 7 60 -1 -1 0.000 0 0 -1 0 0 5 - 0 0 4275 0 4275 4500 0 4500 0 0 -4 1 0 40 -1 18 12 0.0000 4 135 270 3690 2610 M4\001 -4 1 0 40 -1 18 12 0.0000 4 135 270 2025 810 M3\001 -4 0 0 50 -1 18 12 0.0000 4 135 405 810 4410 New\001 -4 0 0 50 -1 18 12 0.0000 4 180 1065 810 4185 Pre-existing\001 -4 0 0 50 -1 19 12 0.0000 4 135 180 2070 225 to\001 -4 0 0 50 -1 18 12 0.0000 4 135 270 2340 225 M4\001 -4 0 0 50 -1 18 12 0.0000 4 135 270 1710 225 M3\001 -4 1 0 60 -1 18 12 0.0000 4 135 330 1485 2745 C34\001 diff --git a/katabatic/doc/images/_do_1G_1M1.fig b/katabatic/doc/images/_do_1G_1M1.fig new file mode 100644 index 00000000..862edd5a --- /dev/null +++ b/katabatic/doc/images/_do_1G_1M1.fig @@ -0,0 +1,120 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +80.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 300 300 6450 3375 +6 675 1050 975 2550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 1200 825 1125 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 1275 900 1125 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 1350 900 1200 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 1425 900 1275 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 1500 900 1350 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 1575 900 1425 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 1650 900 1500 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 1725 900 1575 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 1800 900 1650 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 1875 900 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 1950 900 1800 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 2025 900 1875 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 2100 900 1950 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 2175 900 2025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 2250 900 2100 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 2325 900 2175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 2400 900 2250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 750 2475 900 2325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2475 900 2400 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 750 1125 900 1125 900 2475 750 2475 750 1125 +-6 +6 4275 1050 4575 2550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 1200 4425 1125 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 1275 4500 1125 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 1350 4500 1200 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 1425 4500 1275 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 1500 4500 1350 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 1575 4500 1425 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 1650 4500 1500 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 1725 4500 1575 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 1800 4500 1650 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 1875 4500 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 1950 4500 1800 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 2025 4500 1875 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 2100 4500 1950 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 2175 4500 2025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 2250 4500 2100 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 2325 4500 2175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 2400 4500 2250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4350 2475 4500 2325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4425 2475 4500 2400 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 4350 1125 4500 1125 4500 2475 4350 2475 4350 1125 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 375 750 2775 750 2775 3150 375 3150 375 750 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 3975 750 6375 750 6375 3150 3975 3150 3975 750 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 750 1425 900 1425 900 1575 750 1575 750 1425 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 900 1500 2925 1500 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4350 1425 4500 1425 4500 1575 4350 1575 4350 1425 +2 1 0 6 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 5325 1500 5625 1500 5625 1800 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 5625 1500 5625 3300 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4500 1500 5625 1500 +4 1 0 50 -1 14 14 0.0000 4 195 900 1575 450 1G (H)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 450 3075 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2700 975 NE\001 +4 1 0 50 -1 14 14 0.0000 4 195 900 5175 450 1G (V)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 4050 3075 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 6300 975 NE\001 +-6 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 150 150 6600 150 6600 3450 150 3450 150 150 diff --git a/katabatic/doc/images/_do_1G_1M1.png b/katabatic/doc/images/_do_1G_1M1.png new file mode 100644 index 0000000000000000000000000000000000000000..9976be3fda7e2b652c0122c6d8916c86b462359e GIT binary patch literal 3805 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 literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/_do_1G_1M3.fig b/katabatic/doc/images/_do_1G_1M3.fig new file mode 100644 index 00000000..efbc45fa --- /dev/null +++ b/katabatic/doc/images/_do_1G_1M3.fig @@ -0,0 +1,204 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +80.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 225 225 2925 3225 +6 1050 1200 1350 2700 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 1425 1275 1275 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 1350 1200 1275 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 1500 1275 1350 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 1575 1275 1425 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 1650 1275 1500 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 1725 1275 1575 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 1800 1275 1650 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 1875 1275 1725 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 1950 1275 1800 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 2025 1275 1875 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 2100 1275 1950 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 2175 1275 2025 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 2250 1275 2100 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 2325 1275 2175 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 2400 1275 2250 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 2475 1275 2325 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 2550 1275 2400 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 2625 1275 2475 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1200 2625 1275 2550 +2 2 0 2 4 7 60 -1 -1 0.000 0 0 7 0 0 5 + 1125 1275 1275 1275 1275 2625 1125 2625 1125 1275 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 300 750 2700 750 2700 3150 300 3150 300 750 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1275 1500 2850 1500 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1125 1425 1275 1425 1275 1575 1125 1575 1125 1425 +4 1 0 50 -1 14 14 0.0000 4 210 1200 1500 450 1G (E/W)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 375 3075 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2625 975 NE\001 +-6 +6 225 3750 2775 6675 +6 1050 4650 1350 6150 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 4875 1275 4725 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 4800 1200 4725 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 4950 1275 4800 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 5025 1275 4875 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 5100 1275 4950 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 5175 1275 5025 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 5250 1275 5100 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 5325 1275 5175 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 5400 1275 5250 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 5475 1275 5325 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 5550 1275 5400 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 5625 1275 5475 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 5700 1275 5550 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 5775 1275 5625 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 5850 1275 5700 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 5925 1275 5775 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 6000 1275 5850 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1125 6075 1275 5925 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 1200 6075 1275 6000 +2 2 0 2 4 7 60 -1 -1 0.000 0 0 7 0 0 5 + 1125 4725 1275 4725 1275 6075 1125 6075 1125 4725 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 300 4200 2700 4200 2700 6600 300 6600 300 4200 +2 2 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 1125 4725 1275 4725 1275 4875 1125 4875 1125 4725 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1200 4725 1200 4050 +4 1 0 50 -1 14 14 0.0000 4 195 900 1500 3900 1G (N)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 375 6525 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2625 4425 NE\001 +-6 +6 3525 3750 6075 6825 +6 4350 4650 4650 6150 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 4875 4575 4725 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 4800 4500 4725 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 4950 4575 4800 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 5025 4575 4875 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 5100 4575 4950 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 5175 4575 5025 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 5250 4575 5100 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 5325 4575 5175 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 5400 4575 5250 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 5475 4575 5325 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 5550 4575 5400 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 5625 4575 5475 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 5700 4575 5550 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 5775 4575 5625 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 5850 4575 5700 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 5925 4575 5775 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 6000 4575 5850 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4425 6075 4575 5925 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4500 6075 4575 6000 +2 2 0 2 4 7 60 -1 -1 0.000 0 0 7 0 0 5 + 4425 4725 4575 4725 4575 6075 4425 6075 4425 4725 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 3600 4200 6000 4200 6000 6600 3600 6600 3600 4200 +2 2 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4425 5925 4575 5925 4575 6075 4425 6075 4425 5925 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4500 6750 4500 6075 +4 1 0 50 -1 14 14 0.0000 4 195 900 4800 3900 1G (S)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 3675 6525 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 5925 4425 NE\001 +-6 +6 3525 225 6225 3225 +6 4500 1200 4800 1800 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4575 1425 4725 1275 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4575 1500 4725 1350 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4575 1575 4725 1425 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4575 1650 4725 1500 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4575 1725 4725 1575 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4575 1350 4650 1275 +2 1 0 1 4 7 60 -1 -1 0.000 0 0 7 0 0 2 + 4650 1725 4725 1650 +2 2 0 2 4 7 60 -1 -1 0.000 0 0 7 0 0 5 + 4575 1275 4725 1275 4725 1725 4575 1725 4575 1275 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 3600 750 6000 750 6000 3150 3600 3150 3600 750 +2 2 0 4 4 7 50 -1 -1 0.000 0 0 -1 0 0 5 + 4575 1575 4725 1575 4725 1725 4575 1725 4575 1575 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4650 2400 6150 2400 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 4650 2250 4650 2400 4800 2400 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 4650 1725 4650 2400 +4 1 0 50 -1 14 14 0.0000 4 210 2250 4800 450 1G (E/W,VSmall)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 3675 3075 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 5925 975 NE\001 +-6 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 0 150 6300 150 6300 6900 0 6900 0 150 diff --git a/katabatic/doc/images/_do_1G_1M3.png b/katabatic/doc/images/_do_1G_1M3.png new file mode 100644 index 0000000000000000000000000000000000000000..8a822a038358c07e1ba6927231dd92ac468dd140 GIT binary patch literal 7501 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 FzX7alNPqwU literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/_do_xG.fig b/katabatic/doc/images/_do_xG.fig new file mode 100644 index 00000000..5ea45869 --- /dev/null +++ b/katabatic/doc/images/_do_xG.fig @@ -0,0 +1,131 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +80.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 1125 750 3675 3675 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 1200 1200 3600 1200 3600 3600 1200 3600 1200 1200 +4 1 0 50 -1 14 14 0.0000 4 150 300 2400 900 2G\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 1275 3525 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 3525 1425 NE\001 +-6 +6 1725 5025 2175 5775 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 1800 5100 1800 5700 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 1800 5400 2100 5400 +-6 +6 2625 8625 3075 9375 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 2700 8700 2700 9300 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 2700 9000 3000 9000 +-6 +6 1425 9825 2175 10275 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 1500 9900 2100 9900 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 1800 9900 1800 10200 +-6 +6 5925 2625 6675 3075 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 6000 2700 6600 2700 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 6300 2700 6300 3000 +-6 +6 5925 2025 6675 2475 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 6000 2400 6600 2400 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 6300 2100 6300 2400 +-6 +6 7125 2025 7575 2775 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 7500 2100 7500 2700 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 7200 2400 7500 2400 +-6 +6 7725 2025 8175 2775 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 7800 2100 7800 2700 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 7800 2400 8100 2400 +-6 +6 6225 5925 6975 6375 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 6300 6300 6900 6300 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 2 + 6600 6000 6600 6300 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 1200 4800 3600 4800 3600 7200 1200 7200 1200 4800 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 4800 4800 7200 4800 7200 7200 4800 7200 4800 4800 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 1200 8400 3600 8400 3600 10800 1200 10800 1200 8400 +2 1 0 6 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 2100 2100 2400 2100 2400 2400 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 3 + 1800 6300 1800 6600 1500 6600 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 3 + 2700 9600 2700 9900 2400 9900 +2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 3 + 1800 9900 2700 9900 2700 9000 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 3 + 4500 2700 4500 3000 4800 3000 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 3 + 4800 2100 4500 2100 4500 2400 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 3 + 5400 2700 5400 3000 5100 3000 +2 1 0 6 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 5100 2100 5400 2100 5400 2400 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 5700 1500 5700 3300 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 6900 1500 6900 3300 +2 1 0 2 0 7 50 -1 -1 6.000 0 0 -1 0 0 2 + 5400 6300 6600 6300 +2 1 0 6 0 7 50 -1 -1 14.000 0 0 -1 0 0 3 + 5700 6300 5400 6300 5400 6600 +2 1 0 2 4 7 60 -1 -1 6.000 0 0 7 0 0 2 + 900 2100 2400 2100 +2 1 0 2 4 7 60 -1 -1 6.000 0 0 7 0 0 2 + 2400 2100 2400 3900 +2 1 0 2 4 7 60 -1 -1 6.000 0 0 7 0 0 2 + 900 6600 1800 6600 +2 1 0 2 4 7 60 -1 -1 6.000 0 0 7 0 0 2 + 1800 5400 3900 5400 +2 1 0 2 4 7 60 -1 -1 6.000 0 0 7 0 0 2 + 5400 6300 5400 7500 +2 1 0 2 4 7 60 -1 -1 6.000 0 0 7 0 0 2 + 6600 4500 6600 6300 +2 1 0 2 4 7 60 -1 -1 6.000 0 0 7 0 0 3 + 2700 8100 2700 9000 3900 9000 +2 1 0 2 4 7 60 -1 -1 6.000 0 0 7 0 0 3 + 900 9900 1800 9900 1800 11100 +2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 6600 6300 7500 6300 +2 1 0 2 4 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 1800 4500 1800 5400 +2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 1800 5400 1800 6600 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 600 300 8400 300 8400 11400 600 11400 600 300 +4 1 0 50 -1 14 14 0.0000 4 195 1050 2400 4500 3G (2H)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 1275 7125 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 3525 5025 NE\001 +4 1 0 50 -1 14 14 0.0000 4 195 1050 6000 4500 3G (2V)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 4875 7125 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 7125 5025 NE\001 +4 1 0 50 -1 14 14 0.0000 4 150 300 2400 8100 4G\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 1275 10725 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 3525 8625 NE\001 +4 1 0 50 -1 14 14 0.0000 4 135 600 4950 1800 Turn\001 +4 1 0 50 -1 14 14 0.0000 4 135 600 6300 1800 HTee\001 +4 1 0 50 -1 14 14 0.0000 4 135 600 7650 1800 VTee\001 diff --git a/katabatic/doc/images/_do_xG.png b/katabatic/doc/images/_do_xG.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc48e8f9091dadbfb409e461b6bc92053ce3719 GIT binary patch literal 8067 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 RbfYaiz2OEW@aM+h{{RA}c_aV; literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/_do_xG_1M1_1M2.fig b/katabatic/doc/images/_do_xG_1M1_1M2.fig new file mode 100644 index 00000000..446e82d8 --- /dev/null +++ b/katabatic/doc/images/_do_xG_1M1_1M2.fig @@ -0,0 +1,778 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +90.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 225 300 3075 3375 +6 1350 1050 2400 1350 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 1275 1425 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1650 1275 1500 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1725 1275 1575 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1800 1275 1650 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 1275 1725 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 1275 1800 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1500 1275 1425 1200 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2025 1275 1875 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 1200 2250 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2100 1275 1950 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2175 1275 2025 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2250 1275 2100 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 1275 2175 1125 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1425 1275 1425 1125 2325 1125 2325 1275 1425 1275 +-6 +6 750 1650 1050 2850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 1950 975 1800 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2025 975 1875 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2100 975 1950 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2175 975 2025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2250 975 2100 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2325 975 2175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2400 975 2250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2475 975 2325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2550 975 2400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2625 975 2475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2700 975 2550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2775 975 2625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 1800 900 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 1875 975 1725 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 825 1725 975 1725 975 2775 825 2775 825 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 900 2775 975 2700 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 450 750 2850 750 2850 3150 450 3150 450 750 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1725 1125 1875 1125 1875 1275 1725 1275 1725 1125 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 825 1875 975 1875 975 2025 825 2025 825 1875 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 3 + 975 1950 1800 1950 1800 1275 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 1650 1950 1800 1950 1800 1800 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 1125 1575 1125 1575 1275 1425 1275 1425 1125 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 2175 1125 2325 1125 2325 1275 2175 1275 2175 1125 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 450 1200 750 1200 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 600 1200 600 1350 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 2550 1200 2850 1200 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 2700 1050 2700 1200 +2 1 0 2 0 1 50 -1 -1 6.000 0 0 -1 0 0 2 + 600 1200 1425 1200 +2 1 0 2 0 1 50 -1 -1 6.000 0 0 -1 0 0 2 + 2325 1200 2700 1200 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 600 1200 600 3300 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 300 1200 600 1200 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 2700 1200 3000 1200 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 2700 1200 2700 600 +4 1 0 50 -1 14 14 0.0000 4 195 1800 1650 450 4G (N,S,E,W)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 525 3075 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2775 975 NE\001 +-6 +6 375 13500 2925 16575 +6 1350 14250 2400 14550 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 14475 1425 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1650 14475 1500 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1725 14475 1575 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1800 14475 1650 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 14475 1725 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 14475 1800 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1500 14475 1425 14400 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2025 14475 1875 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 14400 2250 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2100 14475 1950 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2175 14475 2025 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2250 14475 2100 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 14475 2175 14325 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1425 14475 1425 14325 2325 14325 2325 14475 1425 14475 +-6 +6 750 14850 1050 16050 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15150 975 15000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15225 975 15075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15300 975 15150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15375 975 15225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15450 975 15300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15525 975 15375 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15600 975 15450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15675 975 15525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15750 975 15600 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15825 975 15675 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15900 975 15750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15975 975 15825 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15000 900 14925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15075 975 14925 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 825 14925 975 14925 975 15975 825 15975 825 14925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 900 15975 975 15900 +-6 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1725 14325 1875 14325 1875 14475 1725 14475 1725 14325 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 825 15075 975 15075 975 15225 825 15225 825 15075 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 3 + 975 15150 1800 15150 1800 14475 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 1650 15150 1800 15150 1800 15000 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 14325 1575 14325 1575 14475 1425 14475 1425 14325 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 600 14400 1425 14400 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 600 14400 600 16500 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 450 13950 2850 13950 2850 16350 450 16350 450 13950 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 2700 13800 2700 14400 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 2325 14400 2700 14400 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 2550 14400 2700 14400 2700 14250 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 750 14400 600 14400 600 14550 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 2175 14325 2325 14325 2325 14475 2175 14475 2175 14325 +4 1 0 50 -1 14 14 0.0000 4 195 1200 1650 13650 2G (N,S)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 525 16275 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2775 14175 NE\001 +-6 +6 375 3600 3075 6675 +6 1350 4350 2400 4650 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 4575 1425 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1650 4575 1500 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1725 4575 1575 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1800 4575 1650 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 4575 1725 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 4575 1800 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1500 4575 1425 4500 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2025 4575 1875 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 4500 2250 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2100 4575 1950 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2175 4575 2025 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2250 4575 2100 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 4575 2175 4425 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1425 4575 1425 4425 2325 4425 2325 4575 1425 4575 +-6 +6 750 4950 1050 6150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5250 975 5100 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5325 975 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5400 975 5250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5475 975 5325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5550 975 5400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5625 975 5475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5700 975 5550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5775 975 5625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5850 975 5700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5925 975 5775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 6000 975 5850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 6075 975 5925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5100 900 5025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5175 975 5025 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 825 5025 975 5025 975 6075 825 6075 825 5025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 900 6075 975 6000 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 450 4050 2850 4050 2850 6450 450 6450 450 4050 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1725 4425 1875 4425 1875 4575 1725 4575 1725 4425 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 825 5175 975 5175 975 5325 825 5325 825 5175 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 3 + 975 5250 1800 5250 1800 4575 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 1650 5250 1800 5250 1800 5100 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 4425 1575 4425 1575 4575 1425 4575 1425 4425 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 2175 4425 2325 4425 2325 4575 2175 4575 2175 4425 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 2550 4500 2850 4500 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 2700 4350 2700 4500 +2 1 0 2 0 1 50 -1 -1 6.000 0 0 -1 0 0 2 + 600 4500 1425 4500 +2 1 0 2 0 1 50 -1 -1 6.000 0 0 -1 0 0 2 + 2325 4500 2700 4500 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 600 4500 600 6600 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 2700 4500 3000 4500 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 2700 4500 2700 3900 +2 1 0 5 0 1 50 -1 -1 12.000 0 0 -1 0 0 3 + 600 4650 600 4500 750 4500 +4 1 0 50 -1 14 14 0.0000 4 195 1500 1650 3750 3G (N,S,E)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 525 6375 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2775 4275 NE\001 +-6 +6 225 6900 3075 9825 +6 1350 7650 2400 7950 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 7875 1425 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1650 7875 1500 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1725 7875 1575 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1800 7875 1650 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 7875 1725 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 7875 1800 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1500 7875 1425 7800 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2025 7875 1875 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 7800 2250 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2100 7875 1950 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2175 7875 2025 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2250 7875 2100 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 7875 2175 7725 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1425 7875 1425 7725 2325 7725 2325 7875 1425 7875 +-6 +6 750 8250 1050 9450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 8550 975 8400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 8625 975 8475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 8700 975 8550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 8775 975 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 8850 975 8700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 8925 975 8775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9000 975 8850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9075 975 8925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9150 975 9000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9225 975 9075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9300 975 9150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9375 975 9225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 8400 900 8325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 8475 975 8325 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 825 8325 975 8325 975 9375 825 9375 825 8325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 900 9375 975 9300 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 450 7350 2850 7350 2850 9750 450 9750 450 7350 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1725 7725 1875 7725 1875 7875 1725 7875 1725 7725 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 825 8475 975 8475 975 8625 825 8625 825 8475 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 3 + 975 8550 1800 8550 1800 7875 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 1650 8550 1800 8550 1800 8400 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 7725 1575 7725 1575 7875 1425 7875 1425 7725 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 2175 7725 2325 7725 2325 7875 2175 7875 2175 7725 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 2550 7800 2850 7800 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 2700 7650 2700 7800 +2 1 0 2 0 1 50 -1 -1 6.000 0 0 -1 0 0 2 + 2325 7800 2700 7800 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 300 7800 1425 7800 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 2700 7800 3000 7800 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 2700 7800 2700 7200 +4 1 0 50 -1 14 14 0.0000 4 195 1500 1650 7050 3G (N,E,W)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 525 9675 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2775 7575 NE\001 +-6 +6 375 10200 3075 13125 +6 750 11550 1050 12750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 11850 975 11700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 11925 975 11775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12000 975 11850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12075 975 11925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12150 975 12000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12225 975 12075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12300 975 12150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12375 975 12225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12450 975 12300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12525 975 12375 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12600 975 12450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12675 975 12525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 11700 900 11625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 11775 975 11625 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 825 11625 975 11625 975 12675 825 12675 825 11625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 900 12675 975 12600 +-6 +6 1350 10950 2400 11250 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 11175 1425 11025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1650 11175 1500 11025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1725 11175 1575 11025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1800 11175 1650 11025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 11175 1725 11025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 11175 1800 11025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1500 11175 1425 11100 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2025 11175 1875 11025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 11100 2250 11025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2100 11175 1950 11025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2175 11175 2025 11025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2250 11175 2100 11025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 11175 2175 11025 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1425 11175 1425 11025 2325 11025 2325 11175 1425 11175 +-6 +6 2475 10875 2925 11175 +2 1 0 5 0 1 50 -1 -1 12.000 0 0 -1 0 0 2 + 2550 11100 2850 11100 +2 1 0 5 0 1 50 -1 -1 12.000 0 0 -1 0 0 2 + 2700 11100 2700 10950 +-6 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1725 11025 1875 11025 1875 11175 1725 11175 1725 11025 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 825 11775 975 11775 975 11925 825 11925 825 11775 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 3 + 975 11850 1800 11850 1800 11175 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 1650 11850 1800 11850 1800 11700 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 450 10650 2850 10650 2850 13050 450 13050 450 10650 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 2700 10500 2700 11100 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 2325 11100 2700 11100 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 3000 11100 2700 11100 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 2175 11025 2325 11025 2325 11175 2175 11175 2175 11025 +4 1 0 50 -1 14 14 0.0000 4 195 1200 1650 10350 2G (N,E)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 525 12975 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2775 10875 NE\001 +-6 +6 3525 6900 6375 9975 +6 4650 7650 5700 7950 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4875 7875 4725 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4950 7875 4800 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5025 7875 4875 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5100 7875 4950 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 7875 5025 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5250 7875 5100 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4800 7875 4725 7800 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5325 7875 5175 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5625 7800 5550 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5400 7875 5250 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5475 7875 5325 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5550 7875 5400 7725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5625 7875 5475 7725 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 4725 7875 4725 7725 5625 7725 5625 7875 4725 7875 +-6 +6 4050 8250 4350 9450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 8550 4275 8400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 8625 4275 8475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 8700 4275 8550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 8775 4275 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 8850 4275 8700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 8925 4275 8775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9000 4275 8850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9075 4275 8925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9150 4275 9000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9225 4275 9075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9300 4275 9150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9375 4275 9225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 8400 4200 8325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 8475 4275 8325 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 4125 8325 4275 8325 4275 9375 4125 9375 4125 8325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4200 9375 4275 9300 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 3750 7350 6150 7350 6150 9750 3750 9750 3750 7350 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5025 7725 5175 7725 5175 7875 5025 7875 5025 7725 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4125 8475 4275 8475 4275 8625 4125 8625 4125 8475 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 3 + 4275 8550 5100 8550 5100 7875 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 4950 8550 5100 8550 5100 8400 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4725 7725 4875 7725 4875 7875 4725 7875 4725 7725 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5475 7725 5625 7725 5625 7875 5475 7875 5475 7725 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 3750 7800 4050 7800 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 3900 7800 3900 7950 +2 1 0 2 0 1 50 -1 -1 6.000 0 0 -1 0 0 2 + 3900 7800 4725 7800 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 3900 7800 3900 9900 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 3600 7800 3900 7800 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 5625 7800 6300 7800 +4 1 0 50 -1 14 14 0.0000 4 195 1500 4950 7050 3G (S,E,W)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 3825 9675 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 6075 7575 NE\001 +-6 +6 3525 3600 6225 6675 +6 4650 4350 5700 4650 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4875 4575 4725 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4950 4575 4800 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5025 4575 4875 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5100 4575 4950 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 4575 5025 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5250 4575 5100 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4800 4575 4725 4500 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5325 4575 5175 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5625 4500 5550 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5400 4575 5250 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5475 4575 5325 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5550 4575 5400 4425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5625 4575 5475 4425 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 4725 4575 4725 4425 5625 4425 5625 4575 4725 4575 +-6 +6 4050 4950 4350 6150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5250 4275 5100 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5325 4275 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5400 4275 5250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5475 4275 5325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5550 4275 5400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5625 4275 5475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5700 4275 5550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5775 4275 5625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5850 4275 5700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5925 4275 5775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 6000 4275 5850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 6075 4275 5925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5100 4200 5025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5175 4275 5025 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 4125 5025 4275 5025 4275 6075 4125 6075 4125 5025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4200 6075 4275 6000 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 3750 4050 6150 4050 6150 6450 3750 6450 3750 4050 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5025 4425 5175 4425 5175 4575 5025 4575 5025 4425 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4125 5175 4275 5175 4275 5325 4125 5325 4125 5175 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 3 + 4275 5250 5100 5250 5100 4575 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 4950 5250 5100 5250 5100 5100 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4725 4425 4875 4425 4875 4575 4725 4575 4725 4425 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5475 4425 5625 4425 5625 4575 5475 4575 5475 4425 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 3750 4500 4050 4500 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 3900 4500 3900 4650 +2 1 0 2 0 1 50 -1 -1 6.000 0 0 -1 0 0 2 + 3900 4500 4725 4500 +2 1 0 2 0 1 50 -1 -1 6.000 0 0 -1 0 0 2 + 5625 4500 6000 4500 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 3900 4500 3900 6600 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 3600 4500 3900 4500 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 6000 4500 6000 3900 +2 1 0 5 0 1 50 -1 -1 12.000 0 0 -1 0 0 3 + 5850 4500 6000 4500 6000 4350 +4 1 0 50 -1 14 14 0.0000 4 195 1500 4950 3750 3G (N,S,W)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 3825 6375 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 6075 4275 NE\001 +-6 +6 3525 13500 6375 16425 +6 4650 14250 5700 14550 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4875 14475 4725 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4950 14475 4800 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5025 14475 4875 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5100 14475 4950 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 14475 5025 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5250 14475 5100 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4800 14475 4725 14400 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5325 14475 5175 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5625 14400 5550 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5400 14475 5250 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5475 14475 5325 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5550 14475 5400 14325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5625 14475 5475 14325 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 4725 14475 4725 14325 5625 14325 5625 14475 4725 14475 +-6 +6 4050 14850 4350 16050 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15150 4275 15000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15225 4275 15075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15300 4275 15150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15375 4275 15225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15450 4275 15300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15525 4275 15375 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15600 4275 15450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15675 4275 15525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15750 4275 15600 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15825 4275 15675 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15900 4275 15750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15975 4275 15825 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15000 4200 14925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 15075 4275 14925 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 4125 14925 4275 14925 4275 15975 4125 15975 4125 14925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4200 15975 4275 15900 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 3750 13950 6150 13950 6150 16350 3750 16350 3750 13950 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5025 14325 5175 14325 5175 14475 5025 14475 5025 14325 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4125 15075 4275 15075 4275 15225 4125 15225 4125 15075 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 3 + 4275 15150 5100 15150 5100 14475 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 4950 15150 5100 15150 5100 15000 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4725 14325 4875 14325 4875 14475 4725 14475 4725 14325 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5475 14325 5625 14325 5625 14475 5475 14475 5475 14325 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 5625 14400 6300 14400 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 3600 14400 4725 14400 +4 1 0 50 -1 14 14 0.0000 4 195 1200 4950 13650 2G (E,W)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 3825 16275 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 6075 14175 NE\001 +-6 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 150 150 6450 150 6450 16650 150 16650 150 150 diff --git a/katabatic/doc/images/_do_xG_1M1_1M2.png b/katabatic/doc/images/_do_xG_1M1_1M2.png new file mode 100644 index 0000000000000000000000000000000000000000..4f1f90a927737bf01e02bad5dcb6f26a17ff6531 GIT binary patch literal 18463 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 J;O|uB{{Vr~n^6D& literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/_do_xG_xM1_xM3.fig b/katabatic/doc/images/_do_xG_xM1_xM3.fig new file mode 100644 index 00000000..3ef10e18 --- /dev/null +++ b/katabatic/doc/images/_do_xG_xM1_xM3.fig @@ -0,0 +1,1542 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +90.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 225 300 2925 3225 +6 750 1650 1050 2850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 1950 975 1800 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2025 975 1875 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2100 975 1950 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2175 975 2025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2250 975 2100 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2325 975 2175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2400 975 2250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2475 975 2325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2550 975 2400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2625 975 2475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2700 975 2550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 2775 975 2625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 1800 900 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 1875 975 1725 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 825 1725 975 1725 975 2775 825 2775 825 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 900 2775 975 2700 +-6 +6 1350 1650 1650 2850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 1950 1575 1800 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 2025 1575 1875 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 2100 1575 1950 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 2175 1575 2025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 2250 1575 2100 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 2325 1575 2175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 2400 1575 2250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 2475 1575 2325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 2550 1575 2400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 2625 1575 2475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 2700 1575 2550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 2775 1575 2625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 1800 1500 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 1875 1575 1725 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 1425 1725 1575 1725 1575 2775 1425 2775 1425 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1500 2775 1575 2700 +-6 +6 1800 1350 2100 2400 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 1575 2025 1425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 1650 2025 1500 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 1725 2025 1575 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 1800 2025 1650 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 1875 2025 1725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 1950 2025 1800 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 1500 1950 1425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 2025 2025 1875 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 2325 2025 2250 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 2100 2025 1950 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 2175 2025 2025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 2250 2025 2100 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 2325 2025 2175 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1875 1425 2025 1425 2025 2325 1875 2325 1875 1425 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 450 750 2850 750 2850 3150 450 3150 450 750 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 1875 1575 1875 1575 2025 1425 2025 1425 1875 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1875 1875 2025 1875 2025 2025 1875 2025 1875 1875 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 1725 1575 1725 1575 1875 1425 1875 1425 1725 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 825 1725 975 1725 975 1875 825 1875 825 1725 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 825 2325 975 2325 975 2475 825 2475 825 2325 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 975 1800 1425 1800 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1575 1950 1875 1950 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 825 2400 300 2400 +4 1 0 50 -1 14 14 0.0000 4 195 900 1650 450 1G (W)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 525 3075 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2775 975 NE\001 +-6 +6 4050 1650 4350 2850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 1950 4275 1800 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 2025 4275 1875 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 2100 4275 1950 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 2175 4275 2025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 2250 4275 2100 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 2325 4275 2175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 2400 4275 2250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 2475 4275 2325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 2550 4275 2400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 2625 4275 2475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 2700 4275 2550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 2775 4275 2625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 1800 4200 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 1875 4275 1725 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 4125 1725 4275 1725 4275 2775 4125 2775 4125 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4200 2775 4275 2700 +-6 +6 4650 1650 4950 2850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 1950 4875 1800 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 2025 4875 1875 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 2100 4875 1950 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 2175 4875 2025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 2250 4875 2100 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 2325 4875 2175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 2400 4875 2250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 2475 4875 2325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 2550 4875 2400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 2625 4875 2475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 2700 4875 2550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 2775 4875 2625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 1800 4800 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 1875 4875 1725 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 4725 1725 4875 1725 4875 2775 4725 2775 4725 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4800 2775 4875 2700 +-6 +6 5100 1350 5400 2400 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 1575 5325 1425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 1650 5325 1500 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 1725 5325 1575 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 1800 5325 1650 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 1875 5325 1725 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 1950 5325 1800 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 1500 5250 1425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 2025 5325 1875 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5250 2325 5325 2250 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 2100 5325 1950 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 2175 5325 2025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 2250 5325 2100 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 2325 5325 2175 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 5175 1425 5325 1425 5325 2325 5175 2325 5175 1425 +-6 +6 4050 5100 4350 6300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5400 4275 5250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5475 4275 5325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5550 4275 5400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5625 4275 5475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5700 4275 5550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5775 4275 5625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5850 4275 5700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5925 4275 5775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 6000 4275 5850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 6075 4275 5925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 6150 4275 6000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 6225 4275 6075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5250 4200 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 5325 4275 5175 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 4125 5175 4275 5175 4275 6225 4125 6225 4125 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4200 6225 4275 6150 +-6 +6 4650 5100 4950 6300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 5400 4875 5250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 5475 4875 5325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 5550 4875 5400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 5625 4875 5475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 5700 4875 5550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 5775 4875 5625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 5850 4875 5700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 5925 4875 5775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 6000 4875 5850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 6075 4875 5925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 6150 4875 6000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 6225 4875 6075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 5250 4800 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 5325 4875 5175 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 4725 5175 4875 5175 4875 6225 4725 6225 4725 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4800 6225 4875 6150 +-6 +6 5100 4800 5400 5850 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 5025 5325 4875 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 5100 5325 4950 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 5175 5325 5025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 5250 5325 5100 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 5325 5325 5175 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 5400 5325 5250 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 4950 5250 4875 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 5475 5325 5325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5250 5775 5325 5700 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 5550 5325 5400 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 5625 5325 5475 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 5700 5325 5550 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 5775 5325 5625 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 5175 4875 5325 4875 5325 5775 5175 5775 5175 4875 +-6 +6 750 8550 1050 9750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 8850 975 8700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 8925 975 8775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9000 975 8850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9075 975 8925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9150 975 9000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9225 975 9075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9300 975 9150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9375 975 9225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9450 975 9300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9525 975 9375 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9600 975 9450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 9675 975 9525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 8700 900 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 8775 975 8625 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 825 8625 975 8625 975 9675 825 9675 825 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 900 9675 975 9600 +-6 +6 1350 8550 1650 9750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 8850 1575 8700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 8925 1575 8775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 9000 1575 8850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 9075 1575 8925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 9150 1575 9000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 9225 1575 9075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 9300 1575 9150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 9375 1575 9225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 9450 1575 9300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 9525 1575 9375 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 9600 1575 9450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 9675 1575 9525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 8700 1500 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 8775 1575 8625 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 1425 8625 1575 8625 1575 9675 1425 9675 1425 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1500 9675 1575 9600 +-6 +6 1800 8250 2100 9300 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 8475 2025 8325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 8550 2025 8400 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 8625 2025 8475 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 8700 2025 8550 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 8775 2025 8625 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 8850 2025 8700 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 8400 1950 8325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 8925 2025 8775 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 9225 2025 9150 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 9000 2025 8850 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 9075 2025 8925 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 9150 2025 9000 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 9225 2025 9075 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1875 8325 2025 8325 2025 9225 1875 9225 1875 8325 +-6 +6 1725 9525 2025 9975 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 1950 9600 1950 9900 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 1800 9750 1950 9750 +-6 +6 4050 8550 4350 9750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 8850 4275 8700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 8925 4275 8775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9000 4275 8850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9075 4275 8925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9150 4275 9000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9225 4275 9075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9300 4275 9150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9375 4275 9225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9450 4275 9300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9525 4275 9375 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9600 4275 9450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 9675 4275 9525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 8700 4200 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 8775 4275 8625 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 4125 8625 4275 8625 4275 9675 4125 9675 4125 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4200 9675 4275 9600 +-6 +6 4650 8550 4950 9750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 8850 4875 8700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 8925 4875 8775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 9000 4875 8850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 9075 4875 8925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 9150 4875 9000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 9225 4875 9075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 9300 4875 9150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 9375 4875 9225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 9450 4875 9300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 9525 4875 9375 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 9600 4875 9450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 9675 4875 9525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 8700 4800 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 8775 4875 8625 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 4725 8625 4875 8625 4875 9675 4725 9675 4725 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4800 9675 4875 9600 +-6 +6 5100 8250 5400 9300 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 8475 5325 8325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 8550 5325 8400 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 8625 5325 8475 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 8700 5325 8550 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 8775 5325 8625 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 8850 5325 8700 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 8400 5250 8325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 8925 5325 8775 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5250 9225 5325 9150 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 9000 5325 8850 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 9075 5325 8925 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 9150 5325 9000 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 9225 5325 9075 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 5175 8325 5325 8325 5325 9225 5175 9225 5175 8325 +-6 +6 5175 7725 5475 8175 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 5250 7800 5250 8100 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 5400 7950 5250 7950 +-6 +6 750 12000 1050 13200 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12300 975 12150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12375 975 12225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12450 975 12300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12525 975 12375 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12600 975 12450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12675 975 12525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12750 975 12600 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12825 975 12675 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12900 975 12750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12975 975 12825 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 13050 975 12900 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 13125 975 12975 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12150 900 12075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 12225 975 12075 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 825 12075 975 12075 975 13125 825 13125 825 12075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 900 13125 975 13050 +-6 +6 1350 12000 1650 13200 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 12300 1575 12150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 12375 1575 12225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 12450 1575 12300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 12525 1575 12375 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 12600 1575 12450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 12675 1575 12525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 12750 1575 12600 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 12825 1575 12675 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 12900 1575 12750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 12975 1575 12825 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 13050 1575 12900 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 13125 1575 12975 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 12150 1500 12075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 12225 1575 12075 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 1425 12075 1575 12075 1575 13125 1425 13125 1425 12075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1500 13125 1575 13050 +-6 +6 1800 11700 2100 12750 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 11925 2025 11775 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 12000 2025 11850 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 12075 2025 11925 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 12150 2025 12000 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 12225 2025 12075 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 12300 2025 12150 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 11850 1950 11775 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 12375 2025 12225 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 12675 2025 12600 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 12450 2025 12300 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 12525 2025 12375 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 12600 2025 12450 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 12675 2025 12525 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1875 11775 2025 11775 2025 12675 1875 12675 1875 11775 +-6 +6 1725 12975 2025 13425 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 1950 13050 1950 13350 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 1800 13200 1950 13200 +-6 +6 4050 12000 4350 13200 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 12300 4275 12150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 12375 4275 12225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 12450 4275 12300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 12525 4275 12375 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 12600 4275 12450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 12675 4275 12525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 12750 4275 12600 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 12825 4275 12675 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 12900 4275 12750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 12975 4275 12825 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 13050 4275 12900 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 13125 4275 12975 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 12150 4200 12075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4125 12225 4275 12075 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 4125 12075 4275 12075 4275 13125 4125 13125 4125 12075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4200 13125 4275 13050 +-6 +6 4650 12000 4950 13200 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 12300 4875 12150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 12375 4875 12225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 12450 4875 12300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 12525 4875 12375 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 12600 4875 12450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 12675 4875 12525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 12750 4875 12600 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 12825 4875 12675 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 12900 4875 12750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 12975 4875 12825 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 13050 4875 12900 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 13125 4875 12975 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 12150 4800 12075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4725 12225 4875 12075 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 4725 12075 4875 12075 4875 13125 4725 13125 4725 12075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 4800 13125 4875 13050 +-6 +6 5100 11700 5400 12750 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 11925 5325 11775 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 12000 5325 11850 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 12075 5325 11925 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 12150 5325 12000 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 12225 5325 12075 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 12300 5325 12150 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 11850 5250 11775 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 12375 5325 12225 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5250 12675 5325 12600 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 12450 5325 12300 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 12525 5325 12375 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 12600 5325 12450 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5175 12675 5325 12525 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 5175 11775 5325 11775 5325 12675 5175 12675 5175 11775 +-6 +6 5175 11175 5475 11625 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 5250 11250 5250 11550 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 5400 11400 5250 11400 +-6 +6 750 15450 1050 16650 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15750 975 15600 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15825 975 15675 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15900 975 15750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15975 975 15825 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 16050 975 15900 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 16125 975 15975 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 16200 975 16050 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 16275 975 16125 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 16350 975 16200 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 16425 975 16275 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 16500 975 16350 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 16575 975 16425 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15600 900 15525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 15675 975 15525 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 825 15525 975 15525 975 16575 825 16575 825 15525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 900 16575 975 16500 +-6 +6 1350 15450 1650 16650 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 15750 1575 15600 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 15825 1575 15675 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 15900 1575 15750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 15975 1575 15825 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 16050 1575 15900 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 16125 1575 15975 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 16200 1575 16050 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 16275 1575 16125 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 16350 1575 16200 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 16425 1575 16275 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 16500 1575 16350 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 16575 1575 16425 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 15600 1500 15525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 15675 1575 15525 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 1425 15525 1575 15525 1575 16575 1425 16575 1425 15525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1500 16575 1575 16500 +-6 +6 1800 15150 2100 16200 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 15375 2025 15225 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 15450 2025 15300 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 15525 2025 15375 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 15600 2025 15450 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 15675 2025 15525 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 15750 2025 15600 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 15300 1950 15225 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 15825 2025 15675 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 16125 2025 16050 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 15900 2025 15750 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 15975 2025 15825 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 16050 2025 15900 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 16125 2025 15975 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1875 15225 2025 15225 2025 16125 1875 16125 1875 15225 +-6 +6 1725 16425 2025 16875 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 1950 16500 1950 16800 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 1800 16650 1950 16650 +-6 +6 1875 14625 2175 15075 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 1950 14700 1950 15000 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 2 + 2100 14850 1950 14850 +-6 +6 375 3750 2925 6825 +6 750 5100 1050 6300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5400 975 5250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5475 975 5325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5550 975 5400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5625 975 5475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5700 975 5550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5775 975 5625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5850 975 5700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5925 975 5775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 6000 975 5850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 6075 975 5925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 6150 975 6000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 6225 975 6075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5250 900 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 825 5325 975 5175 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 825 5175 975 5175 975 6225 825 6225 825 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 900 6225 975 6150 +-6 +6 1350 5100 1650 6300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 5400 1575 5250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 5475 1575 5325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 5550 1575 5400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 5625 1575 5475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 5700 1575 5550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 5775 1575 5625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 5850 1575 5700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 5925 1575 5775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 6000 1575 5850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 6075 1575 5925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 6150 1575 6000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 6225 1575 6075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 5250 1500 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1425 5325 1575 5175 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 1425 5175 1575 5175 1575 6225 1425 6225 1425 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 1500 6225 1575 6150 +-6 +6 1800 4800 2100 5850 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 5025 2025 4875 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 5100 2025 4950 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 5175 2025 5025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 5250 2025 5100 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 5325 2025 5175 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 5400 2025 5250 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 4950 1950 4875 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 5475 2025 5325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 5775 2025 5700 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 5550 2025 5400 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 5625 2025 5475 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 5700 2025 5550 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1875 5775 2025 5625 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1875 4875 2025 4875 2025 5775 1875 5775 1875 4875 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 450 4200 2850 4200 2850 6600 450 6600 450 4200 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 5325 1575 5325 1575 5475 1425 5475 1425 5325 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1875 5325 2025 5325 2025 5475 1875 5475 1875 5325 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 5175 1575 5175 1575 5325 1425 5325 1425 5175 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 825 5175 975 5175 975 5325 825 5325 825 5175 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 975 5250 1425 5250 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1575 5400 1875 5400 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 5775 1950 6750 +2 2 0 4 4 1 50 -1 -1 10.000 0 0 7 0 0 5 + 1875 5625 2025 5625 2025 5775 1875 5775 1875 5625 +4 1 0 50 -1 14 14 0.0000 4 195 900 1650 3900 1G (S)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 525 6525 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2775 4425 NE\001 +-6 +6 6975 3750 9525 6675 +6 7350 5100 7650 6300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 5400 7575 5250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 5475 7575 5325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 5550 7575 5400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 5625 7575 5475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 5700 7575 5550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 5775 7575 5625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 5850 7575 5700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 5925 7575 5775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 6000 7575 5850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 6075 7575 5925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 6150 7575 6000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 6225 7575 6075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 5250 7500 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 5325 7575 5175 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 7425 5175 7575 5175 7575 6225 7425 6225 7425 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7500 6225 7575 6150 +-6 +6 7950 5100 8250 6300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 5400 8175 5250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 5475 8175 5325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 5550 8175 5400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 5625 8175 5475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 5700 8175 5550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 5775 8175 5625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 5850 8175 5700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 5925 8175 5775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 6000 8175 5850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 6075 8175 5925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 6150 8175 6000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 6225 8175 6075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 5250 8100 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 5325 8175 5175 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 8025 5175 8175 5175 8175 6225 8025 6225 8025 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8100 6225 8175 6150 +-6 +6 8400 4800 8700 6000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 5100 8625 4950 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 5175 8625 5025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 5250 8625 5100 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 5325 8625 5175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 5400 8625 5250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 5475 8625 5325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 5550 8625 5400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 5625 8625 5475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 5700 8625 5550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 5775 8625 5625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 5850 8625 5700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 5925 8625 5775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 4950 8550 4875 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 5025 8625 4875 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 8475 4875 8625 4875 8625 5925 8475 5925 8475 4875 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8550 5925 8625 5850 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 7050 4200 9450 4200 9450 6600 7050 6600 7050 4200 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 8025 5325 8175 5325 8175 5475 8025 5475 8025 5325 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 8025 5175 8175 5175 8175 5325 8025 5325 8025 5175 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 7425 5175 7575 5175 7575 5325 7425 5325 7425 5175 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 7575 5250 8025 5250 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 8175 5400 8475 5400 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 8475 5325 8625 5325 8625 5475 8475 5475 8475 5325 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 8475 4875 8625 4875 8625 5025 8475 5025 8475 4875 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 8850 4950 9000 4950 9000 4800 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 9000 4050 9000 4950 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 8625 4950 9000 4950 +4 1 0 50 -1 14 14 0.0000 4 195 900 8250 3900 1G (N)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 7125 6525 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 9375 4425 NE\001 +-6 +6 7350 1650 7650 2850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 1950 7575 1800 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 2025 7575 1875 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 2100 7575 1950 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 2175 7575 2025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 2250 7575 2100 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 2325 7575 2175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 2400 7575 2250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 2475 7575 2325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 2550 7575 2400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 2625 7575 2475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 2700 7575 2550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 2775 7575 2625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 1800 7500 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 1875 7575 1725 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 7425 1725 7575 1725 7575 2775 7425 2775 7425 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7500 2775 7575 2700 +-6 +6 7950 1650 8250 2850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 1950 8175 1800 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 2025 8175 1875 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 2100 8175 1950 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 2175 8175 2025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 2250 8175 2100 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 2325 8175 2175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 2400 8175 2250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 2475 8175 2325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 2550 8175 2400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 2625 8175 2475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 2700 8175 2550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 2775 8175 2625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 1800 8100 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 1875 8175 1725 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 8025 1725 8175 1725 8175 2775 8025 2775 8025 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8100 2775 8175 2700 +-6 +6 8400 1350 8700 2550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 1650 8625 1500 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 1725 8625 1575 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 1800 8625 1650 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 1875 8625 1725 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 1950 8625 1800 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 2025 8625 1875 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 2100 8625 1950 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 2175 8625 2025 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 2250 8625 2100 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 2325 8625 2175 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 2400 8625 2250 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 2475 8625 2325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 1500 8550 1425 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 1575 8625 1425 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 8475 1425 8625 1425 8625 2475 8475 2475 8475 1425 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8550 2475 8625 2400 +-6 +6 7350 8550 7650 9750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 8850 7575 8700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 8925 7575 8775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 9000 7575 8850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 9075 7575 8925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 9150 7575 9000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 9225 7575 9075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 9300 7575 9150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 9375 7575 9225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 9450 7575 9300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 9525 7575 9375 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 9600 7575 9450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 9675 7575 9525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 8700 7500 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7425 8775 7575 8625 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 7425 8625 7575 8625 7575 9675 7425 9675 7425 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 7500 9675 7575 9600 +-6 +6 7950 8550 8250 9750 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 8850 8175 8700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 8925 8175 8775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 9000 8175 8850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 9075 8175 8925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 9150 8175 9000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 9225 8175 9075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 9300 8175 9150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 9375 8175 9225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 9450 8175 9300 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 9525 8175 9375 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 9600 8175 9450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 9675 8175 9525 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 8700 8100 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8025 8775 8175 8625 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 8025 8625 8175 8625 8175 9675 8025 9675 8025 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8100 9675 8175 9600 +-6 +6 8400 8250 8700 9450 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 8550 8625 8400 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 8625 8625 8475 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 8700 8625 8550 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 8775 8625 8625 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 8850 8625 8700 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 8925 8625 8775 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 9000 8625 8850 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 9075 8625 8925 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 9150 8625 9000 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 9225 8625 9075 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 9300 8625 9150 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 9375 8625 9225 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 8400 8550 8325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8475 8475 8625 8325 +2 2 0 2 1 1 60 -1 -1 6.000 0 0 -1 0 0 5 + 8475 8325 8625 8325 8625 9375 8475 9375 8475 8325 +2 1 0 1 1 1 60 -1 -1 4.000 0 0 -1 0 0 2 + 8550 9375 8625 9300 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 3750 750 6150 750 6150 3150 3750 3150 3750 750 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4725 1875 4875 1875 4875 2025 4725 2025 4725 1875 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5175 1875 5325 1875 5325 2025 5175 2025 5175 1875 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4725 1725 4875 1725 4875 1875 4725 1875 4725 1725 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4125 1725 4275 1725 4275 1875 4125 1875 4125 1725 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4275 1800 4725 1800 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4875 1950 5175 1950 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5175 2175 5325 2175 5325 2325 5175 2325 5175 2175 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 6300 2250 5325 2250 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4725 5325 4875 5325 4875 5475 4725 5475 4725 5325 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5175 5325 5325 5325 5325 5475 5175 5475 5175 5325 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4725 5175 4875 5175 4875 5325 4725 5325 4725 5175 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4125 5175 4275 5175 4275 5325 4125 5325 4125 5175 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4275 5250 4725 5250 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4875 5400 5175 5400 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 3750 4200 6150 4200 6150 6600 3750 6600 3750 4200 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 5250 4050 5250 4875 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 450 7650 2850 7650 2850 10050 450 10050 450 7650 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 8775 1575 8775 1575 8925 1425 8925 1425 8775 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1875 8775 2025 8775 2025 8925 1875 8925 1875 8775 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 8625 1575 8625 1575 8775 1425 8775 1425 8625 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 825 8625 975 8625 975 8775 825 8775 825 8625 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 975 8700 1425 8700 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1575 8850 1875 8850 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 9750 300 9750 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 9225 1950 9750 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 9750 1950 10200 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4725 8775 4875 8775 4875 8925 4725 8925 4725 8775 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5175 8775 5325 8775 5325 8925 5175 8925 5175 8775 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4725 8625 4875 8625 4875 8775 4725 8775 4725 8625 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4125 8625 4275 8625 4275 8775 4125 8775 4125 8625 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4275 8700 4725 8700 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4875 8850 5175 8850 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 3750 7650 6150 7650 6150 10050 3750 10050 3750 7650 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 5250 7950 5250 8325 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 6300 7950 5250 7950 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 5250 7500 5250 7950 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 450 11100 2850 11100 2850 13500 450 13500 450 11100 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 12225 1575 12225 1575 12375 1425 12375 1425 12225 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1875 12225 2025 12225 2025 12375 1875 12375 1875 12225 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 12075 1575 12075 1575 12225 1425 12225 1425 12075 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 825 12075 975 12075 975 12225 825 12225 825 12075 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 975 12150 1425 12150 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1575 12300 1875 12300 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 13200 300 13200 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 12675 1950 13200 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 13200 1950 13650 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1875 11775 2025 11775 2025 11925 1875 11925 1875 11775 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 2025 11850 3000 11850 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 3750 11100 6150 11100 6150 13500 3750 13500 3750 11100 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4725 12225 4875 12225 4875 12375 4725 12375 4725 12225 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5175 12225 5325 12225 5325 12375 5175 12375 5175 12225 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4725 12075 4875 12075 4875 12225 4725 12225 4725 12075 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4125 12075 4275 12075 4275 12225 4125 12225 4125 12075 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4275 12150 4725 12150 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4875 12300 5175 12300 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 4125 12675 4275 12675 4275 12825 4125 12825 4125 12675 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4125 12750 3600 12750 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 5250 11400 5250 11775 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 5250 11400 6300 11400 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 5250 10950 5250 11400 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 450 14550 2850 14550 2850 16950 450 16950 450 14550 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 15675 1575 15675 1575 15825 1425 15825 1425 15675 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1875 15675 2025 15675 2025 15825 1875 15825 1875 15675 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 1425 15525 1575 15525 1575 15675 1425 15675 1425 15525 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 825 15525 975 15525 975 15675 825 15675 825 15525 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 975 15600 1425 15600 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1575 15750 1875 15750 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 16650 300 16650 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 16125 1950 16650 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 16650 1950 17100 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 14850 3000 14850 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 14400 1950 14850 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 14850 1950 15225 +2 2 0 4 4 1 50 -1 -1 10.000 0 0 7 0 0 5 + 1875 15225 2025 15225 2025 15375 1875 15375 1875 15225 +2 2 0 4 4 1 50 -1 -1 10.000 0 0 7 0 0 5 + 1875 15975 2025 15975 2025 16125 1875 16125 1875 15975 +2 2 0 4 4 1 50 -1 -1 10.000 0 0 7 0 0 5 + 1875 12525 2025 12525 2025 12675 1875 12675 1875 12525 +2 2 0 4 4 1 50 -1 -1 10.000 0 0 7 0 0 5 + 5175 11775 5325 11775 5325 11925 5175 11925 5175 11775 +2 2 0 4 4 1 50 -1 -1 10.000 0 0 7 0 0 5 + 1875 9075 2025 9075 2025 9225 1875 9225 1875 9075 +2 2 0 4 4 1 50 -1 -1 10.000 0 0 7 0 0 5 + 5175 8325 5325 8325 5325 8475 5175 8475 5175 8325 +2 2 0 4 4 1 50 -1 -1 10.000 0 0 7 0 0 5 + 5175 4875 5325 4875 5325 5025 5175 5025 5175 4875 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 7050 750 9450 750 9450 3150 7050 3150 7050 750 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 8025 1875 8175 1875 8175 2025 8025 2025 8025 1875 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 8025 1725 8175 1725 8175 1875 8025 1875 8025 1725 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 7425 1725 7575 1725 7575 1875 7425 1875 7425 1725 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 7575 1800 8025 1800 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 8175 1950 8475 1950 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 8475 1875 8625 1875 8625 2025 8475 2025 8475 1875 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 8475 1425 8625 1425 8625 1575 8475 1575 8475 1425 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 9600 1500 8625 1500 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 7050 7650 9450 7650 9450 10050 7050 10050 7050 7650 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 8025 8775 8175 8775 8175 8925 8025 8925 8025 8775 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 8025 8625 8175 8625 8175 8775 8025 8775 8025 8625 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 7425 8625 7575 8625 7575 8775 7425 8775 7425 8625 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 7575 8700 8025 8700 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 8175 8850 8475 8850 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 8475 8775 8625 8775 8625 8925 8475 8925 8475 8775 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 8475 8325 8625 8325 8625 8475 8475 8475 8475 8325 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 9000 7500 9000 8400 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 8625 8400 9000 8400 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 8850 8400 9150 8400 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 9000 8250 9000 8400 +2 1 0 2 4 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 9000 8400 9600 8400 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 150 150 9750 150 9750 17250 150 17250 150 150 +4 1 0 50 -1 14 14 0.0000 4 195 900 4950 450 1G (E)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 3825 3075 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 6075 975 NE\001 +4 1 0 50 -1 14 14 0.0000 4 195 900 4950 3900 1G (N)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 3825 6525 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 6075 4425 NE\001 +4 1 0 50 -1 14 14 0.0000 4 195 1200 1650 7350 2G (S,W)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 525 9975 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2775 7875 NE\001 +4 1 0 50 -1 14 14 0.0000 4 195 1200 4950 7350 2G (N,E)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 3825 9975 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 6075 7875 NE\001 +4 1 0 50 -1 14 14 0.0000 4 195 1500 1650 10800 3G (S,W,E)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 525 13425 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2775 11325 NE\001 +4 1 0 50 -1 14 14 0.0000 4 195 1500 4950 10800 3G (N,W,E)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 3825 13425 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 6075 11325 NE\001 +4 1 0 50 -1 14 14 0.0000 4 195 1800 1650 14250 4G (N,S,W,E)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 525 16875 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2775 14775 NE\001 +4 1 0 50 -1 14 14 0.0000 4 195 900 8250 450 1G (E)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 7125 3075 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 9375 975 NE\001 +4 1 0 50 -1 14 14 0.0000 4 195 1200 8250 7350 2G (N,E)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 7125 9975 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 9375 7875 NE\001 diff --git a/katabatic/doc/images/_do_xG_xM1_xM3.png b/katabatic/doc/images/_do_xG_xM1_xM3.png new file mode 100644 index 0000000000000000000000000000000000000000..91fb380a08048fc2985614360ca90ef50fb02e8d GIT binary patch literal 24305 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 b%M$)&3IA`jgrA8~pU4PIu|{cs3(o%+bC{3* literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/_do_xG_xM2.fig b/katabatic/doc/images/_do_xG_xM2.fig new file mode 100644 index 00000000..fb281106 --- /dev/null +++ b/katabatic/doc/images/_do_xG_xM2.fig @@ -0,0 +1,422 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +90.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 375 300 2925 3375 +6 600 1350 1200 1650 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1125 1575 975 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1125 1500 1050 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1050 1575 900 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 975 1575 825 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 900 1575 750 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 825 1575 675 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 750 1575 675 1500 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 675 1575 675 1425 1125 1425 1125 1575 675 1575 +-6 +6 1800 2100 2700 2400 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2625 2250 2550 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2625 2325 2475 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2550 2325 2400 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2475 2325 2325 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2400 2325 2250 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 2325 2175 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2250 2325 2100 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2175 2325 2025 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2100 2325 1950 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2025 2325 1875 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 2325 1875 2250 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1875 2325 1875 2175 2625 2175 2625 2325 1875 2325 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 450 750 2850 750 2850 3150 450 3150 450 750 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 1875 2175 2025 2175 2025 2325 1875 2325 1875 2175 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 1350 1500 1500 1500 1500 1650 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 1500 2100 1500 2250 1650 2250 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1125 1500 1500 1500 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 975 1425 1125 1425 1125 1575 975 1575 975 1425 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1500 1500 1500 2250 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1500 2250 1875 2250 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 2175 2175 2325 2175 2325 2325 2175 2325 2175 2175 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 2250 2325 2250 3300 +4 1 0 50 -1 14 14 0.0000 4 195 900 1650 450 1G (S)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 525 3075 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2775 975 NE\001 +-6 +6 3675 300 6225 3375 +6 3900 1350 4500 1650 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4425 1575 4275 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4425 1500 4350 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4350 1575 4200 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4275 1575 4125 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4200 1575 4050 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4125 1575 3975 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4050 1575 3975 1500 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 3975 1575 3975 1425 4425 1425 4425 1575 3975 1575 +-6 +6 5100 1350 6000 1650 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5925 1500 5850 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5925 1575 5775 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5850 1575 5700 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5775 1575 5625 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5700 1575 5550 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5625 1575 5475 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5550 1575 5400 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5475 1575 5325 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5400 1575 5250 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5325 1575 5175 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5250 1575 5175 1500 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 5175 1575 5175 1425 5925 1425 5925 1575 5175 1575 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 3750 750 6150 750 6150 3150 3750 3150 3750 750 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 4275 1425 4425 1425 4425 1575 4275 1575 4275 1425 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 5550 1575 5550 3300 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 5175 1425 5325 1425 5325 1575 5175 1575 5175 1425 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4425 1500 5175 1500 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5475 1425 5625 1425 5625 1575 5475 1575 5475 1425 +4 1 0 50 -1 14 14 0.0000 4 195 900 4950 450 1G (S)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 3825 3075 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 6075 975 NE\001 +-6 +6 600 4800 1200 5100 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1125 5025 975 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1125 4950 1050 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1050 5025 900 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 975 5025 825 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 900 5025 750 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 825 5025 675 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 750 5025 675 4950 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 675 5025 675 4875 1125 4875 1125 5025 675 5025 +-6 +6 1800 4800 2700 5100 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2625 4950 2550 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2625 5025 2475 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2550 5025 2400 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2475 5025 2325 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2400 5025 2250 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 5025 2175 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2250 5025 2100 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2175 5025 2025 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2100 5025 1950 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2025 5025 1875 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 5025 1875 4950 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1875 5025 1875 4875 2625 4875 2625 5025 1875 5025 +-6 +6 3525 3750 6225 6825 +6 3900 4800 4500 5100 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4425 5025 4275 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4425 4950 4350 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4350 5025 4200 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4275 5025 4125 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4200 5025 4050 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4125 5025 3975 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4050 5025 3975 4950 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 3975 5025 3975 4875 4425 4875 4425 5025 3975 5025 +-6 +6 5100 4800 6000 5100 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5925 4950 5850 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5925 5025 5775 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5850 5025 5700 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5775 5025 5625 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5700 5025 5550 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5625 5025 5475 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5550 5025 5400 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5475 5025 5325 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5400 5025 5250 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5325 5025 5175 4875 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5250 5025 5175 4950 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 5175 5025 5175 4875 5925 4875 5925 5025 5175 5025 +-6 +6 5325 5325 5625 5775 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5550 5400 5550 5700 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5550 5550 5400 5550 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 3750 4200 6150 4200 6150 6600 3750 6600 3750 4200 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 4275 4875 4425 4875 4425 5025 4275 5025 4275 4875 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 5175 4875 5325 4875 5325 5025 5175 5025 5175 4875 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4425 4950 5175 4950 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5475 4875 5625 4875 5625 5025 5475 5025 5475 4875 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 5550 5025 5550 5550 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 5550 5550 5550 6750 +2 1 0 2 4 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 5550 5550 3600 5550 +4 1 0 50 -1 14 14 0.0000 4 195 1200 4950 3900 2G (S,W)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 3825 6525 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 6075 4425 NE\001 +-6 +6 3525 7200 6225 10275 +6 3900 8250 4500 8550 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4425 8475 4275 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4425 8400 4350 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4350 8475 4200 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4275 8475 4125 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4200 8475 4050 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4125 8475 3975 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4050 8475 3975 8400 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 3975 8475 3975 8325 4425 8325 4425 8475 3975 8475 +-6 +6 5100 8250 6000 8550 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5925 8400 5850 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5925 8475 5775 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5850 8475 5700 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5775 8475 5625 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5700 8475 5550 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5625 8475 5475 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5550 8475 5400 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5475 8475 5325 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5400 8475 5250 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5325 8475 5175 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5250 8475 5175 8400 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 5175 8475 5175 8325 5925 8325 5925 8475 5175 8475 +-6 +6 5325 8775 5625 9225 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5550 8850 5550 9150 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5550 9000 5400 9000 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 3750 7650 6150 7650 6150 10050 3750 10050 3750 7650 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 4275 8325 4425 8325 4425 8475 4275 8475 4275 8325 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 5175 8325 5325 8325 5325 8475 5175 8475 5175 8325 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 4425 8400 5175 8400 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5475 8325 5625 8325 5625 8475 5475 8475 5475 8325 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 5550 8475 5550 9000 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 5550 9000 5550 10200 +2 1 0 2 4 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 5550 9000 3600 9000 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 5775 8325 5925 8325 5925 8475 5775 8475 5775 8325 +2 1 0 2 4 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 5850 8325 5850 7500 +4 1 0 50 -1 14 14 0.0000 4 195 1500 4950 7350 3G (N,S,W)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 3825 9975 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 6075 7875 NE\001 +-6 +6 225 7200 3075 10275 +6 600 8250 1200 8550 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1125 8475 975 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1125 8400 1050 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1050 8475 900 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 975 8475 825 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 900 8475 750 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 825 8475 675 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 750 8475 675 8400 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 675 8475 675 8325 1125 8325 1125 8475 675 8475 +-6 +6 1800 8250 2700 8550 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2625 8400 2550 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2625 8475 2475 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2550 8475 2400 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2475 8475 2325 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2400 8475 2250 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 8475 2175 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2250 8475 2100 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2175 8475 2025 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2100 8475 1950 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2025 8475 1875 8325 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 8475 1875 8400 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1875 8475 1875 8325 2625 8325 2625 8475 1875 8475 +-6 +6 2025 8775 2325 9225 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 2250 8850 2250 9150 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 2250 9000 2100 9000 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 450 7650 2850 7650 2850 10050 450 10050 450 7650 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 975 8325 1125 8325 1125 8475 975 8475 975 8325 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 1875 8325 2025 8325 2025 8475 1875 8475 1875 8325 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1125 8400 1875 8400 +2 2 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 5 + 2175 8325 2325 8325 2325 8475 2175 8475 2175 8325 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 2250 8475 2250 9000 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 2250 9000 2250 10200 +2 1 0 2 4 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 2250 9000 300 9000 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 2475 8325 2625 8325 2625 8475 2475 8475 2475 8325 +2 1 0 2 4 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 2625 8400 3000 8400 +4 1 0 50 -1 14 14 0.0000 4 195 1500 1650 7350 3G (S,E,W)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 525 9975 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2775 7875 NE\001 +-6 +2 2 1 2 0 7 50 -1 -1 6.000 0 0 7 0 0 5 + 450 4200 2850 4200 2850 6600 450 6600 450 4200 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 975 4875 1125 4875 1125 5025 975 5025 975 4875 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 1875 4875 2025 4875 2025 5025 1875 5025 1875 4875 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1125 4950 1875 4950 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 675 4875 825 4875 825 5025 675 5025 675 4875 +2 1 0 2 4 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 675 4950 300 4950 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 150 150 6450 150 6450 10350 150 10350 150 150 +4 1 0 50 -1 14 14 0.0000 4 195 900 1650 3900 1G (W)\001 +4 0 0 50 -1 14 14 0.0000 4 135 300 525 6525 SW\001 +4 2 0 50 -1 14 14 0.0000 4 135 300 2775 4425 NE\001 diff --git a/katabatic/doc/images/_do_xG_xM2.png b/katabatic/doc/images/_do_xG_xM2.png new file mode 100644 index 0000000000000000000000000000000000000000..4554558e9a9774a182c82336701225e2d286625c GIT binary patch literal 10865 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 O|FIN!&-NdL@xK5ZOgY~G literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/_makeDogleg-1.fig b/katabatic/doc/images/_makeDogleg-1.fig new file mode 100644 index 00000000..740a613a --- /dev/null +++ b/katabatic/doc/images/_makeDogleg-1.fig @@ -0,0 +1,247 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 450 375 6225 2250 +6 450 900 750 2250 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1125 675 975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1200 675 1050 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1275 675 1125 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1350 675 1200 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1425 675 1275 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1500 675 1350 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1575 675 1425 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1650 675 1500 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1725 675 1575 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1800 675 1650 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1875 675 1725 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1950 675 1800 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 2025 675 1875 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 2100 675 1950 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 2175 675 2025 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1050 600 975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 600 2175 675 2100 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 525 975 675 975 675 2175 525 2175 525 975 +-6 +6 1425 975 1875 1275 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1500 1200 1800 1200 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1650 1050 1650 1200 +-6 +6 2325 1125 2775 1425 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2400 1200 2700 1200 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2550 1350 2550 1200 +-6 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 525 1125 675 1125 675 1275 525 1275 525 1125 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1050 1200 1050 900 1350 900 1350 1200 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 3450 1200 4350 1200 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 2550 1200 3450 1200 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1650 1200 1650 450 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 2550 1200 2550 1950 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4350 1200 4350 450 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5250 1200 5250 450 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6150 1200 6150 1950 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 675 1200 1650 1200 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 1650 1200 2550 1200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1950 1200 1950 900 2250 900 2250 1200 +2 1 0 4 0 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 6000 1200 6150 1200 6150 1350 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4200 1200 4500 1200 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4350 1050 4350 1200 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 4350 1200 5250 1200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4650 1200 4650 900 4950 900 4950 1200 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5100 1200 5400 1200 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5250 1050 5250 1200 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 5250 1200 6150 1200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 5550 1200 5550 900 5850 900 5850 1200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 3300 1200 3300 900 3600 900 3600 1200 +4 1 0 50 -1 14 12 0.0000 4 120 240 1200 1125 10\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 2100 1125 12\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 4800 1125 16\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 5700 1125 17\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 3450 1125 13\001 +4 1 0 50 -1 14 10 0.0000 4 120 315 1200 1350 C,T\001 +-6 +6 450 3000 750 4350 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3225 675 3075 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3300 675 3150 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3375 675 3225 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3450 675 3300 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3525 675 3375 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3600 675 3450 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3675 675 3525 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3750 675 3600 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3825 675 3675 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3900 675 3750 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3975 675 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 4050 675 3900 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 4125 675 3975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 4200 675 4050 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 4275 675 4125 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3150 600 3075 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 600 4275 675 4200 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 525 3075 675 3075 675 4275 525 4275 525 3075 +-6 +6 1425 3075 1875 3375 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1500 3300 1800 3300 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 1650 3150 1650 3300 +-6 +6 2325 3225 2775 3525 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2400 3300 2700 3300 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2550 3450 2550 3300 +-6 +6 750 5625 4875 6300 +4 0 4 50 -1 2 10 0.0000 4 135 3705 1050 6000 Perpandicular id:20 and parallel id:21 are created.\001 +4 0 4 50 -1 2 10 0.0000 4 135 3780 1050 6225 A new canonical appears on the "right" side (id:16).\001 +4 0 0 50 -1 2 10 0.0000 4 135 1785 750 5775 Segment id:13 is broken.\001 +-6 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 525 3225 675 3225 675 3375 525 3375 525 3225 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1050 3300 1050 3000 1350 3000 1350 3300 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1650 3300 1650 2550 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 2550 3300 2550 4050 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 675 3300 1650 3300 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 1650 3300 2550 3300 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1950 3300 1950 3000 2250 3000 2250 3300 +2 1 0 2 4 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 3450 4050 4350 4050 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4350 4050 4350 3300 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5250 4050 5250 3300 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6150 4050 6150 4800 +2 1 0 4 0 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 6000 4050 6150 4050 6150 4200 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4200 4050 4500 4050 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4350 3900 4350 4050 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 4350 4050 5250 4050 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4650 4050 4650 3750 4950 3750 4950 4050 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5100 4050 5400 4050 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5250 3900 5250 4050 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 5250 4050 6150 4050 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 5550 4050 5550 3750 5850 3750 5850 4050 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 2925 3300 2925 3000 3225 3000 3225 3300 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 2625 3300 3450 3300 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 3300 3300 3450 3300 3450 3450 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 3600 4050 3450 4050 3450 3900 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3450 3300 3450 4050 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 3450 3525 3750 3525 3750 3825 3450 3825 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 3750 4050 3750 4350 4050 4350 4050 4050 +2 1 3 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 3450 2400 3450 5100 +2 1 3 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2 + 0 0 1.00 60.00 120.00 + 0 0 1.00 60.00 120.00 + 6150 4950 3450 4950 +2 1 3 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2 + 0 0 1.00 60.00 120.00 + 0 0 1.00 60.00 120.00 + 3450 4950 450 4950 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 300 300 6450 300 6450 6450 300 6450 300 300 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 450 5400 6300 5400 +4 1 0 50 -1 14 12 0.0000 4 120 240 1200 3225 10\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 2100 3225 12\001 +4 1 0 50 -1 14 10 0.0000 4 120 315 1200 3450 C,T\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 4800 3975 16\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 5700 3975 17\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 3075 3225 13\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 3600 3750 20\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 3900 4275 21\001 +4 1 4 50 -1 14 10 0.0000 4 90 105 4800 4200 C\001 +4 1 0 50 -1 14 10 0.0000 4 135 1050 4800 5100 right side\001 +4 1 0 50 -1 14 10 0.0000 4 105 945 1950 5100 left side\001 +4 0 0 50 -1 2 10 0.0000 4 135 4680 750 5550 Segment id:13 is not canonical, both sides must be re-canonizeds.\001 diff --git a/katabatic/doc/images/_makeDogleg-1.png b/katabatic/doc/images/_makeDogleg-1.png new file mode 100644 index 0000000000000000000000000000000000000000..608d87ab99ccfcadd4b5c82fd85656d6f5a1fae8 GIT binary patch literal 10266 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 V2mgal1U70C@trd0WB%2Z{}-~fs_*~+ literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/_makeDogleg-2.fig b/katabatic/doc/images/_makeDogleg-2.fig new file mode 100644 index 00000000..826dd211 --- /dev/null +++ b/katabatic/doc/images/_makeDogleg-2.fig @@ -0,0 +1,246 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +110.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 450 3000 750 4350 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3225 675 3075 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3300 675 3150 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3375 675 3225 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3450 675 3300 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3525 675 3375 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3600 675 3450 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3675 675 3525 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3750 675 3600 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3825 675 3675 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3900 675 3750 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3975 675 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 4050 675 3900 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 4125 675 3975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 4200 675 4050 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 4275 675 4125 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 3150 600 3075 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 600 4275 675 4200 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 525 3075 675 3075 675 4275 525 4275 525 3075 +-6 +6 450 900 750 2250 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1125 675 975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1200 675 1050 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1275 675 1125 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1350 675 1200 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1425 675 1275 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1500 675 1350 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1575 675 1425 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1650 675 1500 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1725 675 1575 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1800 675 1650 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1875 675 1725 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1950 675 1800 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 2025 675 1875 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 2100 675 1950 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 2175 675 2025 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 525 1050 600 975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 600 2175 675 2100 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 525 975 675 975 675 2175 525 2175 525 975 +-6 +6 3225 1125 3675 1425 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3300 1200 3600 1200 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3450 1350 3450 1200 +-6 +6 2175 975 2625 1275 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2250 1200 2550 1200 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2400 1050 2400 1200 +-6 +6 4125 3825 4575 4125 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4350 3900 4350 4050 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4200 4050 4500 4050 +-6 +6 3225 3975 3675 4275 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3300 4050 3600 4050 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 3450 4200 3450 4050 +-6 +6 2175 3825 2625 4125 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2250 4050 2550 4050 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 2400 3900 2400 4050 +-6 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 525 3225 675 3225 675 3375 525 3375 525 3225 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5250 4050 5250 3300 +2 1 0 4 0 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 6000 4050 6150 4050 6150 4200 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 4350 4050 5250 4050 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4650 4050 4650 3750 4950 3750 4950 4050 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5100 4050 5400 4050 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5250 3900 5250 4050 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 5250 4050 6150 4050 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 5550 4050 5550 3750 5850 3750 5850 4050 +2 1 3 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2 + 0 0 1.00 60.00 120.00 + 0 0 1.00 60.00 120.00 + 6150 4950 1500 4950 +2 1 3 1 0 7 50 -1 -1 4.000 0 0 -1 1 1 2 + 0 0 1.00 60.00 120.00 + 0 0 1.00 60.00 120.00 + 1500 4950 450 4950 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 525 1125 675 1125 675 1275 525 1275 525 1125 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 3450 1200 4350 1200 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4350 1200 4350 450 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 5250 1200 5250 450 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6150 1200 6150 1950 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 675 1200 2400 1200 +2 1 0 4 0 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 6000 1200 6150 1200 6150 1350 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4200 1200 4500 1200 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 4350 1050 4350 1200 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 4350 1200 5250 1200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4650 1200 4650 900 4950 900 4950 1200 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5100 1200 5400 1200 +2 1 0 4 0 7 40 -1 -1 0.000 0 0 -1 0 0 2 + 5250 1050 5250 1200 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 5250 1200 6150 1200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 5550 1200 5550 900 5850 900 5850 1200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 3750 1200 3750 900 4050 900 4050 1200 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3450 1200 3450 1950 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 2550 1200 3450 1200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 2850 1200 2850 900 3150 900 3150 1200 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 2400 1200 2400 450 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1350 1200 1350 900 1650 900 1650 1200 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4350 4050 4350 3300 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 3450 4050 3450 4800 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 2550 4050 3450 4050 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 3525 4050 4350 4050 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 2400 4050 2400 3300 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 2850 4050 2850 3750 3150 3750 3150 4050 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 3750 4050 3750 3750 4050 3750 4050 4050 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 825 3300 825 3000 1125 3000 1125 3300 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 1350 3300 1500 3300 1500 3450 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 1650 4050 1500 4050 1500 3900 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1500 3300 1500 4050 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1500 3525 1800 3525 1800 3825 1500 3825 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1800 4050 1800 4350 2100 4350 2100 4050 +2 1 3 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 1500 2400 1500 5100 +2 1 0 2 4 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 1500 4050 2400 4050 +2 1 0 2 0 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 525 3300 1500 3300 +2 1 0 2 1 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 6150 4050 6150 4800 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 300 300 6450 300 6450 6600 300 6600 300 300 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 450 5400 6300 5400 +4 1 0 50 -1 14 12 0.0000 4 120 240 4800 3975 16\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 5700 3975 17\001 +4 1 4 50 -1 14 10 0.0000 4 90 105 4800 4200 C\001 +4 0 0 50 -1 2 10 0.0000 4 135 4920 750 5550 Segment id:10 is canonical, ONLY right side has to be re-canonized.\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 4800 1125 16\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 5700 1125 17\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 3900 1125 13\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 3000 1125 12\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 1500 1125 10\001 +4 1 0 50 -1 14 10 0.0000 4 120 315 1500 1350 C,T\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 3000 3975 12\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 3900 3975 13\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 975 3225 10\001 +4 1 0 50 -1 14 10 0.0000 4 120 315 975 3450 C,T\001 +4 1 0 50 -1 14 10 0.0000 4 105 945 975 5100 left side\001 +4 1 0 50 -1 14 10 0.0000 4 135 1050 4050 5100 right side\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 1650 3750 20\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 1950 4275 21\001 +4 1 4 50 -1 14 10 0.0000 4 90 105 1425 3750 W\001 +4 1 4 50 -1 14 10 0.0000 4 90 105 1950 3975 W\001 +4 0 4 50 -1 2 10 0.0000 4 135 3705 1050 6000 Perpandicular id:20 and parallel id:21 are created.\001 +4 0 4 50 -1 2 10 0.0000 4 135 3780 1050 6225 A new canonical appears on the "right" side (id:16).\001 +4 0 0 50 -1 2 10 0.0000 4 135 1785 750 5775 Segment id:10 is broken.\001 +4 0 4 50 -1 2 10 0.0000 4 135 4380 1050 6450 The parts broken from id:10 are flagged "WeakTerminal1".\001 diff --git a/katabatic/doc/images/_makeDogleg-2.png b/katabatic/doc/images/_makeDogleg-2.png new file mode 100644 index 0000000000000000000000000000000000000000..fb5704f6b7472ad0f80eb4cb532496587c8c952e GIT binary patch literal 11981 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

    Xp$u_gnT$3JUtb7&yz3%8h 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\001 +4 1 0 50 -1 14 12 1.5708 4 165 1200 -225 1200 W<3*pitchs\001 diff --git a/katabatic/doc/images/_slacken-1.png b/katabatic/doc/images/_slacken-1.png new file mode 100644 index 0000000000000000000000000000000000000000..df3835c79858d6c112554baa9ec54168053702fa GIT binary patch literal 9434 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 literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/checkRoutingPadSize.fig b/katabatic/doc/images/checkRoutingPadSize.fig new file mode 100644 index 00000000..a0327f1b --- /dev/null +++ b/katabatic/doc/images/checkRoutingPadSize.fig @@ -0,0 +1,153 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +80.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 1650 3450 2775 5175 +6 1650 3750 1950 5100 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 3975 1875 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4050 1875 3900 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4125 1875 3975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4200 1875 4050 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4275 1875 4125 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4350 1875 4200 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4425 1875 4275 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4500 1875 4350 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4575 1875 4425 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4650 1875 4500 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4725 1875 4575 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4800 1875 4650 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4875 1875 4725 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4950 1875 4800 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 5025 1875 4875 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 3900 1800 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1800 5025 1875 4950 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 1725 3825 1875 3825 1875 5025 1725 5025 1725 3825 +-6 +6 2250 3750 2550 4200 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2325 3975 2475 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2325 4050 2475 3900 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2325 4125 2475 3975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2325 3900 2400 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 4125 2475 4050 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 2325 3825 2475 3825 2475 4125 2325 4125 2325 3825 +-6 +2 1 0 1 0 32 60 -1 -1 4.000 0 0 -1 0 0 2 + 1650 3825 2775 3825 +2 1 0 1 0 32 60 -1 -1 4.000 0 0 -1 0 0 2 + 1950 4350 2775 4350 +2 1 0 1 0 32 60 -1 -1 4.000 0 0 -1 0 0 2 + 2700 3825 2700 4350 +2 1 0 1 0 32 60 -1 -1 4.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 2700 5100 2700 4350 +2 1 0 1 0 32 60 -1 -1 4.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 2700 3450 2700 3825 +4 1 0 60 -1 14 10 1.5708 4 105 630 2625 4800 VSmall\001 +4 1 0 60 -1 14 10 1.5708 4 105 210 2625 3600 15\001 +-6 +6 4500 3750 5400 4200 +6 4800 3750 5100 4050 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4875 3975 5025 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4875 3900 4950 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4950 3975 5025 3900 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 4875 3825 5025 3825 5025 3975 4875 3975 4875 3825 +-6 +4 1 0 60 -1 14 10 0.0000 4 105 840 4950 4200 Punctual\001 +-6 +6 3000 3750 4575 5100 +6 3300 3750 4350 4050 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3375 3900 3450 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3375 3975 3525 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3450 3975 3600 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3525 3975 3675 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3600 3975 3750 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3675 3975 3825 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3750 3975 3900 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3825 3975 3975 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3900 3975 4050 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3975 3975 4125 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4050 3975 4200 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4125 3975 4275 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4200 3975 4275 3900 +2 2 0 2 4 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 3375 3825 4275 3825 4275 3975 3375 3975 3375 3825 +-6 +6 3300 4350 3750 4650 +2 2 0 2 4 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 3375 4425 3675 4425 3675 4575 3375 4575 3375 4425 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3375 4500 3450 4425 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3375 4575 3525 4425 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3450 4575 3600 4425 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3525 4575 3675 4425 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3600 4575 3675 4500 +-6 +2 1 0 1 0 32 60 -1 -1 4.000 0 0 -1 0 0 2 + 3375 3750 3375 5100 +2 1 0 1 0 32 60 -1 -1 4.000 0 0 -1 0 0 2 + 3825 4050 3825 5100 +2 1 0 1 0 32 60 -1 -1 4.000 0 0 -1 0 0 2 + 3375 4800 3825 4800 +2 1 0 1 0 32 60 -1 -1 4.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 4350 4800 3825 4800 +2 1 0 1 0 32 60 -1 -1 4.000 0 0 -1 1 0 2 + 0 0 1.00 60.00 120.00 + 3000 4800 3375 4800 +4 1 0 60 -1 14 10 0.0000 4 105 630 4200 4950 HSmall\001 +4 1 0 60 -1 14 10 0.0000 4 105 210 3150 4950 15\001 +-6 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 1500 3300 5550 3300 5550 5250 1500 5250 1500 3300 diff --git a/katabatic/doc/images/checkRoutingPadSize.png b/katabatic/doc/images/checkRoutingPadSize.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a7dc77a95354a719e6457f332cc830ed0ca6d6 GIT binary patch literal 2997 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 literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/doRp_Access.fig b/katabatic/doc/images/doRp_Access.fig new file mode 100644 index 00000000..3d2d5354 --- /dev/null +++ b/katabatic/doc/images/doRp_Access.fig @@ -0,0 +1,177 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 1650 3750 2475 5100 +6 1650 3750 1950 5100 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 3975 1875 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4050 1875 3900 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4125 1875 3975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4200 1875 4050 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4275 1875 4125 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4350 1875 4200 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4425 1875 4275 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4500 1875 4350 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4575 1875 4425 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4650 1875 4500 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4725 1875 4575 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4800 1875 4650 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4875 1875 4725 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4950 1875 4800 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 5025 1875 4875 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 3900 1800 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1800 5025 1875 4950 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 1725 3825 1875 3825 1875 5025 1725 5025 1725 3825 +-6 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 1725 3975 1875 3975 1875 4125 1725 4125 1725 3975 +2 1 0 2 4 32 60 -1 -1 6.000 0 0 -1 0 0 2 + 1875 4050 2400 4050 +-6 +6 2700 3750 3525 4200 +6 2700 3750 3000 4200 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2775 3975 2925 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2775 4050 2925 3900 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2775 4125 2925 3975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2775 3900 2850 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2850 4125 2925 4050 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 2775 3825 2925 3825 2925 4125 2775 4125 2775 3825 +-6 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 2775 3975 2925 3975 2925 4125 2775 4125 2775 3975 +2 1 0 2 4 32 60 -1 -1 6.000 0 0 -1 0 0 2 + 2925 4050 3450 4050 +-6 +6 4500 3750 5550 4425 +6 4500 3750 5550 4050 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4575 3900 4650 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4575 3975 4725 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4650 3975 4800 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4725 3975 4875 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4800 3975 4950 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4875 3975 5025 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4950 3975 5100 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5025 3975 5175 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5100 3975 5250 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5175 3975 5325 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5250 3975 5400 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5325 3975 5475 3825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5400 3975 5475 3900 +2 2 0 2 4 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 4575 3825 5475 3825 5475 3975 4575 3975 4575 3825 +-6 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 4725 3825 4875 3825 4875 3975 4725 3975 4725 3825 +2 1 0 2 4 32 60 -1 -1 6.000 0 0 -1 0 0 2 + 4800 3975 4800 4350 +-6 +6 4500 4500 5475 5175 +6 4500 4500 4950 4800 +2 2 0 2 4 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 4575 4575 4875 4575 4875 4725 4575 4725 4575 4575 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4575 4650 4650 4575 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4575 4725 4725 4575 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4650 4725 4800 4575 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4725 4725 4875 4575 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4800 4725 4875 4650 +-6 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 4725 4575 4875 4575 4875 4725 4725 4725 4725 4575 +2 1 0 2 0 32 40 -1 -1 6.000 0 0 -1 0 0 2 + 4875 4650 5400 4650 +2 1 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 3 + 5250 4650 5400 4650 5400 4800 +2 1 0 2 4 32 60 -1 -1 6.000 0 0 -1 0 0 2 + 5400 4650 5400 5100 +-6 +6 4500 5850 5550 6150 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4575 6000 4650 5925 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4575 6075 4725 5925 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4650 6075 4800 5925 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4725 6075 4875 5925 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4800 6075 4950 5925 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4875 6075 5025 5925 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 4950 6075 5100 5925 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5025 6075 5175 5925 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5100 6075 5250 5925 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5175 6075 5325 5925 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5250 6075 5400 5925 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5325 6075 5475 5925 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5400 6075 5475 6000 +2 2 0 2 4 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 4575 5925 5475 5925 5475 6075 4575 6075 4575 5925 +-6 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 4725 5925 4875 5925 4875 6075 4725 6075 4725 5925 +2 1 0 2 4 32 60 -1 -1 6.000 0 0 -1 0 0 2 + 4050 6000 4050 6450 +2 1 0 2 0 32 40 -1 -1 6.000 0 0 -1 0 0 2 + 4725 6000 4050 6000 +2 1 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 3 + 4200 6000 4050 6000 4050 6150 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 1500 3150 6000 3150 6000 6600 1500 6600 1500 3150 +4 1 0 60 -1 14 12 0.0000 4 165 1560 2550 3450 flags=HAccess\001 +4 1 0 60 -1 14 12 0.0000 4 165 1560 5100 3450 flags=Noflags\001 +4 1 0 60 -1 14 12 0.0000 4 165 1440 5100 5550 flags=VSmall\001 diff --git a/katabatic/doc/images/doRp_Access.png b/katabatic/doc/images/doRp_Access.png new file mode 100644 index 0000000000000000000000000000000000000000..bc6c3fd11e1a9c0af5046199b975a778ceff6b0a GIT binary patch literal 4260 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 literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/doRp_AutoContacts.fig b/katabatic/doc/images/doRp_AutoContacts.fig new file mode 100644 index 00000000..5c8e687d --- /dev/null +++ b/katabatic/doc/images/doRp_AutoContacts.fig @@ -0,0 +1,315 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 4950 7125 7200 7725 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5100 7350 5175 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5100 7425 5250 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5175 7425 5325 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5250 7425 5400 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5325 7425 5475 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5400 7425 5550 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5475 7425 5625 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5550 7425 5700 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5625 7425 5775 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5700 7425 5850 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 7425 5925 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5850 7425 6000 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6975 7425 7050 7350 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5925 7425 6075 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6000 7425 6150 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6075 7425 6225 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6150 7425 6300 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6225 7425 6375 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6300 7425 6450 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6375 7425 6525 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6450 7425 6600 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6525 7425 6675 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6600 7425 6750 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6675 7425 6825 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6750 7425 6900 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6825 7425 6975 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 6900 7425 7050 7275 +2 2 0 2 4 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 5100 7275 7050 7275 7050 7425 5100 7425 5100 7275 +2 2 0 1 4 4 60 -1 30 4.000 0 0 -1 0 0 5 + 5025 7200 7125 7200 7125 7500 5025 7500 5025 7200 +2 2 0 4 4 4 40 -1 -1 10.000 0 0 -1 0 0 5 + 5025 7200 5325 7200 5325 7500 5025 7500 5025 7200 +2 2 0 4 4 4 40 -1 -1 10.000 0 0 -1 0 0 5 + 6825 7200 7125 7200 7125 7500 6825 7500 6825 7200 +4 1 4 40 -1 14 12 0.0000 4 120 120 5175 7725 S\001 +4 1 4 40 -1 14 12 0.0000 4 120 120 6975 7725 T\001 +-6 +6 5100 3750 7800 5250 +6 5250 4800 5850 5100 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5400 5025 5550 4875 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5475 5025 5625 4875 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5550 5025 5700 4875 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5625 5025 5775 4875 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5325 5025 5475 4875 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5325 4950 5400 4875 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5700 5025 5775 4950 +2 2 0 2 4 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 5325 4875 5775 4875 5775 5025 5325 5025 5325 4875 +-6 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 5250 3900 5550 3900 5550 4200 5250 4200 5250 3900 +2 2 0 4 4 4 40 -1 -1 10.000 0 0 -1 0 0 5 + 5700 3900 6000 3900 6000 4200 5700 4200 5700 3900 +2 2 0 1 4 4 60 -1 30 4.000 0 0 -1 0 0 5 + 5250 4350 6000 4350 6000 4650 5250 4650 5250 4350 +2 2 0 1 0 4 60 -1 -1 4.000 0 0 -1 0 0 5 + 5100 3750 7800 3750 7800 5250 5100 5250 5100 3750 +4 0 0 60 -1 14 12 0.0000 4 165 1200 6150 5025 RoutingPad\001 +4 0 0 60 -1 14 12 0.0000 4 120 1320 6150 4125 AutoContact\001 +4 0 0 60 -1 14 12 0.0000 4 165 1560 6150 4575 Fixed Segment\001 +-6 +2 1 0 1 1 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 1725 3975 1875 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4050 1875 3900 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4125 1875 3975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4200 1875 4050 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4275 1875 4125 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4350 1875 4200 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4425 1875 4275 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4500 1875 4350 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4575 1875 4425 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4650 1875 4500 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4725 1875 4575 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4800 1875 4650 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4875 1875 4725 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 4950 1875 4800 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 5025 1875 4875 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 3900 1800 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1800 5025 1875 4950 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 1725 3825 1875 3825 1875 5025 1725 5025 1725 3825 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 1650 3900 1950 3900 1950 4200 1650 4200 1650 3900 +2 1 0 2 4 32 60 -1 -1 6.000 0 0 -1 0 0 2 + 1950 4050 2400 4050 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 6225 1875 6075 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 6150 1800 6075 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1800 6225 1875 6150 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 1725 6075 1875 6075 1875 6225 1725 6225 1725 6075 +2 2 0 1 1 1 60 -1 30 4.000 0 0 -1 0 0 5 + 1650 6000 1950 6000 1950 6300 1650 6300 1650 6000 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 1575 5925 2025 5925 2025 6375 1575 6375 1575 5925 +2 1 0 2 4 32 60 -1 -1 6.000 0 0 -1 0 0 2 + 2025 6150 2550 6150 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2475 8700 2550 8775 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 8700 2550 8850 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 8775 2550 8925 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 8850 2550 9000 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 8925 2550 9075 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9000 2550 9150 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9075 2550 9225 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9150 2550 9300 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9225 2550 9375 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9300 2550 9450 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9375 2550 9525 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9450 2550 9600 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 10575 2475 10650 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9525 2550 9675 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9600 2550 9750 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9675 2550 9825 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9750 2550 9900 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9825 2550 9975 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9900 2550 10050 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 9975 2550 10125 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 10050 2550 10200 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 10125 2550 10275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 10200 2550 10350 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 10275 2550 10425 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 10350 2550 10500 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 10425 2550 10575 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 10500 2550 10650 +2 2 0 2 4 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 2550 8700 2550 10650 2400 10650 2400 8700 2550 8700 +2 2 0 4 4 4 40 -1 -1 10.000 0 0 -1 0 0 5 + 2625 8625 2625 8925 2325 8925 2325 8625 2625 8625 +2 2 0 4 4 4 40 -1 -1 10.000 0 0 -1 0 0 5 + 2625 10425 2625 10725 2325 10725 2325 10425 2625 10425 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1425 7350 1500 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1500 7425 1650 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1575 7425 1725 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1650 7425 1800 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1725 7425 1875 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1800 7425 1950 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1875 7425 2025 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1950 7425 2100 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2025 7425 2175 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2100 7425 2250 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2175 7425 2325 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3300 7425 3375 7350 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2250 7425 2400 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2325 7425 2475 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2400 7425 2550 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2475 7425 2625 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2550 7425 2700 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2625 7425 2775 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2700 7425 2850 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2775 7425 2925 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2850 7425 3000 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 2925 7425 3075 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3000 7425 3150 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3075 7425 3225 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3150 7425 3300 7275 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 3225 7425 3375 7275 +2 2 0 2 4 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 1425 7275 3375 7275 3375 7425 1425 7425 1425 7275 +2 2 0 4 4 4 40 -1 -1 10.000 0 0 -1 0 0 5 + 1350 7200 1650 7200 1650 7500 1350 7500 1350 7200 +2 2 0 4 4 4 40 -1 -1 10.000 0 0 -1 0 0 5 + 3150 7200 3450 7200 3450 7500 3150 7500 3150 7200 +2 1 0 1 4 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 1425 7425 1575 7275 +2 2 0 1 4 4 60 -1 30 4.000 0 0 -1 0 0 5 + 1350 7200 3450 7200 3450 7500 1350 7500 1350 7200 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 1275 7125 1725 7125 1725 7575 1275 7575 1275 7125 +2 1 0 2 4 32 60 -1 -1 6.000 0 0 -1 0 0 2 + 1500 6750 1500 7125 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 4950 7125 5400 7125 5400 7575 4950 7575 4950 7125 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 6750 7125 7200 7125 7200 7575 6750 7575 6750 7125 +2 1 0 2 4 4 40 -1 -1 6.000 0 0 -1 0 0 2 + 4425 7350 4950 7350 +2 1 0 2 4 4 40 -1 -1 6.000 0 0 -1 0 0 2 + 6975 6600 6975 7125 +2 2 0 1 4 4 60 -1 30 4.000 0 0 -1 0 0 5 + 2625 8625 2625 10725 2325 10725 2325 8625 2625 8625 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 2250 9375 2700 9375 2700 9825 2250 9825 2250 9375 +2 1 0 2 4 4 60 -1 -1 6.000 0 0 -1 0 0 2 + 2700 9600 3000 9600 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 300 3600 9600 3600 9600 11250 300 11250 300 3600 +4 1 1 40 -1 14 12 0.0000 4 120 360 1800 5775 S&T\001 +4 1 4 40 -1 14 12 0.0000 4 120 120 2175 8850 S\001 +4 1 4 40 -1 14 12 0.0000 4 120 120 2175 10650 T\001 +4 0 0 50 -1 14 12 0.0000 4 165 3600 450 11100 (3.c) METALx (V,flags=NoFlags)\001 +4 0 0 50 -1 14 12 0.0000 4 165 3840 450 5250 (1) Ordinary non-punctual METAL1\001 +4 0 0 50 -1 14 12 0.0000 4 150 2280 450 6600 (2) Punctual METAL1\001 +4 1 4 40 -1 14 12 0.0000 4 120 120 1500 7725 S\001 +4 1 4 40 -1 14 12 0.0000 4 120 120 3300 7725 T\001 +4 0 0 50 -1 14 12 0.0000 4 150 1920 450 8100 (3.a) METALx (H)\001 +4 0 0 50 -1 14 12 0.0000 4 150 1920 4275 8100 (3.b) METALx (H)\001 +4 0 0 50 -1 14 12 0.0000 4 165 2520 1125 8325 flags=DoSourceContact\001 +4 0 0 50 -1 14 12 0.0000 4 165 4440 4950 8325 flags=SoSourceContact|DoTargetContact\001 diff --git a/katabatic/doc/images/doRp_AutoContacts.png b/katabatic/doc/images/doRp_AutoContacts.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb6b5b93743d0d041ea04bbfd572d796057f167 GIT binary patch literal 14091 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 Jqkqi@{ug73Ui$z5 literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/doRp_StairCaseH.fig b/katabatic/doc/images/doRp_StairCaseH.fig new file mode 100644 index 00000000..4851ffbe --- /dev/null +++ b/katabatic/doc/images/doRp_StairCaseH.fig @@ -0,0 +1,122 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +90.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 3000 1350 3600 1650 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3525 1575 3375 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3525 1500 3450 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3450 1575 3300 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3375 1575 3225 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3300 1575 3150 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3225 1575 3075 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3150 1575 3075 1500 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 3075 1575 3075 1425 3525 1425 3525 1575 3075 1575 +-6 +6 600 1350 1200 1650 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1125 1575 975 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1125 1500 1050 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1050 1575 900 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 975 1575 825 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 900 1575 750 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 825 1575 675 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 750 1575 675 1500 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 675 1575 675 1425 1125 1425 1125 1575 675 1575 +-6 +6 1800 2100 2700 2400 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2625 2250 2550 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2625 2325 2475 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2550 2325 2400 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2475 2325 2325 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2400 2325 2250 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2325 2325 2175 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2250 2325 2100 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2175 2325 2025 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2100 2325 1950 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 2025 2325 1875 2175 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1950 2325 1875 2250 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1875 2325 1875 2175 2625 2175 2625 2325 1875 2325 +-6 +6 4200 1350 5100 1650 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5025 1500 4950 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 5025 1575 4875 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4950 1575 4800 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4875 1575 4725 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4800 1575 4650 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4725 1575 4575 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4650 1575 4500 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4575 1575 4425 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4500 1575 4350 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4425 1575 4275 1425 +2 1 0 1 3 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4350 1575 4275 1500 +2 2 0 2 3 1 60 -1 -1 6.000 0 0 7 0 0 5 + 4275 1575 4275 1425 5025 1425 5025 1575 4275 1575 +-6 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 3375 1425 3525 1425 3525 1575 3375 1575 3375 1425 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 1875 2175 2025 2175 2025 2325 1875 2325 1875 2175 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 1350 1500 1500 1500 1500 1650 +2 1 0 4 0 1 50 -1 -1 10.000 0 0 -1 0 0 3 + 1500 2100 1500 2250 1650 2250 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1125 1500 1500 1500 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 975 1425 1125 1425 1125 1575 975 1575 975 1425 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1500 1500 1500 2250 +2 1 0 2 0 1 60 -1 -1 6.000 0 0 -1 0 0 2 + 1500 2250 1875 2250 +2 2 0 4 3 1 50 -1 -1 0.000 0 0 -1 0 0 5 + 4275 1425 4425 1425 4425 1575 4275 1575 4275 1425 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 3525 1500 4275 1500 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 300 1050 5400 1050 5400 2850 300 2850 300 1050 +4 1 0 50 -1 14 14 0.0000 4 195 1500 4050 2700 Aligneds H\001 +4 1 0 50 -1 14 14 0.0000 4 195 1950 1650 2700 Misaligneds H\001 diff --git a/katabatic/doc/images/doRp_StairCaseH.png b/katabatic/doc/images/doRp_StairCaseH.png new file mode 100644 index 0000000000000000000000000000000000000000..f175a996569655c516dea63e4592abd2c44cc10d GIT binary patch literal 2616 zcmeH}X*3(!7RRGrFBhSdy2Q{*sg_c8RdFTU$_+{`Y95NlSSm`0G2vEFs;O6Fk@gX^ zrj|B{DIPVXQd()%SU1KRg2YV7P2aHA`|v)zzO~-B_hFxX*4}IFbYi5Sxf%{`m%E|03h_i!pzh@s*p8d8Zv6B(8GpmXL8I) zTIXu7YRn3w;3Q%~m2s|mK}CTQlht%8cde>Z($z5@-g|`P_{K2vfgStAHMQe{e!<;8 zaClg0nA~z6`yOt(_7v%*^Z56G_`{pcM*yRyI|8M`&?nMNp)3_{f?blbP1>5Er6ktm zY=?w8?AwxyuUI0f*)`eg)s?=S2efIW#XGO=*Ww7Z{d%WGso5(|(c!142Vh-;yJrzI z!SYTSB_Uss6ko*S+Us2zui%Iz>)PBU}R zyj!f#skhEF2Urnu0e)&1-eti?&V?RIn2IhC=+mdHRxSCaTr z^5kNz!*sF@@i{cP{ z7mA}n3sD1MbfbmG`t&S)BvS~7=WUwIHhlL276xPHZuWXXaC%vfNBeBG%G-x(%>1O^rKo_#RdiUWcO_`HomFVG;H17>=Eld9; zCSz6ix@ZUW;a6C##>@vEr|e(Elq9%4>T4DC4~Ly34z7W8-S?w%fOWw(f!8Vx;sNp3_$#VGra%*jv}lZj5@SH0KdqG8Cq~ZqEs2O-20YUxas`!cAku zYqY%b_2`(Q1bC9PlInhoen)1gKGa;eb%$a!uJDw<#UHvYoJ@&)soK7Bq&7(WSW(s2)Wo2fWb^?dvPOL*D#xE;=B5ERG^- zYt-mK*TDo-DK>lb*Cmo0y2X$;OrGmiunBBVqG!=!dpq zhu;Og9l5e2#QZ@4JOJMzn$N}m3hElS8*_A=Wf z68Z%xDCtg?pEHvTbO5zFc0xK<`v;;SX@&fYuj%T@M(HdT`l6f*sdF``^seXFP$Hka%qUKIE%909e2f zW;H*1{dV_%EhPjZ{~;w9Is$-`V(k~&sq?3h@Z(40WBlg;#wa7eus1gKBGfEjxtK0t kJC~xqekE)7)En+G-~WgI>z;fNYE=?s^|2wF|N7W}02?m+9smFU literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/doRp_StairCaseV.fig b/katabatic/doc/images/doRp_StairCaseV.fig new file mode 100644 index 00000000..4703e90a --- /dev/null +++ b/katabatic/doc/images/doRp_StairCaseV.fig @@ -0,0 +1,110 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +90.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 900 1050 2400 3225 +6 1500 1050 1800 1650 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 1275 1725 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 1350 1725 1200 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 1425 1725 1275 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 1500 1725 1350 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 1575 1725 1425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 1200 1650 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1650 1575 1725 1500 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1575 1125 1725 1125 1725 1575 1575 1575 1575 1125 +-6 +6 1500 1950 1800 2550 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 2175 1725 2025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 2250 1725 2100 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 2325 1725 2175 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 2400 1725 2250 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 2475 1725 2325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1575 2100 1650 2025 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 1650 2475 1725 2400 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 1575 2025 1725 2025 1725 2475 1575 2475 1575 2025 +-6 +2 2 0 4 4 1 50 -1 -1 10.000 0 0 7 0 0 5 + 1575 1425 1725 1425 1725 1575 1575 1575 1575 1425 +2 2 0 4 4 1 50 -1 -1 10.000 0 0 7 0 0 5 + 1575 2025 1725 2025 1725 2175 1575 2175 1575 2025 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 1650 1575 1650 2025 +4 1 0 50 -1 14 14 0.0000 4 195 1500 1650 3150 Aligneds V\001 +-6 +6 3000 1050 4950 3225 +6 3450 1050 3750 1650 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3525 1275 3675 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3525 1350 3675 1200 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3525 1425 3675 1275 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3525 1500 3675 1350 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3525 1575 3675 1425 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3525 1200 3600 1125 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 3600 1575 3675 1500 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 3525 1125 3675 1125 3675 1575 3525 1575 3525 1125 +-6 +6 4200 2250 4500 2850 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4275 2475 4425 2325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4275 2550 4425 2400 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4275 2625 4425 2475 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4275 2700 4425 2550 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4275 2775 4425 2625 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4275 2400 4350 2325 +2 1 0 1 4 1 60 -1 -1 4.000 0 0 7 0 0 2 + 4350 2775 4425 2700 +2 2 0 2 4 1 60 -1 -1 6.000 0 0 7 0 0 5 + 4275 2325 4425 2325 4425 2775 4275 2775 4275 2325 +-6 +2 2 0 4 4 1 50 -1 -1 10.000 0 0 7 0 0 5 + 4275 2325 4425 2325 4425 2475 4275 2475 4275 2325 +2 2 0 4 4 1 50 -1 -1 10.000 0 0 7 0 0 5 + 3525 1425 3675 1425 3675 1575 3525 1575 3525 1425 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 3600 1575 3600 1950 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 3600 1950 4350 1950 +2 1 0 2 0 7 60 -1 -1 0.000 0 0 -1 0 0 2 + 4350 1950 4350 2325 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 3600 1800 3600 1950 3750 1950 +2 1 0 4 0 7 50 -1 -1 0.000 0 0 -1 0 0 3 + 4200 1950 4350 1950 4350 2100 +4 1 0 50 -1 14 14 0.0000 4 195 1950 3975 3150 Misaligneds V\001 +-6 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 600 750 5250 750 5250 3450 600 3450 600 750 diff --git a/katabatic/doc/images/doRp_StairCaseV.png b/katabatic/doc/images/doRp_StairCaseV.png new file mode 100644 index 0000000000000000000000000000000000000000..53c92bee210a825d07ab1e902e87337e9484b3e2 GIT binary patch literal 3019 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 L*n5W9KO^(+0WDBz literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/moveULeft-1.fig b/katabatic/doc/images/moveULeft-1.fig new file mode 100644 index 00000000..69d56f1d --- /dev/null +++ b/katabatic/doc/images/moveULeft-1.fig @@ -0,0 +1,133 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +110.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 75 300 4125 3900 +1 4 0 1 4 7 60 -1 -1 4.000 1 0.0000 1500 1500 150 150 1350 1500 1650 1500 +2 2 1 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 5 + 300 300 3900 300 3900 3900 300 3900 300 300 +2 1 1 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 2100 300 2100 3900 +2 1 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 3 + 750 1350 750 1500 900 1500 +2 1 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 3 + 3300 1650 3300 1500 3150 1500 +2 1 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 3 + 3300 3450 3300 3600 3450 3600 +2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 750 1500 3300 1500 +2 1 0 2 1 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 750 600 750 1500 +2 1 1 2 1 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 3300 3600 4050 3600 +2 1 1 2 1 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 750 600 1350 600 +2 1 1 2 1 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 750 600 150 600 +2 1 0 1 4 7 60 -1 -1 4.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1500 1650 1500 3150 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 4 + 2400 1500 2400 1275 2550 1275 2550 1500 +2 1 0 2 1 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 3300 1500 3300 3600 +2 1 0 1 1 7 50 -1 -1 4.000 0 0 -1 0 0 4 + 750 900 600 900 600 1125 750 1125 +2 1 0 1 1 7 50 -1 -1 4.000 0 0 -1 0 0 4 + 3300 2550 3150 2550 3150 2775 3300 2775 +2 1 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 2 + 600 600 900 600 +2 1 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 2 + 750 750 750 600 +2 2 0 1 4 4 60 -1 20 0.000 0 0 -1 0 0 5 + 300 300 900 300 900 525 300 525 300 300 +2 2 0 1 4 4 60 -1 20 0.000 0 0 -1 0 0 5 + 2100 300 2700 300 2700 525 2100 525 2100 300 +2 2 0 1 4 4 60 -1 20 0.000 0 0 -1 0 0 5 + 2100 2100 2700 2100 2700 2325 2100 2325 2100 2100 +2 2 0 1 4 4 60 -1 20 0.000 0 0 -1 0 0 5 + 300 2100 900 2100 900 2325 300 2325 300 2100 +2 1 1 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 300 2100 3900 2100 +4 0 1 50 -1 14 10 0.0000 4 90 105 3375 2700 G\001 +4 0 1 50 -1 14 10 0.0000 4 90 105 825 1050 L\001 +4 1 0 50 -1 14 10 0.0000 4 90 105 2100 1650 G\001 +4 1 4 60 -1 14 10 1.5708 4 135 1155 1425 2325 moveULeft()\001 +4 1 0 60 -1 14 10 0.0000 4 105 105 2475 1425 8\001 +4 1 1 60 -1 14 10 0.0000 4 105 105 675 1050 5\001 +4 1 1 60 -1 14 10 0.0000 4 105 105 3225 2700 7\001 +4 1 7 50 -1 14 10 0.0000 4 105 525 600 450 Gc:70\001 +4 1 7 50 -1 14 10 0.0000 4 105 525 2400 450 Gc:71\001 +4 1 7 50 -1 14 10 0.0000 4 105 525 2400 2250 Gc:61\001 +4 1 7 50 -1 14 10 0.0000 4 105 525 600 2250 Gc:60\001 +-6 +1 4 0 1 4 4 40 -1 -1 4.000 1 0.0000 5100 1500 75 75 5025 1500 5175 1500 +1 4 0 1 4 4 40 -1 -1 4.000 1 0.0000 7650 1500 75 75 7575 1500 7725 1500 +2 2 1 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 5 + 4650 300 8250 300 8250 3900 4650 3900 4650 300 +2 1 1 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 6450 300 6450 3900 +2 1 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 3 + 7650 3450 7650 3600 7800 3600 +2 1 0 2 1 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 5100 600 5100 2700 +2 1 1 2 1 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 7650 3600 8400 3600 +2 1 1 2 1 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 5100 600 5700 600 +2 1 1 2 1 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 5100 600 4500 600 +2 1 0 1 1 7 50 -1 -1 4.000 0 0 -1 0 0 4 + 5100 900 4950 900 4950 1125 5100 1125 +2 1 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 2 + 4950 600 5250 600 +2 1 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 2 + 5100 750 5100 600 +2 2 0 1 4 4 60 -1 20 0.000 0 0 -1 0 0 5 + 4650 300 5250 300 5250 525 4650 525 4650 300 +2 2 0 1 4 4 60 -1 20 0.000 0 0 -1 0 0 5 + 6450 300 7050 300 7050 525 6450 525 6450 300 +2 2 0 1 4 4 60 -1 20 0.000 0 0 -1 0 0 5 + 6450 2100 7050 2100 7050 2325 6450 2325 6450 2100 +2 2 0 1 4 4 60 -1 20 0.000 0 0 -1 0 0 5 + 4650 2100 5250 2100 5250 2325 4650 2325 4650 2100 +2 1 1 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 4650 2100 8250 2100 +2 1 0 1 1 7 50 -1 -1 4.000 0 0 -1 0 0 4 + 7650 3000 7500 3000 7500 3225 7650 3225 +2 1 0 2 1 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 7650 2700 7650 3600 +2 1 0 2 0 7 60 -1 -1 6.000 0 0 -1 0 0 2 + 5100 2700 7650 2700 +2 1 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 3 + 7650 2850 7650 2700 7500 2700 +2 1 0 4 0 7 50 -1 -1 10.000 0 0 -1 0 0 3 + 5100 2550 5100 2700 5250 2700 +2 1 0 1 0 7 50 -1 -1 4.000 0 0 -1 0 0 4 + 6750 2700 6750 2475 6900 2475 6900 2700 +2 2 0 1 32 32 90 -1 20 0.000 0 0 -1 0 0 5 + 0 150 8550 150 8550 4050 0 4050 0 150 +3 0 0 1 4 4 40 -1 -1 4.000 0 1 0 4 + 1 1 1.00 60.00 120.00 + 5175 1500 5400 1650 5400 2400 5100 2700 + 0.000 1.000 1.000 0.000 +3 0 0 1 4 4 40 -1 -1 4.000 0 1 0 4 + 1 1 1.00 60.00 120.00 + 7725 1575 7950 1800 7950 2400 7650 2700 + 0.000 1.000 1.000 0.000 +4 0 1 50 -1 14 10 0.0000 4 90 105 5175 1050 G\001 +4 1 0 50 -1 14 10 0.0000 4 90 105 6450 1650 G\001 +4 1 1 60 -1 14 10 0.0000 4 105 105 5025 1050 5\001 +4 1 7 50 -1 14 10 0.0000 4 105 525 4950 450 Gc:70\001 +4 1 7 50 -1 14 10 0.0000 4 105 525 6750 450 Gc:71\001 +4 1 7 50 -1 14 10 0.0000 4 105 525 6750 2250 Gc:61\001 +4 1 7 50 -1 14 10 0.0000 4 105 525 4950 2250 Gc:60\001 +4 1 1 60 -1 14 10 0.0000 4 105 105 7575 3150 7\001 +4 0 1 50 -1 14 10 0.0000 4 90 105 7725 3150 L\001 +4 1 0 60 -1 14 10 0.0000 4 105 105 6825 2625 8\001 diff --git a/katabatic/doc/images/moveULeft-1.png b/katabatic/doc/images/moveULeft-1.png new file mode 100644 index 0000000000000000000000000000000000000000..bb8e2a4037c8ebe643a9592da2d68b74e665131c GIT binary patch literal 8479 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 literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/updateTopologyHTee.fig b/katabatic/doc/images/updateTopologyHTee.fig new file mode 100644 index 00000000..984a7874 --- /dev/null +++ b/katabatic/doc/images/updateTopologyHTee.fig @@ -0,0 +1,274 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 1125 900 3075 2775 +6 1875 1125 2325 1425 +2 1 0 4 0 0 50 -1 -1 10.000 0 0 -1 0 0 2 + 1950 1200 2250 1200 +2 1 0 4 0 0 50 -1 -1 10.000 0 0 -1 0 0 2 + 2100 1200 2100 1350 +-6 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 2100 1200 1200 1200 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 2100 1200 3000 1200 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 2100 1200 2100 2100 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 1500 1200 1500 900 1800 900 1800 1200 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 2400 1200 2400 900 2700 900 2700 1200 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 2100 1575 1800 1575 1800 1875 2100 1875 +4 1 0 60 -1 18 12 0.0000 4 180 390 2100 2700 (1.a)\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 1650 1425 M2\001 +4 0 0 50 -1 14 12 0.0000 4 120 240 2175 1800 M3\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 2550 1425 M2\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 1950 1800 v1\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 1650 1125 h1\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 2550 1125 h2\001 +-6 +6 1125 3300 3075 5175 +6 1875 3525 2325 3825 +2 1 0 4 0 0 50 -1 -1 10.000 0 0 -1 0 0 2 + 1950 3600 2250 3600 +2 1 0 4 0 0 50 -1 -1 10.000 0 0 -1 0 0 2 + 2100 3600 2100 3750 +-6 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 2100 3600 1200 3600 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 2100 3600 3000 3600 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 2100 3600 2100 4500 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 1500 3600 1500 3300 1800 3300 1800 3600 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 2400 3600 2400 3300 2700 3300 2700 3600 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 2100 3975 1800 3975 1800 4275 2100 4275 +4 1 0 60 -1 18 12 0.0000 4 180 390 2100 5100 (2.a)\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 1650 3825 M2\001 +4 0 0 50 -1 14 12 0.0000 4 120 240 2175 4200 M3\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 2550 3825 M2\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 1950 4200 v1\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 1650 3525 h1\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 2550 3525 h2\001 +-6 +6 5325 3300 7275 5775 +6 6075 3525 6525 3825 +2 1 0 4 0 0 50 -1 -1 10.000 0 0 -1 0 0 2 + 6150 3600 6450 3600 +2 1 0 4 0 0 50 -1 -1 10.000 0 0 -1 0 0 2 + 6300 3600 6300 3750 +-6 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 6300 3600 5400 3600 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 6300 3600 7200 3600 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 5700 3600 5700 3300 6000 3300 6000 3600 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 6600 3600 6600 3300 6900 3300 6900 3600 +2 1 0 4 4 0 50 -1 -1 10.000 0 0 -1 0 0 3 + 6300 4350 6300 4500 6150 4500 +2 1 0 4 4 0 50 -1 -1 10.000 0 0 -1 0 0 3 + 5850 4500 5700 4500 5700 4650 +2 1 0 2 4 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 6300 3600 6300 4500 +2 1 0 2 4 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 5700 4500 6300 4500 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 5700 4500 5700 5400 +2 1 0 1 4 0 60 -1 -1 0.000 0 0 -1 0 0 4 + 6300 3900 6000 3900 6000 4200 6300 4200 +4 1 0 60 -1 14 12 0.0000 4 120 240 5850 3825 M2\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 6750 3825 M2\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 5850 3525 h1\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 6750 3525 h2\001 +4 1 0 60 -1 18 12 0.0000 4 180 405 6300 5700 (2.b)\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 6150 4125 v1\001 +4 0 4 50 -1 14 12 0.0000 4 120 240 6375 4125 M3\001 +4 0 4 50 -1 14 12 0.0000 4 120 240 5775 5325 M5\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 6000 4725 M4\001 +-6 +6 4425 525 7275 2775 +6 6075 1125 6525 1425 +2 1 0 4 0 0 50 -1 -1 10.000 0 0 -1 0 0 2 + 6150 1200 6450 1200 +2 1 0 4 0 0 50 -1 -1 10.000 0 0 -1 0 0 2 + 6300 1200 6300 1350 +-6 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 6300 1200 7200 1200 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 6300 1200 6300 2100 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 6600 1200 6600 900 6900 900 6900 1200 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 6300 1575 6000 1575 6000 1875 6300 1875 +2 1 0 4 4 0 50 -1 -1 10.000 0 0 -1 0 0 3 + 5550 1200 5400 1200 5400 1050 +2 1 0 4 4 0 50 -1 -1 10.000 0 0 -1 0 0 3 + 5250 600 5400 600 5400 750 +2 1 0 2 4 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 5400 600 5400 1200 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 5400 600 4500 600 +2 1 0 2 4 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 5400 1200 6300 1200 +2 1 0 1 4 0 60 -1 -1 0.000 0 0 -1 0 0 4 + 5700 1200 5700 900 6000 900 6000 1200 +4 1 4 60 -1 14 12 0.0000 4 120 240 5850 1425 M2\001 +4 0 0 50 -1 14 12 0.0000 4 120 240 6375 1800 M3\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 6750 1425 M2\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 6150 1800 v1\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 6750 1125 h2\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 5250 975 M3\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 4650 825 M4\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 5850 1125 h1\001 +4 1 0 60 -1 18 12 0.0000 4 180 405 5850 2700 (1.b)\001 +-6 +6 1125 6600 3075 8475 +6 1875 6825 2325 7125 +2 1 0 4 0 0 50 -1 -1 10.000 0 0 -1 0 0 2 + 1950 6900 2250 6900 +2 1 0 4 0 0 50 -1 -1 10.000 0 0 -1 0 0 2 + 2100 6900 2100 7050 +-6 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 2100 6900 1200 6900 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 2100 6900 3000 6900 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 2100 6900 2100 7800 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 1500 6900 1500 6600 1800 6600 1800 6900 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 2400 6900 2400 6600 2700 6600 2700 6900 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 2100 7275 1800 7275 1800 7575 2100 7575 +4 1 0 60 -1 18 12 0.0000 4 180 390 2100 8400 (3.a)\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 1650 7125 M2\001 +4 0 0 50 -1 14 12 0.0000 4 120 240 2175 7500 M3\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 2550 7125 M2\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 1950 7500 v1\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 1650 6825 h1\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 2550 6825 h2\001 +-6 +6 1125 9000 3075 10875 +6 1875 9225 2325 9525 +2 1 0 4 0 0 50 -1 -1 10.000 0 0 -1 0 0 2 + 1950 9300 2250 9300 +2 1 0 4 0 0 50 -1 -1 10.000 0 0 -1 0 0 2 + 2100 9300 2100 9450 +-6 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 2100 9300 1200 9300 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 2100 9300 3000 9300 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 2100 9300 2100 10200 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 1500 9300 1500 9000 1800 9000 1800 9300 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 2400 9300 2400 9000 2700 9000 2700 9300 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 2100 9675 1800 9675 1800 9975 2100 9975 +4 1 0 60 -1 18 12 0.0000 4 180 390 2100 10800 (4.a)\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 1650 9525 M4\001 +4 0 0 50 -1 14 12 0.0000 4 120 240 2175 9900 M3\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 2550 9525 M4\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 1950 9900 v1\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 1650 9225 h1\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 2550 9225 h2\001 +-6 +6 6075 6825 6525 7125 +2 1 0 4 4 0 50 -1 -1 0.000 0 0 -1 0 0 2 + 6150 6900 6450 6900 +2 1 0 4 4 0 50 -1 -1 0.000 0 0 -1 0 0 2 + 6300 6900 6300 7050 +-6 +6 6075 9225 6525 9525 +2 1 0 4 4 0 50 -1 -1 0.000 0 0 -1 0 0 2 + 6150 9300 6450 9300 +2 1 0 4 4 0 50 -1 -1 0.000 0 0 -1 0 0 2 + 6300 9300 6300 9450 +-6 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 6300 6900 7200 6900 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 6300 6900 6300 7800 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 6600 6900 6600 6600 6900 6600 6900 6900 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 6300 7275 6000 7275 6000 7575 6300 7575 +2 1 0 4 4 0 50 -1 -1 10.000 0 0 -1 0 0 3 + 5550 6900 5400 6900 5400 6750 +2 1 0 4 4 0 50 -1 -1 10.000 0 0 -1 0 0 3 + 5250 6300 5400 6300 5400 6450 +2 1 0 2 4 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 5400 6300 5400 6900 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 5400 6300 4500 6300 +2 1 0 2 4 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 5400 6900 6300 6900 +2 1 0 1 4 0 60 -1 -1 0.000 0 0 -1 0 0 4 + 5700 6900 5700 6600 6000 6600 6000 6900 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 6300 9300 5400 9300 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 6300 9300 7200 9300 +2 1 0 2 0 0 60 -1 -1 6.000 0 0 -1 0 0 2 + 6300 9300 6300 10200 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 5700 9300 5700 9000 6000 9000 6000 9300 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 6600 9300 6600 9000 6900 9000 6900 9300 +2 1 0 1 0 0 60 -1 -1 4.000 0 0 -1 0 0 4 + 6300 9675 6000 9675 6000 9975 6300 9975 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 900 0 8100 0 8100 11100 900 11100 900 0 +3 0 0 1 4 0 60 -1 -1 4.000 0 1 0 6 + 0 0 1.00 60.00 120.00 + 1800 1350 2400 600 3000 600 3600 1125 4200 1125 4500 900 + 0.000 1.000 1.000 1.000 1.000 0.000 +3 0 0 1 4 0 60 -1 -1 4.000 0 1 0 3 + 0 0 1.00 60.00 120.00 + 2475 4125 4200 4125 5700 5250 + 0.000 1.000 0.000 +3 0 0 1 4 0 60 -1 -1 4.000 0 1 0 3 + 0 0 1.00 60.00 120.00 + 2700 7050 6000 6075 6600 6975 + 0.000 1.000 0.000 +3 0 0 1 4 0 60 -1 -1 4.000 0 1 0 3 + 0 0 1.00 60.00 120.00 + 2475 7425 5700 7950 6450 7575 + 0.000 1.000 0.000 +3 0 0 1 4 0 60 -1 -1 4.000 0 1 0 4 + 0 0 1.00 60.00 120.00 + 2250 9975 3600 10500 6300 10500 6450 9975 + 0.000 1.000 1.000 0.000 +4 1 4 60 -1 14 12 0.0000 4 120 240 5850 7125 M4\001 +4 0 4 50 -1 14 12 0.0000 4 120 240 6375 7500 M5\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 6750 7125 M4\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 6150 7500 v1\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 6750 6825 h2\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 5250 6675 M3\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 4650 6525 M2\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 5850 6825 h1\001 +4 1 0 60 -1 18 12 0.0000 4 180 405 5850 8400 (3.b)\001 +4 1 0 60 -1 18 12 0.0000 4 180 405 6300 10800 (4.b)\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 5850 9525 M4\001 +4 0 4 50 -1 14 12 0.0000 4 120 240 6375 9900 M5\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 6750 9525 M4\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 6150 9900 v1\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 5850 9225 h1\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 6750 9225 h2\001 diff --git a/katabatic/doc/images/updateTopologyHTee.png b/katabatic/doc/images/updateTopologyHTee.png new file mode 100644 index 0000000000000000000000000000000000000000..e53ec1cbfd762572f059d6d260ae3a3e96b43e63 GIT binary patch literal 16311 zcmeHuXH-+`x^*a0q$ARcbW}i^2tj%Y9YHaI6anc)dar^40znZ$dXOeXP&$OB^d5Q* zC`czD5I_QfZ{gl&?|sfaZ)$!0RoZhod58K2R`TmJJ~!{A9&t0#w=@9KF)O8AzDr__UYAkY<%hKk}n-*hxeG=ZxzZDog_e~zVOj0Q#I zxQREtKF7^d?HT%%E7V|E(KX$8~&=_*ZDw?ayNi z>jiWdq&eaGbZ7Q-y4j@Y6+JGv+fzf|s!dlPD!mHL)wIWn}# zAa;30+hlAgVKUpMdNT^6*K>=5oEu&yYN#pMeZ^~%dL*luo~vAbH_Fy>@f!@L6CLPY z4SGwr2ag;Y@!=XS;U|NzEqhl*P}rWyzZ%F|3;Hp#79Wa7hyexjT5$IlN4I|Sl`J;~ z?n8n;RdLaj8ExdGe4wOYPIp{%$vZvZ=EjztY4dGluaHl;Qe@ByQgaV%`iZvRcsAj6 zi&SK&+zqF;=2(%CEjPxU+P*PbV^Z|zWJe#~q2;f_k7)Tx2a#O?ZFKc+Yoy9Hi~H_g z6FzbztKMfJueNfpKcbagm7CIOv24ppHrJ>~vI%mH_=J0jj+7{qouXh=R>x`>8OiQgZXi|GExI@lfWz8=gavX)6rPpiAq<*O%99WC@#8Di)Xa{*Tjs|3| zvEJOktq)6|($vRqR~^HS_Fb%ZxbvVQJ>6R^G>&T)Z;cM%wwVLhHmtQ4DTzwAhNr&N zelLKEtk*(r5y@_^M_Md1AgAxyv0v*{y*=E2$uq-+Y)ugHjT@)ej=*{`ZX4i4`r7c= zzH}TLN^wwdItia(u=BURDB=pN2lT+E)4R>rlkVKo6Yx5~Qpn*phn->00w39ATQGQR zN;Aite$7Qi&kk?o1Vz+0?V&P~$*jl0P{Wua<5}@34}8e6J(H7UaFu!HL*=Py;ft4s zhu+NT=?vy$8630hQ_yx!mxwV-YcE~eE?qSR$GcuzQ%Y$Jp`lqx8W2*p+be!3X=Ti< zmdkRzrLY%8`I?_c%LTIdNsOp*Z2F337~%<@*h@y2*m^OhgX z(*MiyD>aW-i`5p~z_=aAP5W3(nCmu~c&R$IzHo+EiO?Xic$-Z^=IlSnI^^GsK3w*V zd(GYy=STP>ka=WHJHCL|tKmeYC(h=w+MIw%tn7 zw9$cC$60k?UtunpHKoNOPAgF9AhoK?WzMs26_TD2Bjf5A{y1;fv3)AQ%)O4ZSjiZEY=a#rf>8Bf2!BX-1<)a!G_}+!V58A~#Gj zbU%(0w=T6Y<#OVgGTu!#TyEa2n{WW1Ey8LV(T8&1s#=T=M~kD^dC+#Xi04w|I=Ztu zMaNg)Re0+*0?#?cL4<=FSAMd^#8MPGU7~Q4ntp}nL*e#7)X5;jERCmoEDuzwD&wDj zV(TVSNU4y$OJ&D5h9_`u84nH36%RF7Vnyni7gB;U?H5Ajro9DSRQR&Cv<}|BS$|&J z*w+$%FUIBWg}fQIRT#0`VK|1A2nl=sRtg?)sEH)Lfz~?scz)uizLrHy>2?uShcyC` zald3#<9v*S_bIa}vXfdb5RFvT`yhliX{VaCn@Wzytclo#ev4R{xoh6WqWAdiA;~Eu zcBUx-K8wElE15yvE}AR(MjJN;bF}9g>ib%9>a2ZS3p19sKAVCIW};DH-WY8@U0N_S z68RjNX%_U@+q|5$H}*@NvC{Qyw6w>Zsqn|jYLQ#$RWWYaRpVx!csZWlv>*xlNMIy^lB4U9u}hpnov_9R7~G)(_`r*re`t7FVHm$I+B|4jz5fxUIVA) zo5UznSzxN^mHDTlx(2i6Lva4`{--$AF-_OONZg4SK~|JZN$(b>uT-~ZaNFI0e_Q^u zu8e;w7rhqq=IM(Iq23q?pvCwgT^c0l5gi@{NbTQmBt~mBmU-=AKR$V~ZQdNrR3oC0 zZwEQBW!fq+mVP!5S5fCm1tQS?0&HX{nEWkTC2SrY+oR%GmZ zwrk&BRHSMsv{1bhUh#4#-N9Tb(ty6;WVm@!SqF z(zCC0Swm8E#GhKJ*r#TODkIq35ZzL95g1V2d6jzHa|GM7#tDv3om862GUbAc?4BbH zTP`JDd)_NaJD-c&aN&9~`2LFMx2a z%(GU=^a5Wao07~AC(@VP)30=9BFJE@5S@1fpw(D4N86Exb<~`2Ye9N(V+d)sZn4}WooR-hU@t>q$f);m&zhp6 z`IY-O&okhS+w;e7*s+FVUycp2?)8^NgmoUTtm`=s9^$^*bo?`gq@Ayn_Fz@b6+;v;}$n=yhx62tQ{o#2+Rc7mh3stD5cm6;> zZg0}8o}7K^A-Juc&f_zf2E6h0Yw$FiptG^!^kp^r1=Wf}cr^=jl$scnnERex0+bl> zkJbI381nz*99l0c4E}UjoMygZf;N%0v>@vF)F*ZhjJfyT1^Ei4sUQR%nsLClc4)H z=rf;t-@A6*3W?Z0!g1=2lsw7oKV|(BSXJ`20b%f>6&HM;U^3`oleTHPqJJ-IncHyd ztu$GN#24Q8GOym)howJUPi{C&=&f0LCKmZ|=ag3t&zEvq-%p#+Qv+x;QnG)e2ZI0V1cv$pIGTHV?t(du**9{f`KGap^bU&AJ zIlVrAG#&8$flZ=NCpg6_rNA9ZHJ$H)dsS0&INyBM)n0bU+H4gDfwLLid8Ck)Q!&q5 zS5MbcWd|8-6Fe_H|7kh`eV^mpxuEvg()U*iE?;`U?;*Ii2MlLp0PkwJ%^`2^AG1O} z3rKFtcFOOUek|m9e%L~}kUd|<{MnSOZWV=%o>>G-XYn|!>W0xsiPzGUKHn3$g1#14 zJx9pGK0SK%n|3;nXX!b#kZr_vZT`yGzt1gOvElI2eXZS9K=mPJxNv>eV_UUC6}Fg5{Uu?SvxYbM1x*6oUY0%!dKoQ9VC>S!>^g8g zgrJL3nH3~_k%cs^kWBP0@GS8Y&7x;NlLravjn%6r^_oW**0B(aislXIW1JzdrdKFt z`*RQN*TP+{x?IiXg_k94FiM2FZH^yp?n-P?)Z$i!tqP}`lJ`kJL}0(_sI-mIGN2Bz z+)1BVUa(7uJn7%q>M%Azd3h~{L*05^TCkPMA97gN%349Z#GbP-ycQ$oo*i#HDs00< zlc62LXB8(z?q*Wh7kcp9x|E|>Ei%40#-)4SvSmt6rv=k(=wsOzdCE+|V;M^bKbDqB zylskA8cHbP-(Z}XV0am}D3%{mMyMv6O3rJe96~BPYU}x?tdN`KVHeo6!+AU?5Wr6z(Yxt)o(u@DOvp4>YQPMl7D~& zkJjT59=*V1RIAvkzdSvp-l^cfa&UOCDv!Q%CwqsrVCJ>thN8HzNzlnOrnESv+N~m% zV7d;xTGU1s5#}n)eGrHuIH)Z7eY(Yn;v6Gb8l8Mw`dmr>!1{ zlj8^S^@cVb333F`>J}c4ddqG&C>jtX0~ojK;Y5X;iK33W!&gSUIE|a#Q>qEfQumhq zkzINfTizII3m<(28stZnWUu*PPe;Oh7S-0MkFRQc`~p^3Fr*}QZ|Pneuijy~^jm@3 z%D+oUDB+|fGrA^qQ-pv}!X3`$AnVsvOKcM!s&*gNAshOR2H8a|8s~Qf{z}M_IgcCu zO4^cni3_ezXvxgGVDN-4*C?i>y)4&Qeb4yka6Tkp7E^B<1Z`R&zXI1!w-L(T+AaQi z`F-p1qlp8vLzC^pwY0^Z<;%!TH7SPFUboKBr&i3WX;1|#GfV9aVZ6Lx*@A#lj*WT`;w0geX`gG44oxF(~B&_J2x=^}QDpPA0e?XkRrcuUK$Td}oRspLtI* zk|uu6&vz|6@3eIfqCik@jduKIx`x~;ot56adi*BhVED0vc4R1#3QudPXT^cbTBLdC zViIEG8rAVY_M7E>MeDW<61ywDJF4$m0Y#)ZO|Fz_%r|FBwhX;b^=b;&uM&Z!!Xa@@=1Dt?3o2#+Ei+H$+W_rB}A z&KybyB3Vxy^Yhv@^{O!!{7^Cpc%0C~b)4n{l^Q$XHh33THMx}uB}BB-BcXloCHlDG zVUEZ*9hYd3EpN&ZxfiCm;9+Tf-_~8V<3fpCRH4jNY6=90+1KMDIpJXl(a!|&iV6hW z7Eg&gfc=ZWetqD|$yH4&9zuy9AkREeB7A0FMzrQJgBWuSa0z7CE01ZbMdu&b*avfe zD^MD#hZr^)e0u$NEUemgY-lKik(aOCTbNAxJ~g4XM*=Wci7gkSm-1Ol51~ z17o6XH%s^hm~2XowB94;BpM%KuG*4gM_mjcGZJN6A79gc;mcHg+{X0!n?JqDJtrz~ zCjTZ|_TH%~B~js;q7}H`_>0;}Of9deeJ=1KQgFe@9D27?wULte0s73e=~qpce~^Po z2g};Zy6jYz0FJWlb%5LGf~%{a`F7g!*f9gHP`6!cJ|eV3qVjrwit=Wnc)xDPTTTXm zg-cF2iRs@J^R@%ccvZTc*lde7hx1%7cXFs^BjSTr~|-)_TzLZdkx6 zia_8cQRVY0*4O}%HvI+wJS&7Pyc_m+f<*f3lGwF0)Y4{JKJu4*k!nMnc$IC5{dvH z%+#tw+u-j>C{WZxcH7E13L)rg+c0*CJFHMGJKjoSni8A~ZcwPbSsN-xu1du$04qkg z*e+BxkEyr*4pji2`bLhMpbbB>Fs+J0m z;?a!=9g+_oRdWZyc~@_Xl)v%N!uO{G5Jw}mS2!IeMD7D2zAu@fx=G!F2L+~$hXS^EypQM`krxdF$^2k z@4dKLK*$jW)Z7_Te#+bH6dB^lx-hxa(-QeOJ>9tvA?k#!qA>(5b8CXI(V@rNNr|FE8OUtL|i}eWOc72A}faGxPsKmaB?60y-6$ z^&~+jM;sJuCRU{+c3*b}f}G!;%Rc08px@?DJ2mm6midq^=Bma+>EFAm>uOi2Z(gK{ai0fv{W92Fe#k<=o` zXYo=;GSPb?w^&^ba6@p_+1dl%=w|TpO^Xbn=TdjBtR#JVj7{~>qS-lZ2g)GI?ET=_ z6hDYt;A~vb*3VWs*aR1r?IX<@my3phZDgq0Cncah*jEeuXm5rR&TW|BFy(-|HAtb^ z^k_S?)|-OIQ8iI~H?77~fb=W4lEmrs{i8D5h!HW^1ib62nA)|&3!o|~mvPihK|S@p zpSW*O1EJMBwqd}X&)Er@SNVRj%sV6&IaX}8owsx$?$)s?)e2{qu~g(NmeXSR%E-@?42=rXz*C6c4F{Df5QDku`o8duWS_{*x$d(@|)?Ey$BIaI{GGj+anE(>BoTV@BwGWA?it z@0hHj2zbF1OHU!MJI6{=;%tdyc(ds&xP!;~IY&HQ#(~UfgKK~n(i;dJc39~_KI?DSu*@}8x(p!=#yQ-Xs5SDjf-Gi8=dw|> zQ4^Q+Tu;1PN}sVZ(ZEhzspUV;bb+Fk?Gh*4LZc}=-F-h;&U`R_T{KcEvtw+yVGBmy zwaU*47p)Rgl3s$MJ}QGJQ|ENc_y*Mv(PFzVC4{fQMW5{|89kQI;yHjVqH;W*8|jI{ zl!uQ_FYPKSEJjx{7#Ro@EMUF~G&;H#uBLe@4?o7V>I7zMlCW$;znwhxHAO9_sA5M8 ztUJPdchno6|LkUn?+fc#dIp|CM1GSU{sv1sXSU_w%60+rJljyisvoEA(-7b6KI4_5 zb1E!=FTiG7Nx&m`jmFb6uO`ovqpkPn1fe%m(4x%9FHZc1ULnFH zIZ*792Q?>Azw|IxmS%6wikV%_%`!L4Fp+XpGf(N9+!nrJ zO?6$~c(Q9Iz{e`F?2|92cEfuWj~{Mm0UOMRySerdhPMv{HEOu0|KKVD7lVDKq?tea zo~Ej_ldv4&Ai-x$wkMpW8nniKHZt`&9I_kU5~0!Tp0ms@ht4TsWY(vF%?Q?Z>*(dW zJ$3qpP1zfrP!YKk==Oc|%MD?x6jPb{gy>LVjk92%l=5al8ttL0!(w0Zo~u^n$Y`@7 zR|dX;p#_&VJ)hBWbBz72+holrhrCLDNmu6Mq}W+CLh79(>^u6zRgGZ|re?_nbZX-S z;sYz8Cksd7>qdZbDDCS;W7LISzi6*(Drw)o_e-5Q)KNVFf#{x|djaZE@&fVZ8deX~ zlBZxDl5PsOIu$?4opE0mPMop{8wA(;hFL5Hn!bMxu=6%TV+*?tF!$*pZc!pxdD#r> zM^0v5&rX4<8MQ&8cjsTor*&-6`3A&!VCNabGx5h8M|KJuuTe8l}ShwA_qu@3SV=IhZpxuP0SJFyI5){ zbWkAhxP~fwOE$k=hfGMQI@2m8%Vi;S3w2$QLjrMQ%G4Uha_Cl1#l4R5;0Z!b4)k*Q zB^|A4le?o|4rS#HZB|9IKNtxmN zN`ksmZ9ZHdgo%-2*TuxkV<8^BsCqYz(lrIeJ+N`4=cqR(SIoBeT-RKuo~E82DgN2F zrRD9F!erEuQ&-PYsdN3I k>>jdol)@uI9DsRd7F9W{|K_2_T-Zq|<8851Mm)r&S zE&(FdHWZN&gs5<+XGmEJ>UI|tzqkTLm^Qwy81WAp3BK!XrI8H0uU$`-l&65g6Gzb^ z6i-@~eDfK0KNxdz98+ZBuV*LM+}FbYMa|o*Jf>R8NJu!)Z3ds&c6J_?X}+x8Z}*9Z zDbEtG0wUwje2JeF4^;54Sne+*()ppDw!FECdOzpYb1KQaIrbsrmAjSP$K~X9b^F)& zWQtD-=#j8kAj$kYcymn}zF5r%a#52>y_156#uXLO&ou`cfBF^lq@2~w->2n9e2n&K zG}niS-fEqBb&sr&{@A(rq$q%=F$lv-eg}|{qPAB3XGVsJGaiC#$N~CERGDDr6-G`d z2r1-q*6$PkndQ5G_6wdgJO{Rm2-(no2ugJm?4-XdNV^V1R=lZ{@tf==qG4!1fKQ2-&r;&rRv@hoQKgAk%7hn|at zyPDfgYskm7cQJMxk&W6WjlmORUjXEQPV<2=&Pw~N!)ZXr8at=3aLTOx^~X<+IcMU7 zpkSwZw_DBYr&hj%_v0pE07C{?MidD9NP0%x_xeRuP0rH4bJC|NrZ141Jwab*-1 zi$26A*j?W*x%OttlWn)6w|@vsw{N+O40VXdj=^}G4hR^qyQVS;%U&Uy0sy=UYSJXd z3mPL^8t0|wr$%r>UJ2z&s);0fCsu4mN@-R<0ck*0Wv0pFLE;Juwo6~4yl?mMl!qBm zBadVzhPE=mN)7}^UFW(O!@8Nn*~v->>|y5Z+>pwg*K6c_1GMO_CP4zMP5P{qtHnAA zn{&Dk5@y+R1|+1$7!gA&V14&J*p8BHGN~EF1!72W^({n)9S9Dx&aFp z*Y3f7Z!oOlVb6Ss3P-kB>$@+57p6rBx&YAu#yisn<`@~BCwVyCWaHoJi}GzOy2I}?>=w+3&zw{La=L(Ff>oY_FE3JahKlB>vzz<8IEeQd z<9+poBpMIWsj$)nIeN<;8`?qVucvy^mb<_^u@?g?P*Z44;9Q*ka;1B+zFDNsi4u=u z&;M?kVuDP&JRC4e9Tka3g{oyfr%E7M?mWG4B7dr|tbaz=fe>D5Nww zdqU~c#Olku4V^1{e!Jqg3NwA$#l#*D4Ja|jDh=lLjU|Amra0{KP#v!!{lT-3q}gLd z>|glC555_izDG;{{G}uoJB>8-G+~8(_~o1b^hQaD~UQZrFVY z+K69IZp$(f=~BZn%ywACwXt%Ut+u07)5lO^4%un-LGE(E)SOS*J3xTbRX7~>;4Uy6 zuQOhJ;BA51Ou)<84fgU2R1Od_o*`W_Nfd7zazxv>S@rl}}7}nmamh=@sBKY@o4hOS=w`spIiGOeGUCmR+n(L3M2F3=)xan=+fH~xMW$GRu znH`ON>b~<0Oz_RI$V96Y{c6^Y$1v+mLO^r*H_nXF-<@P6X=Hk}KSneHjcvYmpDT3# zZLNS0&1QS!un^jGn{BvmX+%?O_L*1!KxqI<`orhQfd-dfDqlHZ`#R2?=h&6#$1YE8 z4h}(=p+epxB~>mu50&~T(CDyuEmkq3#@=z?agDj=&8fY46gJ*UIs01%aE>8#ln@gbPzO*blkXr%G>zDqF`7`pM}Zs47SSB3T&*FD^2WDU}` zhnUXA)S_qtV9iB_VE2zWjNG#OB*|hIfQ!$SFVNRtzLv{UG2s+mp)|7|4g+IKGR(?V zsNmU?g@AWI&}bZhhvR+Gvf>KOLC5ajGB}{iy+5Y~()zteXNO?HLC3pP(?g7WEDN+pqo{o*q+KyR?CQ$lTmq$k{131EO0xxD%hstB`KIU3kNZ^FMqGLp^ ztZw=M82Ezg&1PCQoU2wgn=E666zEU$?|X85aOao-fZu+X02cwpHNKiHhUHZ||E8p{ zcxA2gp910$Aal+&(hd`&OJIzEi|BXhG;6SpI?`o}WkNM}q5R|B%bQRCoM+;{3{5f- z{X>TZE`=iFPlhN2I#UU8>0$(}vW2>mj@wDWxf)2oTNF#^`5|0q%`nhSJ_=LH_NP>C zEA}Zh!=oxVggscD7;$a&fciCE8T8Lq{UK`}U%ly1;m?{?en9${#@Y99!bVWT3nK?DP0-J)Odw9putAad@NoxdkLy@A`d1 zp&|#G0*W=VVh2vH--N?a{l5Mm-aKPUMbFySe1gYh6XxXnDTxHc;i^2p35QhYtYpeo z8$n-Zi#JcBo)(8^FDhgY_2>sto!NUXuIa%yrfe_L(wu8Jz__NO>98l4|C9{hbO+#Q z0#4u(08|9@(0asB?--zZiBYcR`|Y2qs-)VmA!=%zL7TG%^NKRPYw_m_KNxVMOdw*& z--=tx(ALle5!c)vuxn&7wm0iu{q`rotd~9hfM*(sJaG9@+Wd@@GSQ*Uo2N7hscA>W zRcq9HkaK)a3&-lO*8w7w5SLCxX^~{+0^-wsUN4Nc!UVY+{E<}^x0~0kE$#maJuW7( ze*6U*dF!zTV8a~a%|ZI-)n}eu16^|P{a$m*iKUAcIaNZG0*CiYS_?ib?&%FOfomF^ zQ8%uT9aeIars1e7*sXsfoxOo2V#<9Cm^RP{i>rWhgNg~}S}N!7>_1VLDoWAU*^gE? z5rUNIY!Ab>UhZfpfdp9oVPd;iY6WO~^?OHV4m%POA_Vac5Jrt8yr8{^7m8z|0~fgp z^(!G&-2T#w7Ey~Y&GvIWqCJ;{gs%`j-z%;lbNlK~=*a=yehqd~cX;&jT+BN<3R-th z3=eG*;Hx6hpfI78M1fhz_2T(^MOR5ZtsFLl;Wu-b>rXyLv==?gkSPjk8Ccz0G~D7_8bKNQpoFQKIk}9`&RG zSe^zigMh7wuTWHa_^6I#byfuQRKxB@*tJ6wLeFYO(C3lWrKkPZ*G?W2dY&#|Mr1l2@9Yo$qNSsgZl${!jJ0HjXr)n+qc~5us{a{f;yp$`?D+{r5=h(i!%QDG`$r z%Ykl^T-OODO5NzDxQNpt+&!I;YXbDy=~Vd4J~BGa(&R3*-|UCQTe#ApU2J%9ks9F- z2Oj$zl8^?+>79LSbGu4nr~O^Px}JD2vNly2gV}oO4VVQ3KfQ?$eeTR~;1p}mo)NR( zyG4bYyOE}6CRXx8Ba!##*uO&d(fA6IHuO`cT`hY1szlfgG zsG2V#?(n+2ug>$FWCC%|>Bj?AIp+q31q_=V#OkVp5akC2opPxZKtnL5Vfs0EJBawv z{c}-bSfWhWX!>gY4}F>8PCXU|w4LA*2Ch6Afy}ScNU9P_m7s168#%>D*?^J1eJg{vsu$zxBZI~+rGW-v220m-4|9@Dsw&o z$Wq^s3@}o@zsCM}pZ(dIo5?0aZtE5BHG{sa3yfQpyPY;;Gce5OO15@Mbs1(=Y1!4$ z0`p^l&_Y8-N&w$boe!uliP9wyoVaPiHZxQe{-U;IGBgQQXd9G!SW?NJ>~@6+GhC^& z@&qGEA7=vw$N!iZz2FPS^xlrR&y#`L;p*NoHr%PA!bq_t$Wd4Zy@U;L18U=1^m4vY zr<88z0IXwZpg+FpApPc@=TgT?cYoT67<-Gaz^3&{(%uf(&t$Wq%HDIrzAc)A5!?~? z%@<~OS0gw@lqUw7q9`C~2H-~k52`9%A@%(+S0{z1H$)@k(${M_eNAw-xV-o5l^(q^ z%{5+0rw^9!$}jPEqxSfKj-k7Z)T!`x@muM>sHt_Tujp`;R zyFpaICrls>Rb7=*rAJSr|8IW;by4Q`kDx|H@jzF|TSQu#S1dxa*rT7Cp~NddtJ2K` zAYXC2P=RowD6zl){_cXmXTjeK;qO@RcR2hzBmA8W|IUX0UuVPmJ`0ler4E~pzarNE E1Ar}1hX4Qo literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/updateTopologyTerminal.fig b/katabatic/doc/images/updateTopologyTerminal.fig new file mode 100644 index 00000000..134ac4d6 --- /dev/null +++ b/katabatic/doc/images/updateTopologyTerminal.fig @@ -0,0 +1,316 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 300 900 2475 1500 +6 300 900 600 1500 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 375 1125 525 1125 525 1275 375 1275 375 1125 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 1125 525 975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 1200 525 1050 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 1275 525 1125 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 1350 525 1200 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 1425 525 1275 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 1050 450 975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 450 1425 525 1350 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 375 975 525 975 525 1425 375 1425 375 975 +-6 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 525 1200 2400 1200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1200 1200 1200 900 1500 900 1500 1200 +4 1 0 50 -1 14 12 0.0000 4 120 240 1350 1125 10\001 +-6 +6 300 2100 2475 2700 +6 300 2100 600 2700 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 375 2325 525 2325 525 2475 375 2475 375 2325 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 2325 525 2175 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 2400 525 2250 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 2475 525 2325 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 2550 525 2400 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 2625 525 2475 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 2250 450 2175 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 450 2625 525 2550 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 375 2175 525 2175 525 2625 375 2625 375 2175 +-6 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 525 2400 2400 2400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1200 2400 1200 2100 1500 2100 1500 2400 +4 1 0 50 -1 14 12 0.0000 4 120 240 1350 2325 10\001 +-6 +6 5700 900 6000 1500 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 5775 1125 5925 1125 5925 1275 5775 1275 5775 1125 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 1125 5925 975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 1200 5925 1050 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 1275 5925 1125 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 1350 5925 1200 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 1425 5925 1275 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 1050 5850 975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5850 1425 5925 1350 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 5775 975 5925 975 5925 1425 5775 1425 5775 975 +-6 +6 5700 2100 6000 2700 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 5775 2325 5925 2325 5925 2475 5775 2475 5775 2325 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 2325 5925 2175 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 2400 5925 2250 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 2475 5925 2325 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 2550 5925 2400 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 2625 5925 2475 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 2250 5850 2175 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5850 2625 5925 2550 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 5775 2175 5925 2175 5925 2625 5775 2625 5775 2175 +-6 +6 300 6000 600 6600 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 375 6225 525 6225 525 6375 375 6375 375 6225 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 6225 525 6075 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 6300 525 6150 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 6375 525 6225 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 6450 525 6300 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 6525 525 6375 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 6150 450 6075 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 450 6525 525 6450 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 375 6075 525 6075 525 6525 375 6525 375 6075 +-6 +6 5700 6750 6000 7350 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 5775 6975 5925 6975 5925 7125 5775 7125 5775 6975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 6975 5925 6825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 7050 5925 6900 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 7125 5925 6975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 7200 5925 7050 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 7275 5925 7125 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 6900 5850 6825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5850 7275 5925 7200 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 5775 6825 5925 6825 5925 7275 5775 7275 5775 6825 +-6 +6 300 3600 600 4200 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 375 3825 525 3825 525 3975 375 3975 375 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 3825 525 3675 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 3900 525 3750 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 3975 525 3825 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 4050 525 3900 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 4125 525 3975 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 375 3750 450 3675 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 450 4125 525 4050 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 375 3675 525 3675 525 4125 375 4125 375 3675 +-6 +6 5700 4350 6000 4950 +2 2 0 4 0 32 40 -1 -1 10.000 0 0 -1 0 0 5 + 5775 4575 5925 4575 5925 4725 5775 4725 5775 4575 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 4575 5925 4425 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 4650 5925 4500 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 4725 5925 4575 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 4800 5925 4650 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 4875 5925 4725 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5775 4500 5850 4425 +2 1 0 1 1 32 50 -1 -1 4.000 0 0 -1 0 0 2 + 5850 4875 5925 4800 +2 2 0 2 1 32 50 -1 -1 6.000 0 0 -1 0 0 5 + 5775 4425 5925 4425 5925 4875 5775 4875 5775 4425 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4500 1200 4500 900 4800 900 4800 1200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4500 2400 4500 2100 4800 2100 4800 2400 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 3900 1200 5775 1200 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 3900 2400 5775 2400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 825 6300 825 6000 1125 6000 1125 6300 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 1350 6300 1500 6300 1500 6450 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 1650 7050 1500 7050 1500 6900 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1500 6300 1500 7050 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1500 6525 1800 6525 1800 6825 1500 6825 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1800 7050 1800 7350 2100 7350 2100 7050 +2 1 3 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 1500 5700 1500 7500 +2 1 0 2 4 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 1500 7050 2400 7050 +2 1 0 2 0 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 525 6300 1500 6300 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4125 6300 4125 6000 4425 6000 4425 6300 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 4650 6300 4800 6300 4800 6450 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 4950 7050 4800 7050 4800 6900 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4800 6300 4800 7050 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4800 6525 5100 6525 5100 6825 4800 6825 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 5100 7050 5100 7350 5400 7350 5400 7050 +2 1 3 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 4800 5700 4800 7500 +2 1 0 2 4 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 4800 7050 5775 7050 +2 1 0 2 0 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 3900 6300 4800 6300 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 825 3900 825 3600 1125 3600 1125 3900 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 1350 3900 1500 3900 1500 4050 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 1650 4650 1500 4650 1500 4500 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1500 3900 1500 4650 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1500 4125 1800 4125 1800 4425 1500 4425 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1800 4650 1800 4950 2100 4950 2100 4650 +2 1 3 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 1500 3300 1500 5100 +2 1 0 2 4 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 1500 4650 2400 4650 +2 1 0 2 0 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 525 3900 1500 3900 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4125 3900 4125 3600 4425 3600 4425 3900 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 4650 3900 4800 3900 4800 4050 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 4950 4650 4800 4650 4800 4500 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4800 3900 4800 4650 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4800 4125 5100 4125 5100 4425 4800 4425 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 5100 4650 5100 4950 5400 4950 5400 4650 +2 1 3 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 4800 3300 4800 5100 +2 1 0 2 4 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 4800 4650 5775 4650 +2 1 0 2 0 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 3900 3900 4800 3900 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + 0 600 6300 600 6300 8100 0 8100 0 600 +3 0 0 1 4 0 60 -1 -1 4.000 0 1 0 4 + 0 0 1.00 60.00 120.00 + 1050 1200 825 1725 1050 1875 750 2400 + 0.000 1.000 1.000 0.000 +4 1 0 60 -1 14 12 0.0000 4 120 240 1350 2625 M4\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 1350 1425 M2\001 +4 1 0 60 -1 18 12 0.0000 4 180 390 1350 1800 (1.a)\001 +4 1 0 60 -1 18 12 0.0000 4 195 1740 1350 3000 (1.b) Layer Change\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 4650 2625 M4\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 4650 1425 M2\001 +4 1 0 60 -1 18 12 0.0000 4 180 405 4650 3000 (2.b)\001 +4 2 0 60 -1 14 12 0.0000 4 120 120 225 2475 S\001 +4 2 0 60 -1 14 12 0.0000 4 120 120 225 1275 S\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 4650 1125 10\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 4650 2325 10\001 +4 0 0 60 -1 14 12 0.0000 4 120 120 6075 2475 T\001 +4 0 0 60 -1 14 12 0.0000 4 120 120 6075 1275 T\001 +4 1 0 60 -1 18 12 0.0000 4 180 390 4650 1800 (2.a)\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 975 6525 M2\001 +4 2 4 60 -1 14 12 0.0000 4 120 240 1425 6750 M3\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 1950 6975 M4\001 +4 1 0 60 -1 18 12 0.0000 4 195 1635 1350 7800 (1.d) Layer Adjust\001 +4 2 0 60 -1 14 12 0.0000 4 120 120 225 6375 S\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 975 6225 10\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 1650 6750 20\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 1950 7275 21\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 4275 6525 M4\001 +4 2 4 60 -1 14 12 0.0000 4 120 240 4725 6750 M3\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 5250 6975 M2\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 4275 6225 10\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 4950 6750 20\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 5250 7275 21\001 +4 0 0 60 -1 14 12 0.0000 4 120 120 6075 7125 T\001 +4 1 0 60 -1 18 12 0.0000 4 180 405 4650 7800 (2.d)\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 975 4125 M4\001 +4 2 4 60 -1 14 12 0.0000 4 120 240 1425 4350 M5\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 1950 4575 M4\001 +4 1 0 60 -1 18 12 0.0000 4 195 1950 1350 5400 (1.c) Dogleg Creation\001 +4 2 0 60 -1 14 12 0.0000 4 120 120 225 3975 S\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 975 3825 10\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 1650 4350 20\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 1950 4875 21\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 4275 4125 M4\001 +4 2 4 60 -1 14 12 0.0000 4 120 240 4725 4350 M5\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 5250 4575 M4\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 4275 3825 10\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 4950 4350 20\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 5250 4875 21\001 +4 0 0 60 -1 14 12 0.0000 4 120 120 6075 4725 T\001 +4 1 0 60 -1 18 12 0.0000 4 180 390 4650 5400 (2.c)\001 diff --git a/katabatic/doc/images/updateTopologyTerminal.png b/katabatic/doc/images/updateTopologyTerminal.png new file mode 100644 index 0000000000000000000000000000000000000000..5f16a0bbfebc9c5a1aab65f9ce34edf122c2c237 GIT binary patch literal 13234 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 W|BwAb)434CbF(g11jT=JcmD--ZqRT5 literal 0 HcmV?d00001 diff --git a/katabatic/doc/images/updateTopologyTurn.fig b/katabatic/doc/images/updateTopologyTurn.fig new file mode 100644 index 00000000..e3983a42 --- /dev/null +++ b/katabatic/doc/images/updateTopologyTurn.fig @@ -0,0 +1,244 @@ +#FIG 3.2 Produced by xfig version 3.2.5a +Landscape +Center +Inches +Letter +100.00 +Single +-2 +1200 2 +0 32 #ffffdd +6 3750 -75 6450 1875 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4950 1200 4950 900 5250 900 5250 1200 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 4200 1200 6150 1200 +2 1 0 4 0 0 45 -1 -1 10.000 0 0 -1 0 0 3 + 4200 900 4200 1200 4500 1200 +2 1 0 2 0 0 50 -1 -1 6.000 0 0 -1 0 0 2 + 4200 0 4200 1200 +2 1 0 1 0 0 50 -1 -1 4.000 0 0 -1 0 0 4 + 4200 600 3900 600 3900 300 4200 300 +4 1 0 60 -1 14 12 0.0000 4 120 240 5100 1425 M4\001 +4 1 0 60 -1 18 12 0.0000 4 195 2625 5100 1800 (1.b) Layer Change: pivot up\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 5100 1125 10\001 +4 1 0 45 -1 14 12 0.0000 4 120 120 4050 525 9\001 +4 0 0 50 -1 14 12 0.0000 4 120 240 4275 525 M3\001 +4 1 0 60 -1 14 12 0.0000 4 120 120 4350 1425 S\001 +-6 +6 0 2400 6300 11175 +6 300 2625 2700 4575 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 600 3900 2625 3900 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1425 3900 1425 3600 1725 3600 1725 3900 +2 1 0 4 0 0 45 -1 -1 10.000 0 0 -1 0 0 3 + 600 3600 600 3900 900 3900 +2 1 0 2 0 0 50 -1 -1 6.000 0 0 -1 0 0 2 + 600 2700 600 3900 +2 1 0 1 0 0 50 -1 -1 4.000 0 0 -1 0 0 4 + 600 3300 300 3300 300 3000 600 3000 +4 1 0 60 -1 14 12 0.0000 4 120 240 1575 4125 M2\001 +4 1 0 60 -1 18 12 0.0000 4 195 1740 1575 4500 (2.b) Layer Change\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 1575 3825 10\001 +4 1 0 45 -1 14 12 0.0000 4 120 120 450 3225 9\001 +4 0 0 50 -1 14 12 0.0000 4 120 240 675 3225 M5\001 +4 1 0 60 -1 14 12 0.0000 4 120 120 450 3825 S\001 +-6 +6 3600 4800 6300 7875 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 4200 5100 6225 5100 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4950 5100 4950 4800 5250 4800 5250 5100 +2 1 0 4 0 0 45 -1 -1 10.000 0 0 -1 0 0 3 + 4200 5400 4200 5100 4500 5100 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 4200 6150 4200 6300 4350 6300 +2 1 0 2 4 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 4200 6300 5100 6300 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4500 6300 4500 6600 4800 6600 4800 6300 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 5100 6450 5100 6300 4950 6300 +2 1 3 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 3600 6300 5700 6300 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4200 5100 4200 6300 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4200 5550 3900 5550 3900 5850 4200 5850 +2 1 0 2 0 0 50 -1 -1 6.000 0 0 -1 0 0 2 + 5100 6300 5100 7500 +2 1 0 1 0 0 50 -1 -1 4.000 0 0 -1 0 0 4 + 5100 6900 5400 6900 5400 6600 5100 6600 +4 1 0 60 -1 18 12 0.0000 4 195 1950 5175 7800 (3.c) Dogleg Creation\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 5100 5025 10\001 +4 1 0 60 -1 14 12 0.0000 4 120 120 4050 5325 T\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 5100 5325 M2\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 4650 6225 M6\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 4650 6525 20\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 4050 5775 21\001 +4 1 0 45 -1 14 12 0.0000 4 120 120 5250 6825 9\001 +4 0 4 60 -1 14 12 0.0000 4 120 240 4275 5775 M5\001 +4 2 0 50 -1 14 12 0.0000 4 120 240 5025 6825 M5\001 +-6 +6 3900 2400 6300 4575 +2 1 0 2 0 0 50 -1 -1 6.000 0 0 -1 0 0 2 + 4200 2700 4200 3900 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 4200 2700 6225 2700 +2 1 0 1 0 0 50 -1 -1 4.000 0 0 -1 0 0 4 + 4200 3600 3900 3600 3900 3300 4200 3300 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4950 2700 4950 2400 5250 2400 5250 2700 +2 1 0 4 0 0 45 -1 -1 10.000 0 0 -1 0 0 3 + 4200 3000 4200 2700 4500 2700 +4 1 0 60 -1 18 12 0.0000 4 195 1740 5175 4500 (3.b) Layer Change\001 +4 0 0 50 -1 14 12 0.0000 4 120 240 4275 3525 M5\001 +4 1 0 45 -1 14 12 0.0000 4 120 120 4050 3525 9\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 5100 2625 10\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 5100 2925 M2\001 +4 1 0 60 -1 14 12 0.0000 4 120 120 4050 2925 T\001 +-6 +6 0 5025 2700 7875 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 600 7200 2625 7200 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1425 7200 1425 6900 1725 6900 1725 7200 +2 1 0 4 0 0 45 -1 -1 10.000 0 0 -1 0 0 3 + 600 6900 600 7200 900 7200 +2 1 0 2 0 0 50 -1 -1 6.000 0 0 -1 0 0 2 + 600 6000 600 7200 +2 1 0 1 0 0 50 -1 -1 4.000 0 0 -1 0 0 4 + 600 6750 300 6750 300 6450 600 6450 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 600 6150 600 6000 750 6000 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 900 6000 900 6300 1200 6300 1200 6000 +2 1 0 2 4 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 600 6000 1500 6000 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 1500 5850 1500 6000 1350 6000 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1500 5100 1500 5850 +2 1 3 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 0 6000 2100 6000 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1500 5400 1800 5400 1800 5700 1500 5700 +4 1 0 60 -1 14 12 0.0000 4 120 240 1575 7425 M2\001 +4 1 0 60 -1 18 12 0.0000 4 195 1950 1575 7800 (2.c) Dogleg Creation\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 1575 7125 10\001 +4 1 0 60 -1 14 12 0.0000 4 120 120 450 7125 S\001 +4 1 0 45 -1 14 12 0.0000 4 120 120 450 6675 9\001 +4 0 0 50 -1 14 12 0.0000 4 120 240 675 6675 M5\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 1050 6225 20\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 1650 5625 21\001 +4 2 4 60 -1 14 12 0.0000 4 120 240 1425 5625 M5\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 1050 5925 M6\001 +-6 +6 3600 8100 6300 11175 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 4200 8400 6225 8400 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4950 8400 4950 8100 5250 8100 5250 8400 +2 1 0 4 0 0 45 -1 -1 10.000 0 0 -1 0 0 3 + 4200 8700 4200 8400 4500 8400 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 4200 9450 4200 9600 4350 9600 +2 1 0 2 4 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 4200 9600 5100 9600 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4500 9600 4500 9900 4800 9900 4800 9600 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 5100 9750 5100 9600 4950 9600 +2 1 3 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 3600 9600 5700 9600 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 4200 8400 4200 9600 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 4200 8850 3900 8850 3900 9150 4200 9150 +2 1 0 2 0 0 50 -1 -1 6.000 0 0 -1 0 0 2 + 5100 9600 5100 10800 +2 1 0 1 0 0 50 -1 -1 4.000 0 0 -1 0 0 4 + 5100 10200 5400 10200 5400 9900 5100 9900 +4 1 0 60 -1 18 12 0.0000 4 195 1635 5175 11100 (3.d) Layer Adjust\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 5100 8325 10\001 +4 1 0 60 -1 14 12 0.0000 4 120 120 4050 8625 T\001 +4 1 0 60 -1 14 12 0.0000 4 120 240 5100 8625 M2\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 4650 9525 M4\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 4650 9825 20\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 4050 9075 21\001 +4 1 0 45 -1 14 12 0.0000 4 120 120 5250 10125 9\001 +4 0 4 60 -1 14 12 0.0000 4 120 240 4275 9075 M3\001 +4 2 0 50 -1 14 12 0.0000 4 120 240 5025 10125 M5\001 +-6 +6 0 8325 2700 11175 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 600 10500 2625 10500 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1425 10500 1425 10200 1725 10200 1725 10500 +2 1 0 4 0 0 45 -1 -1 10.000 0 0 -1 0 0 3 + 600 10200 600 10500 900 10500 +2 1 0 2 0 0 50 -1 -1 6.000 0 0 -1 0 0 2 + 600 9300 600 10500 +2 1 0 1 0 0 50 -1 -1 4.000 0 0 -1 0 0 4 + 600 10050 300 10050 300 9750 600 9750 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 600 9450 600 9300 750 9300 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 900 9300 900 9600 1200 9600 1200 9300 +2 1 0 2 4 32 50 -1 -1 0.000 0 0 -1 0 0 2 + 600 9300 1500 9300 +2 1 0 4 4 32 40 -1 -1 0.000 0 0 -1 0 0 3 + 1500 9150 1500 9300 1350 9300 +2 1 0 2 4 7 50 -1 -1 0.000 0 0 -1 0 0 2 + 1500 8400 1500 9150 +2 1 3 1 4 7 50 -1 -1 4.000 0 0 -1 0 0 2 + 0 9300 2100 9300 +2 1 0 1 4 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1500 8700 1800 8700 1800 9000 1500 9000 +4 1 0 60 -1 14 12 0.0000 4 120 240 1575 10725 M2\001 +4 1 0 60 -1 18 12 0.0000 4 195 1635 1575 11100 (2.d) Layer Adjust\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 1575 10425 10\001 +4 1 0 60 -1 14 12 0.0000 4 120 120 450 10425 S\001 +4 1 0 45 -1 14 12 0.0000 4 120 120 450 9975 9\001 +4 0 0 50 -1 14 12 0.0000 4 120 240 675 9975 M3\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 1050 9525 20\001 +4 1 4 50 -1 14 12 0.0000 4 120 240 1650 8925 21\001 +4 2 4 60 -1 14 12 0.0000 4 120 240 1425 8925 M5\001 +4 1 4 60 -1 14 12 0.0000 4 120 240 1050 9225 M4\001 +-6 +-6 +2 1 0 1 0 7 50 -1 -1 0.000 0 0 -1 0 0 4 + 1350 1200 1350 900 1650 900 1650 1200 +2 1 0 2 0 32 40 -1 -1 0.000 0 0 -1 0 0 2 + 600 1200 2550 1200 +2 1 0 4 0 0 45 -1 -1 10.000 0 0 -1 0 0 3 + 600 900 600 1200 900 1200 +2 1 0 2 0 0 50 -1 -1 6.000 0 0 -1 0 0 2 + 600 0 600 1200 +2 1 0 1 0 0 50 -1 -1 4.000 0 0 -1 0 0 4 + 600 600 300 600 300 300 600 300 +2 1 0 1 0 0 50 -1 -1 4.000 0 0 -1 0 0 2 + 0 2100 6900 2100 +2 1 0 1 0 0 50 -1 -1 4.000 0 0 -1 0 0 2 + 3300 2100 3300 11400 +2 2 0 0 0 32 70 -1 21 2.000 0 0 -1 0 0 5 + -300 -300 7200 -300 7200 11700 -300 11700 -300 -300 +3 0 0 1 4 0 50 -1 -1 4.000 0 1 0 4 + 0 0 1.00 60.00 120.00 + 2100 1200 3000 600 3900 1800 4875 1200 + 0.000 1.000 1.000 0.000 +3 0 0 1 4 0 50 -1 -1 4.000 0 1 0 4 + 0 0 1.00 60.00 120.00 + 600 450 1200 1200 1200 2400 600 3450 + 0.000 1.000 1.000 0.000 +3 0 0 1 4 0 50 -1 -1 4.000 0 1 0 3 + 0 0 1.00 60.00 120.00 + 600 450 2100 2400 4200 3150 + 0.000 1.000 0.000 +4 1 0 60 -1 14 12 0.0000 4 120 240 1500 1425 M2\001 +4 1 0 60 -1 18 12 0.0000 4 180 390 1500 1800 (1.a)\001 +4 1 0 50 -1 14 12 0.0000 4 120 240 1500 1125 10\001 +4 1 0 45 -1 14 12 0.0000 4 120 120 450 525 9\001 +4 1 0 60 -1 14 12 0.0000 4 120 120 750 1425 S\001 +4 0 0 50 -1 14 12 0.0000 4 120 240 675 525 M3\001 diff --git a/katabatic/doc/images/updateTopologyTurn.png b/katabatic/doc/images/updateTopologyTurn.png new file mode 100644 index 0000000000000000000000000000000000000000..54b27d8c02f34810d9f75c9b7061ab10ea1c2792 GIT binary patch literal 18598 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 B3l;zX literal 0 HcmV?d00001 diff --git a/katabatic/doc/mkDoc.sh b/katabatic/doc/mkDoc.sh deleted file mode 100644 index f7b1749c..00000000 --- a/katabatic/doc/mkDoc.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - - cd images - for file in *.fig; do - echo "Translating $file into PDF..." - fig2dev -L pdf -p dummy $file `basename $file .fig`.pdf - done - cd .. - - exit 0 diff --git a/katabatic/src/AutoContact.cpp b/katabatic/src/AutoContact.cpp index c332e1be..79b91d71 100644 --- a/katabatic/src/AutoContact.cpp +++ b/katabatic/src/AutoContact.cpp @@ -2,14 +2,14 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./AutoContact.cpp" | // +-----------------------------------------------------------------+ @@ -18,7 +18,6 @@ #include #include #include - #include "hurricane/Bug.h" #include "hurricane/Error.h" #include "hurricane/Warning.h" @@ -27,2079 +26,27 @@ #include "hurricane/BasicLayer.h" #include "hurricane/Technology.h" #include "hurricane/Net.h" -#include "hurricane/Contact.h" #include "hurricane/Plug.h" #include "hurricane/RoutingPad.h" #include "hurricane/Vertical.h" #include "hurricane/Horizontal.h" #include "hurricane/UpdateSession.h" #include "hurricane/DebugSession.h" - #include "crlcore/RoutingGauge.h" - -#include "katabatic/GCell.h" #include "katabatic/AutoContact.h" -#include "katabatic/AutoSegment.h" #include "katabatic/AutoVertical.h" #include "katabatic/AutoHorizontal.h" #include "katabatic/Session.h" -namespace { - - /*! \class SegmentEnd - * \brief Segment manipulator (\b internal) - * - * SegmentPosition compute detailed informations about how an - * Segment is connected to the current AutoContact. This - * object act as a cache, avoiding to recalculate the position - * information many times. - * - * It also provide uniform way of resizing the Segment extention - * from the AutoContact. - */ - - /*! \var bool SegmentEnd::_isSourceHook; - * set to \b true if the Segment is attached to the AutoContact - * through it's source hook (\b false for target \c hook). - */ - - /*! \function SegmentEnd::SegmentEnd ( AutoSegment* segment, bool isSourceHook ); - * \param segment the supporting segment. - * \param isSourceHook initialize _isSourceHook. - */ - - /*! \function static SegmentEnd* SegmentEnd::create ( Hook* hook, bool checking ); - * \param contact The AutoContact we are currently processing. - * \return The appropriate SegmentPosition. - * - * This create function allocate the relevant HorizontalPosition or - * VerticalPosition derived object, providing an uniform allocator - * function. - */ - - /*! \function virtual bool SegmentEnd::isVertical () const; - * \return \b true if the associated Segment is vertical. - */ - - /*! \function virtual bool SegmentEnd::isHorizontal () const; - * \return \b true if the associated Segment is horizontal. - */ - - /*! \function bool SegmentEnd::isSourceHook () const; - * \return The _isSourceHook value (accessor). - */ - - /*! \function bool SegmentEnd::isGlobal () const; - * \return The _isGlobal value (accessor). - */ - - /*! \function virtual DbU::Unit SegmentEnd::getAxis () const; - * \return For horizontal segment, the Y coordinate and the X coordinate for - * vertical ones. - */ - - /*! \function Layer* SegmentEnd::getLayer () const; - * \return The layer of the segment. - */ - - /*! \function Point SegmentEnd::getEnd () const; - * \return The position of the segment's extremity attached to the AutoContact. - */ - - - /*! \function void SegmentEnd::setDelta ( DbU::Unit delta ); - * \param delta the new value of the extention. - * - * Adjust the segment's extention. Coordinate must be expressed - * as an offset to the absolute coordinate of the relevant hook. - */ - - /*! \function void SegmentEnd::orient (); - * restore correct orientation of the segment (source \e lower than - * target), usually needed after a setDelta(). - */ - - - - - /*! \class HorizontalEnd - * \brief Horizontal Segment manipulator (\b internal) - * - * This class must only be accessed through it's base class - * SegmentPosition, it's constructed through SegmentPosition::create(). - */ - - - /*! \class VerticalEnd - * \brief Vertical Segment manipulator (\b internal) - * - * This class must only be accessed through it's base class - * SegmentPosition, it's constructed through SegmentPosition::create(). - */ - - - using namespace std; - using namespace Hurricane; - using namespace Katabatic; - - -// ------------------------------------------------------------------- -// Local Variables. - -// const char* badAutoContactAnchor = -// "AutoContact::AutoContact() :\n\n" -// " Only are supported to anchor an AutoContact :\n" -// " %s\n"; - -// const char* nonAdjacentLayers = -// "%s :\n\n" -// " %s and %s are not adjacent, cannot build a VIA.\n"; - -// const char* missingAutoLayer = -// "AutoContact::create() :\n\n" -// " DataBase is lacking \"AutoLayer\" layer, please check technology file.\n"; - -// const char* emptyJunctionBox = -// " Empty JunctionBox in %s (internal error)."; - - const char* badHookType = - "Hook of %s is neither a SourceHook nor a TargetHook (internal error)."; - - const char* missingAutoSegment = - "No AutoSegment associated to %s (internal error)."; - - -// Forward Declarations. - class StackedContact; - - -// ------------------------------------------------------------------- -// Class : "::UPoint". - - - class UPoint { - // Constructors. - public: - inline UPoint ( bool isHorizontal, DbU::Unit ux, DbU::Unit uy ); - // Accessors. - inline DbU::Unit getUX () const; - inline DbU::Unit getUY () const; - inline DbU::Unit getX () const; - inline DbU::Unit getY () const; - // Modifiers. - inline void setUX ( DbU::Unit ux ); - inline void setUY ( DbU::Unit uy ); - // Attributes. - protected: - bool _isHorizontal; - DbU::Unit _ux; - DbU::Unit _uy; - }; - - -// Inline Functions. - inline UPoint::UPoint ( bool isHorizontal, DbU::Unit ux, DbU::Unit uy ) - : _isHorizontal(isHorizontal), _ux(ux), _uy(uy) {} - inline DbU::Unit UPoint::getUX () const { return _ux; } - inline DbU::Unit UPoint::getUY () const { return _uy; } - inline DbU::Unit UPoint::getX () const { return (_isHorizontal)?_ux:_uy; } - inline DbU::Unit UPoint::getY () const { return (_isHorizontal)?_uy:_ux; } - inline void UPoint::setUX ( DbU::Unit ux ) { _ux = ux; } - inline void UPoint::setUY ( DbU::Unit uy ) { _uy = uy; } - - -// ------------------------------------------------------------------- -// Class : "::SegmentEnd". - - - class SegmentEnd { - public: - struct Compare : public binary_function { - inline bool operator() ( const SegmentEnd* lhs, const SegmentEnd* rhs ) const; - }; - public: - // AutoSegment & Segment wrapped functions. - inline bool isGlobal () const; - inline bool isLocal () const; - inline bool isHorizontal () const; - inline bool isVertical () const; - inline bool isSlackened () const; - inline Net* getNet () const; - inline const Layer* getLayer () const; - inline Hook* getSourceHook (); - inline Hook* getTargetHook (); - inline DbU::Unit getSourceX () const; - inline DbU::Unit getSourceY () const; - inline DbU::Unit getTargetX () const; - inline DbU::Unit getTargetY () const; - inline DbU::Unit getSourceU () const; - inline DbU::Unit getTargetU () const; - inline DbU::Unit getDuSource () const; - inline DbU::Unit getDuTarget () const; - inline DbU::Unit getAxis () const; - inline DbU::Unit getWidth () const; - inline void setSlackened ( bool ); - inline void setDuSource ( DbU::Unit ); - inline void setDuTarget ( DbU::Unit ); - inline void invert (); - inline void invalidate (); - // Constructors & Destructors. - inline SegmentEnd ( AutoSegment* , bool isSourceHook ); - virtual ~SegmentEnd (); - static SegmentEnd* create ( Hook*, bool checking ); - // Accessors. - static size_t getAllocateds (); - inline bool isSourceHook () const; - inline AutoSegment* getSegment () const; - virtual Hook* getHook () const; - inline Point getEnd () const; - inline DbU::Unit getEndX () const; - inline DbU::Unit getEndY () const; - virtual vector* getForks (); - virtual vector* getAligneds (); - // Modifiers. - void setDelta ( DbU::Unit ); - virtual void orient (); - virtual void addFork ( SegmentEnd* ); - virtual void addAligned ( SegmentEnd* ); - virtual void split ( vector& ); - // Inspector Managment. - inline Record* _getRecord () const; - inline string _getString () const; - inline string _getTypeName () const; - protected: - // Attributes. - static size_t _allocateds; - AutoSegment* _autoSegment; - bool _isSourceHook; - }; - - -} - -INSPECTOR_P_SUPPORT(SegmentEnd); - -namespace { - - size_t SegmentEnd::_allocateds = 0; - - SegmentEnd::~SegmentEnd () { _allocateds--; } - size_t SegmentEnd::getAllocateds () { return _allocateds; } - inline bool SegmentEnd::isGlobal () const { return _autoSegment->isGlobal(); } - inline bool SegmentEnd::isLocal () const { return _autoSegment->isLocal(); } - inline bool SegmentEnd::isHorizontal () const { return _autoSegment->isHorizontal(); } - inline bool SegmentEnd::isVertical () const { return _autoSegment->isVertical(); } - inline bool SegmentEnd::isSlackened () const { return _autoSegment->isSlackened(); } - inline AutoSegment* SegmentEnd::getSegment () const { return _autoSegment; } - inline Net* SegmentEnd::getNet () const { return _autoSegment->getNet(); } - inline const Layer* SegmentEnd::getLayer () const { return _autoSegment->getLayer(); } - inline Hook* SegmentEnd::getSourceHook () { return _autoSegment->getSourceHook(); } - inline Hook* SegmentEnd::getTargetHook () { return _autoSegment->getTargetHook(); } - inline DbU::Unit SegmentEnd::getSourceX () const { return _autoSegment->getSourceX(); } - inline DbU::Unit SegmentEnd::getSourceY () const { return _autoSegment->getSourceY(); } - inline DbU::Unit SegmentEnd::getTargetX () const { return _autoSegment->getTargetX(); } - inline DbU::Unit SegmentEnd::getTargetY () const { return _autoSegment->getTargetY(); } - inline DbU::Unit SegmentEnd::getSourceU () const { return _autoSegment->getSourceU(); } - inline DbU::Unit SegmentEnd::getTargetU () const { return _autoSegment->getTargetU(); } - inline DbU::Unit SegmentEnd::getDuSource () const { return _autoSegment->getDuSource(); } - inline DbU::Unit SegmentEnd::getDuTarget () const { return _autoSegment->getDuTarget(); } - inline DbU::Unit SegmentEnd::getAxis () const { return _autoSegment->getAxis(); } - inline DbU::Unit SegmentEnd::getWidth () const { return _autoSegment->getWidth(); } - inline void SegmentEnd::setSlackened ( bool state ) { _autoSegment->setSlackened(state); } - inline void SegmentEnd::setDuSource ( DbU::Unit du ) { _autoSegment->setDuSource(du); } - inline void SegmentEnd::setDuTarget ( DbU::Unit du ) { _autoSegment->setDuTarget(du); } - inline void SegmentEnd::invert () { _autoSegment->invert(); } - inline void SegmentEnd::invalidate () { _autoSegment->invalidate(); } - inline bool SegmentEnd::isSourceHook () const { return _isSourceHook; } - inline Point SegmentEnd::getEnd () const { return isSourceHook() ? Point(getSourceX(),getSourceY()) : Point(getTargetX(),getTargetY()); } - inline DbU::Unit SegmentEnd::getEndX () const { return isSourceHook() ? getSourceX() : getTargetX(); } - inline DbU::Unit SegmentEnd::getEndY () const { return isSourceHook() ? getSourceY() : getTargetY(); } - vector* SegmentEnd::getForks () { return NULL; } - vector* SegmentEnd::getAligneds () { return NULL; } - void SegmentEnd::addFork ( SegmentEnd* ) {} - void SegmentEnd::addAligned ( SegmentEnd* ) {} - void SegmentEnd::split ( vector& ) {} - inline Record* SegmentEnd::_getRecord () const { return _autoSegment->_getRecord(); } - inline string SegmentEnd::_getString () const { return _autoSegment->_getString(); } - inline string SegmentEnd::_getTypeName () const { return "Katabatic::SegmentEnd"; } - - inline bool SegmentEnd::Compare::operator() ( const SegmentEnd* lhs, const SegmentEnd* rhs ) const - { return AutoSegment::CompareId() ( lhs->getSegment(), rhs->getSegment() ); } - - inline SegmentEnd::SegmentEnd ( AutoSegment* segment, bool isSourceHook ) - : _autoSegment(segment) - , _isSourceHook(isSourceHook) - { - _allocateds++; - } - - - Hook* SegmentEnd::getHook () const - { - if ( isSourceHook() ) return _autoSegment->getSourceHook(); - return _autoSegment->getTargetHook(); - } - - - void SegmentEnd::orient () - { - if ( ( !isGlobal() ) && ( getSourceU() > getTargetU() ) ) { - ltrace(99) << "Orient() before - " << this << endl; - - invert (); - DbU::Unit duSource = getDuSource(); - DbU::Unit duTarget = getDuTarget(); - setDuSource ( duTarget ); - setDuTarget ( duSource ); - _isSourceHook = !_isSourceHook; - - ltrace(99) << "Orient() after - " << this << endl; - } - } - - - void SegmentEnd::setDelta ( DbU::Unit delta ) - { - ltrace(99) << "setDelta(" << DbU::getLambda(delta) << ") - " << this << endl; - - if ( isSourceHook() ) { - if ( getDuSource() != delta ) { - setDuSource ( delta ); - ltrace(99) << "DuSource actualized: " << this << endl; - } - } else { - if ( getDuTarget() != delta ) { - setDuTarget ( delta ); - ltrace(99) << "DuTarget actualized: " << this << endl; - } - } - - orient (); - } - - -} - - -namespace { - - -// ------------------------------------------------------------------- -// Class : "::ForkCompare". - - - class ForkCompare { - public: - inline ForkCompare ( bool increasing ) : _increasing(increasing) {}; - inline bool operator() ( SegmentEnd* lhs, SegmentEnd* rhs ) const; - protected: - bool _increasing; - }; - - - bool ForkCompare::operator() ( SegmentEnd* lhs, SegmentEnd* rhs ) const - { - bool superior = rhs->isGlobal(); - - if ( lhs->getAxis() == rhs->getAxis() ) { - if ( lhs->isLocal() && rhs->isLocal() ) - return false; - } else - superior = lhs->getAxis() > rhs->getAxis(); - - return (_increasing) ? !superior : superior; - } - - -// ------------------------------------------------------------------- -// Class : "::StackedContact". - - - class StackedContact : public Contact { - - public: - static StackedContact* create ( Net* , const Layer* , DbU::Unit x, DbU::Unit y ); - StackedContact ( Net* , const Layer* , DbU::Unit x, DbU::Unit y ); - virtual ~StackedContact (); - public: - void setAnchor ( Component* ); - void addLayer ( const Layer* ); - void attachSlave ( SegmentEnd* ); - void breakUp (); - - protected: - vector _useds; - Component* _anchor; - private: - StackedContact ( const StackedContact& ); - StackedContact& operator= ( const StackedContact& ); - }; - - -// ------------------------------------------------------------------- -// Class : "::GlobalEnd". - - - class GlobalEnd : public SegmentEnd { - public: - GlobalEnd ( AutoSegment* , bool isSourceHook ); - virtual ~GlobalEnd (); - virtual vector* getForks (); - virtual vector* getAligneds (); - virtual void split ( vector& ); - virtual void addFork ( SegmentEnd* ); - virtual void addAligned ( SegmentEnd* ); - virtual Segment* _create ( Contact* source, Contact* target ) = 0; - protected: - vector _forks; - vector _aligneds; - }; - - - GlobalEnd::GlobalEnd ( AutoSegment* segment, bool isSourceHook ) - : SegmentEnd(segment,isSourceHook) - , _forks() - , _aligneds() - {} - - - GlobalEnd::~GlobalEnd () - {} - - - vector* GlobalEnd::getForks () - { - return &_forks; - } - - - vector* GlobalEnd::getAligneds () - { - return &_aligneds; - } - - - void GlobalEnd::addFork ( SegmentEnd* segmentEnd ) - { - for ( size_t i = 0 ; i < _forks.size() ; i++ ) { - if ( _forks[i] == segmentEnd ) return; - } - _forks.push_back ( segmentEnd ); - } - - - void GlobalEnd::addAligned ( SegmentEnd* segmentEnd ) - { - for ( size_t i = 0 ; i < _aligneds.size() ; i++ ) { - if ( _aligneds[i] == segmentEnd ) return; - } - _aligneds.push_back ( segmentEnd ); - } - - - void GlobalEnd::split ( vector& stackedContacts ) - { - ltrace(99) << "GlobalEnd::split() - " << this << endl; - ltracein(99); - - sort ( _forks.begin(), _forks.end(), ForkCompare(!isSourceHook()) ); - - StackedContact* contact1 = NULL; - StackedContact* contact2 = NULL; - const Layer* contactLayer = NULL; - Hook* hook = getHook(); - vector::iterator it = _forks.begin(); - - if ( it == _forks.end() ) { - ltrace(99) << "No forks!" << endl; - stackedContacts.push_back ( StackedContact::create ( getNet() - , getLayer() - , getEndX() - , getEndY() - ) ); - stackedContacts.back()->attachSlave ( this ); - - ltraceout(99); - return; - } - - ltrace(99) << "splitted Axis " << DbU::getLambda(getAxis()) << endl; - ltrace(99) << "iterator Axis " << DbU::getLambda((*it)->getAxis()) << " " << (*it) << endl; - - UPoint center ( isHorizontal(), (*it)->getAxis(), getAxis() ); - contactLayer = Session::getTechnology()->getViaBetween ( getLayer(), (*it)->getLayer() ); - stackedContacts.push_back - ( StackedContact::create ( getNet(), contactLayer, center.getX(), center.getY() ) ); - contact1 = stackedContacts.back (); - contact1->attachSlave ( *it ); - - hook->detach (); - hook->attach ( contact1->getBodyHook() ); - setDelta ( 0 ); - - for ( it++ ; it != _forks.end() ; it++ ) { - ltrace(99) << "splitted Axis " << DbU::getLambda(getAxis()) << endl; - ltrace(99) << "iterator Axis " << DbU::getLambda((*it)->getAxis()) << " " << (*it) << endl; - - if ( (*(it-1))->getAxis() != (*it)->getAxis() ) { - UPoint center ( isHorizontal(), (*it)->getAxis(), getAxis() ); - contactLayer = Session::getTechnology()->getViaBetween ( getLayer(), (*it)->getLayer() ); - stackedContacts.push_back - ( StackedContact::create ( getNet(), contactLayer, center.getX(), center.getY() ) ); - contact2 = stackedContacts.back (); - } else { - contact2 = contact1; - } - - if ( contact1 != contact2 ) { - if ( !isSourceHook() ) _create ( contact1, contact2 ); - else _create ( contact2, contact1 ); - } - - contact2->attachSlave ( *it ); - contact1 = contact2; - } - - for ( it = _aligneds.begin() ; it != _aligneds.end() ; it++ ) { - if ( isSourceHook() == (*it)->isSourceHook() ) { - stackedContacts.front()->attachSlave ( *it ); - } else { - stackedContacts.back()->attachSlave ( *it ); - } - } - - ltraceout(99); - } - - -// ------------------------------------------------------------------- -// Class : "::HorizontalEnd". - - - class HorizontalEnd : public GlobalEnd { - public: - HorizontalEnd ( AutoSegment* , bool isSourceHook ); - virtual ~HorizontalEnd (); - virtual Segment* _create ( Contact* source , Contact* target ); - }; - - - HorizontalEnd::HorizontalEnd ( AutoSegment* horizontal, bool isSourceHook ) - : GlobalEnd(horizontal,isSourceHook) - { } - - - HorizontalEnd::~HorizontalEnd () - { } - - - Segment* HorizontalEnd::_create ( Contact* source , Contact* target ) - { - return Horizontal::create ( source, target, getLayer(), getAxis(), getWidth() ); - } - - -// ------------------------------------------------------------------- -// Class : "::VerticalEnd". - - - class VerticalEnd : public GlobalEnd { - public: - VerticalEnd ( AutoSegment* , bool isSourceHook ); - virtual ~VerticalEnd (); - virtual Segment* _create ( Contact* source , Contact* target ); - }; - - - VerticalEnd::VerticalEnd ( AutoSegment* vertical, bool isSourceHook ) - : GlobalEnd(vertical,isSourceHook) - { } - - - VerticalEnd::~VerticalEnd () - { } - - - Segment* VerticalEnd::_create ( Contact* source , Contact* target ) - { - return Vertical::create ( source, target, getLayer(), getAxis(), getWidth() ); - } - - -// ------------------------------------------------------------------- -// Static Generic Constructor for all SegmentEnd. - - - SegmentEnd* SegmentEnd::create ( Hook* hook, bool checking ) - { - bool isSourceHook = (dynamic_cast(hook)); - if ( !isSourceHook && ( dynamic_cast(hook) == NULL ) ) { - cerr << Error ( badHookType, getString(hook->getComponent()).c_str() ) << endl; - return NULL; - } - - AutoSegment* autoSegment = Session::lookup ( dynamic_cast(hook->getComponent()) ); - - if ( !autoSegment ) - throw Error ( missingAutoSegment, getString(hook->getComponent()).c_str() ); - - if ( !checking ) - autoSegment->invalidate (); - - if ( autoSegment->isGlobal() ) { - if ( autoSegment->isHorizontal() ) - return new HorizontalEnd ( autoSegment, isSourceHook ); - else - return new VerticalEnd ( autoSegment, isSourceHook ); - } else { - if ( autoSegment->isHorizontal() ) - return new SegmentEnd ( autoSegment, isSourceHook ); - } - return new SegmentEnd ( autoSegment, isSourceHook ); - } - - -// ------------------------------------------------------------------- -// Class : "::JunctionBox". - - - class JunctionBox { - - public: - // Constructor & Destructor. - JunctionBox ( AutoContact*, bool checking ); - ~JunctionBox (); - // Predicates. - inline bool isVFlat (); - inline bool isHFlat (); - inline bool isFlat (); - inline bool isPunctual (); - inline bool isVEmpty (); - inline bool isHEmpty (); - inline bool isEmpty (); - bool isHExtended (); - bool isVExtended (); - bool canGoOutside ( const AutoSegment* ) const; - bool canHDesalignate () const; - bool canVDesalignate () const; - void getZSpan ( size_t& zMin, size_t& zMax ) const; - // Modifiers. - void checkTopology (); - void revalidateTopology (); - void computeGlobalStem (); - void computeAlignate (); - void mergeX ( DbU::Unit ); - void mergeY ( DbU::Unit ); - void mergeAnchor (); - void merge ( Hook* ); - void postMerge ( SegmentEnd* ); - void resizePunctual (); - void resize (); - void breakUpPunctual (); - void breakUp (); - void split (); - void splitTerminal (); - void updateContacts ( VirtualContacts& ); - void restoreHConnexity ( DbU::Unit x, bool split ); - void restoreVConnexity ( DbU::Unit y, bool split ); - - protected: - // Attributes. - RoutingGauge* _routingGauge; - AutoContact* _contact; - Component* _anchor; - DbU::Unit _xMin; - DbU::Unit _yMin; - DbU::Unit _xMax; - DbU::Unit _yMax; - SegmentEnd* _globalStem; - vector _globalEnds; - vector _localEnds; - vector _layerStack; - size_t _wireCount; - bool _failsafe; - bool _checking; - }; - - - inline bool JunctionBox::isVFlat () { return _yMin == _yMax; } - inline bool JunctionBox::isHFlat () { return _xMin == _xMax; } - inline bool JunctionBox::isFlat () { return isHFlat() || isVFlat(); } - inline bool JunctionBox::isPunctual () { return isHFlat() && isVFlat(); } - inline bool JunctionBox::isVEmpty () { return _yMin > _yMax; } - inline bool JunctionBox::isHEmpty () { return _xMin > _xMax; } - inline bool JunctionBox::isEmpty () { return isHEmpty() || isVEmpty(); } - - - JunctionBox::JunctionBox ( AutoContact* contact, bool checking ) - : _routingGauge(Session::getRoutingGauge()) - , _contact (contact) - , _anchor (NULL) - , _xMin (+1) - , _yMin (+1) - , _xMax (-1) - , _yMax (-1) - , _globalStem (NULL) - , _globalEnds () - , _localEnds () - , _layerStack (Session::getRoutingGauge()->getDepth()) - , _wireCount (0) - , _failsafe (false) - , _checking (checking) - { - ltrace(110) << "JunctionBox() " << contact << endl; - ltracein(109); - - forEach ( Hook*, hook, _contact->getBodyHook()->getSlaveHooks() ) merge ( *hook ); - mergeAnchor (); - - sort ( _globalEnds.begin(), _globalEnds.end(), SegmentEnd::Compare() ); - sort ( _localEnds.begin() , _localEnds.end() , SegmentEnd::Compare() ); - - if ( ( _wireCount < 1 ) && !_contact->getAnchor() ) - cerr << Warning("%s has less than 2 wires (%d)" - ,getString(_contact).c_str(),_wireCount) << endl; - - computeGlobalStem (); - if ( _globalStem ) { - ltrace(109) << "_globalStem: " << _globalStem << endl; - for ( size_t i=0 ; i < _localEnds.size() ; i++ ) - postMerge ( _localEnds[i] ); - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) - postMerge ( _globalEnds[i] ); - - ltraceout(109); - return; - } - - if ( isPunctual() || (isFlat() && !_contact->getAnchor()) ) { - ltraceout(109); - return; - } - - // JunctionBox is empty, non-flat or flat with anchor. - _failsafe = true; - ltraceout(109); - } - - - JunctionBox::~JunctionBox () - { - for ( size_t i = 0 ; i < _globalEnds.size() ; i++ ) delete _globalEnds[i]; - for ( size_t i = 0 ; i < _localEnds.size() ; i++ ) delete _localEnds[i]; - } - - - bool JunctionBox::isHExtended () - { - if ( _globalStem ) { - ltrace(109) << "JunctionBox::isHExtended(): " << _globalStem->isHorizontal() << endl; - return _globalStem->isHorizontal(); - } - return _contact->isHAlignate(); - } - - - bool JunctionBox::isVExtended () - { - if ( _globalStem ) { - ltrace(109) << "JunctionBox::isVExtended(): " << _globalStem->isVertical() << endl; - return _globalStem->isVertical(); - } - return _contact->isVAlignate(); - } - - - void JunctionBox::getZSpan ( size_t& zMin, size_t& zMax ) const - { - bool minFound = false; - - zMin = 0; - zMax = 0; - for ( size_t i=0 ; i<_layerStack.size() ; i++ ) { - if ( !minFound ) { - if ( _layerStack[i] > 0 ) { - zMin = zMax = i; - minFound = true; - } - } else { - if ( _layerStack[i] > 0 ) { - zMax = i; - } - } - } - } - - - void JunctionBox::revalidateTopology () - { - _contact->setInvalidatedTopology ( false ); - _contact->setCorner ( false ); - if ( !_contact->getAnchor() ) { - size_t horizontals = 0; - size_t verticals = 0; - - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { - if ( _globalEnds[i]->isHorizontal() ) horizontals++; - else verticals++; - } - for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { - if ( _localEnds[i]->isHorizontal() ) horizontals++; - else verticals++; - } - _contact->setCorner ( (horizontals == 1) - and (verticals == 1) - and (not _contact->isHAlignate()) - and (not _contact->isVAlignate()) ); - } - - checkTopology (); - } - - - void JunctionBox::checkTopology () - { - vector errors; - - bool anchored = (_contact->getAnchor()); - bool alignateHorizontal = _contact->isHAlignate() || anchored; - bool alignateVertical = _contact->isVAlignate() || anchored; - bool globalHorizontal = false; - bool globalVertical = false; - size_t localHorizontals = 0; - size_t localVerticals = 0; - - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { - if ( _globalEnds[i]->isHorizontal() ) { - globalHorizontal = true; - localHorizontals++; - } else { - globalVertical = true; - localVerticals++; - } - } - - for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { - if ( _localEnds[i]->isHorizontal() ) localHorizontals++; - else localVerticals++; - } - - if ( !(localHorizontals || globalHorizontal || anchored) ) - errors.push_back ( "No horizontal components" ); - - if ( !(localVerticals || globalVertical || anchored) ) - errors.push_back ( "No vertical components" ); - - if ( !alignateHorizontal && !globalVertical && (localHorizontals > 1) ) - errors.push_back ( "Disconnecteds horizontals components" ); - - if ( !alignateVertical && !globalHorizontal && (localVerticals > 1) ) - errors.push_back ( "Disconnecteds verticals components" ); - - if ( _globalEnds.size() > 3 ) - errors.push_back ( "More than three globals" ); - - if ( ( _globalEnds.size() == 3 ) && ( _localEnds.size() ) ) - errors.push_back ( "Three globals AND locals" ); - - if ( _globalEnds.size() + _localEnds.size() + ((anchored)?1:0) < 2 ) - errors.push_back ( "Less than two connections" ); - - if ( errors.size() ) { - cerr << Error("AutoContact topology of %s",getString(_contact).c_str()) << endl; - if ( anchored ) - cerr << " A: " << _contact->getAnchor() << endl; - - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) - cerr << " G: " << _globalEnds[i] << endl; - - for ( size_t i=0 ; i < _localEnds.size() ; i++ ) - cerr << " L: " << _localEnds[i] << endl; - - for ( size_t i=0 ; i < errors.size() ; i++ ) - cerr << " " << errors[i] << endl; - } - } - - - bool JunctionBox::canGoOutside ( const AutoSegment* segment ) const - { - if ( _contact->isCorner () ) return true; - if ( _contact->getAnchor() ) return false; - - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { - if ( _globalEnds[i]->isHorizontal() xor segment->isHorizontal() ) { - ltrace(200) << "canGoOutside(): true (has global) " << _contact << endl; - return true; - } - } - - return false; - } - - - bool JunctionBox::canHDesalignate () const - { - if ( _contact->getAnchor () ) return false; - if ( !_contact->isHAlignate() ) return false; - - SegmentEnd* globalHorizontal = NULL; - SegmentEnd* globalVertical = NULL; - - size_t verticals = 0; - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { - ltrace(109) << _globalEnds[i]->getSegment() << endl; - if ( _globalEnds[i]->isHorizontal() ) { - globalHorizontal = _globalEnds[i]; - } else { - globalVertical = _globalEnds[i]; - verticals++; - } - } - - for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { - ltrace(109) << _localEnds[i]->getSegment() << endl; - if ( _localEnds[i]->isVertical() ) verticals++; - } - - ltrace(200) << "canHDesalignate(Contact*) - " << _contact << endl; - ltrace(200) << " Vertical stem: " << globalVertical - << " isVAlignate():" << _contact->isVAlignate() - << " verticals:" << verticals - << endl; - return (globalVertical != NULL) && (_contact->isVAlignate() || (verticals == 1)); - } - - - bool JunctionBox::canVDesalignate () const - { - if ( _contact->getAnchor () ) return false; - if ( !_contact->isVAlignate() ) return false; - - SegmentEnd* globalHorizontal = NULL; - SegmentEnd* globalVertical = NULL; - - size_t horizontals = 0; - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { - if ( _globalEnds[i]->isHorizontal() ) { - globalHorizontal = _globalEnds[i]; - horizontals++; - } else { - globalVertical = _globalEnds[i]; - } - } - - for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { - ltrace(109) << _localEnds[i]->getSegment() << endl; - if ( _localEnds[i]->isHorizontal() ) horizontals++; - } - - ltrace(200) << "canVDesalignate(Contact*) - " << _contact << endl; - ltrace(200) << " Vertical stem: " << globalHorizontal - << " isHAlignate():" << _contact->isHAlignate() - << " horizontals:" << horizontals - << endl; - return (globalHorizontal != NULL) && (_contact->isHAlignate() || (horizontals == 1)); - } - - - void JunctionBox::restoreHConnexity ( DbU::Unit x, bool split ) - { - ltrace(200) << "restoreHConnexity() - @" << DbU::getValueString(x) << " " << _contact << endl; - - _contact->invalidate (); - - if ( _contact->isHAlignate() ) return; - if ( _contact->getAnchor () ) { - _contact->setHAlignate ( true ); - return; - } - - bool slackened = false; - SegmentEnd* verticalStem = NULL; - vector horizontals; - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { - if ( _globalEnds[i]->isHorizontal() ) { - horizontals.push_back ( _globalEnds[i] ) ; - } else { - verticalStem = _globalEnds[i]; - } - } - - if ( verticalStem ) { - ltrace(200) << "Done nothing has vertical stem: " << verticalStem << endl; - return; - } - - for ( size_t i=0 ; i<_localEnds.size() ; i++ ) { - if ( _localEnds[i]->isHorizontal() ) - horizontals.push_back ( _localEnds[i] ) ; - else - slackened = slackened or _localEnds[i]->isSlackened(); - } - - if ( (horizontals.size() == 1) and (horizontals[0]->isGlobal()) ) { - ltrace(200) << "Done nothing, has only a horizontal stem: " << horizontals[0] << endl; - return; - } - - if ( !split ) { - _contact->setHAlignate ( true ); - return; - } - - GCell* gcell = _contact->getGCell (); - Net* net = _contact->getNet (); - const Layer* layer = dynamic_cast(_contact->getLayer())->getTop(); - if ( _routingGauge->getLayerDirection(layer) != Constant::Vertical ) - layer = dynamic_cast(_contact->getLayer())->getBottom(); - - _contact->setVAlignate ( true ); - AutoContact* splitContact = NULL; - for ( size_t i=1 ; isetVAlignate ( true ); - - ltrace(200) << "| Separate " << horizontals[i]->getSegment()->base() - << ":" << horizontals[i]->getSegment() << endl; - - horizontals[i]->getHook()->detach(); - - splitContact = AutoContact::create ( gcell, net, _contact->getLayer() ); - AutoSegment* segment = AutoVertical::create ( _contact - , splitContact - , layer - , x //globalHorizontals[i]->getAxis() - , DbU::lambda(2.0) - , AutoSegment::Local - , false - , false - ); - horizontals[i]->getHook()->attach ( splitContact->getContact()->getBodyHook() ); - segment->setSlackened ( slackened ); - ltrace(200) << "restoreHConnexity() strap: " << segment << endl; - } - } - - - void JunctionBox::restoreVConnexity ( DbU::Unit y, bool split ) - { - ltrace(200) << "restoreVConnexity() - @" << DbU::getValueString(y) << " " << _contact << endl; - - _contact->invalidate (); - - if ( _contact->isVAlignate() ) return; - if ( _contact->getAnchor () ) { - _contact->setVAlignate ( true ); - return; - } - - bool slackened = false; - SegmentEnd* horizontalStem = NULL; - vector verticals; - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { - if ( _globalEnds[i]->isVertical() ) { - verticals.push_back ( _globalEnds[i] ) ; - } else { - horizontalStem = _globalEnds[i]; - } - } - - if ( horizontalStem ) { - ltrace(200) << "Done nothing, has horizontal stem: " << horizontalStem << endl; - return; - } - - for ( size_t i=0 ; i<_localEnds.size() ; i++ ) { - if ( _localEnds[i]->isVertical() ) - verticals.push_back ( _localEnds[i] ) ; - else - slackened = slackened or _localEnds[i]->isSlackened(); - } - - if ( (verticals.size() == 1) and (verticals[0]->isGlobal()) ) { - ltrace(200) << "Done nothing, has only a vertical stem: " << verticals[0] << endl; - return; - } - - if ( !split ) { - _contact->setVAlignate ( true ); - return; - } - - GCell* gcell = _contact->getGCell (); - Net* net = _contact->getNet (); - const Layer* layer = dynamic_cast(_contact->getLayer())->getBottom(); - if ( _routingGauge->getLayerDirection(layer) != Constant::Horizontal ) - layer = dynamic_cast(_contact->getLayer())->getTop(); - - _contact->setHAlignate ( true ); - AutoContact* splitContact = NULL; - for ( size_t i=1 ; isetHAlignate ( true ); - - ltrace(200) << "| Separate " << verticals[i]->getSegment()->base() - << ":" << verticals[i]->getSegment() << endl; - - verticals[i]->getHook()->detach(); - - splitContact = AutoContact::create ( gcell, net, _contact->getLayer() ); - AutoSegment* segment = AutoHorizontal::create ( _contact - , splitContact - , layer - , y //globalVerticals[i]->getAxis() - , DbU::lambda(2.0) - , AutoSegment::Local - , false - , false - ); - verticals[i]->getHook()->attach ( splitContact->getContact()->getBodyHook() ); - segment->setSlackened ( slackened ); - ltrace(200) << "restoreVConnexity() strap: " << segment << endl; - } - } - - - void JunctionBox::computeAlignate () - { - - bool globalHorizontal = false; - bool globalVertical = false; - size_t horizontals = 0; - size_t verticals = 0; - - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { - if ( _globalEnds[i]->isHorizontal() ) { - globalHorizontal = true; - horizontals++; - } else { - globalVertical = true; - verticals++; - } - } - - for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { - if ( _localEnds[i]->isHorizontal() ) horizontals++; - else verticals++; - } - - if ( !globalVertical && (horizontals > 1) ) - _contact->setHAlignate ( true ); - - if ( !globalHorizontal && (verticals > 1) ) - _contact->setVAlignate ( true ); - - ltrace(109) << "computeAlignate(): [AFTER] " << _contact << endl; - } - - - void JunctionBox::computeGlobalStem () - { - SegmentEnd* globalHorizontal = NULL; - SegmentEnd* globalVertical = NULL; - size_t horizontals = 0; - size_t verticals = 0; - - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { - if ( _globalEnds[i]->isHorizontal() ) { - globalHorizontal = _globalEnds[i]; - horizontals++; - } else { - globalVertical = _globalEnds[i]; - verticals++; - } - } - - for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { - if ( _localEnds[i]->isHorizontal() ) horizontals++; - else verticals++; - } - - ltrace(109) << "computeGlobalStem(): " << _contact << endl; - ltrace(109) << "| h:" << horizontals << " v:" << verticals << endl; - - if ( globalVertical && (horizontals > 1) && !_contact->isHAlignate() ) { - ltrace(109) << "| Vertical GlobalStem h:" << horizontals << " v:" << verticals << endl; - _globalStem = globalVertical; - } - - if ( globalHorizontal && (verticals > 1) && !_contact->isVAlignate() ) { - ltrace(109) << "| Horizontal GlobalStem h:" << horizontals << " v:" << verticals << endl; - _globalStem = globalHorizontal; - } - - - if ( (horizontals > 1) && (verticals > 1) && !_contact->isVAlignate() && !_contact->isHAlignate() ) { - ltrace(109) << "* Bad AutoContact: " << _contact << endl; - - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) - ltrace(109) << "| G: " << _globalEnds[i] << endl; - - for ( size_t i=0 ; i < _localEnds.size() ; i++ ) - ltrace(109) << "| L: " << _localEnds[i] << endl; - } - } - - - void JunctionBox::mergeX ( DbU::Unit x ) - { - if ( _xMin > _xMax ) { _xMin = _xMax = x; return; } - if ( x < _xMin ) { _xMin = x; return; } - if ( x > _xMax ) { _xMax = x; return; } - } - - - void JunctionBox::mergeY ( DbU::Unit y ) - { - if ( _yMin > _yMax ) { _yMin = _yMax = y; return; } - if ( y < _yMin ) { _yMin = y; return; } - if ( y > _yMax ) { _yMax = y; return; } - } - - - void JunctionBox::mergeAnchor () - { - _anchor = _contact->getAnchor (); - if ( !_anchor ) return; - - RoutingPad* rp = dynamic_cast(_anchor); - if ( !rp ) { - _failsafe = true; - return; - } - - _layerStack [ _routingGauge->getLayerDepth(_anchor->getLayer()) ] ++; - _wireCount++; - - Point source = rp->getSourcePosition (); - Point target = rp->getTargetPosition (); - if ( ( source.getX() == target.getX() ) || isHEmpty() ) { - ltrace(109) << "merge() Axis " - << DbU::getLambda(source.getX()) << " [RoutingPad] " - << rp->getLayer() << endl; - mergeX ( source.getX() ); - } - if ( ( source.getY() == target.getY() ) || isVEmpty() ) { - ltrace(109) << "merge() Axis " - << DbU::getLambda(source.getY()) << " [RoutingPad] " - << rp->getLayer() << endl; - mergeY ( source.getY() ); - } - } - - - void JunctionBox::merge ( Hook* hook ) - { - SegmentEnd* segmentEnd = SegmentEnd::create ( hook, _checking ); - if ( !segmentEnd ) return; - - _layerStack [ _routingGauge->getLayerDepth(segmentEnd->getLayer()) ] ++; - _wireCount++; - - if ( segmentEnd->isGlobal() ) { - ltrace(109) << "merge() Axis " - << DbU::getLambda(segmentEnd->getAxis()) - << " [global] " << segmentEnd << endl; - _globalEnds.push_back ( segmentEnd ); - } else { - ltrace(109) << "merge() Axis " << DbU::getLambda(segmentEnd->getAxis()) - << " [local] " << segmentEnd << endl; - _localEnds.push_back ( segmentEnd ); - } - - if ( segmentEnd->isHorizontal() ) mergeY ( segmentEnd->getAxis() ); - else mergeX ( segmentEnd->getAxis() ); - } - - - void JunctionBox::postMerge ( SegmentEnd* segmentEnd ) - { - if ( segmentEnd == _globalStem ) return; - - if ( _globalStem->isHorizontal() xor segmentEnd->isHorizontal() ) - _globalStem->addFork ( segmentEnd ); - else - _globalStem->addAligned ( segmentEnd ); - } - - - void JunctionBox::resizePunctual () - { - Point center; - DbU::Unit delta; - - if ( isEmpty() ) center = _contact->getCenter(); - else if ( isPunctual() ) { - center.setX ( _xMin ); - center.setY ( _yMin ); - } else { - center.setX ( (_xMin+_xMax)/2 ); - center.setY ( (_yMin+_yMax)/2 ); - } - - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) { - if ( _globalEnds[i]->isHorizontal() ) - delta = center.getX() - _contact->getX(); - else - delta = center.getY() - _contact->getY(); - _globalEnds[i]->setDelta ( delta ); - } - - for ( size_t i=0 ; i < _localEnds.size() ; i++ ) { - if ( _localEnds[i]->isHorizontal() ) - delta = center.getX() - _contact->getX(); - else - delta = center.getY() - _contact->getY(); - - _localEnds[i]->setDelta ( delta ); - } - - Box constraint = _contact->getConstraintBox()/*.inflate(DbU::lambda(0.5))*/; - if ( !constraint.contains(center) ) - cbug << Bug("%s [%s %s] outside constraint %s." - ,getString(_contact).c_str() - ,DbU::getValueString(center.getX()).c_str() - ,DbU::getValueString(center.getY()).c_str() - ,getString(constraint).c_str()) << endl; - } - - - void JunctionBox::resize () - { - ltrace(99) << "JunctionBox::resize() - " << endl; - - if ( !_wireCount ) { - cerr << Warning("Standalone %s skipped.",getString(_contact).c_str()) << endl; - return; - } - - if ( _failsafe || isPunctual() || !_globalStem ) - resizePunctual (); - else { - // Flat geometry. - DbU::Unit deltaMin; - DbU::Unit deltaMax; - DbU::Unit deltaFork; - - if ( _globalStem->isHorizontal() ) { - deltaMin = _xMin - _contact->getX(); - deltaMax = _xMax - _contact->getX(); - deltaFork = _yMin - _contact->getY(); - } else { - deltaMin = _yMin - _contact->getY(); - deltaMax = _yMax - _contact->getY(); - deltaFork = _xMin - _contact->getX(); - } - - _globalStem->setDelta ( _globalStem->isSourceHook() ? deltaMin : deltaMax ); - - vector* forks = _globalStem->getForks(); - vector* aligneds = _globalStem->getAligneds(); - - for ( size_t i=0 ; i < aligneds->size() ; i++ ) - (*aligneds)[i]->setDelta ( (*aligneds)[i]->isSourceHook() ? deltaMax : deltaMin ); - - for ( size_t i=0 ; i < forks->size() ; i++ ) - (*forks)[i]->setDelta ( deltaFork ); - } - } - - - void JunctionBox::split () - { - ltrace(200) << "JunctionBox::split() - " << _contact << endl; - - size_t zMin, zMax; - size_t anchorDepth = 0; - getZSpan ( zMin, zMax ); - - if ( _anchor ) { - ltrace(200) << "Anchor: " << _anchor << endl; - - anchorDepth = _routingGauge->getLayerDepth(_anchor->getLayer()); - if ( anchorDepth == 0 ) { - if ( zMax-zMin < 2 ) return; - splitTerminal (); - _contact->split (); - return; - } - } - - ltracein(200); - ltrace(200) << "Z span: [" << zMin << ":" << zMax << "]" << endl; - ltrace(200) << "Global Stem: " << _globalStem << endl; - - if ( zMax-zMin > 3 ) { - cerr << Error("AutoContact::split(): Spans on more than 4 layers, ignoring." - "\n %s",getString(_contact).c_str()) << endl; - ltraceout(200); - return; - } - - _contact->invalidate (); - - if ( zMax == zMin ) { - ltrace(200) << "NULL Z span, no layer change." << endl; - ltraceout(200); - return; - } - - if ( zMax-zMin < 2 ) { - const Layer* contactLayer = _routingGauge->getContactLayer(zMin); - _contact->setLayer ( contactLayer ); - ltrace(200) << "Needs only to change Layer." << endl; - ltraceout(200); - return; - } - - // The complete case. - //bool hExtended = isHExtended(); - //bool vExtended = isVExtended(); - bool xFound = false; - bool yFound = false; - vector hBottom; - vector vBottom; - vector hTop; - vector vTop; - Point position; - - for ( size_t i=0; i < _globalEnds.size() ; i++ ) { - ltrace(200) << "| G: " << _globalEnds[i] << endl; - if ( _globalEnds[i]->isHorizontal() ) { - if ( not yFound ) { - yFound = true; - position.setY ( _globalEnds[i]->getAxis() ); - } - if ( _routingGauge->getLayerDepth(_globalEnds[i]->getLayer()) < zMin+2 ) - hBottom.push_back ( _globalEnds[i] ); - else - hTop.push_back ( _globalEnds[i] ); - } else { - if ( not xFound ) { - xFound = true; - position.setX ( _globalEnds[i]->getAxis() ); - } - if ( _routingGauge->getLayerDepth(_globalEnds[i]->getLayer()) < zMin+2 ) - vBottom.push_back ( _globalEnds[i] ); - else - vTop.push_back ( _globalEnds[i] ); - } - } - - for ( size_t i=0; i < _localEnds.size() ; i++ ) { - ltrace(200) << "| L: " << _localEnds[i] << endl; - _localEnds[i]->setSlackened ( true ); - - if ( _localEnds[i]->isHorizontal() ) { - if ( not yFound ) { - yFound = true; - position.setY ( _localEnds[i]->getAxis() ); - } - if ( _routingGauge->getLayerDepth(_localEnds[i]->getLayer()) < zMin+2 ) - hBottom.push_back ( _localEnds[i] ); - else - hTop.push_back ( _localEnds[i] ); - } else { - if ( not xFound ) { - xFound = true; - position.setX ( _localEnds[i]->getAxis() ); - } - if ( _routingGauge->getLayerDepth(_localEnds[i]->getLayer()) < zMin+2 ) - vBottom.push_back ( _localEnds[i] ); - else - vTop.push_back ( _localEnds[i] ); - } - } - - if ( not xFound ) position.setX ( _xMin ); - if ( not yFound ) position.setY ( _yMin ); - - for ( size_t i=0 ; igetHook()->detach (); - for ( size_t i=0 ; igetHook()->detach (); - - AutoContact* corner = AutoContact::create ( _contact->getGCell() - , _contact->getNet() - , _routingGauge->getContactLayer(zMin+1) - ); - ltrace(200) << "Corner " << corner << endl; - - AutoSegment* segment = AutoSegment::create ( _contact - , corner - , _routingGauge->getLayerDirection(zMin+1) - , AutoSegment::Local - ); - DbU::Unit axis; - if ( segment->isHorizontal() ) { - axis = position.getY(); - if ( not hBottom.empty() ) segment->setParent ( hBottom[0]->getSegment() ); - else if ( not hTop .empty() ) segment->setParent ( hTop [0]->getSegment() ); - } else { - axis = position.getX(); - if ( not vBottom.empty() ) segment->setParent ( vBottom[0]->getSegment() ); - else if ( not vTop .empty() ) segment->setParent ( vTop [0]->getSegment() ); - } - - segment->setLayer ( _routingGauge->getRoutingLayer(zMin+1) ); - segment->setAxis ( axis ); - segment->setSlackened ( true ); - segment->setLayerChange ( true ); - ltrace(200) << "Corner @" << DbU::getValueString(axis) << " " << segment << endl; - - //if ( vExtended ) _contact->setVAlignate ( true ); - //if ( hExtended ) _contact->setHAlignate ( true ); - // if ( _routingGauge->getLayerDirection(zMin) == Constant::Horizontal ) { - // _contact->setVAlignate ( true ); - // } else { - // _contact->setHAlignate ( true ); - // } - //_contact->setHAlignate ( true ); - //_contact->setVAlignate ( true ); - - AutoContact* secondary = NULL; - if ( zMax-zMin == 3 ) { - secondary = AutoContact::create ( _contact->getGCell() - , _contact->getNet() - , _routingGauge->getContactLayer(zMin+2) - ); - ltrace(200) << "Secondary " << secondary << endl; - - segment = AutoSegment::create ( corner - , secondary - , _routingGauge->getLayerDirection(zMin+2) - , AutoSegment::Local - ); - - if ( segment->isHorizontal() ) { - axis = position.getY(); - if ( not hTop .empty() ) segment->setParent ( hTop [0]->getSegment() ); - else if ( not hBottom.empty() ) segment->setParent ( hBottom[0]->getSegment() ); - } else { - axis = position.getX(); - if ( not vTop .empty() ) segment->setParent ( vTop [0]->getSegment() ); - else if ( not vBottom.empty() ) segment->setParent ( vBottom[0]->getSegment() ); - } - - axis = (segment->isHorizontal()) ? position.getY() : position.getX(); - segment->setLayer ( _routingGauge->getRoutingLayer(zMin+2) ); - segment->setAxis ( axis ); - //segment->setCanonical ( true ); - segment->setSlackened ( true ); - segment->setLayerChange ( true ); - ltrace(200) << "Secondary @" << DbU::getValueString(axis) << " " << segment << endl; - - } else - secondary = corner; - - // if ( _routingGauge->getLayerDirection(zMin) == Constant::Horizontal ) { - // secondary->setHAlignate ( true ); - // } else { - // secondary->setVAlignate ( true ); - // } - //secondary->setVAlignate(true); - //secondary->setHAlignate(true); - - for ( size_t i=0 ; igetHook()->attach ( secondary->getBodyHook() ); - for ( size_t i=0 ; igetHook()->attach ( secondary->getBodyHook() ); - - if ( _contact->isHAlignate() ) secondary->setHAlignate ( true ); - if ( _contact->isVAlignate() ) secondary->setVAlignate ( true ); - - if ( _globalStem ) { - AutoContact* withoutStem = (_routingGauge->getLayerDepth(_globalStem->getLayer()) < zMin+2) - ? secondary : _contact; - - if ( _globalStem->isHorizontal() ) { - withoutStem->setHAlignate ( true ); - withoutStem->restoreVConnexity ( position.getY(), true ); - } else { - withoutStem->setVAlignate ( true ); - withoutStem->restoreHConnexity ( position.getX(), true ); - } - } else { - if ( _routingGauge->getLayerDirection(zMin) == Constant::Horizontal ) { - _contact ->setVAlignate ( true ); - secondary->setHAlignate ( true ); - } else { - _contact ->setHAlignate ( true ); - secondary->setVAlignate ( true ); - } - } - - // if ( _routingGauge->getLayerDirection(zMin) == Constant::Horizontal ) { - // _contact ->restoreHConnexity ( position.getX(), true ); - // secondary->restoreVConnexity ( position.getY(), true ); - // } else { - // _contact ->restoreVConnexity ( position.getY(), true ); - // secondary->restoreHConnexity ( position.getX(), true ); - // } - - // if ( _contact->isVAlignate() ) secondary->setVAlignate(true); - // if ( _contact->isHAlignate() ) secondary->setHAlignate(true); - - - // if ( (not hExtended) and (not vExtended) ) hExtended = true; - - // if ( hExtended ) { - // ltrace(200) << "Original was H extended: restore V connexity." << endl; - // _contact ->restoreVConnexity ( position.getY(), true ); - // secondary->restoreVConnexity ( position.getY(), true ); - // } - - // if ( vExtended ) { - // ltrace(200) << "Original was V extended: restore H connexity." << endl; - // _contact ->restoreHConnexity ( position.getX(), true ); - // secondary->restoreHConnexity ( position.getX(), true ); - // } - - ltraceout(200); - } - - - void JunctionBox::splitTerminal () - { - ltrace(200) << "JunctionBox::splitTerminal(): AutoSegment connected to RoutingPad." << endl; - ltracein(200); - Point position = _contact->getPosition (); - - _contact->getAnchorHook()->detach (); - - RoutingPad* routingPad = dynamic_cast ( _anchor ); - if ( not routingPad ) { - cerr << Bug("JunctionBox::splitTerminal(): %s is not anchored on a ." - ,getString(_contact).c_str()) << endl; - ltraceout(200); - return; - } - - AutoContact* rpContact = AutoContact::fromRp ( _contact->getGCell() - , routingPad - , _routingGauge->getContactLayer(0) - , position - , DbU::lambda(1.0), DbU::lambda(1.0) - ); - AutoContact* via23 = AutoContact::create ( _contact->getGCell() - , _contact->getNet() - , _routingGauge->getContactLayer(1) - ); - - AutoSegment* segment = AutoSegment::create ( rpContact - , via23 - , Constant::Horizontal - , AutoSegment::Local - , true // terminal. - , false // Temporary: *not* collapsed. - ); - segment->setLayer ( _routingGauge->getRoutingLayer(1) ); - segment->setAxis ( position.getY() ); - segment->setSlackened ( true ); - ltrace(200) << "@" << DbU::getValueString(position.getY()) << segment << endl; - - segment = AutoSegment::create ( via23 - , _contact - , Constant::Vertical - , AutoSegment::Local - , false // terminal. - , false //true // collapsed. - ); - segment->setAxis ( position.getX() ); - segment->setLayer ( _routingGauge->getRoutingLayer(2) ); - segment->setSlackened ( true ); - _contact->setLayer ( _routingGauge->getContactLayer(1) ); - ltrace(200) << "@" << DbU::getValueString(position.getX()) << segment << endl; - - ltraceout(200); - } - - - void JunctionBox::breakUpPunctual () - { - Component* anchor = _contact->getAnchor(); - Point center; - StackedContact* stackedContact; - - if ( isEmpty() ) center = _contact->getCenter(); - else if ( isPunctual() ) { - center.setX ( _xMin ); - center.setY ( _yMin ); - } else { - center.setX ( (_xMin+_xMax)/2 ); - center.setY ( (_yMin+_yMax)/2 ); - } - - const Layer* layer = NULL; - if ( !_localEnds.empty () ) layer = _localEnds [0]->getLayer(); - else if ( !_globalEnds.empty() ) layer = _globalEnds[0]->getLayer(); - else if ( anchor ) layer = anchor->getLayer (); - - stackedContact = StackedContact::create ( _contact->getNet() - , layer - , center.getX() - , center.getY() - ); - - if ( anchor ) stackedContact->setAnchor ( anchor ); - - for ( size_t i=0 ; i < _globalEnds.size() ; i++ ) - stackedContact->attachSlave ( _globalEnds[i] ); - - for ( size_t i=0 ; i < _localEnds.size() ; i++ ) - stackedContact->attachSlave ( _localEnds[i] ); - - stackedContact->breakUp (); - stackedContact->destroy (); - ltrace(99) << "JunctionBox::breakUpPunctual() succeded" << endl; - } - - - void JunctionBox::breakUp () - { - ltrace(99) << "JunctionBox::breakUp() - " << endl; - - if ( !_wireCount ) { - cerr << Warning("Standalone %s skipped.",getString(_contact).c_str()) << endl; - return; - } - - if ( _failsafe or isPunctual() ) - breakUpPunctual (); - else { - if ( not _globalStem ) { - cerr << Bug ( "JunctionBox::breakUp(): Flatten geometry whitout global stem,\n" - " on %p:%s." - , _contact->base() - , getString(_contact).c_str() - ) << endl; - breakUpPunctual (); - } else { - // Flat geometry. - vector stackedContacts; - - _globalStem->split ( stackedContacts ); - for ( size_t i=0 ; i < stackedContacts.size() ; i++ ) { - stackedContacts[i]->breakUp (); - stackedContacts[i]->destroy (); - } - } - } - ltrace(99) << "JunctionBox::breakUp() succeded" << endl; - } - - - void JunctionBox::updateContacts ( VirtualContacts& vcs ) - { - ltrace(109) << "JunctionBox::updateContacts()" << endl; - ltracein(109); - - vcs.clear (); - - Component* anchor = _contact->getAnchor (); - RoutingPad* rp = dynamic_cast(anchor); - if ( rp ) - vcs.merge ( Point(_xMin,_yMin), rp->getLayer() ); - - vector::iterator it = _localEnds.begin(); - for ( ; it != _localEnds.end() ; it++ ) - vcs.merge ( (*it)->getEnd(), (*it)->getLayer() ); - - for ( it = _globalEnds.begin() ; it != _globalEnds.end() ; it++ ) - vcs.merge ( (*it)->getEnd(), (*it)->getLayer() ); - - ltraceout(109); - } - - - StackedContact::~StackedContact () - { - ltrace(99) << "StackedContact::~StackedContact() - " << (void*)this << endl; - } - - - StackedContact::StackedContact ( Net* net, const Layer* layer, DbU::Unit x, DbU::Unit y ) - : Contact(net,layer,x,y) - , _useds(Session::getRoutingGauge()->getDepth()) - , _anchor(NULL) - { - for ( unsigned index = 0 ; index < Session::getRoutingGauge()->getDepth() ; index++ ) - _useds [ index ] = false; - - forEach ( BasicLayer*, basicLayer, getLayer()->getBasicLayers() ) - addLayer ( *basicLayer ); - } - - - StackedContact* StackedContact::create ( Net* net, const Layer* layer, DbU::Unit x, DbU::Unit y ) - { - StackedContact* contact = new StackedContact ( net, layer, x, y ); - contact->_postCreate (); - - ltrace(99) << "create: " << contact << endl; - - return contact; - } - - - void StackedContact::addLayer ( const Layer* layer ) - { - if ( !Session::getTechnology()->isMetal(layer) ) return; - - unsigned int index = Session::getRoutingGauge()->getLayerDepth ( layer ); - if ( index == UINT_MAX ) return; - - ltrace(99) << "StackedContact::addLayer() - " << layer << " [" << index << "]" << endl; - - _useds [ index ] = true; - } - - - void StackedContact::setAnchor ( Component* anchor ) - { - if ( (_anchor=anchor) ) { - forEach ( BasicLayer*, layer, _anchor->getLayer()->getBasicLayers() ) - addLayer ( *layer ); - } - } - - - void StackedContact::attachSlave ( SegmentEnd* segmentEnd ) - { - ltrace(88) << "add at " << getCenter() << " " << segmentEnd->getLayer() << endl; - - addLayer ( segmentEnd->getLayer() ); - - segmentEnd->setDelta ( 0 ); - - Hook* hook = segmentEnd->getHook(); - hook->detach (); - hook->attach ( getBodyHook() ); - } - - - void StackedContact::breakUp () - { - ltrace(99) << "StakedContact::breakUp() - " << this << endl; - - unsigned int zMin = 0; - unsigned int zMax = Session::getRoutingGauge()->getDepth() - 1; - Contact* contacts [ zMax+1 ]; - - for ( unsigned int i=0 ; i <= zMax ; i++ ) contacts[i] = NULL; - - for ( ; (zMin <= zMax) && !_useds[zMin] ; zMin++ ); - for ( ; (zMax > 0 ) && !_useds[zMax] ; zMax-- ); - - ltrace(99) << "Contact depth span [" << zMin << ":" << zMax << "]" << endl; - - if ( zMin > zMax ) return; - if ( zMin == zMax ) { - if ( _anchor ) - contacts[zMin] = Contact::create ( _anchor - , Session::getRoutingGauge()->getRoutingLayer(zMin) - , getX() - _anchor->getX() - , getY() - _anchor->getY() - , DbU::lambda(1.0), DbU::lambda(1.0) - ); - else - contacts[zMin] = Contact::create ( getNet() - , Session::getRoutingGauge()->getRoutingLayer(zMin) - , getX() - , getY() - , DbU::lambda(1.0), DbU::lambda(1.0) - ); - ltrace(88) << "Creating [" << zMin << "] " << contacts[zMin] << endl; - } else { - if ( _anchor ) - contacts[zMin] = contacts[zMin+1] - = Contact::create ( _anchor - , Session::getRoutingGauge()->getContactLayer(zMin) - , getX() - _anchor->getX() - , getY() - _anchor->getY() - , DbU::lambda(1.0), DbU::lambda(1.0) - ); - else - contacts[zMin] = contacts[zMin+1] - = Contact::create ( getNet() - , Session::getRoutingGauge()->getContactLayer(zMin) - , getX() - , getY() - , DbU::lambda(1.0), DbU::lambda(1.0) - ); - ltrace(88) << "Creating [" << zMin << "] " << contacts[zMin] << endl; - - for ( unsigned int j = zMin+1 ; j < zMax ; j++ ) { - contacts[j] = contacts[j+1] - = Contact::create ( contacts[j-1] - , Session::getRoutingGauge()->getContactLayer(j) - , 0 - , 0 - , DbU::lambda(1.0), DbU::lambda(1.0) - ); - ltrace(88) << "Creating [" << j << "] " << contacts[j] << endl; - } - } - - Hook* bodyHook = getBodyHook (); - Hook* currHook = bodyHook->getNextHook (); - - while ( currHook != bodyHook ) { - Hook* nextHook = currHook->getNextHook (); - - currHook->_setNextHook ( currHook ); - Segment* segment = dynamic_cast(currHook->getComponent()); - ltrace(88) << "Reattach [" << Session::getRoutingGauge()->getLayerDepth(segment->getLayer()) - << "] " << segment << endl; - currHook->attach ( contacts[Session::getRoutingGauge()->getLayerDepth(segment->getLayer())]->getBodyHook() ); - - currHook = nextHook; - } - - bodyHook->_setNextHook ( bodyHook ); - ltrace(99) << "StakedContact::breakUp() succeeded" << endl; - } - - -// ------------------------------------------------------------------- -// Class : "::FixedJunctionBox". - - - class FixedJunctionBox { - - public: - // Constructor & Destructor. - FixedJunctionBox ( AutoContact*, bool checking ); - ~FixedJunctionBox (); - // Modifiers. - void checkTopology (); - void merge ( Hook* ); - void resize (); - void breakUp (); - - protected: - // Attributes. - AutoContact* _contact; - vector _segmentEnds; - bool _checking; - }; - - - FixedJunctionBox::FixedJunctionBox ( AutoContact* contact, bool checking ) - : _contact(contact) - , _segmentEnds() - , _checking(checking) - { - ltrace(110) << "FixedJunctionBox() " << contact << endl; - ltracein(109); - - forEach ( Hook*, hook, _contact->getBodyHook()->getSlaveHooks() ) merge ( *hook ); - - ltraceout(109); - } - - - FixedJunctionBox::~FixedJunctionBox () - { - for ( size_t i=0 ; i<_segmentEnds.size() ; i++ ) delete _segmentEnds[i]; - } - - - void FixedJunctionBox::checkTopology () - { } - - - void FixedJunctionBox::merge ( Hook* hook ) - { - SegmentEnd* segmentEnd = SegmentEnd::create ( hook, _checking ); - if ( !segmentEnd ) return; - - ltrace(109) << "merge() Axis " - << DbU::getLambda(segmentEnd->getAxis()) - << " [global] " << segmentEnd << endl; - _segmentEnds.push_back ( segmentEnd ); - } - - - void FixedJunctionBox::resize () - { - for ( size_t i=0 ; i<_segmentEnds.size() ; i++ ) _segmentEnds[i]->setDelta(0); - } - - - void FixedJunctionBox::breakUp () - { - Component* anchor = _contact->getAnchor(); - StackedContact* stackedContact; - - const Layer* layer = NULL; - if ( !_segmentEnds.empty () ) layer = _segmentEnds[0]->getLayer(); - else if ( anchor ) layer = anchor->getLayer (); - - stackedContact = StackedContact::create ( _contact->getNet() - , layer - , _contact->getX() - , _contact->getY() - ); - - if ( anchor ) stackedContact->setAnchor ( anchor ); - - for ( size_t i=0 ; i < _segmentEnds.size() ; i++ ) - stackedContact->attachSlave ( _segmentEnds[i] ); - - stackedContact->breakUp (); - stackedContact->destroy (); - ltrace(99) << "FixedJunctionBox::breakUp() succeded" << endl; - } - - -} // End of local namespace. - - - - namespace Katabatic { - -// ------------------------------------------------------------------- -// Class : "Katabatic::VirtualContacts::VC". - - - bool operator== ( const VirtualContacts::VC& lhs - , const VirtualContacts::VC& rhs ) - { - return lhs._point == rhs._point; - } - - - void VirtualContacts::VC::merge ( const Layer* layer ) - { - if ( _layer->contains(layer) ) return; - Layer *newLayer = Session::getTechnology()->getLayer ( _layer->getMask() & layer->getMask() ); - - if ( !newLayer ) return; - _layer = newLayer; - } - - - void VirtualContacts::merge ( const Point& point, const Layer* layer ) - { - VC vc ( point, layer ); - - ltrace(109) << "VirtualContacts::merge() " << point << " " << layer << endl; - - vector::iterator it = _vcs.begin(); - vector::iterator end = _vcs.end(); - - for ( ; it != end ; it++ ) { - if ( *it == vc ) { (*it).merge ( layer ); return; } - } - - _vcs.push_back ( vc ); - _boundingBox.merge ( Box(point).inflate(DbU::lambda(1.0)) ); - } + using std::ostringstream; + using Hurricane::Bug; + using Hurricane::Error; + using Hurricane::Warning; + using Hurricane::DebugSession; + using Hurricane::ForEachIterator; // ------------------------------------------------------------------- @@ -2111,68 +58,36 @@ namespace Katabatic { const Name AutoContact::_goName = "Katabatic::AutoContact"; - AutoContact* AutoContact::fromRp ( GCell* gcell - , RoutingPad* routingPad - , const Layer* layer - , Point point - , DbU::Unit width - , DbU::Unit height - , bool fixed - ) - { - routingPad->getBodyHook()->detach (); - - DbU::Unit x = 0; - DbU::Unit y = 0; - Entity* entity = routingPad->getOccurrence().getEntity(); - - // Assumes there is no rotation in the Transformation. - if ( dynamic_cast(entity) ) { x = point.getX(); } - else if ( dynamic_cast(entity) ) { y = point.getY(); } - - return AutoContact::create ( gcell - , routingPad - , layer - , x, y - , width, height - , false, false - , fixed - ); - } - - - AutoContact::AutoContact ( GCell* gcell - , Contact* contact - , bool hAlignate - , bool vAlignate - ) - : ExtensionGo (contact->getCell()) - , _id (_maxId++) - , _contact (contact) - , _gcell (gcell) - , _invalid (false) - , _invalidTopology(true) - , _isTerminal (false) - , _fixed (false) - , _hAlignate (hAlignate) - , _vAlignate (vAlignate) - , _isCorner (false) - , _dxMin (0) - , _dxMax (_gcell->getXMax()-_gcell->getX()) - , _dyMin (0) - , _dyMax (_gcell->getYMax()-_gcell->getY()) - , _subContacts () + AutoContact::AutoContact ( GCell* gcell, Contact* contact ) + : ExtensionGo(contact->getCell()) + //, _id (_maxId++) + , _id (contact->getId()) + , _contact (contact) + , _gcell (gcell) + , _flags (CntInvalidatedCache|CntInCreationStage) + , _dxMin (0) + , _dxMax ((int)DbU::toLambda( _gcell->getXMax()-_gcell->getX() )) + , _dyMin (0) + , _dyMax ((int)DbU::toLambda( _gcell->getYMax()-_gcell->getY() )) { _allocateds++; _gcell->addContact ( this ); } + void AutoContact::_preCreate ( GCell* gcell, Net* net, const Layer* layer ) + { + if (not gcell) throw Error("AutoContact::_preCreate(): GCell* parameter must not be NULL."); + if (not net ) throw Error("AutoContact::_preCreate(): Net* parameter must not be NULL."); + if (not layer) throw Error("AutoContact::_preCreate(): const Layer* parameter must not be NULL."); + } + + void AutoContact::_postCreate () { - ExtensionGo::_postCreate (); + ExtensionGo::_postCreate(); - restoreNativeConstraintBox (); + restoreNativeConstraintBox(); ltrace(90) << "Native CBox: " << this << " <" << DbU::getLambda(getCBXMin()) @@ -2180,8 +95,8 @@ namespace Katabatic { << " " << DbU::getLambda(getCBXMax()) << " " << DbU::getLambda(getCBYMax()) << ">" << endl; - Session::link ( this ); - invalidate (); + Session::link( this ); + invalidate( KbTopology ); ltrace(90) << "AutoContact::_postCreate() - " << this << " in " << _gcell << endl; } @@ -2189,94 +104,58 @@ namespace Katabatic { void AutoContact::_preDestroy () { - DebugSession::open ( _contact->getNet() ); + DebugSession::open( _contact->getNet() ); ltrace(90) << "AutoContact::_preDestroy() - " << endl; - if ( not _contact->getSlaveComponents().isEmpty() ) { - cerr << Error("Base contact still have slaves components, cancelled.\n" - " (%s)" - ,_getString().c_str()) << endl; - DebugSession::close (); - return; - } +#if 0 + bool canDestroyBase = true; - if ( not Session::doDestroyTool() ) { - _gcell->removeContact ( this ); - Session::unlink ( this ); + if (not _contact->getSlaveComponents().isEmpty()) { + ostringstream message; + message << "Base contact still have slaves components, cancelled.\n" + << " on: " << this; + + forEach ( Component*, icomponent, _contact->getSlaveComponents() ) { + message << "\n | " << (*icomponent); + } + cerr << Error( message.str() ) << endl; + + canDestroyBase = false; + } +#endif + + if (not Session::doDestroyTool()) { + _gcell->removeContact( this ); + Session::unlink( this ); } - ExtensionGo::_preDestroy (); - if ( Session::doDestroyBaseContact() ) - _contact->destroy (); + ExtensionGo::_preDestroy(); +#if 0 + if (Session::doDestroyBaseContact() and canDestroyBase) + _contact->destroy(); +#endif - DebugSession::close (); + DebugSession::close(); } AutoContact::~AutoContact () + { _allocateds--; } + + + size_t AutoContact::getAllocateds () + { return _allocateds; } + + + const Name& AutoContact::getStaticName () + { return _goName; } + + + bool AutoContact::canDestroy ( unsigned int flags ) const { - _allocateds--; - } - - - AutoContact* AutoContact::create ( GCell* gcell - , Net* net - , const Layer* layer - , bool hAlignate - , bool vAlignate - ) - { - Contact* contact = Contact::create ( net - , layer - , gcell->getCenter().getX() - , gcell->getCenter().getY() - , DbU::lambda(2.0) - , DbU::lambda(2.0) - ); - AutoContact* autoContact = new AutoContact ( gcell, contact, hAlignate, vAlignate ); - - autoContact->_postCreate (); - - ltrace(90) << "create(net*) " << autoContact << endl; - return autoContact; - } - - - AutoContact* AutoContact::create ( GCell* gcell - , RoutingPad* rp - , const Layer* layer - , const DbU::Unit dx - , const DbU::Unit dy - , const DbU::Unit width - , const DbU::Unit height - , bool hAlignate - , bool vAlignate - , bool fixed - ) - { - Contact* contact = Contact::create ( rp - , layer - , dx /*- rp->getX()*/ - , dy /*- rp->getY()*/ - , width - , height - ); - AutoContact* autoContact = new AutoContact ( gcell, contact, hAlignate, vAlignate ); - - autoContact->setFixed ( fixed ); - autoContact->setTerminal ( true ); - autoContact->_postCreate (); - - ltrace(90) << "create(RoutingPad*) " << autoContact << endl; - return autoContact; - } - - - bool AutoContact::canDestroy ( bool error ) const - { - if ( not _contact->getSlaveComponents().isEmpty() ) { - if ( error ) { + if (not _contact->getSlaveComponents().isEmpty()) { + if (flags & KbWarnOnError) { cerr << Error("Base contact still have slaves components, cancelled.\n" " (%s)" ,_getString().c_str()) << endl; @@ -2287,41 +166,25 @@ namespace Katabatic { } - size_t AutoContact::getSegmentEndAllocateds () - { - return SegmentEnd::getAllocateds(); - } - - - size_t AutoContact::getAllocateds () - { - return _allocateds; - } - - - const Name& AutoContact::getStaticName () - { - return _goName; - } - - const Name& AutoContact::getName () const - { - return _goName; - } + { return _goName; } + + + AutoSegments AutoContact::getAutoSegments () + { return new AutoSegments_CachedOnContact(this); } unsigned int AutoContact::getMinDepth () const { size_t minDepth = (size_t)-1; Component* anchor = getAnchor (); - if ( anchor ) { - minDepth = min ( minDepth, Session::getRoutingGauge()->getLayerDepth(anchor->getLayer()) ); + if (anchor) { + minDepth = std::min( minDepth, Session::getRoutingGauge()->getLayerDepth(anchor->getLayer()) ); //ltrace(200) << "Anchor:" << anchor << endl; } - forEach ( Component*, icomponent, getSlaveComponents() ) { - minDepth = min ( minDepth, Session::getRoutingGauge()->getLayerDepth(icomponent->getLayer()) ); + forEach ( AutoSegment*, isegment, const_cast(this)->getAutoSegments() ) { + minDepth = std::min( minDepth, Session::getRoutingGauge()->getLayerDepth(isegment->getLayer()) ); //ltrace(200) << "Slave:" << *icomponent << endl; } @@ -2334,12 +197,12 @@ namespace Katabatic { size_t maxDepth = 0; Component* anchor = getAnchor (); if ( anchor ) { - maxDepth = max ( maxDepth, Session::getRoutingGauge()->getLayerDepth(anchor->getLayer()) ); + maxDepth = std::max ( maxDepth, Session::getRoutingGauge()->getLayerDepth(anchor->getLayer()) ); //ltrace(200) << "Anchor:" << anchor << endl; } - forEach ( Component*, icomponent, getSlaveComponents() ) { - maxDepth = max ( maxDepth, Session::getRoutingGauge()->getLayerDepth(icomponent->getLayer()) ); + forEach ( AutoSegment*, isegment, const_cast(this)->getAutoSegments() ) { + maxDepth = std::max ( maxDepth, Session::getRoutingGauge()->getLayerDepth(isegment->getLayer()) ); //ltrace(200) << "Slave:" << *icomponent << endl; } @@ -2349,46 +212,31 @@ namespace Katabatic { void AutoContact::getLengths ( DbU::Unit* lengths, AutoSegment::DepthLengthSet& processeds ) { - forEach ( Hook*, ihook, getBodyHook()->getSlaveHooks() ) { - bool isSourceHook = (dynamic_cast(*ihook)); - if ( !isSourceHook && ( dynamic_cast(*ihook) == NULL ) ) { - cerr << Error ( badHookType, getString(ihook->getComponent()).c_str() ) << endl; - return; - } + forEach ( AutoSegment*, isegment, getAutoSegments() ) { + bool isSourceHook = (isegment->getAutoSource() == this); - bool isHorizontal = true; - Segment* segment = dynamic_cast((*ihook)->getComponent()); - if ( !segment ) { - isHorizontal = false; - segment = dynamic_cast((*ihook)->getComponent()); - if ( !segment ) - continue; - } + if (processeds.find(*isegment) != processeds.end()) continue; + processeds.insert( *isegment ); - AutoSegment* autoSegment = Session::lookup ( segment ); - if ( not autoSegment or processeds.find(autoSegment) != processeds.end() ) - continue; - processeds.insert ( autoSegment ); - - size_t depth = Session::getRoutingGauge()->getLayerDepth(segment->getLayer()); + size_t depth = Session::getRoutingGauge()->getLayerDepth(isegment->getLayer()); DbU::Unit length; - if ( autoSegment->isLocal() ) { - length = segment->getLength(); + if (isegment->isLocal()) { + length = isegment->getLength(); lengths[depth] += length; - if ( abs(length) >= DbU::lambda(50.0) ) + if ( not isegment->isUnbound() and (abs(length) > DbU::lambda(50.0)) ) cerr << Error("Suspicious length:%.2f of %s." - ,DbU::getLambda(length),getString(autoSegment).c_str()) << endl; + ,DbU::getLambda(length),getString(*isegment).c_str()) << endl; } else { - if ( isHorizontal ) { + if ( isegment->isHorizontal() ) { if ( isSourceHook ) - lengths[depth] += _gcell->getBoundingBox().getXMax() - segment->getSourceX(); + lengths[depth] += _gcell->getBoundingBox().getXMax() - isegment->getSourceX(); else - lengths[depth] += segment->getTargetX() - _gcell->getBoundingBox().getXMin(); + lengths[depth] += isegment->getTargetX() - _gcell->getBoundingBox().getXMin(); } else { if ( isSourceHook ) - lengths[depth] += _gcell->getBoundingBox().getYMax() - segment->getSourceY(); + lengths[depth] += _gcell->getBoundingBox().getYMax() - isegment->getSourceY(); else - lengths[depth] += segment->getTargetY() - _gcell->getBoundingBox().getYMin(); + lengths[depth] += isegment->getTargetY() - _gcell->getBoundingBox().getYMin(); } } } @@ -2396,241 +244,140 @@ namespace Katabatic { Box AutoContact::getNativeConstraintBox () const + { return isFixed() ? Box(_contact->getPosition()) : _gcell->getBoundingBox(); } + + + Interval AutoContact::getNativeUConstraints ( unsigned int direction ) const { - //if ( _fixed ) return Box(getCenter()); - - Component* component = getAnchor(); - if ( component == NULL ) return _gcell->getBoundingBox (); - - DbU::Unit xMin; - DbU::Unit xMax; - DbU::Unit yMin; - DbU::Unit yMax; - Vertical* vertical; - Horizontal* horizontal; - RoutingPad* routingPad; - - if ( (horizontal = dynamic_cast(component))) { - xMin = horizontal->getSourcePosition().getX(); - xMax = horizontal->getTargetPosition().getX(); - yMin = yMax - = horizontal->getTargetPosition().getY(); - } else if ( (vertical = dynamic_cast(component)) ) { - yMin = vertical->getSourcePosition().getY(); - yMax = vertical->getTargetPosition().getY(); - xMin = xMax - = vertical->getTargetPosition().getX(); - } else if ( (routingPad = dynamic_cast(component)) ) { - Entity* entity = routingPad->getOccurrence().getEntity(); - - // Assumes there is no rotation in the Transformation. - if ( dynamic_cast(entity) ) { - xMin = routingPad->getSourcePosition().getX(); - xMax = routingPad->getTargetPosition().getX(); - yMin = yMax - = routingPad->getTargetPosition().getY(); - } else if ( dynamic_cast(entity) ) { - yMin = routingPad->getSourcePosition().getY(); - yMax = routingPad->getTargetPosition().getY(); - xMin = xMax - = routingPad->getTargetPosition().getX(); - } else { - xMin = xMax = routingPad->getPosition().getX(); - yMin = yMax = routingPad->getPosition().getY(); - } - } else { - xMin = xMax = component->getPosition().getX(); - yMin = yMax = component->getPosition().getY(); + Box nativeConstraints = getNativeConstraintBox(); + if (direction & KbHorizontal) { + return Interval( nativeConstraints.getXMin(), nativeConstraints.getXMax() ); } - - order ( xMin, xMax ); - order ( yMin, yMax ); - - return Box ( xMin, yMin, xMax, yMax ); + return Interval( nativeConstraints.getYMin(), nativeConstraints.getYMax() ); } Interval AutoContact::getUConstraints ( unsigned int direction ) const { - if ( direction == Constant::Horizontal ) { - return Interval ( getCBYMin(), getCBYMax() ); + if (direction & KbHorizontal) { + return Interval( getCBXMin(), getCBXMax() ); } - return Interval ( getCBXMin(), getCBXMax() ); + return Interval( getCBYMin(), getCBYMax() ); } - AutoContacts AutoContact::getCollapseds ( unsigned int direction ) + void AutoContact::invalidate ( unsigned int flags ) { - return AutoContacts_Collapsed ( this, direction ); - } - - - void AutoContact::invalidate () - { - if ( !isInvalidated() ) { + if (not isInvalidated()) { ltrace(110) << "AutoContact::invalidate() - " << this << endl; - setInvalidated ( true ); - Session::invalidate ( this ); - getGCell()->invalidate (); + ltracein(110); + setFlags( CntInvalidated ); + if (flags & KbTopology ) setFlags( CntInvalidatedCache ); + Session::invalidate( this ); + + _invalidate( flags ); + //forEach( AutoSegment*, isegment, getAutoSegments() ) + // isegment->invalidate(); + + getGCell()->invalidate(); + ltraceout(110); } } - void AutoContact::revalidate () - { - updateGeometry (); - if ( _invalidTopology ) - revalidateTopology (); - } - - - void AutoContact::updateGeometry () - { - DebugSession::open ( getNet(), 80 ); - - ltrace(110) << "AutoContact::updateGeometry() " << this << endl; - ltracein(110); - - _contact->invalidate ( false ); - setInvalidated ( false ); - - if ( isFixed() ) { - FixedJunctionBox junctionBox ( this, false ); - junctionBox.resize (); - } else { - JunctionBox junctionBox ( this, false ); - junctionBox.resize (); - junctionBox.updateContacts ( _subContacts ); - } -#if defined(CHECK_DATABASE) - checkTopology(); -#endif - - ltraceout(110); - - DebugSession::close (); - } - - void AutoContact::setGCell ( GCell* gcell ) { - invalidate (); - if ( _gcell ) _gcell->removeContact ( this ); + invalidate(); + if (_gcell) _gcell->removeContact( this ); _gcell = gcell; - if ( _gcell ) { - _gcell->addContact ( this ); - _contact->setPosition ( _gcell->getCenter() ); + if (_gcell) { + ltrace(110) << "AutoContact::setGCell() " << gcell << endl; + _gcell->addContact( this ); + _contact->setPosition( _gcell->getCenter() ); _dxMin = 0; _dyMin = 0; - _dxMax = _gcell->getXMax()-_gcell->getX(); - _dyMax = _gcell->getYMax()-_gcell->getY(); + _dxMax = (int)DbU::toLambda( _gcell->getXMax()-_gcell->getX() ); + _dyMax = (int)DbU::toLambda( _gcell->getYMax()-_gcell->getY() ); + ltrace(110) << "* deltas: [" << _dxMin << " " << _dyMin << " " << _dxMax << " " << _dyMax << "]" << endl; } else { - cerr << Bug("NULL GCell for %p:%s.",_contact,_getString().c_str()) << endl; + cerr << Bug( "NULL GCell for %s.", _getString().c_str() ) << endl; } } - void AutoContact::breakUp () + void AutoContact::_getTopology ( Component*& anchor, Horizontal**& horizontals, Vertical**& verticals, size_t size ) { - if ( isFixed() ) { - FixedJunctionBox(this,false).breakUp(); - } else { - JunctionBox(this,false).breakUp(); + size_t hcount = 0; + size_t vcount = 0; + + for ( size_t i=0 ; i(*icomponent); + if (h != NULL) { + if (hcount < size) horizontals[hcount++] = h; + } else { + Vertical* v = dynamic_cast(*icomponent); + if ( (v != NULL) and (vcount < size) ) verticals[vcount++] = v; + } } - ltrace(110) << "AutoContact::breakUp() succeded" << endl; } - void AutoContact::split () + void AutoContact::showTopologyError ( const std::string& message ) { - DebugSession::open ( getNet() ); - JunctionBox(this,false).split(); - DebugSession::close (); + Component* anchor = NULL; + Horizontal** horizontals = new Horizontal* [10]; + Vertical** verticals = new Vertical* [10]; + + _getTopology ( anchor, horizontals, verticals, 10 ); + + cerr << Error("In topology of %s",getString(this).c_str()) << endl; + if (anchor) cerr << " A: " << anchor << endl; + + for ( size_t i=0 ; (i<10) and (horizontals[i] != NULL); ++i ) { + AutoSegment* autoSegment = Session::lookup ( horizontals[i] ); + if (autoSegment != NULL) + cerr << " " << (autoSegment->isGlobal()?'G':'L') << ": " << autoSegment << endl; + else + cerr << " ?: " << horizontals[i] << endl; + } + + for ( size_t i=0 ; (i<10) and (verticals[i] != NULL); ++i ) { + AutoSegment* autoSegment = Session::lookup ( verticals[i] ); + if (autoSegment != NULL) + cerr << " " << (autoSegment->isGlobal()?'G':'L') << ": " << autoSegment << endl; + else + cerr << " ?: " << verticals[i] << endl; + } + + cerr << " " << message << endl; + + delete [] horizontals; + delete [] verticals; } void AutoContact::checkTopology () { - ltrace(110) << "checkTopology() " << this << endl; - - if ( isFixed() ) { - FixedJunctionBox(this,true).checkTopology(); - } else { - JunctionBox(this,true).checkTopology(); - } + //ltrace(110) << "checkTopology() NOT RE-IMPLEMENTED YET " << this << endl; } - void AutoContact::revalidateTopology () + bool AutoContact::isTee ( unsigned int direction ) const { - ltrace(110) << "revalidateTopology() " << this << endl; - - JunctionBox(this,true).revalidateTopology(); + return (isHTee() and (direction & KbHorizontal)) + or (isVTee() and (direction & KbVertical )); } - bool AutoContact::isAlignate ( unsigned int direction ) const - { - return (_hAlignate && (direction == Constant::Horizontal)) - || (_vAlignate && (direction == Constant::Vertical )); - } - - - bool AutoContact::isHExtended () - { return JunctionBox(this,true).isHExtended(); } - - - bool AutoContact::isVExtended () - { return JunctionBox(this,true).isVExtended(); } - - - void AutoContact::computeAlignate () - { - if ( !isFixed() ) - JunctionBox(this,true).computeAlignate(); - } - - - bool AutoContact::canGoOutsideGCell ( const AutoSegment* segment ) - { return JunctionBox(this,true).canGoOutside(segment); } - - - bool AutoContact::canHDesalignate () - { return JunctionBox(this,true).canHDesalignate(); } - - - bool AutoContact::canVDesalignate () - { return JunctionBox(this,true).canVDesalignate(); } - - - bool AutoContact::hDesalignate () - { - bool desalignate = JunctionBox(this,true).canHDesalignate(); - - if ( desalignate ) setHAlignate ( false ); - return desalignate; - } - - - bool AutoContact::vDesalignate () - { - bool desalignate = JunctionBox(this,true).canVDesalignate(); - - if ( desalignate ) setVAlignate ( false ); - return desalignate; - } - - - void AutoContact::restoreHConnexity ( DbU::Unit x, bool split ) - { JunctionBox(this,true).restoreHConnexity ( x, split ); } - - - void AutoContact::restoreVConnexity ( DbU::Unit y, bool split ) - { JunctionBox(this,true).restoreVConnexity ( y, split ); } - - - bool AutoContact::canMoveUp ( AutoSegment* moved ) const + bool AutoContact::canMoveUp ( const AutoSegment* moved ) const { ltrace(200) << "AutoContact::canMoveUp() " << this << endl; size_t viaDepth = 100; @@ -2638,24 +385,24 @@ namespace Katabatic { RoutingGauge* rg = Session::getRoutingGauge(); size_t movedDepth = rg->getLayerDepth(moved->getLayer()); - Component* anchor = getAnchor (); - if ( anchor ) { - viaDepth = rg->getLayerDepth(anchor->getLayer()); + Component* anchor = getAnchor(); + if (anchor) { + viaDepth = rg->getLayerDepth( anchor->getLayer() ); ltrace(200) << "| Anchor depth: " << viaDepth << endl; } - forEach ( Segment*, isegment, _contact->getSlaveComponents().getSubSet() ) { - if ( *isegment == moved->base() ) continue; + forEach ( AutoSegment*, isegment, const_cast(this)->getAutoSegments() ) { + if (*isegment == moved) continue; size_t depth = rg->getLayerDepth(isegment->getLayer()); - if ( viaDepth == 100 ) viaDepth = depth; + if (viaDepth == 100) viaDepth = depth; else - if ( viaDepth != depth ) return false; + if (viaDepth != depth) return false; ltrace(200) << "| Segment depth: " << depth << endl; } - return ( movedDepth+1 == viaDepth ); + return (movedDepth+1 == viaDepth); } @@ -2672,12 +419,12 @@ namespace Katabatic { bool AutoContact::restrictConstraintBox ( DbU::Unit constraintMin , DbU::Unit constraintMax - , unsigned int direction - , bool warnOnError ) + , unsigned int flags + ) { - if ( direction & Constant::Horizontal ) { + if (flags & KbHorizontal) { if ( (constraintMin > getCBYMax()) or (constraintMax < getCBYMin()) ) { - if ( Session::getDemoMode() or not warnOnError ) return false; + if ( Session::isInDemoMode() or not (flags & KbWarnOnError) ) return false; cerr << Error ( "Incompatible DY restriction on %s", _getString().c_str() ) << endl; if ( constraintMin > getCBYMax() ) @@ -2692,11 +439,11 @@ namespace Katabatic { << endl; return false; } - setCBYMin ( max(getCBYMin(),constraintMin) ); - setCBYMax ( min(getCBYMax(),constraintMax) ); - } else if ( direction & Constant::Vertical ) { + setCBYMin ( std::max(getCBYMin(),constraintMin) ); + setCBYMax ( std::min(getCBYMax(),constraintMax) ); + } else if (flags & KbVertical) { if ( (constraintMin > getCBXMax()) || (constraintMax < getCBXMin()) ) { - if ( Session::getDemoMode() or not warnOnError ) return false; + if ( Session::isInDemoMode() or not (flags & KbWarnOnError) ) return false; cerr << Error ( "Incompatible DX restriction on %s", _getString().c_str() ) << endl; if ( constraintMin > getCBXMax() ) @@ -2711,8 +458,8 @@ namespace Katabatic { << endl; return false; } - setCBXMin ( max(getCBXMin(),constraintMin) ); - setCBXMax ( min(getCBXMax(),constraintMax) ); + setCBXMin ( std::max(getCBXMin(),constraintMin) ); + setCBXMax ( std::min(getCBXMax(),constraintMax) ); } ltrace(110) << "restrictConstraintBox() - " << this << " " << getConstraintBox() << endl; return true; @@ -2720,21 +467,15 @@ namespace Katabatic { void AutoContact::restoreNativeConstraintBox () - { - setConstraintBox ( getNativeConstraintBox() ); - } + { setConstraintBox ( getNativeConstraintBox() ); } Box& AutoContact::intersectConstraintBox ( Box& box ) const - { - return box = box.getIntersection ( getConstraintBox() ); - } + { return box = box.getIntersection ( getConstraintBox() ); } Box AutoContact::getBoundingBox () const - { - return _gcell->getBoundingBox (); - } + { return _gcell->getBoundingBox (); } void AutoContact::translate ( const DbU::Unit& tx, const DbU::Unit& ty ) @@ -2744,23 +485,26 @@ namespace Katabatic { } + string AutoContact::_getTypeName () const + { return "AutoContact"; } + + string AutoContact::_getString () const { - string s = _contact->_getString(); - s.insert ( 1, "id: " ); - s.insert ( 4, getString(_id) ); - s.insert ( s.size()-1, (_fixed )?" F":" -" ); - s.insert ( s.size()-1, (_isTerminal)? "t": "-" ); - s.insert ( s.size()-1, (_hAlignate) ? "h": "-" ); - s.insert ( s.size()-1, (_vAlignate) ? "v": "-" ); - s.insert ( s.size()-1, (_invalid) ? "i": "-" ); - - // Point p = _contact->getCenter(); - // s.insert ( s.size()-1, " [" ); - // s.insert ( s.size()-1, DbU::getValueString(p.getX()) ); - // s.insert ( s.size()-1, ":" ); - // s.insert ( s.size()-1, DbU::getValueString(p.getY()) ); - // s.insert ( s.size()-1, "]" ); + string s = _contact->_getString(); + size_t i = s.find(' '); + if (i != string::npos) { + s.erase ( i+1, 7 ); + s.insert( i+1, _getTypeName() ); + } + //s.insert( 1, "id: " ); + //s.insert( 4, getString(_id) ); + s.insert( s.size()-1, (isFixed ())?" F":" -" ); + s.insert( s.size()-1, (isTerminal ())? "T": "-" ); + s.insert( s.size()-1, (isHTee ())? "h": "-" ); + s.insert( s.size()-1, (isVTee ())? "v": "-" ); + s.insert( s.size()-1, (isInvalidated ())? "i": "-" ); + s.insert( s.size()-1, (isInvalidatedCache())? "c": "-" ); return s; } @@ -2770,13 +514,9 @@ namespace Katabatic { Record* record = _contact->_getRecord (); record->add ( getSlot ( "_gcell" , _gcell ) ); record->add ( getSlot ( "_constraintBox", getConstraintBox() ) ); - record->add ( getSlot ( "_fixed" , _fixed ) ); - record->add ( getSlot ( "_isTerminal" , _isTerminal ) ); - record->add ( getSlot ( "_hAlignate" , _hAlignate ) ); - record->add ( getSlot ( "_vAlignate" , _vAlignate ) ); - record->add ( getSlot ( "_invalid" , _invalid ) ); + record->add ( getSlot ( "_flags" , _flags ) ); return record; } -} // End of Katabatic namespace. +} // Katabatic namespace. diff --git a/katabatic/src/AutoContactHTee.cpp b/katabatic/src/AutoContactHTee.cpp new file mode 100644 index 00000000..45ef1b4d --- /dev/null +++ b/katabatic/src/AutoContactHTee.cpp @@ -0,0 +1,314 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2012-2012, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Module : "./AutoContactHTee.cpp" | +// +-----------------------------------------------------------------+ + + +#include +#include +#include +#include "hurricane/Bug.h" +#include "hurricane/Error.h" +#include "hurricane/Warning.h" +#include "hurricane/Layer.h" +#include "hurricane/ViaLayer.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/Technology.h" +#include "hurricane/Net.h" +#include "hurricane/Plug.h" +#include "hurricane/Vertical.h" +#include "hurricane/Horizontal.h" +#include "hurricane/UpdateSession.h" +#include "hurricane/DebugSession.h" +#include "crlcore/RoutingGauge.h" +#include "katabatic/AutoContactHTee.h" +#include "katabatic/AutoVertical.h" +#include "katabatic/AutoHorizontal.h" +#include "katabatic/Session.h" + + +namespace Katabatic { + + using Hurricane::Bug; + using Hurricane::Error; + using Hurricane::DebugSession; + using Hurricane::ltracein; + using Hurricane::ltraceout; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoContactHTee". + + + AutoContactHTee* AutoContactHTee::create ( GCell* gcell, Net* net, const Layer* layer ) + { + Contact* contact = Contact::create ( net + , layer + , gcell->getCenter().getX() + , gcell->getCenter().getY() + , DbU::lambda(2.0) + , DbU::lambda(2.0) + ); + AutoContactHTee* autoContact = new AutoContactHTee ( gcell, contact ); + + autoContact->_postCreate(); + autoContact->unsetFlags( CntInCreationStage ); + + ltrace(90) << "create(net*) " << autoContact << endl; + return autoContact; + } + + + AutoContactHTee::AutoContactHTee ( GCell* gcell, Contact* contact ) + : AutoContact (gcell,contact) + , _horizontal1(NULL) + , _horizontal2(NULL) + , _vertical1 (NULL) + { + setFlags( CntHTee ); + } + + + AutoContactHTee::~AutoContactHTee () + { } + + + AutoSegment* AutoContactHTee::getOpposite ( const AutoSegment* from ) const + { + if (from == _horizontal1) return _horizontal2; + if (from == _horizontal2) return _horizontal1; + return NULL; + } + + + AutoSegment* AutoContactHTee::getSegment ( unsigned int index ) const + { + AutoSegment* segment = NULL; + switch ( index ) { + case 0: return _horizontal1; + case 1: return _horizontal2; + case 2: return _vertical1; + } + //if (not segment) + // cerr << Error( "In %s:\n No cached segment at index %d" + // , getString(this).c_str(), index ) << endl; + return segment; + } + + + void AutoContactHTee::_invalidate ( unsigned int ) + { + unsigned int flags = KbPropagate; + if (_horizontal1 and _horizontal2) { + if (_horizontal1->isInvalidated() xor _horizontal2->isInvalidated()) + flags = KbNoFlags; + } + + if (_horizontal1) _horizontal1->invalidate( flags ); + if (_horizontal2) _horizontal2->invalidate( flags ); + if (_vertical1 ) _vertical1 ->invalidate(); + } + + + void AutoContactHTee::cacheDetach ( AutoSegment* segment ) + { + ltrace(110) << _getTypeName() << "::_cacheDetach() " << this << endl; + + if (segment == _horizontal1) _horizontal1 = NULL; + else if (segment == _horizontal2) _horizontal2 = NULL; + else if (segment == _vertical1) _vertical1 = NULL; + else return; + + setFlags( CntInvalidatedCache ); + } + + + void AutoContactHTee::cacheAttach ( AutoSegment* segment ) + { + ltrace(110) << _getTypeName() << "::cacheAttach() " << this << endl; + ltracein(110); + ltrace(110) << "Attaching: " << segment << endl; + + if (segment->getDirection() == KbHorizontal) { + if (not _horizontal1) _horizontal1 = static_cast(segment); + else if (not _horizontal2) _horizontal2 = static_cast(segment); + else { + cerr << Bug( "%s::cacheAttach() On %s,\n" + " h1 & h2 cache have not been cleared first, cancelled." + , _getTypeName().c_str(), getString(this).c_str() + ) << endl; + ltraceout(110); + return; + } + } else if (segment->getDirection() == KbVertical) { + if (_vertical1) { + cerr << Bug( "%s::cacheAttach() On %s,\n" + " v1 cache has not been cleared first, cancelled." + , _getTypeName().c_str(), getString(this).c_str() + ) << endl; + ltraceout(110); + return; + } + _vertical1 = static_cast(segment); + } + + if (_horizontal1 and _horizontal2 and _vertical1) + unsetFlags( CntInvalidatedCache ); + + ltraceout(110); + } + + + void AutoContactHTee::updateCache () + { + DebugSession::open( getNet(), 80 ); + + ltrace(110) << _getTypeName() << "::updateCache() " << this << endl; + ltracein(110); + + Component* anchor; + Horizontal** horizontals = new Horizontal* [3]; + Vertical** verticals = new Vertical* [3]; + + _getTopology( anchor, horizontals, verticals, 3 ); + + _horizontal1 = static_cast( Session::lookup(horizontals[0]) ); + _horizontal2 = static_cast( Session::lookup(horizontals[1]) ); + _vertical1 = static_cast( Session::lookup(verticals [0]) ); + + string message; + if (horizontals[0] == NULL) message = "HTee has less than two horizontal segments."; + else if (horizontals[1] == NULL) message = "HTee has less than two horizontal segments."; + else if (horizontals[2] != NULL) message = "HTee has more than two horizontal segments."; + else if (verticals [0] == NULL) message = "HTee is missing mandatory vertical segment."; + else if (verticals [1] != NULL) message = "HTee has more than one vertical segment."; + else if ( (not _horizontal1->isCreated() and not _horizontal2->isCreated()) + and (_horizontal1->getY() != _horizontal2->getY()) ) + message = "HTee has misaligned horizontal segments"; + if (not message.empty()) { + showTopologyError( message ); + setFlags( CntBadTopology ); + } + unsetFlags( CntInvalidatedCache ); + + ltrace(110) << "h1:" << _horizontal1 << endl; + ltrace(110) << "h2:" << _horizontal2 << endl; + ltrace(110) << "v1:" << _vertical1 << endl; + + delete [] horizontals; + delete [] verticals; + + ltraceout(110); + DebugSession::close(); + } + + + void AutoContactHTee::updateGeometry () + { + DebugSession::open( getNet(), 80 ); + + ltrace(110) << _getTypeName() << "::updateGeometry() " << this << endl; + ltracein(110); + + if (isInvalidatedCache()) updateCache(); + if (isInvalidatedCache()) { + cerr << Error( "%s::updateGeometry() %s: Unable to restore cache." + , _getTypeName().c_str(), getString(this).c_str() ) << endl; + ltraceout(110); + return; + } + + base()->invalidate( false ); + unsetFlags( CntInvalidated ); + + if (not hasBadTopology()) { + setX( getVertical1 ()->getX() ); + setY( getHorizontal1()->getY() ); + } + + ltraceout(110); + DebugSession::close(); + } + + + void AutoContactHTee::updateTopology () + { + DebugSession::open( getNet(), 80 ); + + ltrace(110) << _getTypeName() << "::updateTopology() " << this << endl; + ltracein(110); + + if (isInvalidatedCache()) updateCache(); + if (isInvalidatedCache()) { + cerr << Error( "%s::updateGeometry() %s: Unable to restore cache." + , _getTypeName().c_str(), getString(this).c_str() ) << endl; + ltraceout(110); + return; + } + + if (not hasBadTopology()) { + RoutingGauge* rg = Session::getRoutingGauge(); + size_t depthH1 = rg->getLayerDepth( getHorizontal1()->getLayer() ); + size_t depthH2 = rg->getLayerDepth( getHorizontal2()->getLayer() ); + size_t depthV1 = rg->getLayerDepth( getVertical1 ()->getLayer() ); + size_t minDepth = std::min( depthV1, std::min(depthH1,depthH2) ); + size_t maxDepth = std::max( depthV1, std::max(depthH1,depthH2) ); + size_t delta = maxDepth - minDepth; + + ltrace(110) << "delta:" << delta << endl; + + if (maxDepth - minDepth > 3) { + showTopologyError( "Sheared HTee, layer delta exceed 3." ); + setFlags( CntBadTopology ); + } else { + if (depthH1 == depthH2) { + // Dogleg on the vertical. + switch ( delta ) { + case 0: setLayer( rg->getRoutingLayer(minDepth) ); break; + case 1: setLayer( rg->getContactLayer(minDepth) ); break; + default: + setLayer( rg->getContactLayer( depthH1 + ((depthH1==minDepth)?0:-1) ) ); + _vertical1 = static_cast( _vertical1->makeDogleg(this) ); + break; + } + } else { + // Dogleg on the horizontal with the greater gap (should be equal to +/-2). + int deltaH1 = (int)depthH1 - (int)depthV1; + int deltaH2 = (int)depthH2 - (int)depthV1; + + if (std::abs(deltaH1) > std::abs(deltaH2)) { + setLayer( rg->getContactLayer( depthH2 + ((depthH2( _horizontal1->makeDogleg(this) ); + _horizontal1->makeDogleg(this); + ltrace(110) << "New h1:" << _horizontal1 << endl; + } else { + setLayer( rg->getContactLayer( depthH1 + ((depthH1( _horizontal2->makeDogleg(this) ); + _horizontal2->makeDogleg(this); + ltrace(110) << "New h2:" << _horizontal2 << endl; + } + } + } + } + + ltraceout(110); + DebugSession::close(); + } + + + string AutoContactHTee::_getTypeName () const + { return "ContactHTee"; } + + +} // Katabatic namespace. diff --git a/katabatic/src/AutoContactTerminal.cpp b/katabatic/src/AutoContactTerminal.cpp new file mode 100644 index 00000000..ac251e26 --- /dev/null +++ b/katabatic/src/AutoContactTerminal.cpp @@ -0,0 +1,367 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2012-2013, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Module : "./AutoContactTerminal.cpp" | +// +-----------------------------------------------------------------+ + + +#include +#include +#include +#include "hurricane/Bug.h" +#include "hurricane/Error.h" +#include "hurricane/Warning.h" +#include "hurricane/Layer.h" +#include "hurricane/ViaLayer.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/Technology.h" +#include "hurricane/Net.h" +#include "hurricane/Plug.h" +#include "hurricane/RoutingPad.h" +#include "hurricane/Vertical.h" +#include "hurricane/Horizontal.h" +#include "hurricane/UpdateSession.h" +#include "hurricane/DebugSession.h" +#include "crlcore/RoutingGauge.h" +#include "katabatic/AutoContactTerminal.h" +#include "katabatic/AutoContactTurn.h" +#include "katabatic/AutoVertical.h" +#include "katabatic/AutoHorizontal.h" +#include "katabatic/Session.h" + + +namespace Katabatic { + + using std::ostringstream; + using Hurricane::Bug; + using Hurricane::Error; + using Hurricane::DebugSession; + using Hurricane::ltracein; + using Hurricane::ltraceout; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoContactTerminal". + + + AutoContactTerminal* AutoContactTerminal::create ( GCell* gcell + , Component* anchor + , const Layer* layer + , Point point + , DbU::Unit width + , DbU::Unit height + ) + { + ltrace(90) << "AutoContactTerminal::create(... Point ...)" << endl; + ltracein(90); + ltrace(90) << "@" << point << endl; + + anchor->getBodyHook()->detach(); + + AutoContactTerminal* autoContact = AutoContactTerminal::create( gcell + , anchor + , layer + , point.getX(), point.getY() + , width, height + ); + ltraceout(90); + return autoContact; + } + + + AutoContactTerminal* AutoContactTerminal::create ( GCell* gcell + , Component* anchor + , const Layer* layer + , const DbU::Unit x + , const DbU::Unit y + , const DbU::Unit width + , const DbU::Unit height + ) + { + ltrace(90) << "AutoContactTerminal::create(... x, y ...)" << endl; + ltrace(90) << "@ x:" << DbU::getValueString(x) << " y:" << DbU::getValueString(y) << endl; + + Point anchorPosition = anchor->getPosition(); + + Contact* contact = Contact::create( anchor + , layer + , x - anchorPosition.getX() + , y - anchorPosition.getY() + , width + , height + ); + AutoContactTerminal* autoContact = new AutoContactTerminal( gcell, contact ); + + autoContact->_postCreate(); + autoContact->unsetFlags( CntInCreationStage ); + + ltrace(90) << "create(Component*) " << autoContact << endl; + return autoContact; + } + + + AutoContactTerminal::AutoContactTerminal ( GCell* gcell, Contact* contact ) + : AutoContact(gcell,contact) + , _segment (NULL) + { + setFlags( CntTerminal ); + } + + + AutoContactTerminal::~AutoContactTerminal () + { } + + + AutoSegment* AutoContactTerminal::getOpposite ( const AutoSegment* ) const + { return NULL; } + + + AutoSegment* AutoContactTerminal::getSegment ( unsigned int index ) const + { + if (_segment) { + switch ( index ) { + case 0: return (_segment->isHorizontal()) ? _segment : NULL; + case 2: return (_segment->isVertical ()) ? _segment : NULL; + } + } + return NULL; + } + + + Box AutoContactTerminal::getNativeConstraintBox () const + { + Component* component = getAnchor(); + if (component == NULL) { + cerr << Error( "%s is not anchored.", getString(this).c_str() ) << endl; + return _gcell->getBoundingBox (); + } + + DbU::Unit xMin; + DbU::Unit xMax; + DbU::Unit yMin; + DbU::Unit yMax; + Vertical* vertical; + Horizontal* horizontal; + RoutingPad* routingPad; + + if ( (horizontal = dynamic_cast(component)) ) { + xMin = horizontal->getSourcePosition().getX(); + xMax = horizontal->getTargetPosition().getX(); + yMin = yMax + = horizontal->getTargetPosition().getY(); + } else if ( (vertical = dynamic_cast(component)) ) { + yMin = vertical->getSourcePosition().getY(); + yMax = vertical->getTargetPosition().getY(); + xMin = xMax + = vertical->getTargetPosition().getX(); + } else if ( (routingPad = dynamic_cast(component)) ) { + Entity* entity = routingPad->getOccurrence().getEntity(); + + // Assumes there is no rotation in the Transformation. + if ( dynamic_cast(entity) ) { + xMin = routingPad->getSourcePosition().getX(); + xMax = routingPad->getTargetPosition().getX(); + yMin = yMax + = routingPad->getTargetPosition().getY(); + } else if ( dynamic_cast(entity) ) { + yMin = routingPad->getSourcePosition().getY(); + yMax = routingPad->getTargetPosition().getY(); + xMin = xMax + = routingPad->getTargetPosition().getX(); + } else { + xMin = xMax = routingPad->getPosition().getX(); + yMin = yMax = routingPad->getPosition().getY(); + } + } else { + xMin = xMax = component->getPosition().getX(); + yMin = yMax = component->getPosition().getY(); + } + + order( xMin, xMax ); + order( yMin, yMax ); + + return Box( xMin, yMin, xMax, yMax ); + } + + + void AutoContactTerminal::_invalidate ( unsigned int flags ) + { + if (_segment) _segment->invalidate(); + } + + + void AutoContactTerminal::cacheDetach ( AutoSegment* segment ) + { + if (_segment == segment) { + _segment = NULL; + setFlags( CntInvalidatedCache ); + } + } + + + void AutoContactTerminal::cacheAttach ( AutoSegment* segment ) + { + if (_segment) { + cerr << Bug( "%s::cacheAttach() On %s,\n" + " cache has not been cleared first, cancelled." + , _getTypeName().c_str(), getString(this).c_str() + ) << endl; + return; + } + _segment = segment; + unsetFlags( CntInvalidatedCache ); + } + + + void AutoContactTerminal::updateCache () + { + DebugSession::open( getNet(), 80 ); + + ltrace(110) << _getTypeName() << "::updateCache() " << this << endl; + ltracein(110); + + Component* anchor; + Horizontal** horizontals = new Horizontal* [2]; + Vertical** verticals = new Vertical* [2]; + + _getTopology( anchor, horizontals, verticals, 2 ); + + if (anchor == NULL) + showTopologyError( "Terminal is missing an anchor (RoutingPad or Component)." ); + + size_t count = 0; + if (horizontals[0] != NULL) ++count; + if (horizontals[1] != NULL) ++count; + if (verticals [0] != NULL) ++count; + if (verticals [1] != NULL) ++count; + if (count > 1) { + showTopologyError( "Terminal has more than one segment." ); + } + if (horizontals[0] != NULL ) { + _segment = Session::lookup( horizontals[0] ); + } else { + _segment = Session::lookup( verticals[0] ); + } + if (_segment == NULL) { + ostringstream os; + os << this << ", AutoSegment lookup failed for:" + << "\n h1: " << horizontals[0] + << "\n v1: " << verticals[0]; + + delete [] horizontals; + delete [] verticals; + + showTopologyError( os.str() ); + throw Error( os.str() ); + } + unsetFlags( CntInvalidatedCache ); + + ltrace(110) << "seg:" << _segment << endl; + + delete [] horizontals; + delete [] verticals; + + ltraceout(110); + DebugSession::close(); + } + + + void AutoContactTerminal::updateGeometry () + { + DebugSession::open( getNet(), 80 ); + + ltrace(110) << _getTypeName() << "::updateGeometry() " << this << endl; + ltracein(110); + + if (isInvalidatedCache()) updateCache(); + if (isInvalidatedCache()) { + cerr << Error( "%s::updateGeometry() %s: Unable to restore cache." + , _getTypeName().c_str(), getString(this).c_str() ) << endl; + ltraceout(110); + return; + } + + base()->invalidate( false ); + unsetFlags( CntInvalidated ); + + ostringstream message; + if (not hasBadTopology()) { + if (_segment->isHorizontal()) { + if (not getUConstraints(KbVertical).contains(_segment->getY())) { + ltrace(110) << "Cached: " << _segment << endl; + message << "Terminal horizontal segment Y " << DbU::getValueString(_segment->getY()) + << " axis is outside RoutingPad " << getUConstraints(KbVertical) << "."; + showTopologyError( message.str() ); + } else + setY( _segment->getY() ); + } else { + if (not getUConstraints(KbHorizontal).contains(_segment->getX())) { + ltrace(110) << "Cached: " << _segment << endl; + message << "Terminal vertical segment X" << DbU::getValueString(_segment->getX()) + << " axis is outside RoutingPad " << getUConstraints(KbHorizontal) << "."; + showTopologyError( message.str() ); + } else + setX( _segment->getX() ); + } + } + + ltraceout(110); + DebugSession::close(); + } + + + void AutoContactTerminal::updateTopology () + { + DebugSession::open( getNet(), 80 ); + + ltrace(110) << _getTypeName() << "::updateTopology() " << this << endl; + ltracein(110); + + if (isInvalidatedCache()) updateCache(); + if (isInvalidatedCache()) { + cerr << Error( "%s::updateGeometry() %s: Unable to restore cache." + , _getTypeName().c_str(), getString(this).c_str() ) << endl; + ltraceout(110); + return; + } + + RoutingGauge* rg = Session::getRoutingGauge(); + size_t anchorDepth = rg->getLayerDepth( (_flags & CntIgnoreAnchor) ? getLayer() + : getAnchor()->getLayer() ); + size_t segmentDepth = rg->getLayerDepth( _segment->getLayer() ); + size_t delta = abssub( anchorDepth, segmentDepth ); + + if (delta > 3) { + showTopologyError( "Sheared Terminal, layer delta exceed 3." ); + setFlags( CntBadTopology ); + } else { + if (delta > 1) { + //_segment = _segment->makeDogleg( this ); + _segment->makeDogleg( this ); + ltrace(110) << "Update seg: " << _segment << endl; + delta = abssub( anchorDepth, rg->getLayerDepth( _segment->getLayer() ) ); + } + else if (delta == 0) setLayer( rg->getRoutingLayer(anchorDepth) ); + else if (delta == 1) setLayer( rg->getContactLayer(std::min(anchorDepth,segmentDepth)) ); + } + + ltraceout(110); + DebugSession::close(); + } + + + string AutoContactTerminal::_getTypeName () const + { return "ContactTerminal"; } + + +} // Katabatic namespace. diff --git a/katabatic/src/AutoContactTurn.cpp b/katabatic/src/AutoContactTurn.cpp new file mode 100644 index 00000000..416c648a --- /dev/null +++ b/katabatic/src/AutoContactTurn.cpp @@ -0,0 +1,264 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2012-2012, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Module : "./AutoContactTurn.cpp" | +// +-----------------------------------------------------------------+ + + +#include +#include +#include +#include "hurricane/Bug.h" +#include "hurricane/Error.h" +#include "hurricane/Warning.h" +#include "hurricane/Layer.h" +#include "hurricane/ViaLayer.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/Technology.h" +#include "hurricane/Net.h" +#include "hurricane/Plug.h" +#include "hurricane/Vertical.h" +#include "hurricane/Horizontal.h" +#include "hurricane/UpdateSession.h" +#include "hurricane/DebugSession.h" +#include "crlcore/RoutingGauge.h" +#include "katabatic/AutoContactTurn.h" +#include "katabatic/AutoVertical.h" +#include "katabatic/AutoHorizontal.h" +#include "katabatic/Session.h" + + +namespace Katabatic { + + using Hurricane::Bug; + using Hurricane::Error; + using Hurricane::DebugSession; + using Hurricane::ltracein; + using Hurricane::ltraceout; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoContactTurn". + + + AutoContactTurn* AutoContactTurn::create ( GCell* gcell, Net* net, const Layer* layer ) + { + _preCreate( gcell, net, layer ); + + Contact* contact = Contact::create ( net + , layer + , gcell->getCenter().getX() + , gcell->getCenter().getY() + , DbU::lambda(2.0) + , DbU::lambda(2.0) + ); + AutoContactTurn* autoContact = new AutoContactTurn ( gcell, contact ); + + autoContact->_postCreate(); + autoContact->unsetFlags( CntInCreationStage ); + + ltrace(90) << "create(net*) " << autoContact << endl; + return autoContact; + } + + + AutoContactTurn::AutoContactTurn ( GCell* gcell, Contact* contact ) + : AutoContact (gcell,contact) + , _horizontal1(NULL) + , _vertical1 (NULL) + { + setFlags( CntTurn ); + } + + + AutoContactTurn::~AutoContactTurn () + { } + + + AutoSegment* AutoContactTurn::getOpposite ( const AutoSegment* ) const + { return NULL; } + + + AutoSegment* AutoContactTurn::getSegment ( unsigned int index ) const + { + switch ( index ) { + case 0: return _horizontal1; + case 2: return _vertical1; + } + return NULL; + } + + + void AutoContactTurn::_invalidate ( unsigned int flags ) + { + if (_horizontal1) _horizontal1->invalidate(); + if (_vertical1 ) _vertical1 ->invalidate(); + } + + + void AutoContactTurn::cacheDetach ( AutoSegment* segment ) + { + if (segment == _horizontal1) _horizontal1 = NULL; + else if (segment == _vertical1) _vertical1 = NULL; + else return; + + setFlags( CntInvalidatedCache ); + } + + + void AutoContactTurn::cacheAttach ( AutoSegment* segment ) + { + if (segment->getDirection() == KbHorizontal) { + if (_horizontal1) { + cerr << Bug( "%s::cacheAttach() On %s,\n" + " h1 cache has not been cleared first, cancelled." + , _getTypeName().c_str(), getString(this).c_str() + ) << endl; + return; + } + _horizontal1 = static_cast(segment); + } else if (segment->getDirection() == KbVertical) { + if (_vertical1) { + cerr << Bug( "%s::cacheAttach() On %s,\n" + " v1 cache has not been cleared first, cancelled." + , _getTypeName().c_str(), getString(this).c_str() + ) << endl; + return; + } + _vertical1 = static_cast(segment); + } + unsetFlags( CntInvalidatedCache ); + } + + + void AutoContactTurn::updateCache () + { + DebugSession::open( getNet(), 80 ); + + ltrace(110) << _getTypeName() << "::updateCache() " << this << endl; + ltracein(110); + + Component* anchor; + Horizontal** horizontals = new Horizontal* [2]; + Vertical** verticals = new Vertical* [2]; + + _getTopology ( anchor, horizontals, verticals, 2 ); + + _horizontal1 = static_cast( Session::lookup(horizontals[0]) ); + _vertical1 = static_cast( Session::lookup(verticals [0]) ); + + string message; + if (horizontals[0] == NULL) message = "Turn is missing mandatory horizontal segment."; + else if (horizontals[1] != NULL) message = "Turn has more than one horizontal segment."; + else if (verticals [0] == NULL) message = "Turn is missing mandatory vertical segment."; + else if (verticals [1] != NULL) message = "Turn has more than one vertical segment."; + if (not message.empty()) { + showTopologyError( message ); + setFlags( CntBadTopology ); + } else + unsetFlags( CntInvalidatedCache ); + + ltrace(110) << "h1:" << _horizontal1 << endl; + ltrace(110) << "v1:" << _vertical1 << endl; + + delete [] horizontals; + delete [] verticals; + + ltraceout(110); + DebugSession::close(); + } + + + void AutoContactTurn::updateGeometry () + { + DebugSession::open( getNet(), 80 ); + + ltrace(110) << _getTypeName() << "::updateGeometry() " << this << endl; + ltracein(110); + + if (isInvalidatedCache()) updateCache(); + if (isInvalidatedCache()) { + cerr << Error( "%s::updateGeometry() %s: Unable to restore cache." + , _getTypeName().c_str(), getString(this).c_str() ) << endl; + ltraceout(110); + return; + } + + base()->invalidate( false ); + unsetFlags ( CntInvalidated ); + + if (not hasBadTopology()) { + setX( getVertical1 ()->getX() ); + setY( getHorizontal1()->getY() ); + } + + ltraceout(110); + DebugSession::close(); + } + + + void AutoContactTurn::updateTopology () + { + DebugSession::open ( getNet(), 80 ); + + ltrace(110) << _getTypeName() << "::updateTopology() " << this << endl; + ltracein(110); + + if (isInvalidatedCache()) updateCache(); + if (isInvalidatedCache()) { + cerr << Error( "%s::updateGeometry() %s: Unable to restore cache." + , _getTypeName().c_str(), getString(this).c_str() ) << endl; + ltraceout(110); + return; + } + + if (not hasBadTopology()) { + RoutingGauge* rg = Session::getRoutingGauge(); + size_t depthH1 = rg->getLayerDepth( getHorizontal1()->getLayer() ); + size_t depthV1 = rg->getLayerDepth( getVertical1 ()->getLayer() ); + size_t depthContact = (depthH1 < depthV1) ? depthH1 : depthH1-1; + size_t delta = abssub ( depthH1, depthV1 ); + + if (delta > 3) { + showTopologyError( "Sheared Turn, layer delta exceed 3." ); + setFlags( CntBadTopology ); + } else { + if (delta == 3) { + if (_horizontal1->isInvalidatedLayer()) { + //_horizontal1 = static_cast( _horizontal1->makeDogleg(this) ); + _horizontal1->makeDogleg(this); + depthH1 = rg->getLayerDepth( _horizontal1->getLayer() ); + ltrace(110) << "Update h1: " << _horizontal1 << endl; + } else /*if (_vertical1->isInvalidatedLayer())*/ { + //_vertical1 = static_cast( _vertical1->makeDogleg(this) ); + _vertical1->makeDogleg(this); + depthV1 = rg->getLayerDepth( _vertical1->getLayer() ); + ltrace(110) << "Update v1: " << _vertical1 << endl; + } + delta = abssub ( depthH1, depthV1 ); + } + + setLayer ( (delta == 0) ? rg->getRoutingLayer(depthContact) : rg->getContactLayer(depthContact) ); + } + } + + ltraceout(110); + DebugSession::close (); + } + + + string AutoContactTurn::_getTypeName () const + { return "ContactTurn"; } + + +} // Katabatic namespace. diff --git a/katabatic/src/AutoContactVTee.cpp b/katabatic/src/AutoContactVTee.cpp new file mode 100644 index 00000000..7b00704e --- /dev/null +++ b/katabatic/src/AutoContactVTee.cpp @@ -0,0 +1,302 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2012-2013, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Module : "./AutoContactVTee.cpp" | +// +-----------------------------------------------------------------+ + + +#include +#include +#include +#include "hurricane/Bug.h" +#include "hurricane/Error.h" +#include "hurricane/Warning.h" +#include "hurricane/Layer.h" +#include "hurricane/ViaLayer.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/Technology.h" +#include "hurricane/Net.h" +#include "hurricane/Plug.h" +#include "hurricane/Vertical.h" +#include "hurricane/Horizontal.h" +#include "hurricane/UpdateSession.h" +#include "hurricane/DebugSession.h" +#include "crlcore/RoutingGauge.h" +#include "katabatic/AutoContactVTee.h" +#include "katabatic/AutoVertical.h" +#include "katabatic/AutoHorizontal.h" +#include "katabatic/Session.h" + + +namespace Katabatic { + + using Hurricane::Bug; + using Hurricane::Error; + using Hurricane::DebugSession; + using Hurricane::ltracein; + using Hurricane::ltraceout; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoContactVTee". + + + AutoContactVTee* AutoContactVTee::create ( GCell* gcell, Net* net, const Layer* layer ) + { + Contact* contact = Contact::create( net + , layer + , gcell->getCenter().getX() + , gcell->getCenter().getY() + , DbU::lambda(2.0) + , DbU::lambda(2.0) + ); + AutoContactVTee* autoContact = new AutoContactVTee( gcell, contact ); + + autoContact->_postCreate(); + autoContact->unsetFlags( CntInCreationStage ); + + ltrace(90) << "create(net*) " << autoContact << endl; + return autoContact; + } + + + AutoContactVTee::AutoContactVTee ( GCell* gcell, Contact* contact ) + : AutoContact(gcell,contact) + , _horizontal1(NULL) + , _vertical1 (NULL) + , _vertical2 (NULL) + { + setFlags( CntVTee ); + } + + + AutoContactVTee::~AutoContactVTee () + { } + + + AutoSegment* AutoContactVTee::getOpposite ( const AutoSegment* from ) const + { + if (from == _vertical1) return _vertical2; + if (from == _vertical2) return _vertical1; + return NULL; + } + + + AutoSegment* AutoContactVTee::getSegment ( unsigned int index ) const + { + switch ( index ) { + case 0: return _horizontal1; + case 2: return _vertical1; + case 3: return _vertical2; + } + return NULL; + } + + + void AutoContactVTee::_invalidate ( unsigned int ) + { + unsigned int flags = KbPropagate; + if (_vertical1 and _vertical2) { + if (_vertical1->isInvalidated() xor _vertical2->isInvalidated()) + flags = KbNoFlags; + } + + if (_vertical1 ) _vertical1 ->invalidate( flags ); + if (_vertical2 ) _vertical2 ->invalidate( flags ); + if (_horizontal1) _horizontal1->invalidate(); + } + + + void AutoContactVTee::cacheDetach ( AutoSegment* segment ) + { + if (segment == _horizontal1) _horizontal1 = NULL; + else if (segment == _vertical1) _vertical1 = NULL; + else if (segment == _vertical2) _vertical2 = NULL; + else return; + + setFlags( CntInvalidatedCache ); + } + + + void AutoContactVTee::cacheAttach ( AutoSegment* segment ) + { + if (segment->getDirection() == KbVertical) { + if (not _vertical1) _vertical1 = static_cast(segment); + else if (not _vertical2) _vertical2 = static_cast(segment); + else { + cerr << Bug( "%s::cacheAttach() On %s,\n" + " v1 & v2 cache have not been cleared first, cancelling." + , _getTypeName().c_str(), getString(this).c_str() + ) << endl; + return; + } + } else if (segment->getDirection() == KbHorizontal) { + if (_horizontal1) { + cerr << Bug( "%s::cacheAttach() On %s,\n" + " h1 cache has not been cleared first, cancelling." + , _getTypeName().c_str(), getString(this).c_str() + ) << endl; + return; + } + _horizontal1 = static_cast(segment); + } + + if (_vertical1 and _vertical2 and _horizontal1) + unsetFlags( CntInvalidatedCache ); + } + + + void AutoContactVTee::updateCache () + { + DebugSession::open( getNet(), 80 ); + + ltrace(110) << "AutoContactVTee::updateCache() " << this << endl; + ltracein(110); + + Component* anchor; + Horizontal** horizontals = new Horizontal* [3]; + Vertical** verticals = new Vertical* [3]; + + _getTopology ( anchor, horizontals, verticals, 3 ); + + _horizontal1 = static_cast( Session::lookup(horizontals[0]) ); + _vertical1 = static_cast( Session::lookup(verticals [0]) ); + _vertical2 = static_cast( Session::lookup(verticals [1]) ); + + string message; + if (verticals [0] == NULL) message = "VTee has less than two vertical segments."; + else if (verticals [1] == NULL) message = "VTee has less than two vertical segments."; + else if (verticals [2] != NULL) message = "VTee has more than two vertical segments."; + else if (horizontals[0] == NULL) message = "VTee is missing mandatory horizontal segment."; + else if (horizontals[1] != NULL) message = "VTee has more than one horizontal segment."; + else if ( (not _vertical1->isCreated() and not _vertical2->isCreated()) + and (_vertical1->getY() != _vertical2->getY()) ) + message = "VTee has misaligned vertical segments"; + if (not message.empty() ) { + showTopologyError( message ); + setFlags( CntBadTopology ); + } + unsetFlags( CntInvalidatedCache ); + + ltrace(110) << "h1:" << _horizontal1 << endl; + ltrace(110) << "v1:" << _vertical1 << endl; + ltrace(110) << "v2:" << _vertical2 << endl; + + delete [] horizontals; + delete [] verticals; + + ltraceout(110); + DebugSession::close(); + } + + + void AutoContactVTee::updateGeometry () + { + DebugSession::open( getNet(), 80 ); + + ltrace(110) << "AutoContactVTee::updateGeometry() " << this << endl; + ltracein(110); + + if (isInvalidatedCache()) updateCache(); + if (isInvalidatedCache()) { + cerr << Error( "%s::updateGeometry() %s: Unable to restore cache." + , _getTypeName().c_str(), getString(this).c_str() ) << endl; + ltraceout(110); + return; + } + + base()->invalidate( false ); + unsetFlags( CntInvalidated ); + + if (not hasBadTopology()) { + setX( getVertical1 ()->getX() ); + setY( getHorizontal1()->getY() ); + } + + ltraceout(110); + DebugSession::close(); + } + + + void AutoContactVTee::updateTopology () + { + DebugSession::open ( getNet(), 80 ); + + ltrace(110) << "AutoContactVTee::updateTopology() " << this << endl; + ltracein(110); + + if (isInvalidatedCache()) updateCache(); + if (isInvalidatedCache()) { + cerr << Error( "%s::updateGeometry() %s: Unable to restore cache." + , _getTypeName().c_str(), getString(this).c_str() ) << endl; + ltraceout(110); + return; + } + + if (not hasBadTopology()) { + RoutingGauge* rg = Session::getRoutingGauge(); + size_t depthV1 = rg->getLayerDepth( getVertical1 ()->getLayer() ); + size_t depthV2 = rg->getLayerDepth( getVertical2 ()->getLayer() ); + size_t depthH1 = rg->getLayerDepth( getHorizontal1()->getLayer() ); + size_t minDepth = std::min( depthH1, std::min(depthV1,depthV2) ); + size_t maxDepth = std::max( depthH1, std::max(depthV1,depthV2) ); + size_t delta = maxDepth - minDepth; + + ltrace(110) << "minDepth:" << minDepth << endl; + ltrace(110) << "maxDepth:" << maxDepth << endl; + ltrace(110) << "delta:" << delta << endl; + + if ( maxDepth - minDepth > 3 ) { + showTopologyError( "Sheared VTee, layer delta exceed 3." ); + setFlags( CntBadTopology ); + } else { + if (depthV1 == depthV2) { + ltrace(110) << "depthV1 == depthV2 (" << depthV1 << ")" << endl; + // Dogleg on the horizontal. + switch ( delta ) { + case 0: setLayer( rg->getRoutingLayer(minDepth) ); break; + case 1: setLayer( rg->getContactLayer(minDepth) ); break; + default: + ltrace(110) << "Restore connectivity: dogleg on h1." << endl; + setLayer( rg->getContactLayer( depthV1 + ((depthV1==minDepth)?0:-1) ) ); + _horizontal1 = static_cast( _horizontal1->makeDogleg(this) ); + break; + } + } else { + // Dogleg on the vertical with the greater gap (should be equal to +/-2). + int deltaV1 = (int)depthV1 - (int)depthH1; + int deltaV2 = (int)depthV2 - (int)depthH1; + + if (std::abs(deltaV1) > std::abs(deltaV2)) { + setLayer( rg->getContactLayer( depthV2 + ((depthV2( _vertical1->makeDogleg(this) ); + _vertical1->makeDogleg(this); + } else { + setLayer( rg->getContactLayer( depthV1 + ((depthV1( _vertical2->makeDogleg(this) ); + _vertical2->makeDogleg(this); + } + } + } + } + + ltraceout(110); + DebugSession::close (); + } + + + string AutoContactVTee::_getTypeName () const + { return "ContactVTee"; } + + +} // Katabatic namespace. diff --git a/katabatic/src/AutoContacts.cpp b/katabatic/src/AutoContacts.cpp deleted file mode 100644 index d2e2c974..00000000 --- a/katabatic/src/AutoContacts.cpp +++ /dev/null @@ -1,140 +0,0 @@ - -// -*- C++ -*- -// -// This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved -// -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | -// | C O R I O L I S | -// | K a t a b a t i c - Routing Toolbox | -// | | -// | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | -// | =============================================================== | -// | C++ Module : "./AutoContacts.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x - - -#include - -#include "hurricane/Segment.h" -#include "hurricane/Horizontal.h" -#include "hurricane/Vertical.h" - -#include "katabatic/Session.h" -#include "katabatic/AutoContact.h" -#include "katabatic/AutoSegment.h" - - -namespace Katabatic { - - - using namespace std; - using Hurricane::Hook; - using Hurricane::Error; - using Hurricane::Segment; - using Hurricane::ForEachIterator; - - -// ------------------------------------------------------------------- -// Class : "Katabatic::AutoContacts_Collapsed". - - - void AutoContactStack::push ( AutoContact* contact, Segment* segment ) - { - ltrace(80) << "Stacking " << (void*)contact->getContact() << ":" << contact - << " + " << (void*)segment << ":" << segment << endl; - - push_back(make_pair(contact,segment)); - } - - - AutoContact* AutoContacts_Collapsed::Locator::getElement () const - { - return _stack.getAutoContact (); - } - - - void AutoContacts_Collapsed::Locator::progress () - { - AutoContact* sourceContact = _stack.getAutoContact (); - Segment* sourceSegment = _stack.getSegment (); - - _stack.pop (); - - forEach ( Hook*, ihook, sourceContact->getBodyHook()->getHooks() ) { - Segment* segment = NULL; - - if ( _direction & Constant::Horizontal ) segment = dynamic_cast(ihook->getComponent()); - else segment = dynamic_cast(ihook->getComponent()); - - if ( segment && (segment != sourceSegment) ) { - AutoSegment* autoSegment = Session::lookup ( segment ); - - if ( !autoSegment ) { - cerr << Error("Can't lookup for %s.",getString(segment).c_str()) << endl; - continue; - } - if ( !autoSegment->isCollapsed() ) continue; - - Hook* opposite = segment->getOppositeHook ( *ihook ); - AutoContact* targetContact = dynamic_cast(opposite->getMasterHook()->getComponent()); - - if ( targetContact ) _stack.push ( targetContact, segment ); - } - } - } - - - Hurricane::Locator* AutoContacts_Collapsed::Locator::getClone () const - { - return new Locator(*this); - } - - - bool AutoContacts_Collapsed::Locator::isValid () const - { - return _stack.isEmpty(); - } - - - string AutoContacts_Collapsed::Locator::_getString () const - { - string s = "<" + _TName("AutoContacts_Collapsed::Locator") - + getString(_stack.getAutoContact()) - + ">"; - return s; - } - - - Collection* AutoContacts_Collapsed::getClone () const - { - return new AutoContacts_Collapsed(*this); - } - - - Hurricane::Locator* AutoContacts_Collapsed::getLocator () const - { - return new Locator(_contact,_direction); - } - - - string AutoContacts_Collapsed::_getString () const - { - string s = "<" + _TName("AutoContacts_Collapsed") + " " - + getString(_contact) + " " - + getString(_direction) - + ">"; - return s; - } - - -} // End of Katabatic namespace. diff --git a/katabatic/src/AutoHorizontal.cpp b/katabatic/src/AutoHorizontal.cpp index 81791805..c022c096 100644 --- a/katabatic/src/AutoHorizontal.cpp +++ b/katabatic/src/AutoHorizontal.cpp @@ -2,14 +2,14 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved +// Copyright (c) UPMC 2008-2012, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./AutoHorizontal.cpp" | // +-----------------------------------------------------------------+ @@ -19,157 +19,15 @@ #include "hurricane/Bug.h" #include "hurricane/Error.h" #include "hurricane/DebugSession.h" +#include "hurricane/RoutingPad.h" #include "crlcore/RoutingGauge.h" #include "katabatic/Configuration.h" -#include "katabatic/AutoContact.h" +#include "katabatic/AutoContactTerminal.h" +#include "katabatic/AutoContactTurn.h" #include "katabatic/AutoHorizontal.h" #include "katabatic/AutoVertical.h" -namespace { - - using namespace std; - using namespace Hurricane; - using namespace Katabatic; - - - bool slacken ( AutoContact* contact ) - { - if ( contact->getLayer() != Session::getConfiguration()->getContactLayer(0) ) - return false; - - ltrace(200) << "Session::slacken(): " << contact << endl; - - vector hooks; - forEach ( Hook*, ihook, contact->getBodyHook()->getSlaveHooks() ) hooks.push_back ( *ihook ); - - contact->getBodyHook()->_setNextHook ( contact->getBodyHook() ); - for ( size_t i=0 ; i_setNextHook ( hooks[i] ); - - const Layer* paralLayer = Session::getConfiguration()->getRoutingLayer(1); - const Layer* perpandLayer = Session::getConfiguration()->getRoutingLayer(2); - const Layer* contactLayer = Session::getConfiguration()->getContactLayer(1); - AutoContact* contact1 = AutoContact::create ( contact->getGCell(), contact->getNet(), contactLayer ); - AutoContact* contact2 = AutoContact::create ( contact->getGCell(), contact->getNet(), contactLayer ); - - AutoSegment* hsegment = AutoHorizontal::create ( contact - , contact1 - , paralLayer - , contact->getY() - , DbU::lambda(2.0) - , AutoSegment::Local - , true // terminal - , false // collapsed - ); - - AutoSegment* vsegment = AutoVertical::create ( contact1 - , contact2 - , perpandLayer - , contact->getX() - , DbU::lambda(2.0) - , AutoSegment::Local - , false - , false - ); - - for ( size_t i=0 ; iattach ( contact2->getBodyHook() ); - - contact2->setVAlignate ( true ); - contact2->restoreHConnexity ( contact->getX(), true ); - - hsegment->setSlackened ( true ); - vsegment->setSlackened ( true ); - vsegment->setSlackenStrap ( true ); - - ltrace(200) << "Session::slacken() new paral: " << hsegment << endl; - ltrace(200) << "Session::slacken() perpand: " << vsegment << endl; - - return true; - } - - - void slacken ( AutoHorizontal* segment, bool fromSource ) - { - AutoContact* contact = NULL; - Point slackPoint; - if (fromSource) { - contact = segment->getAutoSource(); - slackPoint = Point ( segment->getSourceX(), segment->getSourceY() ); - } else { - contact = segment->getAutoTarget(); - slackPoint = Point ( segment->getTargetX(), segment->getTargetY() ); - } - if ( !contact ) return; - - forEach ( Vertical*, ivertical, contact->getSlaveComponents().getSubSet() ) { - AutoSegment* autoVertical = Session::lookup ( *ivertical ); - if ( autoVertical ) { - autoVertical->invalidate (); - if ( autoVertical->isGlobal() and not contact->getAnchor() ) return; - } - } - - if ( slacken(contact) ) return; - - size_t depth = Session::getRoutingGauge()->getLayerDepth ( segment->getLayer() ); - Layer* contactLayer = NULL; - const Layer* slackLayer = NULL; - - if ( depth+1 < Session::getRoutingGauge()->getDepth() ) { - contactLayer = Session::getRoutingGauge()->getContactLayer ( depth ); - slackLayer = Session::getRoutingGauge()->getRoutingLayer ( depth + 1 ); - } else { - contactLayer = Session::getRoutingGauge()->getContactLayer ( depth-1 ); - slackLayer = Session::getRoutingGauge()->getRoutingLayer ( depth ); - } - - if ( fromSource ) segment->getSourceHook()->detach (); - else segment->getTargetHook()->detach (); - - AutoContact* contact1 = AutoContact::create ( contact->getGCell(), segment->getNet(), contactLayer ); - AutoContact* contact2 = AutoContact::create ( contact->getGCell(), segment->getNet(), contactLayer ); - - AutoSegment* hsegment = AutoHorizontal::create ( contact - , contact1 - , segment->getLayer() - , slackPoint.getY() - , DbU::lambda(2.0) - , AutoSegment::Local - , false - , false - ); - - AutoSegment* vsegment = AutoVertical::create ( contact1 - , contact2 - , slackLayer - , slackPoint.getX() - , DbU::lambda(2.0) - , AutoSegment::Local - , false - , false - ); - - if ( fromSource ) - segment->getSourceHook()->attach ( contact2->getContact()->getBodyHook() ); - else - segment->getTargetHook()->attach ( contact2->getContact()->getBodyHook() ); - contact->restoreVConnexity ( slackPoint.getY(), true ); - - hsegment->setSlackened ( true ); - vsegment->setSlackened ( true ); - vsegment->setSlackenStrap ( true ); - - //contact->setVAlignate ( true ); - - ltrace(200) << "Session::slacken() new paral: " << hsegment << endl; - ltrace(200) << "Session::slacken() perpand: " << vsegment << endl; - ltrace(200) << "Session::slacken() original: " << segment << endl; - } - - -} // End of local namespace. - - namespace Katabatic { @@ -180,39 +38,48 @@ namespace Katabatic { using Hurricane::Error; using Hurricane::Bug; using Hurricane::DebugSession; + using Hurricane::RoutingPad; // ------------------------------------------------------------------- // Class : "Katabatic::AutoHorizontal". - AutoHorizontal::AutoHorizontal ( Horizontal* horizontal - , int type - , bool terminal - , bool collapsed - ) - : AutoSegment(horizontal,true,type,terminal,collapsed) + Segment* AutoHorizontal::base () { return _horizontal; } + Segment* AutoHorizontal::base () const { return _horizontal; } + Horizontal* AutoHorizontal::getHorizontal () { return _horizontal; } + DbU::Unit AutoHorizontal::getSourceU () const { return _horizontal->getSourceX(); } + DbU::Unit AutoHorizontal::getTargetU () const { return _horizontal->getTargetX(); } + DbU::Unit AutoHorizontal::getDuSource () const { return _horizontal->getDxSource(); } + DbU::Unit AutoHorizontal::getDuTarget () const { return _horizontal->getDxTarget(); } + Interval AutoHorizontal::getSpanU () const { return Interval(_horizontal->getSourceX(),_horizontal->getTargetX()); } + void AutoHorizontal::setDuSource ( DbU::Unit du ) { _horizontal->setDxSource(du); } + void AutoHorizontal::setDuTarget ( DbU::Unit du ) { _horizontal->setDxTarget(du); } + string AutoHorizontal::_getTypeName () const { return "AutoHorizontal"; } + + + AutoHorizontal::AutoHorizontal ( Horizontal* horizontal ) + : AutoSegment(horizontal) , _horizontal(horizontal) { - ltrace(99) << "Creating (before post-create): " << this << endl; + ltrace(99) << "CTOR AutoHorizontal " << this << endl; + ltrace(99) << " over " << horizontal << endl; } void AutoHorizontal::_postCreate () { AutoSegment::_postCreate (); - orient (); - setPositions (); AutoContact* source = getAutoSource(); - if ( source->isTerminal() ) source->setY ( _horizontal->getY() ); + if (source->isTerminal()) source->setY( _horizontal->getY() ); AutoContact* target = getAutoTarget(); - if ( target->isTerminal() ) target->setY ( _horizontal->getY() ); + if (target->isTerminal()) target->setY( _horizontal->getY() ); + + if (source->getGCell() != target->getGCell()) { + setFlags( SegGlobal ); - if ( source->getGCell() == target->getGCell() ) { - setGlobal ( false ); - } else { GCell* gcell; GCell* end; @@ -235,50 +102,9 @@ namespace Katabatic { } - AutoHorizontal* AutoHorizontal::create ( Horizontal* horizontal - , int type - , bool terminal - , bool collapsed - ) - { - AutoSegment::_preCreate ( horizontal->getSource(), horizontal->getTarget() ); - AutoHorizontal* autoHorizontal = new AutoHorizontal ( horizontal - , type - , terminal - , collapsed - ); - autoHorizontal->_postCreate (); - return autoHorizontal; - } - - - AutoHorizontal* AutoHorizontal::create ( AutoContact* source - , AutoContact* target - , const Layer* layer - , DbU::Unit y - , DbU::Unit width - , int type - , bool terminal - , bool collapsed - ) - { - AutoSegment::_preCreate ( source, target ); - AutoHorizontal* autoHorizontal - = new AutoHorizontal ( Horizontal::create ( source->getContact() - , target->getContact() - , layer - , y - , width ), type, terminal, collapsed ); - - autoHorizontal->_postCreate (); - - return autoHorizontal; - } - - void AutoHorizontal::_preDestroy () { - ltrace(200) << "AutoHorizontal::_preDestroy() - " << (void*)this << endl; + ltrace(200) << "AutoHorizontal::_preDestroy() - " << endl; ltrace(200) << " " << _getString() << endl; ltracein(90); @@ -316,15 +142,15 @@ namespace Katabatic { AutoHorizontal::~AutoHorizontal () { if ( Session::doDestroyBaseSegment() and not Session::doDestroyTool() ) { - ltrace(200) << "~AutoHorizontal() - " << (void*)_horizontal << endl; + ltrace(200) << "~AutoHorizontal() - " << endl; _horizontal->destroy (); } } - Interval AutoHorizontal::getSourceConstraints ( bool native ) const + Interval AutoHorizontal::getSourceConstraints ( unsigned int flags ) const { - if ( native ) { + if (flags & KbNativeConstraints) { Box nativeBox ( getAutoSource()->getNativeConstraintBox() ); return Interval ( nativeBox.getYMin(), nativeBox.getYMax() ); } @@ -332,9 +158,9 @@ namespace Katabatic { } - Interval AutoHorizontal::getTargetConstraints ( bool native ) const + Interval AutoHorizontal::getTargetConstraints ( unsigned int flags ) const { - if ( native ) { + if (flags & KbNativeConstraints) { Box nativeBox ( getAutoTarget()->getNativeConstraintBox() ); return Interval ( nativeBox.getYMin(), nativeBox.getYMax() ); } @@ -375,7 +201,7 @@ namespace Katabatic { unsigned int AutoHorizontal::getDirection () const - { return Constant::Horizontal; } + { return KbHorizontal; } size_t AutoHorizontal::getGCells ( vector& gcells ) const @@ -399,88 +225,190 @@ namespace Katabatic { bool AutoHorizontal::_canSlacken () const { + ltracein(200); + Interval sourceConstraints = Interval(getAutoSource()->getCBYMin(),getAutoSource()->getCBYMax()); Interval targetConstraints = Interval(getAutoTarget()->getCBYMin(),getAutoTarget()->getCBYMax()); // Ugly: should uses topRightShrink from GCell. - sourceConstraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); - targetConstraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + sourceConstraints.inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + targetConstraints.inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); - ltrace(200) << "source " << (void*)getAutoSource() << ":" << getAutoSource() << endl; + ltrace(200) << "source " << getAutoSource() << endl; ltrace(200) << "source constraints: " << sourceConstraints << " " << DbU::getValueString(sourceConstraints.getSize()) << endl; - ltrace(200) << "target " << (void*)getAutoTarget() << ":" << getAutoTarget() << endl; + ltrace(200) << "target " << getAutoTarget() << endl; ltrace(200) << "target constraints: " << targetConstraints << " " << DbU::getValueString(targetConstraints.getSize()) << endl; // Ugly: GCell's track number is hardwired. - if ( sourceConstraints.getSize() / DbU::lambda(5.0) < 10 ) return true; - if ( targetConstraints.getSize() / DbU::lambda(5.0) < 10 ) return true; + if (sourceConstraints.getSize() / DbU::lambda(5.0) < 10) { ltraceout(200); return true; } + if (targetConstraints.getSize() / DbU::lambda(5.0) < 10) { ltraceout(200); return true; } + ltraceout(200); return false; } - void AutoHorizontal::_slacken () + bool AutoHorizontal::_slacken ( unsigned int flags ) { ltrace(200) << "AutoHorizontal::_slacken() " << this << endl; + + if (not isStrongTerminal()) return false; + + const Configuration* configuration = Session::getConfiguration(); + const Layer* metal2 = configuration->getRoutingLayer( 1 ); + + bool success = false; + bool isMetal2Source = false; + bool isMetal2Target = false; + DbU::Unit height = 0; + AutoContact* source = getAutoSource(); + AutoContact* target = getAutoTarget(); + if (source->isTerminal()) { + height = (static_cast(source->getAnchor()))->getBoundingBox().getHeight(); + isMetal2Source = (source->getLayer() == metal2); + } + if (target->isTerminal()) { + height = std::min( height, (static_cast(target->getAnchor()))->getBoundingBox().getHeight() ); + isMetal2Target = (target->getLayer() == metal2); + } + + if (height >= 4*DbU::lambda(5.0)) { + if (not (_flags & (SegGlobal|SegWeakGlobal)) and (getLength() < 5*DbU::lambda(5.0))) + return false; + } + ltracein(200); + ltrace(200) << "_flags:" << (_flags & (SegGlobal|SegWeakGlobal)) << endl; + ltrace(200) << "test:" << (getLength() < DbU::lambda(5.0)*5) << endl; + ltrace(200) << "length:" << DbU::getValueString(getLength()) << endl; - AutoContact* contact = getAutoSource(); - Interval constraints = Interval(contact->getCBYMin(),contact->getCBYMax()); + int lowSlack = (flags & KbHalfSlacken) ? 3 : 10; + bool slackened = false; + bool halfSlackened = false; + DbU::Unit targetPosition = getTargetPosition(); + AutoSegment* parallel = this; - constraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + if (source->isTerminal()) { + Interval perpandConstraints = getAutoTarget()->getUConstraints(KbHorizontal); + Interval constraints = source->getUConstraints (KbVertical).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + Interval nativeConstraints = source->getNativeUConstraints(KbVertical).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + int slack = constraints.getSize() / DbU::lambda(5.0); + int nativeSlack = nativeConstraints.getSize() / DbU::lambda(5.0); - // Ugly: GCell's track number is hardwired. - if ( constraints.getSize() / DbU::lambda(5.0) < 10 ) ::slacken ( this, true ); + ltrace(200) << "Source constraint: " << constraints + << " slack:" << slack + << " native slack:" << nativeSlack << endl; + ltrace(200) << "Perpand constraints on target: " << perpandConstraints << endl; + // Ugly: GCell's track number is hardwired. + if ((nativeSlack < lowSlack) or (nativeSlack - slack < 3)) { + ltrace(200) << "Slackening from Source: " << source << endl; + _makeDogleg( source->getGCell(), KbNoFlags ); + slackened = true; + } else if (slack < 10) { + halfSlackened = true; + } - contact = getAutoTarget (); - constraints = Interval(contact->getCBYMin(),contact->getCBYMax()); - constraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + const vector& doglegs = Session::getDoglegs(); + if (doglegs.size() >= 2) { + ltrace(200) << "AutoSegment::_slaken(): Source @" << DbU::getValueString(getSourcePosition()) << endl; + doglegs[doglegs.size()-2]->setAxis( getSourcePosition() ); + success = true; - if ( constraints.getSize() / DbU::lambda(5.0) < 10 ) ::slacken ( this, false ); + if (isMetal2Source) { + ltrace(200) << "Fixing on source terminal contact." << endl; + doglegs[doglegs.size()-2]->getAutoSource()->setFlags( CntFixed ); + } - setSlackened ( true ); + parallel = doglegs[ doglegs.size()-1 ]; + } + } + if (parallel) target = parallel->getAutoTarget(); + + if (target->isTerminal()) { + Interval constraints = target->getUConstraints (KbVertical).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + Interval nativeConstraints = target->getNativeUConstraints(KbVertical).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + int slack = constraints.getSize() / DbU::lambda(5.0); + int nativeSlack = nativeConstraints.getSize() / DbU::lambda(5.0); + + // Ugly: GCell's track number is hardwired. + ltrace(200) << "Target constraint: " << constraints + << " slack:" << slack + << " native slack:" << nativeSlack << endl; + if ((nativeSlack < lowSlack) or (nativeSlack - slack < 3)) { + ltrace(200) << "Slackening from Target: " << target << endl; + parallel->_makeDogleg( target->getGCell(), KbNoFlags ); + slackened = true; + } else if (slack < 10) { + halfSlackened = true; + } + + if (halfSlackened) { + setFlags( SegHalfSlackened ); + } else if (slackened) { + setFlags ( SegSlackened ); + unsetFlags( SegHalfSlackened ); + } + + const vector& doglegs = Session::getDoglegs(); + if (doglegs.size() >= 2) { + ltrace(200) << "AutoSegment::_slaken(): Target @" << DbU::getValueString(targetPosition) << endl; + doglegs[doglegs.size()-2]->setAxis( targetPosition ); + success = true; + + if (isMetal2Target) { + ltrace(200) << "Fixing on target terminal contact." << endl; + doglegs[doglegs.size()-2]->getAutoTarget()->setFlags( CntFixed ); + } + } + } ltraceout(200); + + return success; } - bool AutoHorizontal::canDesalignate ( AutoContact* contact ) const - { return contact->canHDesalignate(); } - - - void AutoHorizontal::desalignate ( AutoContact* contact ) - { contact->hDesalignate(); } - - - void AutoHorizontal::alignate ( DbU::Unit axis ) + void AutoHorizontal::_setAxis ( DbU::Unit axis ) { - if ( _horizontal->getY() == axis ) return; + setFlags( SegAxisSet ); - ltrace(80) << "alignate() " << (void*)this << " " << this << " @Y " << DbU::getLambda(axis) << endl; + if ((axis != getAxis()) and isFixed()) { + cerr << Error( "AutoHorizontal::setAxis(): Cannot move fixed segment to %s.\n" + " (on: %s)" + , DbU::getValueString(axis).c_str() + , _getString().c_str() + ) << endl; + } - _horizontal->setY ( axis ); - invalidate (); + if (_horizontal->getY() == axis) return; + + ltrace(80) << "_setAxis() @Y " << DbU::getLambda(axis) << " " << this << endl; + + _horizontal->setY( axis ); + invalidate(); AutoContact* anchor = getAutoSource(); - anchor->invalidate (); - if ( anchor->isTerminal() ) anchor->setY ( axis ); + anchor->invalidate(); + if (anchor->isTerminal()) anchor->setY( axis ); anchor = getAutoTarget(); - anchor->invalidate (); - if ( anchor->isTerminal() ) anchor->setY ( axis ); + anchor->invalidate(); + if (anchor->isTerminal()) anchor->setY( axis ); } - void AutoHorizontal::orient () + void AutoHorizontal::updateOrient () { - if ( _horizontal->getTargetX() < _horizontal->getSourceX() ) - _horizontal->invert (); + if (_horizontal->getTargetX() < _horizontal->getSourceX()) { + ltrace(80) << "updateOrient() " << this << " (before S/T swap)" << endl; + _horizontal->invert(); + } } - void AutoHorizontal::setPositions () + void AutoHorizontal::updatePositions () { _sourcePosition = _horizontal->getSourceX() - Session::getExtensionCap(); _targetPosition = _horizontal->getTargetX() + Session::getExtensionCap(); @@ -522,14 +450,16 @@ namespace Katabatic { Interval sourceConstraints = Interval(getAutoSource()->getCBYMin(),getAutoSource()->getCBYMax()); Interval targetConstraints = Interval(getAutoTarget()->getCBYMin(),getAutoTarget()->getCBYMax()); - if ( !sourceConstraints.intersect(targetConstraints) ) { - cerr << Error ( "%p:%s\n Constraints incoherency: S:%p:%s, T:%p:%s" - , (void*)base() + + if (not sourceConstraints.intersect(targetConstraints)) { + cerr << Error ( "%s\n Constraints incoherency:\n" + " S:%s %s\n" + " T:%s %s" , _getString().c_str() - , getAutoSource()->getContact() , getString(sourceConstraints).c_str() - , getAutoTarget()->getContact() + , getString(getAutoSource()).c_str() , getString(targetConstraints).c_str() + , getString(getAutoTarget()).c_str() ) << endl; return false; } @@ -538,261 +468,306 @@ namespace Katabatic { } - void AutoHorizontal::_computeTerminal () + bool AutoHorizontal::canMoveULeft ( float reserve ) const { - _computeTerminal(_horizontal); + //cerr << "canMoveULeft() " << this << endl; - ltrace(99) << "_computeTerminal() S:" << getAutoSource()->isTerminal() - << " T:" << getAutoTarget()->isTerminal() - << " " << this << endl; + if (not isGlobal()) return false; + if (not getAutoSource()->isTurn() or not getAutoTarget()->isTurn()) return false; + if (not getAutoSource()->getGCell()->getDown()) return false; + + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + AutoSegment* perpandiculars[2] = { autoSource->getSegment(0), autoTarget->getSegment(0) }; + + if ( ( (not perpandiculars[0]->isGlobal()) or (perpandiculars[0]->getAutoSource() == autoSource) ) + and ( (not perpandiculars[1]->isGlobal()) or (perpandiculars[1]->getAutoSource() == autoTarget) ) ) + return false; + + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + unsigned int depth = Session::getRoutingGauge()->getLayerDepth( getLayer() ); + float currMaxDensity = 0.0; + float leftMaxDensity = 0.0; + + //cerr << "| begin:" << begin << endl; + //cerr << "| end: " << end << endl; + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getRight() ) { + //cerr << "| gcell:" << gcell << endl; + if (currMaxDensity < gcell->getWDensity(depth)) currMaxDensity = gcell->getWDensity( depth ); + } + + begin = begin->getDown(); + end = end ->getDown(); + + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getRight() ) { + if (leftMaxDensity < gcell->getWDensity(depth)) leftMaxDensity = gcell->getWDensity( depth ); + } + + return (leftMaxDensity + reserve < currMaxDensity); } - void AutoHorizontal::moveULeft () + bool AutoHorizontal::canMoveURight ( float reserve ) const { - if ( not getAutoSource()->isCorner() or not getAutoTarget()->isCorner() ) return; - if ( not getAutoSource()->getGCell()->getDown() ) return; + //cerr << "canMoveURight() " << this << endl; - Session::setInvalidateMask ( Session::RestoreHCon|Session::NetCanonize ); - Session::invalidate ( getNet() ); + if (not isGlobal()) return false; + if (not getAutoSource()->isTurn() or not getAutoTarget()->isTurn()) return false; + if (not getAutoSource()->getGCell()->getUp()) return false; - AutoContact* autoSource = getAutoSource(); - AutoContact* autoTarget = getAutoTarget(); - GCell* begin = autoSource->getGCell(); - GCell* end = autoTarget->getGCell(); + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + AutoSegment* perpandiculars[2] = { autoSource->getSegment(0), autoTarget->getSegment(0) }; - forEach ( Vertical*, isegment, autoSource->getSlaveComponents().getSubSet() ) { - AutoSegment* segment = Session::lookup ( *isegment ); - if ( segment->isLocal() ) { - segment->setGlobal ( true ); - continue; - } + if ( ( (not perpandiculars[0]->isGlobal()) or (perpandiculars[0]->getAutoTarget() == autoSource) ) + and ( (not perpandiculars[1]->isGlobal()) or (perpandiculars[1]->getAutoTarget() == autoTarget) ) ) + return false; - if ( segment->getAutoSource() == autoSource ) { - begin->addVSegment ( segment ); + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + unsigned int depth = Session::getRoutingGauge()->getLayerDepth( getLayer() ); + float currMaxDensity = 0.0; + float leftMaxDensity = 0.0; + + //cerr << "| begin:" << begin << endl; + //cerr << "| end: " << end << endl; + + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getRight() ) { + //cerr << "| gcell: " << gcell << endl; + if (currMaxDensity < gcell->getWDensity(depth)) currMaxDensity = gcell->getWDensity( depth ); + } + + begin = begin->getUp(); + end = end ->getUp(); + + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getRight() ) { + if (leftMaxDensity < gcell->getWDensity(depth)) leftMaxDensity = gcell->getWDensity( depth ); + } + + return (leftMaxDensity + reserve < currMaxDensity); + } + + + bool AutoHorizontal::moveULeft () + { + if (not getAutoSource()->isTurn() or not getAutoTarget()->isTurn()) return false; + if (not getAutoSource()->getGCell()->getDown()) return false; + + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + AutoSegment* perpandicular = autoSource->getSegment(2); + + if (perpandicular->isLocal()) { + perpandicular->setFlags( Katabatic::SegGlobal ); + } else { + if (perpandicular->getAutoSource() == autoSource) { + begin->addVSegment( perpandicular ); } else { - if ( begin->getDown() == segment->getAutoSource()->getGCell() ) { - segment->setGlobal ( false ); - segment->getAutoSource()->invalidate (); + if (begin->getDown() == perpandicular->getAutoSource()->getGCell()) { + perpandicular->unsetFlags( Katabatic::SegGlobal ); } else - begin->getDown()->removeVSegment ( segment ); + begin->getDown()->removeVSegment( perpandicular ); } } - forEach ( Vertical*, isegment, autoTarget->getSlaveComponents().getSubSet() ) { - AutoSegment* segment = Session::lookup ( *isegment ); - if ( segment->isLocal() ) { - segment->setGlobal ( true ); - continue; - } - - if ( segment->getAutoSource() == autoTarget ) { - begin->addVSegment ( segment ); + perpandicular = autoTarget->getSegment(2); + if (perpandicular->isLocal()) { + perpandicular->setFlags( Katabatic::SegGlobal ); + } else { + if (perpandicular->getAutoSource() == autoTarget) { + end->addVSegment( perpandicular ); } else { - if ( end->getDown() == segment->getAutoSource()->getGCell() ) { - segment->setGlobal ( false ); - segment->getAutoSource()->invalidate (); + if (end->getDown() == perpandicular->getAutoSource()->getGCell()) { + perpandicular->unsetFlags( Katabatic::SegGlobal ); } else - end->getDown()->removeVSegment ( segment ); + end->getDown()->removeVSegment( perpandicular ); } } - if ( begin != end ) { - for ( GCell* gcell = begin->getLeft() ; gcell != end ; gcell = gcell->getLeft() ) - gcell->removeHSegment ( this ); + if (begin != end) { + for ( GCell* gcell=begin->getRight() ; gcell and gcell!=end ; gcell=gcell->getRight() ) + gcell->removeHSegment( this ); } begin = begin->getDown(); end = end ->getDown(); - autoSource->setGCell ( begin ); - autoTarget->setGCell ( end ); - if ( begin != end ) { - for ( GCell* gcell = begin->getLeft() ; gcell != end ; gcell = gcell->getLeft() ) - gcell->addHSegment ( this ); + autoSource->setGCell( begin ); + autoTarget->setGCell( end ); + if (begin != end) { + for ( GCell* gcell=begin->getRight() ; gcell and gcell!=end ; gcell=gcell->getRight() ) + gcell->addHSegment( this ); } - DbU::Unit y = begin->getUSide(Constant::Vertical).getVMax(); - setAxis ( y ); + DbU::Unit y = begin->getSide(KbVertical).getVMax(); + setAxis( y ); - Session::revalidateTopology (); + return true; } - void AutoHorizontal::moveURight () + bool AutoHorizontal::moveURight () { - if ( not getAutoSource()->isCorner() or not getAutoTarget()->isCorner() ) return; - if ( not getAutoSource()->getGCell()->getUp() ) return; + //cerr << "moveURight() " << this << endl; - Session::setInvalidateMask ( Session::RestoreVCon|Session::NetCanonize ); - Session::invalidate ( getNet() ); + if (not getAutoSource()->isTurn() or not getAutoTarget()->isTurn()) return false; + if (not getAutoSource()->getGCell()->getUp()) return false; - AutoContact* autoSource = getAutoSource(); - AutoContact* autoTarget = getAutoTarget(); - GCell* begin = autoSource->getGCell(); - GCell* end = autoTarget->getGCell(); + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + AutoSegment* perpandicular = autoSource->getSegment(2); - forEach ( Vertical*, isegment, autoSource->getSlaveComponents().getSubSet() ) { - AutoSegment* segment = Session::lookup ( *isegment ); - if ( segment->isLocal() ) { - segment->setGlobal ( true ); - continue; - } - - if ( segment->getAutoTarget() == autoSource ) { - begin->addVSegment ( segment ); + if (perpandicular->isLocal()) { + perpandicular->setFlags( Katabatic::SegGlobal ); + } else { + if (perpandicular->getAutoTarget() == autoSource) { + begin->addVSegment( perpandicular ); } else { - if ( begin->getUp() == segment->getAutoTarget()->getGCell() ) { - segment->setGlobal ( false ); - segment->getAutoTarget()->invalidate (); + if (begin->getUp() == perpandicular->getAutoTarget()->getGCell()) { + perpandicular->unsetFlags( Katabatic::SegGlobal ); } else - begin->getUp()->removeVSegment ( segment ); + begin->getUp()->removeVSegment( perpandicular ); } } - forEach ( Vertical*, isegment, autoTarget->getSlaveComponents().getSubSet() ) { - AutoSegment* segment = Session::lookup ( *isegment ); - if ( segment->isLocal() ) { - segment->setGlobal ( true ); - continue; - } - - if ( segment->getAutoTarget() == autoTarget ) { - begin->addVSegment ( segment ); + perpandicular = autoTarget->getSegment(2); + if (perpandicular->isLocal()) { + perpandicular->setFlags( Katabatic::SegGlobal ); + } else { + if (perpandicular->getAutoTarget() == autoTarget) { + end->addVSegment( perpandicular ); } else { - if ( end->getUp() == segment->getAutoTarget()->getGCell() ) { - segment->setGlobal ( false ); - segment->getAutoTarget()->invalidate (); + if (end->getUp() == perpandicular->getAutoTarget()->getGCell()) { + perpandicular->unsetFlags( Katabatic::SegGlobal ); } else - end->getUp()->removeVSegment ( segment ); + end->getUp()->removeVSegment( perpandicular ); } } - if ( begin != end ) { - for ( GCell* gcell = begin->getLeft() ; gcell != end ; gcell = gcell->getLeft() ) - gcell->removeHSegment ( this ); + //cerr << "| begin:" << begin << endl; + //cerr << "| end: " << end << endl; + + //cerr << "* remove" << endl; + if (begin != end) { + for ( GCell* gcell=begin->getRight() ; gcell and gcell!=end ; gcell=gcell->getRight() ) { + //cerr << "| gcell: " << end << endl; + gcell->removeHSegment( this ); + } } begin = begin->getUp(); end = end ->getUp(); - autoSource->setGCell ( begin ); - autoTarget->setGCell ( end ); - if ( begin != end ) { - for ( GCell* gcell = begin->getLeft() ; gcell != end ; gcell = gcell->getLeft() ) - gcell->addHSegment ( this ); + autoSource->setGCell( begin ); + autoTarget->setGCell( end ); + //cerr << "* add" << endl; + if (begin != end) { + for ( GCell* gcell=begin->getRight() ; gcell and gcell!=end ; gcell=gcell->getRight() ) { + //cerr << "| gcell: " << end << endl; + gcell->addHSegment( this ); + } } - DbU::Unit y = begin->getUSide(Constant::Vertical).getVMin(); - setAxis ( y ); + DbU::Unit y = begin->getSide( KbVertical ).getVMin(); + setAxis( y ); - Session::revalidateTopology (); + return true; } - void AutoHorizontal::_makeDogLeg ( GCell* dogLegGCell, bool upLayer ) + unsigned int AutoHorizontal::_makeDogleg ( GCell* doglegGCell, unsigned int flags ) { - DebugSession::open ( getNet(), 110 ); + ltrace(200) << "AutoHorizontal::_makeDogleg(GCell*)" << endl; + + DebugSession::open( getNet(), 110 ); ltracein(159); - Session::dogLegReset (); + //Session::doglegReset(); AutoContact* autoTarget = getAutoTarget(); AutoContact* autoSource = getAutoSource(); GCell* begin = autoSource->getGCell(); GCell* end = autoTarget->getGCell(); - unsigned int fragmentType = AutoSegment::Global; - unsigned int splittedType = AutoSegment::Global; - //DbU::Unit dogLegAxis = (detachSource)?dogLegGCell->getXMax():dogLegGCell->getX(); - DbU::Unit dogLegAxis = (dogLegGCell->getXMax() + dogLegGCell->getX()) / 2; - if ( isLocal() ) - dogLegAxis = (getSourceX() + getTargetX()) / 2; + DbU::Unit doglegAxis = (doglegGCell->getXMax() + doglegGCell->getX()) / 2; + if (isLocal()) + doglegAxis = (getSourceX() + getTargetX()) / 2; - ltrace(159) << "Detaching Target AutoContact " - << (void*)autoTarget->getContact() << ":" - << autoTarget->getContact() << "." << endl; - if ( end == dogLegGCell ) { - fragmentType = AutoSegment::Local; - } - if ( begin == dogLegGCell ) { - setGlobal ( false ); - splittedType = AutoSegment::Local; - } + ltrace(159) << "Detaching from Target AutoContact " << autoTarget << "." << endl; - autoTarget->invalidate (); - autoTarget->setInvalidatedTopology ( true ); - - if ( dogLegGCell != end ) { - GCell* gcell = dogLegGCell; + if (doglegGCell == begin) unsetFlags( SegGlobal ); + if (doglegGCell != end) { + GCell* gcell = doglegGCell; do { - if ( gcell != begin ) - gcell->removeHSegment ( this ); - gcell = gcell->getRight (); - } while ( gcell && (gcell != end) ); + if (gcell != begin) + gcell->removeHSegment( this ); + gcell = gcell->getRight(); + } while ( gcell and (gcell != end) ); } - Session::dogLeg ( this ); + size_t depth = Session::getRoutingGauge()->getLayerDepth( _horizontal->getLayer() ); + bool upLayer = (depth+1 < Session::getRoutingGauge()->getDepth()); + Layer* contactLayer = Session::getRoutingGauge()->getContactLayer( depth + ((upLayer)?0:-1) ); + const Layer* doglegLayer = Session::getRoutingGauge()->getRoutingLayer( depth + ((upLayer)?1:-1) ); - size_t depth = Session::getRoutingGauge()->getLayerDepth ( _horizontal->getLayer() ); - Layer* contactLayer = Session::getRoutingGauge()->getContactLayer ( depth + ((upLayer)?0:-1) ); - const Layer* dogLegLayer = Session::getRoutingGauge()->getRoutingLayer ( depth + ((upLayer)?1:-1) ); + Session::dogleg( this ); + targetDetach(); + invalidate(); + autoTarget->invalidate( KbTopology ); + AutoContact* dlContact1 = AutoContactTurn::create( doglegGCell, _horizontal->getNet(), contactLayer ); + AutoContact* dlContact2 = AutoContactTurn::create( doglegGCell, _horizontal->getNet(), contactLayer ); + AutoSegment* segment1 = AutoSegment::create( dlContact1 , dlContact2, KbVertical ); + segment1->setLayer( doglegLayer ); + segment1->_setAxis( doglegAxis ); + segment1->setFlags( SegDogleg|SegSlackened|SegCanonical|SegNotAligned ); - _horizontal->getTargetHook()->detach (); + ltrace(200) << "New " << dlContact1 << endl; + ltrace(200) << "New " << dlContact2 << endl; + Session::dogleg( segment1 ); - AutoContact* dlContact1 = AutoContact::create ( dogLegGCell, _horizontal->getNet(), contactLayer ); - AutoContact* dlContact2 = AutoContact::create ( dogLegGCell, _horizontal->getNet(), contactLayer ); - AutoSegment* segment1 = AutoVertical::create ( dlContact1 - , dlContact2 - , dogLegLayer - , dogLegAxis - , DbU::lambda(2.0) - , AutoSegment::Local - , false - , false - ); - segment1->setDogleg ( true ); + targetAttach( dlContact1 ); + AutoSegment* segment2 = AutoSegment::create( dlContact2 , autoTarget, KbHorizontal ); + autoTarget->cacheAttach( segment2 ); + segment2->setLayer( getLayer() ); + segment2->_setAxis( getY() ); + segment2->setFlags( (isSlackened()?SegSlackened:0) ); + Session::dogleg( segment2 ); - ltrace(200) << "New " << (void*)dlContact1->getContact() << ":" << dlContact1->getContact() << "." << endl; - ltrace(200) << "New " << (void*)dlContact2->getContact() << ":" << dlContact2->getContact() << "." << endl; - ltrace(200) << "Session::dogLeg[1] perpand: " << segment1 << endl; - Session::dogLeg ( segment1 ); - - _horizontal->getTargetHook()->attach ( dlContact1->getContact()->getBodyHook() ); - AutoSegment* segment2 = AutoHorizontal::create ( dlContact2 - , autoTarget - , getLayer() - , getY() - , DbU::lambda(2.0) - , fragmentType - , false - , false - ); - segment2->setAxis ( getY(), AxisSet ); - ltrace(200) << "Session::dogLeg[2] new paral: " << segment2 << endl; - ltrace(200) << "Session::dogLeg[0] original: " << this << endl; - Session::dogLeg ( segment2 ); - - setGlobal ( (splittedType == AutoSegment::Global) ); - - if ( (splittedType == AutoSegment::Global) or ( fragmentType == AutoSegment::Global ) ) { - if ( splittedType == AutoSegment::Local ) autoSource->restoreVConnexity ( getY(), true ); - else autoTarget->restoreVConnexity ( getY(), true ); + if (isStrongTerminal()) { + if (autoSource->getAnchor()) { + segment1->setFlags( SegWeakTerminal1 ); + segment2->setFlags( SegWeakTerminal1 ); + } else { + unsetFlags( SegStrongTerminal ); + setFlags( SegWeakTerminal1 ); + segment1->setFlags( SegWeakTerminal1 ); + segment2->setFlags( SegStrongTerminal ); + } + } else if (isWeakTerminal()) { + segment1->setFlags( SegWeakTerminal1 ); + segment2->setFlags( SegWeakTerminal1 ); } - setTerminal ( false ); - segment2->setTerminal ( false ); - if ( autoSource->getAnchor() and not isGlobal() ) setTerminal ( true ); - if ( autoTarget->getAnchor() and not segment2->isGlobal() ) segment2->setTerminal ( true ); + ltrace(200) << "Session::dogleg[x+1] perpand: " << segment1 << endl; + ltrace(200) << "Session::dogleg[x+2] new paral: " << segment2 << endl; + ltrace(200) << "Session::dogleg[x+0] original: " << this << endl; - segment1->setSlackened ( true ); - segment2->setSlackened ( isSlackened() ); + dlContact1->updateCache(); + dlContact2->updateCache(); + //autoTarget->updateCache(); - Session::invalidate ( getNet() ); - Session::revalidateTopology (); + segment2->canonize( flags ); + if (not isCanonical()) canonize( flags ); ltraceout(159); - DebugSession::close (); + DebugSession::close(); + + return (upLayer) ? KbUseAboveLayer : KbUseBelowLayer; } diff --git a/katabatic/src/AutoSegment.cpp b/katabatic/src/AutoSegment.cpp index aeb475c2..1ea1eb39 100644 --- a/katabatic/src/AutoSegment.cpp +++ b/katabatic/src/AutoSegment.cpp @@ -2,34 +2,33 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./AutoSegment.cpp" | // +-----------------------------------------------------------------+ -#include "hurricane/Warning.h" -#include "hurricane/Bug.h" -#include "hurricane/DataBase.h" -#include "hurricane/Technology.h" -#include "hurricane/Horizontal.h" -#include "hurricane/Vertical.h" -#include "crlcore/RoutingGauge.h" - -#include "katabatic/Session.h" -#include "katabatic/AutoContact.h" -#include "katabatic/AutoSegment.h" -#include "katabatic/AutoHorizontal.h" -#include "katabatic/AutoVertical.h" -#include "katabatic/GCell.h" -#include "katabatic/KatabaticEngine.h" +#include "hurricane/Warning.h" +#include "hurricane/Bug.h" +#include "hurricane/DataBase.h" +#include "hurricane/Technology.h" +#include "hurricane/Horizontal.h" +#include "hurricane/Vertical.h" +#include "crlcore/RoutingGauge.h" +#include "katabatic/Session.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/AutoHorizontal.h" +#include "katabatic/AutoVertical.h" +#include "katabatic/GCell.h" +#include "katabatic/KatabaticEngine.h" namespace { @@ -131,13 +130,13 @@ namespace { AutoSegment* segment = NULL; size_t segmentCount = 0; forEach ( Component*, icomponent, terminalContact->getSlaveComponents() ) { - if ( *icomponent == autoSegment->getSegment() ) continue; + if ( *icomponent == autoSegment->base() ) continue; Segment* connex = dynamic_cast(*icomponent); if ( !connex ) continue; segment = Session::lookup ( connex ); - if ( !segment || !segment->isTerminal() ) continue; + if ( not segment or not segment->isWeakTerminal() ) continue; segmentCount++; } @@ -310,22 +309,90 @@ namespace Katabatic { unsigned long AutoSegment::_maxId = 0; - DbU::Unit AutoSegment::getX () const + AutoSegment::AutoSegment ( Segment* segment ) + : _id (segment->getId()) + , _flags (SegCreated) + , _optimalMin (0) + , _sourcePosition (0) + , _targetPosition (0) + , _userConstraints(false) + , _parent (NULL) + , _observers () { - return getSegment()->getX(); + AutoContact* source = Session::lookup(dynamic_cast(segment->getSource())); + AutoContact* target = Session::lookup(dynamic_cast(segment->getTarget())); + + _allocateds++; + + if (dynamic_cast(segment)) setFlags( SegHorizontal ); + if (source->isTerminal() or target->isTerminal()) setFlags( SegStrongTerminal ); + + _gcell = source->getGCell(); + setOptimalMax ( isHorizontal() ? _gcell->getBoundingBox().getYMax() + : _gcell->getBoundingBox().getXMax() ); + + _globalsCount += isGlobal() ? 1 : 0; + + source->invalidate( KbTopology ); } + void AutoSegment::_preCreate ( AutoContact* source, AutoContact* target ) + { + if ( (source == NULL) or (target == NULL) ) + throw Error( badAutoSegmentAnchor + , ((source)?getString(source).c_str():"NULL") + , ((target)?getString(target).c_str():"NULL") + ); + + if (source == target) + throw Error( dupAutoSegmentAnchor, getString(source).c_str() ); + } + + + void AutoSegment::_postCreate () + { + Session::invalidate( getNet() ); + Session::link( this ); + updateOrient(); + updatePositions(); + invalidate( KbNoFlags ); + //sourceAttach( getAutoSource() ); + //targetAttach( getAutoTarget() ); + + _observers.notify( Create ); + } + + + void AutoSegment::_preDestroy () + { + ltrace(200) << "AutoSegment::_preDestroy() - " << (void*)this << endl; + ltracein(90); + + _observers.notify( Destroy ); + + Session::unlink( this ); + ltraceout(90); + } + + + AutoSegment::~AutoSegment () + { + _allocateds--; + if ( isGlobal() and (_globalsCount > 0) ) _globalsCount--; + } + + + DbU::Unit AutoSegment::getX () const + { return base()->getX(); } + + DbU::Unit AutoSegment::getY () const - { - return getSegment()->getY(); - } + { return base()->getY(); } AutoContact* AutoSegment::getOppositeAnchor ( AutoContact* anchor ) const - { - return Session::lookup(static_cast(getOppositeAnchor(anchor->getContact()))); - } + { return Session::lookup(static_cast(getOppositeAnchor(anchor->base()))); } Interval& AutoSegment::getOptimal ( Interval& i ) const @@ -336,54 +403,80 @@ namespace Katabatic { } - bool AutoSegment::checkInvalidated () const + bool AutoSegment::checkNotInvalidated () const { - if ( isInvalidated() ) + if (isInvalidated()) cerr << Error("%s is invalidated.",getString(this).c_str()) << endl; - return !isInvalidated(); + return not isInvalidated(); } - void AutoSegment::invalidate () + void AutoSegment::invalidate ( unsigned int flags ) { - if ( Session::doDestroyTool() ) return; + if (Session::doDestroyTool()) return; + if (isInvalidated()) return; - _invalidate (); - forEach ( AutoSegment*, isegment, getCollapseds() ) - isegment->_invalidate (); + ltrace(200) << "AutoSegment::invalidate() " << flags << " " << this << endl; + ltracein(200); + + _invalidate(); + if ((flags & KbPropagate) and not isNotAligned()) { + forEach( AutoSegment*, isegment, getAligneds() ) + isegment->_invalidate(); + } + ltraceout(200); } void AutoSegment::_invalidate () { - if ( !isInvalidated() ) { - ltrace(110) << "AutoSegment::_invalidate() " << this << endl; + if (isInvalidated()) return; + ltrace(110) << "AutoSegment::_invalidate() " << this << endl; - setInvalidated ( true ); - Session::invalidate ( this ); - } + setFlags( SegInvalidated ); + Session::invalidate( this ); + + _observers.notify( Invalidate ); } void AutoSegment::revalidate () { ltrace(110) << "AutoSegment::revalidate() " << this << endl; + if (not isInvalidated()) return; + ltracein(110); - setPositions (); - setInvalidated ( false ); + updateOrient(); + updatePositions(); + unsetFlags( SegInvalidated|SegInvalidatedLayer|SegCreated ); + + _observers.notify( Revalidate ); ltraceout(110); } + bool AutoSegment::isStrongTerminal ( unsigned int flags ) const + { + if (_flags & SegStrongTerminal) return true; + + if ((flags & KbPropagate) and not isNotAligned()) { + forEach( AutoSegment*, isegment, const_cast(this)->getAligneds() ) { + if (isegment->_flags & SegStrongTerminal) return true; + } + } + return false; + } + + DbU::Unit AutoSegment::getSlack () const { DbU::Unit constraintMin; DbU::Unit constraintMax; - getConstraints ( constraintMin, constraintMax ); + getConstraints( constraintMin, constraintMax ); return constraintMax - constraintMin; } @@ -392,12 +485,10 @@ namespace Katabatic { DbU::Unit AutoSegment::getCost ( DbU::Unit axis ) const { DbU::Unit optimal = getOptimalMin(); - if ( axis < optimal ) - return optimal - axis; + if (axis < optimal) return optimal - axis; optimal = getOptimalMax(); - if ( axis > optimal ) - return axis - optimal; + if (axis > optimal) return axis - optimal; return 0; } @@ -405,10 +496,14 @@ namespace Katabatic { AutoSegment* AutoSegment::getCanonical ( DbU::Unit& min, DbU::Unit& max ) { + ltrace(89) << "AutoSegment::getCanonical() - " << this << endl; + min = getSourcePosition (); max = getTargetPosition (); - if ( max < min ) swap ( min, max ); + if (max < min) swap( min, max ); + + //ltrace(89) << "[" << DbU::getValueString(min) << " " << DbU::getValueString(max) << "]" << endl; AutoSegment* canonical = this; size_t canonicals = isCanonical(); @@ -416,30 +511,34 @@ namespace Katabatic { DbU::Unit collapsedMin; DbU::Unit collapsedMax; - forEach ( AutoSegment*, isegment, getCollapseds() ) { - if ( isegment->isCanonical() ) { - canonical = *isegment; - canonicals++; + if (not isNotAligned()) { + forEach( AutoSegment*, isegment, getAligneds() ) { + if (isegment->isCanonical()) { + canonical = *isegment; + canonicals++; + } + + collapsedMin = isegment->getSourcePosition(); + collapsedMax = isegment->getTargetPosition(); + if (collapsedMax < collapsedMin) swap( collapsedMin, collapsedMax ); + if (collapsedMin < min) min = collapsedMin; + if (collapsedMax > max) max = collapsedMax; + + aligneds++; } + //ltrace(89) << "[" << DbU::getValueString(min) << " " << DbU::getValueString(max) << "]" << endl; + ltrace(89) << "Canonical: " << canonical << endl; - collapsedMin = isegment->getSourcePosition(); - collapsedMax = isegment->getTargetPosition(); - if ( collapsedMax < collapsedMin ) swap ( collapsedMin, collapsedMax ); - if ( collapsedMin < min ) min = collapsedMin; - if ( collapsedMax > max ) max = collapsedMax; + if ( (canonicals > 1) or ( not canonicals and (aligneds > 2) ) ) { + cerr << Bug("AutoSegment::getCanonical(): %p:%s" + "\n Bad canonization: %d canonicals out of %d collapseds." + , base(), _getString().c_str(), canonicals, aligneds ) << endl; - aligneds++; - } - - if ( (canonicals > 1) || ( !canonicals && (aligneds > 2) ) ) { - cerr << Bug("AutoSegment::getCanonical(): %p:%s" - "\n Bad canonization: %d canonicals out of %d collapseds." - , base(), _getString().c_str(), canonicals, aligneds ) << endl; - - int count = 0; - cerr << " " << count++ << ": " << this << endl; - forEach ( AutoSegment*, isegment, getCollapseds() ) - cerr << " " << count++ << ": " << *isegment << endl; + int count = 0; + cerr << " " << count++ << ": " << this << endl; + forEach( AutoSegment*, isegment, getAligneds() ) + cerr << " " << count++ << ": " << *isegment << endl; + } } return canonical; @@ -449,225 +548,236 @@ namespace Katabatic { AutoSegments AutoSegment::getOnSourceContact ( unsigned int direction ) { return AutoSegments_OnContact - ( this, getSource() ).getSubSet ( AutoSegments_InDirection(direction) ); + ( this, getSource() ).getSubSet( AutoSegments_InDirection(direction) ); } AutoSegments AutoSegment::getOnTargetContact ( unsigned int direction ) { return AutoSegments_OnContact - ( this, getTarget() ).getSubSet ( AutoSegments_InDirection(direction) ); + ( this, getTarget() ).getSubSet( AutoSegments_InDirection(direction) ); } - AutoSegments AutoSegment::getCollapseds ( bool withPerpand ) + AutoSegments AutoSegment::getCachedOnSourceContact ( unsigned int direction ) + { return AutoSegments_CachedOnContact( getAutoSource(), direction ); } + + + AutoSegments AutoSegment::getCachedOnTargetContact ( unsigned int direction ) + { return AutoSegments_CachedOnContact( getAutoTarget(), direction ); } + + + AutoSegments AutoSegment::getAligneds ( unsigned int flags ) { - return AutoSegments_Collapsed ( this, withPerpand ); + ltrace(89) << "AutoSegment::getAligneds() - flags:" << flags << endl; + return AutoSegments_Aligneds( this, flags ); } - AutoSegments AutoSegment::getCollapsedPerpandiculars () + AutoSegments AutoSegment::getPerpandiculars () + { return AutoSegments_Perpandiculars( this ); } + + + void AutoSegment::setFlagsOnAligneds ( unsigned int flags ) { - return AutoSegments_CollapsedPerpandicular ( this ); + setFlags( flags ); + if (not isNotAligned()) { + forEach( AutoSegment*, isegment, getAligneds() ) + isegment->setFlags( flags ); + } } - bool AutoSegment::isCanonicalStrap () const + void AutoSegment::sourceDetach () { - if ( not isStrap() ) return false; - forEach ( AutoSegment*, isegment, const_cast(this)->getCollapseds() ) { - if ( not isegment->isStrap() ) return false; + AutoContact* source = getAutoSource(); + if (source) { + base()->getSourceHook()->detach(); + source->cacheDetach( this ); + unsetFlags( SegNotSourceAligned ); } - return true; } - bool AutoSegment::collapse () + void AutoSegment::targetDetach () { - if ( _isGlobal ) { - cerr << Error("Global %s cannot be collapsed.",getString(this).c_str()) << endl; - return false; + AutoContact* target = getAutoTarget(); + if (target) { + base()->getTargetHook()->detach(); + target->cacheDetach( this ); + unsetFlags( SegNotTargetAligned ); } - if ( _isCollapsed ) return true; - - _isCollapsed = true; - - unsigned int direction = (_isHorizontal) ? Constant::Vertical : Constant::Horizontal; - forEach ( AutoSegment*, isegment, AutoSegments_AnchoredBySource(getAutoSource(),direction) ) { - isegment->setCanonical ( false ); - } - forEach ( AutoSegment*, isegment, AutoSegments_AnchoredBySource(getAutoTarget(),direction) ) { - isegment->setCanonical ( false ); - } - - return true; } - bool AutoSegment::expand () + void AutoSegment::sourceAttach ( AutoContact* source ) { - if ( _isGlobal ) { - cerr << Warning("Global %s already uncollapsed.",getString(this).c_str()) << endl; - return false; - } - if ( !_isCollapsed ) { - cerr << Warning("Local %s already uncollapsed.",getString(this).c_str()) << endl; - return true; - } + if (source) { + if (not base()->getSourceHook()->isAttached()) + base()->getSourceHook()->attach( source->base()->getBodyHook() ); + source->cacheAttach( this ); - _isCollapsed = false; - - canonize (); - - unsigned int direction = (_isHorizontal) ? Constant::Vertical : Constant::Horizontal; - forEach ( AutoSegment*, segment, getOnSourceContact(direction) ) { - segment->canonize (); + // if (source->isHTee() and isHorizontal()) return; + // else if (source->isVTee() and isVertical ()) return; + // setFlags( SegNotSourceAligned ); } - forEach ( AutoSegment*, segment, getOnTargetContact(direction) ) { - segment->canonize (); - } - - return true; } - bool AutoSegment::toConstraintAxis ( set* processeds ) + void AutoSegment::targetAttach ( AutoContact* target ) { - if ( processeds && (processeds->find(this) != processeds->end()) ) return false; + if (target) { + if (not base()->getTargetHook()->isAttached()) + base()->getTargetHook()->attach( target->base()->getBodyHook() ); + target->cacheAttach( this ); + + // if (target->isHTee() and isHorizontal()) return; + // else if (target->isVTee() and isVertical ()) return; + // setFlags( SegNotTargetAligned ); + } + } + + + void AutoSegment::mergeUserConstraints ( const Interval& constraints ) + { + ltrace(200) << "mergeUserConstraints() " << this << endl; + ltrace(200) << "| " << constraints << " merged with " << _userConstraints << endl; + _userConstraints.intersection(constraints); + } + + + bool AutoSegment::toConstraintAxis () + { + ltrace(200) << "toConstraintAxis() " << this << endl; + ltracein(200); + + if (not isCanonical()) { ltraceout(200); return false; } DbU::Unit constraintMin; DbU::Unit constraintMax; - getConstraints ( constraintMin, constraintMax ); + getConstraints( constraintMin, constraintMax ); // Empty constraint interval: ignore. - if ( constraintMin > constraintMax ) return false; + if (constraintMin > constraintMax) { ltraceout(200); return false; } - if ( isDogleg() ) { + if (isDogleg()) { // Ugly: hard-wired value of the track spacing. constraintMin -= DbU::lambda(25.0); constraintMax += DbU::lambda(25.0); } - if ( getAxis() < constraintMin ) { - setAxis ( constraintMin, Realignate, processeds ); + if (getAxis() < constraintMin) { + setAxis( constraintMin ); + ltraceout(200); return true; } - if ( getAxis() > constraintMax ) { - setAxis ( constraintMax, Realignate, processeds ); + if (getAxis() > constraintMax) { + setAxis( constraintMax ); + ltraceout(200); return true; } + ltraceout(200); return false; } - bool AutoSegment::toOptimalAxis ( set* processeds ) + bool AutoSegment::toOptimalAxis () { - if ( processeds && (processeds->find(this) != processeds->end()) ) return false; + ltrace(200) << "toOptimalAxis() " << this << endl; + ltracein(200); + + if (not isCanonical()) { ltraceout(200); return false; } DbU::Unit constraintMin; DbU::Unit constraintMax; - getConstraints ( constraintMin, constraintMax ); + getConstraints( constraintMin, constraintMax ); - DbU::Unit optimalMin = max ( min(getOptimalMin(),constraintMax), constraintMin ); - DbU::Unit optimalMax = min ( max(getOptimalMax(),constraintMin), constraintMax ); + DbU::Unit optimalMin = max( min(getOptimalMin(),constraintMax), constraintMin ); + DbU::Unit optimalMax = min( max(getOptimalMax(),constraintMin), constraintMax ); - if ( getAxis() < optimalMin ) { -#if defined(CHECK_DETERMINISM) - cerr << "Order: toOptimalMin " - << DbU::getValueString(optimalMin) << " [" - << DbU::getValueString(optimalMin) << ":" - << DbU::getValueString(optimalMax) << "] [" - << DbU::getValueString(constraintMin) << ":" - << DbU::getValueString(constraintMax) << "] " - << this << endl; -#endif - setAxis ( optimalMin, Realignate|AxisSet, processeds ); + if (getAxis() < optimalMin) { + setAxis( optimalMin ); + ltraceout(200); return true; } - if ( getAxis() > optimalMax ) { -#if defined(CHECK_DETERMINISM) - cerr << "Order: toOptimalMax " - << DbU::getValueString(optimalMin) << " [" - << DbU::getValueString(optimalMin) << ":" - << DbU::getValueString(optimalMax) << "] [" - << DbU::getValueString(constraintMin) << ":" - << DbU::getValueString(constraintMax) << "] " - << this << endl; -#endif - setAxis ( optimalMax, Realignate|AxisSet, processeds ); + if (getAxis() > optimalMax) { + setAxis( optimalMax ); + ltraceout(200); return true; } -#if defined(CHECK_DETERMINISM) - cerr << "Order: in optimal position " - << DbU::getValueString(optimalMin) << " [" - << DbU::getValueString(optimalMin) << ":" - << DbU::getValueString(optimalMax) << "] [" - << DbU::getValueString(constraintMin) << ":" - << DbU::getValueString(constraintMax) << "] " - << this << endl; -#endif - + ltraceout(200); return false; } - void AutoSegment::setAxis ( DbU::Unit axis, unsigned int flags, set* processeds ) + void AutoSegment::setAxis ( DbU::Unit axis, unsigned int flags ) { - if ( processeds and (processeds->find(this) != processeds->end()) ) return; + if (not isCanonical()) return; - if ( ( axis != getAxis() ) and isFixed() ) { - cerr << Error("AutoSegment::setAxis(): Cannot move fixed segment to %s.\n" - " (on: %s)" - ,DbU::getValueString(axis).c_str() - ,_getString().c_str() - ) << endl; - } - - if ( _isUnsetAxis and (flags & AxisSet) ) { - ltrace(200) << "setAxis() - AxisSet flag raised " << this << endl; - _isUnsetAxis = false; - } - if ( ( axis == getAxis() ) and not (flags & Realignate) ) return; + if ( (axis == getAxis()) and not (flags & KbRealignate) ) return; ltrace(200) << "setAxis() @" - << ((_isHorizontal)?"Y ":"X ") << DbU::getLambda(getAxis()) + << ((isHorizontal())?"Y ":"X ") << DbU::getLambda(getAxis()) << " to " << DbU::getLambda(axis) << " on " << this << endl; ltracein(80); - alignate ( axis ); - if ( processeds ) processeds->insert ( this ); + _setAxis( axis ); - forEach ( AutoSegment*, isegment, getCollapseds() ) { - isegment->alignate ( getAxis() ); - if ( flags & AxisSet ) isegment->_isUnsetAxis = false; - if ( processeds ) processeds->insert ( *isegment ); + if (not isNotAligned()) { + forEach( AutoSegment*, isegment, getAligneds() ) { + isegment->_setAxis( getAxis() ); + } + } else { + ltrace(200) << "No need to process parallels." << endl; } ltraceout(80); } - void AutoSegment::computeOptimal ( set* processeds ) + void AutoSegment::computeTerminal () + { + AutoContact* source = getAutoSource(); + AutoContact* target = getAutoTarget(); + + ltrace(99) << "computeTerminal() S:" << source->isTerminal() + << " T:" << target->isTerminal() + << " " << this << endl; + + if (source->isTerminal() or target->isTerminal()) { + unsetFlags( SegWeakTerminal ); + setFlags ( SegStrongTerminal ); + } else { + unsigned int terminalFlag = 0; + switch ( _getFlags() & SegWeakTerminal ) { + case 0: break; + case SegStrongTerminal: terminalFlag = SegWeakTerminal1; break; + case SegWeakTerminal1: terminalFlag = SegWeakTerminal1; break; + case SegWeakTerminal2: terminalFlag = SegWeakTerminal2; break; + default: + cerr << Warning("%s has multiple terminal flag sets: %x." + ,getString(this).c_str() + ,_flags + ) << endl; + terminalFlag = SegWeakTerminal2; break; + } + unsetFlags( SegWeakTerminal ); + setFlags ( terminalFlag ); + } + } + + + void AutoSegment::computeOptimal ( set& processeds ) { ltrace(89) << "computeOptimal() - " << this << endl; ltracein(89); - if ( processeds && (processeds->find(this) != processeds->end()) ) { ltraceout(89); return; } - - if ( _isCollapsed ) { - _optimalMin = 0; - setOptimalMax ( (_isHorizontal) ? _gcell->getBoundingBox().getYMax() - : _gcell->getBoundingBox().getXMax() ); - ltraceout(89); - return; - } - DbU::Unit minGCell = getOrigin(); DbU::Unit maxGCell = getExtremity(); DbU::Unit terminalMin; @@ -675,64 +785,64 @@ namespace Katabatic { AttractorsMap attractors; AutoContact* anchor = getAutoSource(); - if ( anchor->isTerminal() ) { + if (anchor->isTerminal()) { Box constraintBox = anchor->getConstraintBox(); if ( isHorizontal() ) { - terminalMin = constraintBox.getYMin (); - terminalMax = constraintBox.getYMax (); + terminalMin = constraintBox.getYMin(); + terminalMax = constraintBox.getYMax(); } else { - terminalMin = constraintBox.getXMin (); - terminalMax = constraintBox.getXMax (); + terminalMin = constraintBox.getXMin(); + terminalMax = constraintBox.getXMax(); } - attractors.addAttractor ( terminalMin ); - if ( terminalMin != terminalMax ) - attractors.addAttractor ( terminalMax ); + attractors.addAttractor( terminalMin ); + if (terminalMin != terminalMax) + attractors.addAttractor( terminalMax ); } anchor = getAutoTarget(); - if ( anchor->isTerminal() ) { + if (anchor->isTerminal()) { Box constraintBox = anchor->getConstraintBox(); - if ( isHorizontal() ) { - terminalMin = constraintBox.getYMin (); - terminalMax = constraintBox.getYMax (); + if (isHorizontal()) { + terminalMin = constraintBox.getYMin(); + terminalMax = constraintBox.getYMax(); } else { - terminalMin = constraintBox.getXMin (); - terminalMax = constraintBox.getXMax (); + terminalMin = constraintBox.getXMin(); + terminalMax = constraintBox.getXMax(); } - attractors.addAttractor ( terminalMin ); - if ( terminalMin != terminalMax ) - attractors.addAttractor ( terminalMax ); + attractors.addAttractor( terminalMin ); + if (terminalMin != terminalMax) + attractors.addAttractor( terminalMax ); } - forEach ( AutoSegment*, autoSegment, getCollapsedPerpandiculars() ) { + forEach( AutoSegment*, autoSegment, getPerpandiculars() ) { ltrace(89) << "Perpandicular " << *autoSegment << endl; ltracein(89); - if ( autoSegment->isLocal() ) { - if ( !autoSegment->isTerminal() ) { ltraceout(89); continue; } + if (autoSegment->isLocal()) { + if (not autoSegment->isStrongTerminal()) { ltraceout(89); continue; } DbU::Unit terminalMin; DbU::Unit terminalMax; - if ( getTerminalInterval ( *autoSegment - , NULL - , isHorizontal() - , terminalMin - , terminalMax ) ) { - attractors.addAttractor ( terminalMin ); - if ( terminalMin != terminalMax ) - attractors.addAttractor ( terminalMax ); + if (getTerminalInterval( *autoSegment + , NULL + , isHorizontal() + , terminalMin + , terminalMax )) { + attractors.addAttractor( terminalMin ); + if (terminalMin != terminalMax) + attractors.addAttractor( terminalMax ); } } else { bool isMin = true; - if ( isHorizontal() - && ( autoSegment->getAutoSource()->getGCell()->getRow() == _gcell->getRow() ) ) + if ( isHorizontal() + and (autoSegment->getAutoSource()->getGCell()->getRow() == _gcell->getRow()) ) isMin = false; - if ( isVertical() - && ( autoSegment->getAutoSource()->getGCell()->getColumn() == _gcell->getColumn() ) ) + if ( isVertical() + and (autoSegment->getAutoSource()->getGCell()->getColumn() == _gcell->getColumn()) ) isMin = false; - attractors.addAttractor ( (isMin) ? minGCell : maxGCell ); + attractors.addAttractor( (isMin) ? minGCell : maxGCell ); } ltraceout(89); } @@ -741,9 +851,9 @@ namespace Katabatic { DbU::Unit optimalMax; DbU::Unit constraintMin; DbU::Unit constraintMax; - getConstraints ( constraintMin, constraintMax ); + getConstraints( constraintMin, constraintMax ); - if ( attractors.getAttractorsCount() ) { + if (attractors.getAttractorsCount()) { ltrace(89) << "Lower Median " << DbU::getLambda(attractors.getLowerMedian()) << endl; ltrace(89) << "Upper Median " << DbU::getLambda(attractors.getUpperMedian()) << endl; @@ -751,231 +861,155 @@ namespace Katabatic { optimalMax = attractors.getUpperMedian(); } else { optimalMin = 0; - optimalMax = (_isHorizontal) ? _gcell->getBoundingBox().getYMax() - : _gcell->getBoundingBox().getXMax(); + optimalMax = (isHorizontal()) ? _gcell->getBoundingBox().getYMax() + : _gcell->getBoundingBox().getXMax(); } - setInBound ( constraintMin, constraintMax, optimalMin ); - setInBound ( constraintMin, constraintMax, optimalMax ); + setInBound( constraintMin, constraintMax, optimalMin ); + setInBound( constraintMin, constraintMax, optimalMax ); - if ( processeds ) processeds->insert ( this ); - setOptimalMin ( optimalMin ); - setOptimalMax ( optimalMax ); - forEach ( AutoSegment*, autoSegment, getCollapseds() ) { - if ( processeds ) processeds->insert ( *autoSegment ); - autoSegment->setOptimalMin ( optimalMin ); - autoSegment->setOptimalMax ( optimalMax ); + ltrace(89) << "Applying constraint on: " << this << endl; + setOptimalMin( optimalMin ); + setOptimalMax( optimalMax ); + processeds.insert( this ); + if (not isNotAligned()) { + forEach ( AutoSegment*, autoSegment, getAligneds() ) { + ltrace(89) << "Applying constraint on: " << *autoSegment << endl; + autoSegment->setOptimalMin( optimalMin ); + autoSegment->setOptimalMax( optimalMax ); + processeds.insert( (*autoSegment) ); + } } ltraceout(89); } - AutoSegment* AutoSegment::canonize () + AutoSegment* AutoSegment::canonize ( unsigned int flags ) { ltrace(159) << "canonize() - " << this << endl; - if ( isCanonical() ) { - ltrace(159) << "* " << this << " canonical" << endl; - return this; - } + // if (isCanonical() and isGlobal()) { + // ltrace(159) << "* " << this << " canonical" << endl; + // return this; + // } - AutoSegment* canonical = this; - bool hasCanonical = false; - bool isCanonicalLocal = true; + vector segments; + AutoSegment* canonical = this; + bool hasCanonical = isCanonical(); + bool hasGlobal = isGlobal(); - forEach ( AutoSegment*, isegment, getCollapseds() ) { - if ( isegment->isGlobal() ) isCanonicalLocal = false; + if (not isNotAligned()) { + forEach( AutoSegment*, isegment, getAligneds(flags) ) { + if (isegment->isFixed()) continue; - if ( isegment->isCanonical() ) { - ltrace(159) << "* " << *isegment << " canonical" << endl; - //return *isegment; - canonical = *isegment; - hasCanonical = true; - break; + hasGlobal = hasGlobal or isegment->isGlobal(); + segments.push_back( *isegment ); + + if (not hasCanonical) { + if (isegment->isCanonical()) { + ltrace(159) << "* " << *isegment << " canonical already set" << endl; + canonical = *isegment; + hasCanonical = true; + } + + if (CompareId()(*isegment,canonical)) canonical = *isegment; + } } - if ( not hasCanonical ) { - if ( CompareId()(*isegment,canonical) ) - canonical = *isegment; + canonical->setFlags( SegCanonical ); + if (hasGlobal) { + for ( size_t i=0 ; isetFlags( SegWeakGlobal ); + } else { + for ( size_t i=0 ; iunsetFlags( SegWeakGlobal ); } - } + if (segments.empty()) setFlags( SegNotAligned ); - canonical->setCanonical ( true ); - canonical->setCanonicalLocal ( isCanonicalLocal ); - - // ltrace: 159 - if ( isCanonical() ) cerr << "* " << this << " canonical" << endl; - else cerr << "* " << this << endl; - - forEach ( AutoSegment*, isegment, getCollapseds() ) { - if ( isegment->isCanonical() ) cerr << "| " << *isegment << " canonical" << endl; - else cerr << "| " << *isegment << endl; + if (isCanonical()) { ltrace(159) << "* " << this << " canonical" << endl; } + else { + ltrace(159) << "* " << this << " not canonical" << endl; + ltrace(159) << "* " << canonical << " *is* the canonical" << endl; + } + } else { + setFlags ( SegCanonical ); + unsetFlags( SegWeakGlobal ); } return canonical; } - AutoSegment::AutoSegment ( Segment* segment - , bool isHorizontal - , int type - , bool terminal - , bool collapsed - ) - : _isUnsetAxis (true) - , _invalidated (false) - , _isHorizontal (isHorizontal) - , _isTopologicEnd (false) - , _isTerminal (terminal) - , _isDogleg (false) - , _isCollapsed (collapsed) - , _isCanonical (false) - , _isFixed (false) - , _strap (false) - , _layerChange (false) - , _slackened (false) - , _slackenStrap (false) - , _allowOutsideGCell(false) - , _id (_maxId++) - , _optimalMin (0) - , _userConstraints (false) - , _parent (NULL) - { - //cerr << "AutoSegment::AutoSegment() - " << endl; -#if defined(CHECK_DETERMINISM) - cerr << "Order: AutoSegment::AutoSegment() - " << endl; -#endif - AutoContact* source = Session::lookup(dynamic_cast(segment->getSource())); - AutoContact* target = Session::lookup(dynamic_cast(segment->getTarget())); - - _allocateds++; - - _gcell = source->getGCell(); - setOptimalMax ( (_isHorizontal) ? _gcell->getBoundingBox().getYMax() - : _gcell->getBoundingBox().getXMax() ); - - switch ( type ) { - case AutoSegment::Global: _isGlobal = true; break; - case AutoSegment::Local : _isGlobal = false; break; - case AutoSegment::Guess : - _isGlobal = ( source->getGCell() != target->getGCell() ); - break; - } - _globalsCount += (_isGlobal) ? 1 : 0; - _isCanonicalLocal = not _isGlobal; - - _computeTerminal ( segment ); - //if ( source->isTerminal() or target->isTerminal() ) _isTerminal = true; - - //if ( source->isTerminal() - // and target->isTerminal() - // /*and (segment->getLength() < DbU::lambda(25.0))*/ - // and (source->getGCell() == target->getGCell()) ) { - // _strap = true; - //} - - source->setInvalidatedTopology ( true ); - } - - - void AutoSegment::_preCreate ( Component* source, Component* target ) - { - AutoContact* acSource = Session::lookup(dynamic_cast(source)); - AutoContact* acTarget = Session::lookup(dynamic_cast(target)); - - _preCreate ( acSource, acTarget ); - } - - - void AutoSegment::_preCreate ( AutoContact* source, AutoContact* target ) - { - if ( !source || !target ) - throw Error ( badAutoSegmentAnchor - , ((source)?getString(source).c_str():"NULL") - , ((target)?getString(target).c_str():"NULL") - ); - - if ( source == target ) - throw Error ( dupAutoSegmentAnchor, getString(source).c_str() ); - } - - - void AutoSegment::_postCreate () - { - Session::invalidate ( getNet() ); - Session::link ( this ); - invalidate (); - } - - - void AutoSegment::_preDestroy () - { - ltrace(200) << "AutoSegment::_preDestroy() - " << (void*)this << endl; - ltracein(90); - - Session::unlink ( this ); - ltraceout(90); - } - - - AutoSegment::~AutoSegment () - { - _allocateds--; - if ( _isGlobal and (_globalsCount > 0) ) _globalsCount--; - } - - - void AutoSegment::_computeTerminal ( Segment* segment ) - { - AutoContact* source = Session::lookup(dynamic_cast(segment->getSource())); - AutoContact* target = Session::lookup(dynamic_cast(segment->getTarget())); - - _isTerminal = source->isTerminal() or target->isTerminal(); - } - - - size_t AutoSegment::getAlignedContacts ( map& innerContacts ) + size_t AutoSegment::getAlignedContacts ( map& innerContacts ) const { map::iterator icontact; - innerContacts.clear (); - innerContacts.insert ( make_pair(getAutoSource(),0x1) ); - innerContacts.insert ( make_pair(getAutoTarget(),0x4) ); + innerContacts.clear(); + innerContacts.insert( make_pair(getAutoSource(),0x1) ); + innerContacts.insert( make_pair(getAutoTarget(),0x4) ); - forEach ( AutoSegment*, isegment, getCollapseds() ) { - if ( (icontact = innerContacts.find(isegment->getAutoSource())) != innerContacts.end() ) { - if ( icontact->second & 0x1 ) icontact->second |= 0x2; - else icontact->second |= 0x1; - } else - innerContacts.insert ( make_pair(getAutoSource(),0x1) ); - - if ( (icontact = innerContacts.find(isegment->getAutoTarget())) != innerContacts.end() ) { - if ( icontact->second & 0x4 ) icontact->second |= 0x8; - else icontact->second |= 0x4; - } else - innerContacts.insert ( make_pair(getAutoTarget(),0x4) ); + if (not isNotAligned()) { + forEach ( AutoSegment*, isegment, const_cast(this)->getAligneds() ) { + if ( (icontact = innerContacts.find(isegment->getAutoSource())) != innerContacts.end() ) { + if (icontact->second & 0x1) icontact->second |= 0x2; + else icontact->second |= 0x1; + } else + innerContacts.insert( make_pair(getAutoSource(),0x1) ); + + if ( (icontact = innerContacts.find(isegment->getAutoTarget())) != innerContacts.end() ) { + if (icontact->second & 0x4) icontact->second |= 0x8; + else icontact->second |= 0x4; + } else + innerContacts.insert( make_pair(getAutoTarget(),0x4) ); + } } return innerContacts.size(); } + Interval AutoSegment::getMinSpanU () const + { + map contacts; + map::iterator icontact; + + getAlignedContacts( contacts ); + + DbU::Unit spanMin = DbU::Min; + DbU::Unit spanMax = DbU::Max; + Interval constraints; + unsigned int direction = getDirection(); + + for ( icontact=contacts.begin() ; icontact != contacts.end() ; icontact++ ) { + constraints = icontact->first->getUConstraints( direction ); + if (icontact->second == 0x1) { + spanMin = max( spanMin, constraints.getVMax() ); + } + if (icontact->second == 0x4) { + spanMax = min( spanMax, constraints.getVMin() ); + } + } + + return Interval(spanMin,spanMax); + } + + size_t AutoSegment::getPerpandicularsBound ( set& bounds ) { map contacts; map::iterator icontact; - getAlignedContacts ( contacts ); + getAlignedContacts( contacts ); for ( icontact=contacts.begin() ; icontact != contacts.end() ; icontact++ ) { if ( (icontact->second == 0x1) or (icontact->second == 0x4) ) { forEach ( Segment*, isegment, icontact->first->getSlaveComponents().getSubSet() ) { AutoSegment* autoSegment = Session::lookup ( *isegment ); - if ( !autoSegment ) continue; - if ( autoSegment->getDirection() == getDirection() ) continue; + if (not autoSegment) continue; + if (autoSegment->getDirection() == getDirection()) continue; - bounds.insert ( autoSegment ); + bounds.insert( autoSegment ); } } } @@ -984,253 +1018,86 @@ namespace Katabatic { } - Interval AutoSegment::getMinSpanU () - { - map contacts; - map::iterator icontact; - - getAlignedContacts ( contacts ); - - DbU::Unit spanMin = DbU::Min; - DbU::Unit spanMax = DbU::Max; - Interval constraints; - unsigned int direction = Constant::perpandicular(getDirection()); - - for ( icontact=contacts.begin() ; icontact != contacts.end() ; icontact++ ) { - constraints = icontact->first->getUConstraints ( direction ); - if ( icontact->second == 0x1 ) { - spanMin = max ( spanMin, constraints.getVMax() ); - } - if ( icontact->second == 0x4 ) { - spanMax = min ( spanMax, constraints.getVMin() ); - } - } - - return Interval(spanMin,spanMax); - } - - - void AutoSegment::setAllowOutsideGCell ( bool state, bool propagate ) - { - if ( allowOutsideGCell() ) return; - - _setAllowOutsideGCell ( state ); - - if ( propagate ) { - forEach ( AutoSegment*, isegment, getCollapseds() ) { - isegment->_setAllowOutsideGCell ( state ); - } - } - } - - - void AutoSegment::_setAllowOutsideGCell ( bool state ) - { - ltrace(200) << "_setAllowOutsideGCell() - " << this << endl; - _allowOutsideGCell = state; - } - - - bool AutoSegment::canGoOutsideGCell () const + void AutoSegment::changeDepth ( unsigned int depth, unsigned int flags ) { + ltrace(200) << "changeDepth() " << depth << " - " << this << endl; ltracein(200); + Session::invalidate( getNet() ); - bool goOutsideGCell = getAutoSource()->canGoOutsideGCell(this); - goOutsideGCell = goOutsideGCell and getAutoTarget()->canGoOutsideGCell(this); + _changeDepth( depth, flags & ~KbPropagate ); - if ( !goOutsideGCell ) { - ltraceout(200); - return false; - } - - GCell* sourceGCell = getAutoSource()->getGCell(); - GCell* leftGCell = NULL; - GCell* rightGCell = NULL; - Interval uside; - bool goLeft = false; - bool goRight = false; - - if ( isHorizontal() ) { - uside = sourceGCell->getUSide ( Constant::Vertical ); - leftGCell = sourceGCell->getDown(); - rightGCell = sourceGCell->getUp (); - } else { - uside = sourceGCell->getUSide ( Constant::Horizontal ); - leftGCell = sourceGCell->getLeft (); - rightGCell = sourceGCell->getRight(); - } - - DbU::Unit constraintMin; - DbU::Unit constraintMax; - getConstraints ( constraintMin, constraintMax ); - - if ( leftGCell && (uside.getVMin() >= constraintMin) ) { - ltrace(200) << "Can go Left." << endl; - goLeft = true; - } - // Ugly: Must use the right compensator for VMax. - if ( rightGCell && (uside.getVMax() <= constraintMax)+DbU::lambda(1.0) ) { - ltrace(200) << "Can go Right." << endl; - goRight = true; - } - - goOutsideGCell = goOutsideGCell and (goRight or goLeft); - - // Override. - //goOutsideGCell = !isGlobal() && !isTerminal(); - - ltrace(200) << "AutoSegment::canGoOutsideGCell() - " << goOutsideGCell << endl; - ltraceout(200); - - return goOutsideGCell; - } - - - bool AutoSegment::canDesalignate () - { - ltrace(200) << "AutoSegment::canDesalignate()" << endl; - - map innerContacts; - map::iterator icontact; - - getAlignedContacts ( innerContacts ); - - for ( icontact=innerContacts.begin() ; icontact != innerContacts.end() ; icontact++ ) { - ltrace(200) << "| " << "flags:" << icontact->second - << " " << (void*)icontact->first->base() << ":" << icontact->first << endl; - if ( (icontact->second & 0x5 ) && canDesalignate(icontact->first) ) return true; - //if ( (icontact->second & 0x3 ) && canDesalignate(icontact->first) ) return true; - //if ( (icontact->second & 0x12) && canDesalignate(icontact->first) ) return true; - } - ltrace(200) << "No AutoContact suitable for desalignment." << endl; - - return false; - } - - - void AutoSegment::desalignate () - { - map innerContacts; - map::iterator icontact; - vector segments; - - // Ugly. Must fusion with the inner contact loop. - forEach ( AutoSegment*, isegment, getCollapseds() ) { - segments.push_back ( *isegment ); - } - - invalidate (); - getAlignedContacts ( innerContacts ); - - for ( icontact=innerContacts.begin() ; icontact != innerContacts.end() ; icontact++ ) { - desalignate ( icontact->first ); - //if ( icontact->second & 0x3 ) desalignate ( icontact->first ); - //if ( icontact->second & 0x3 ) desalignate ( icontact->first ); - //if ( icontact->second & 0x12) desalignate ( icontact->first ); - } - - // for ( size_t i=0 ; i_computeTerminal ( segments[i]->base() ); - // ltrace(99) << "_computeTerminals() - " << segments[i] << endl; - // } - - Session::invalidate ( getNet() ); - Session::revalidateTopology (); - } - - - void AutoSegment::changeDepth ( unsigned int depth, bool propagate, bool standAlone ) - { - invalidate (); - Session::invalidate ( getNet() ); - Session::setInvalidateMask ( Session::NetSplitContacts ); - - _changeDepth ( depth, true ); - - if ( propagate ) { - forEach ( AutoSegment*, isegment, getCollapseds() ) { - isegment->_changeDepth ( depth, true ); + if ((flags & KbPropagate) and not isNotAligned()) { + forEach ( AutoSegment*, isegment, getAligneds(KbNoCheckLayer) ) { + (*isegment)->_changeDepth( depth, flags & ~KbPropagate ); } } - if ( standAlone ) Session::revalidateTopology(); + ltraceout(200); } - void AutoSegment::_changeDepth ( unsigned int depth, bool withNeighbors ) + void AutoSegment::_changeDepth ( unsigned int depth, unsigned int flags ) { ltrace(200) << "_changeDepth() - " << this << endl; ltracein(200); - const Layer* layer0 = Session::getRoutingGauge()->getRoutingLayer(depth); - if ( getLayer() != layer0 ) { - setLayer ( layer0 ); + invalidate( KbNoFlags ); + setFlags( SegInvalidatedLayer ); - getAutoSource()->invalidate(); - getAutoTarget()->invalidate(); + const Layer* newLayer = Session::getRoutingGauge()->getRoutingLayer(depth); + if (getLayer() != newLayer) { + setLayer( newLayer ); + + getAutoSource()->invalidate( KbTopology|KbNoCheckLayer ); + getAutoTarget()->invalidate( KbTopology|KbNoCheckLayer ); } - if ( !withNeighbors ) { + if (not (flags & KbWithNeighbors)) { ltraceout(200); return; } - forEach ( Component*, icomponent, getAutoSource()->getSlaveComponents() ) { - if ( *icomponent == base() ) continue; + forEach ( AutoSegment*, isegment, getCachedOnSourceContact(KbDirectionMask) ) { + if ((*isegment) == this) continue; + if ((*isegment)->isGlobal ()) continue; + if ((*isegment)->isTerminal()) continue; - Segment* segment = dynamic_cast(*icomponent); - if ( !segment ) continue; - - AutoSegment* autoSegment = Session::lookup ( segment ); - if ( !autoSegment ) continue; - if ( autoSegment->isGlobal () ) continue; - if ( autoSegment->isTerminal() ) continue; - - if ( !( autoSegment->isHorizontal() xor isHorizontal() ) ) { - autoSegment->_changeDepth ( depth, false ); - } else { - autoSegment->_changeDepth ( depth-1, false ); - } + if (not ((*isegment)->isHorizontal() xor isHorizontal())) + (*isegment)->_changeDepth( depth , KbNoFlags ); + else + (*isegment)->_changeDepth( depth-1, KbNoFlags ); } - forEach ( Component*, icomponent, getAutoTarget()->getSlaveComponents() ) { - if ( *icomponent == base() ) continue; + forEach ( AutoSegment*, isegment, getCachedOnTargetContact(KbDirectionMask) ) { + if ((*isegment) == this) continue; + if ((*isegment)->isGlobal ()) continue; + if ((*isegment)->isTerminal()) continue; - Segment* segment = dynamic_cast(*icomponent); - if ( !segment ) continue; - - AutoSegment* autoSegment = Session::lookup ( segment ); - if ( !autoSegment ) continue; - if ( autoSegment->isGlobal () ) continue; - if ( autoSegment->isTerminal() ) continue; - - if ( !( autoSegment->isHorizontal() xor isHorizontal() ) ) { - autoSegment->_changeDepth ( depth, false ); - } else { - autoSegment->_changeDepth ( depth-1, false ); - } + if (not ((*isegment)->isHorizontal() xor isHorizontal())) + (*isegment)->_changeDepth( depth , KbNoFlags ); + else + (*isegment)->_changeDepth( depth-1, KbNoFlags ); } vector gcells; - getGCells ( gcells ); - for ( size_t i=0 ; iinvalidate (); - } + getGCells( gcells ); + for ( size_t i=0 ; iinvalidate(); ltraceout(200); } - bool AutoSegment::canSlacken ( bool propagate ) + bool AutoSegment::canSlacken ( unsigned int flags ) const { ltrace(200) << "AutoSegment::canSlacken()" << endl; - if ( !isGlobal() && !propagate ) return false; + if (not isGlobal() and not (flags & KbPropagate)) return false; - if ( _canSlacken() ) return true; - if ( propagate ) { - forEach ( AutoSegment*, isegment, getCollapseds() ) { - if ( isegment->_canSlacken() ) return true; + if (_canSlacken()) return true; + if ((flags & KbPropagate) and not isNotAligned()) { + forEach ( AutoSegment*, isegment, const_cast(this)->getAligneds() ) { + if (isegment->_canSlacken()) return true; } } @@ -1238,24 +1105,19 @@ namespace Katabatic { } - void AutoSegment::slacken ( bool propagate ) + bool AutoSegment::slacken ( unsigned int flags ) { - invalidate (); + bool success = false; - set collapseds; - collapseds.insert ( this ); + success = success or _slacken( flags ); - if ( propagate ) { - forEach ( AutoSegment*, isegment, getCollapseds() ) - collapseds.insert ( *isegment ); + if ((flags & KbPropagate) and not isNotAligned()) { + forEach ( AutoSegment*, isegment, getAligneds() ) { + success = success or (*isegment)->_slacken( flags ); + } } - set::iterator isegment = collapseds.begin(); - for ( ; isegment != collapseds.end() ; isegment++ ) - (*isegment)->_slacken (); - - Session::invalidate ( getNet() ); - Session::revalidateTopology (); + return success; } @@ -1269,24 +1131,24 @@ namespace Katabatic { size_t depth = Session::getRoutingGauge()->getLayerDepth(getLayer()); vector gcells; - getGCells ( gcells ); + getGCells( gcells ); begin = *gcells.begin (); end = *gcells.rbegin(); float maxDensity = 0.0; - for ( size_t i=0 ; igetFeedthroughs(depth) ); + for ( size_t i=0 ; igetFeedthroughs(depth) ); } - if ( flags & Propagate ) { - forEach ( AutoSegment*, isegment, getCollapseds() ) { - isegment->getGCells ( gcells ); - if ( (*gcells.begin ())->getIndex() < begin->getIndex() ) begin = *gcells.begin (); - if ( (*gcells.rbegin())->getIndex() > end ->getIndex() ) end = *gcells.rbegin(); + if ((flags & KbPropagate) and not isNotAligned()) { + forEach ( AutoSegment*, isegment, getAligneds() ) { + isegment->getGCells( gcells ); + if ((*gcells.begin ())->getIndex() < begin->getIndex()) begin = *gcells.begin (); + if ((*gcells.rbegin())->getIndex() > end ->getIndex()) end = *gcells.rbegin(); - for ( size_t i=0 ; igetFeedthroughs(depth) ); + for ( size_t i=0 ; igetFeedthroughs(depth) ); } } } @@ -1295,44 +1157,42 @@ namespace Katabatic { } - bool AutoSegment::canPivotUp ( float reserve, unsigned int flags ) + bool AutoSegment::canPivotUp ( float reserve, unsigned int flags ) const { ltrace(200) << "AutoSegment::canPivotUp() - " << flags << " (reserve:" << reserve << ")" << endl; - if ( isLayerChange() or isFixed() ) return false; - if ( isTerminal () or isLocal() ) return false; + if ( isLayerChange() or isFixed() ) return false; + if ( isStrongTerminal() or isLocal() ) return false; - //if ( isTerminal() ) return false; - - size_t depth = Session::getRoutingGauge()->getLayerDepth(getLayer()); - if ( depth+2 >= Session::getRoutingGauge()->getDepth() ) return false; + size_t depth = Session::getRoutingGauge()->getLayerDepth( getLayer() ); + if (depth+2 >= Session::getRoutingGauge()->getDepth()) return false; vector gcells; - getGCells ( gcells ); + getGCells( gcells ); for ( size_t i=0 ; ihasFreeTrack(depth+2,reserve) ) return false; + if (not gcells[i]->hasFreeTrack(depth+2,reserve)) return false; } - if ( not (flags&IgnoreContact) ) { + if ( not (flags&KbIgnoreContacts) ) { ltrace(200) << getAutoSource() << endl; ltrace(200) << getAutoTarget() << endl; ltrace(200) << "min depths, Segment:" << depth << " S:" << getAutoSource()->getMinDepth() << " T:" << getAutoTarget()->getMinDepth() << endl; - if ( getAutoSource()->getMinDepth() < depth ) return false; - if ( getAutoTarget()->getMinDepth() < depth ) return false; + if (getAutoSource()->getMinDepth() < depth) return false; + if (getAutoTarget()->getMinDepth() < depth) return false; } - if ( flags & Propagate ) { - forEach ( AutoSegment*, isegment, getCollapseds() ) { - isegment->getGCells ( gcells ); + if ((flags & KbPropagate) and not isNotAligned()) { + forEach ( AutoSegment*, isegment, const_cast(this)->getAligneds(flags) ) { + isegment->getGCells( gcells ); for ( size_t i=0 ; ihasFreeTrack(depth+2,reserve) ) return false; + if (not gcells[i]->hasFreeTrack(depth+2,reserve)) return false; } - if ( isegment->getAutoSource()->getMinDepth() < depth ) return false; - if ( isegment->getAutoTarget()->getMinDepth() < depth ) return false; + if (isegment->getAutoSource()->getMinDepth() < depth) return false; + if (isegment->getAutoTarget()->getMinDepth() < depth) return false; } } else { ltrace(200) << "AutoSegment::canPivotUp() - true [no propagate]" << endl; @@ -1345,22 +1205,21 @@ namespace Katabatic { } - bool AutoSegment::canPivotDown ( bool propagate, float reserve ) + bool AutoSegment::canPivotDown ( float reserve, unsigned int flags ) const { ltrace(200) << "AutoSegment::canPivotDown()" << " (reserve:" << reserve << ")" << endl; - if ( isLayerChange() or isFixed() ) return false; - if ( isTerminal () or isLocal() ) return false; - //if ( isTerminal () ) return false; + if ( isLayerChange() or isFixed() ) return false; + if ( isStrongTerminal() or isLocal() ) return false; - size_t depth = Session::getRoutingGauge()->getLayerDepth(getLayer()); - if ( depth < 3 ) return false; + size_t depth = Session::getRoutingGauge()->getLayerDepth( getLayer() ); + if (depth < 3) return false; vector gcells; - getGCells ( gcells ); + getGCells( gcells ); for ( size_t i=0 ; ihasFreeTrack(depth-2,reserve) ) return false; + if (not gcells[i]->hasFreeTrack(depth-2,reserve)) return false; } ltrace(200) << getAutoSource() << endl; @@ -1369,21 +1228,21 @@ namespace Katabatic { << " S:" << getAutoSource()->getMaxDepth() << " T:" << getAutoTarget()->getMaxDepth() << endl; - if ( getAutoSource()->getMaxDepth() > depth ) return false; - if ( getAutoTarget()->getMaxDepth() > depth ) return false; - if ( not propagate ) { + if (getAutoSource()->getMaxDepth() > depth) return false; + if (getAutoTarget()->getMaxDepth() > depth) return false; + if (not (flags & KbPropagate)) { ltrace(200) << "AutoSegment::canPivotDown() - true [no propagate]" << endl; return true; } - if ( propagate ) { - forEach ( AutoSegment*, isegment, getCollapseds() ) { - isegment->getGCells ( gcells ); + if ((flags & KbPropagate) and not isNotAligned()) { + forEach ( AutoSegment*, isegment, const_cast(this)->getAligneds() ) { + isegment->getGCells( gcells ); for ( size_t i=0 ; ihasFreeTrack(depth-2,reserve) ) return false; + if (not gcells[i]->hasFreeTrack(depth-2,reserve)) return false; } - if ( isegment->getAutoSource()->getMaxDepth() < depth ) return false; - if ( isegment->getAutoTarget()->getMaxDepth() < depth ) return false; + if (isegment->getAutoSource()->getMaxDepth() < depth) return false; + if (isegment->getAutoTarget()->getMaxDepth() < depth) return false; } } @@ -1393,7 +1252,7 @@ namespace Katabatic { } - bool AutoSegment::canMoveUp ( float reserve, unsigned int flags ) + bool AutoSegment::canMoveUp ( float reserve, unsigned int flags ) const { ltrace(200) << "AutoSegment::canMoveUp() " << flags << " (reserve:" << reserve << ")" << endl; @@ -1402,19 +1261,19 @@ namespace Katabatic { GCell* end = NULL; if ( isLayerChange() or isFixed() ) return false; - if ( isTerminal() and (not (flags & AllowTerminal)) ) return false; - if ( isLocal() and (not (flags & AllowLocal )) ) return false; + if ( isStrongTerminal() and (not (flags & KbAllowTerminal)) ) return false; + if ( isLocal() and (not (flags & KbAllowLocal )) ) return false; size_t depth = Session::getRoutingGauge()->getLayerDepth(getLayer()) + 2; - if ( depth >= Session::getConfiguration()->getAllowedDepth() ) return false; + if (depth >= Session::getConfiguration()->getAllowedDepth()) return false; vector gcells; - getGCells ( gcells ); + getGCells( gcells ); begin = *gcells.begin (); end = *gcells.rbegin(); for ( size_t i=0 ; ihasFreeTrack(depth,reserve) ) { + if (not gcells[i]->hasFreeTrack(depth,reserve)) { ltrace(200) << "Not enough free track in " << gcells[i] << endl; return false; } @@ -1422,24 +1281,24 @@ namespace Katabatic { ltrace(200) << "Enough free track under canonical segment." << endl; - if ( isLocal() and not (flags & Propagate) ) { - if ( not getAutoSource()->canMoveUp(this) ) return false; - if ( not getAutoTarget()->canMoveUp(this) ) return false; + if ( isLocal() and not (flags & KbPropagate) ) { + if (not getAutoSource()->canMoveUp(this)) return false; + if (not getAutoTarget()->canMoveUp(this)) return false; return true; } bool hasGlobalSegment = false; - if ( flags & Propagate ) { - forEach ( AutoSegment*, isegment, getCollapseds() ) { - if ( isegment->isFixed () ) return false; - if ( isegment->isGlobal() ) hasGlobalSegment = true; + if ((flags & KbPropagate) and not isNotAligned()) { + forEach ( AutoSegment*, isegment, const_cast(this)->getAligneds(flags) ) { + if (isegment->isFixed ()) return false; + if (isegment->isGlobal()) hasGlobalSegment = true; - isegment->getGCells ( gcells ); + isegment->getGCells( gcells ); if ( (*gcells.begin ())->getIndex() < begin->getIndex() ) begin = *gcells.begin (); if ( (*gcells.rbegin())->getIndex() > end ->getIndex() ) end = *gcells.rbegin(); for ( size_t i=0 ; ihasFreeTrack(depth,reserve) ) { + if (not gcells[i]->hasFreeTrack(depth,reserve)) { ltrace(200) << "Not enough free track in " << gcells[i] << endl; return false; } @@ -1447,21 +1306,21 @@ namespace Katabatic { } } - if ( (depth >= 4) and (flags & PerpandicularFrag) ) { - float fragmentation = begin->getFragmentation(depth-1); + if ( (depth >= 4) and (flags & KbWithPerpands) ) { + float fragmentation = begin->getFragmentation( depth-1 ); ltrace(200) << "Check begin GCell perpandicular fragmentation: " << fragmentation << endl; - if ( fragmentation < 0.5 ) { + if (fragmentation < 0.5) { ltrace(200) << "Not enough free track for perpandicular in begin GCell " << "(frag:" << fragmentation << ")." << endl; return false; } - fragmentation = end->getFragmentation(depth-1); + fragmentation = end->getFragmentation( depth-1 ); ltrace(200) << "Check end GCell perpandicular fragmentation: " << fragmentation << endl; - if ( fragmentation < 0.5 ) { + if (fragmentation < 0.5) { ltrace(200) << "Not enough free track for perpandicular in end GCell " << "(frag:" << fragmentation << ")." << endl; @@ -1476,7 +1335,7 @@ namespace Katabatic { bool AutoSegment::moveUp ( unsigned int flags ) { //if ( not canMoveUp(0.0,flags) ) return false; - changeDepth ( Session::getRoutingGauge()->getLayerDepth(getLayer()) + 2, flags&Propagate ); + changeDepth( Session::getRoutingGauge()->getLayerDepth(getLayer()) + 2, flags&KbPropagate ); return true; } @@ -1485,12 +1344,15 @@ namespace Katabatic { bool AutoSegment::moveDown ( unsigned int flags ) { //if ( not canPivotDown(0.0,flags) ) return false; - changeDepth ( Session::getRoutingGauge()->getLayerDepth(getLayer()) - 2, flags&Propagate ); + changeDepth( Session::getRoutingGauge()->getLayerDepth(getLayer()) - 2, flags&KbPropagate ); return true; } +#if THIS_IS_DISABLED + + bool AutoSegment::shearUp ( GCell* upGCell, AutoSegment*& movedUp, float reserve, unsigned int flags ) { ltrace(200) << "AutoSegment::shearUp() " << this << endl; @@ -1538,17 +1400,17 @@ namespace Katabatic { } AutoSegment* before = this; - const vector& doglegs = Session::getDogLegs(); + const vector& doglegs = Session::getDoglegs(); if ( leftShear ) { - makeDogLeg ( leftShear, true ); + makeDogleg ( leftShear, true ); movedUp = doglegs[2]; } else { before = NULL; movedUp = this; } - if ( rightShear ) makeDogLeg(rightShear,true); + if ( rightShear ) makeDogleg(rightShear,true); if ( movedUp->moveUp(flags) ) { if ( rightShear or leftShear ) @@ -1559,129 +1421,232 @@ namespace Katabatic { movedUp = NULL; return false; } +#endif - bool AutoSegment::canDogLeg ( Interval interval ) + unsigned int AutoSegment::canDogleg ( Interval interval ) { - ltrace(200) << "AutoSegment::canDogLeg(Interval) " << interval << endl; + ltrace(200) << "AutoSegment::canDogleg(Interval) " << interval << endl; size_t leftDogleg = 0; size_t rightDogleg = 0; - if ( getSpanU().contains(interval.getVMin()) ) leftDogleg++; - if ( getSpanU().contains(interval.getVMax()) ) rightDogleg++; + if (getSpanU().contains(interval.getVMin())) leftDogleg++; + if (getSpanU().contains(interval.getVMax())) rightDogleg++; - forEach ( AutoSegment*, isegment, getCollapseds() ) { - if ( isegment->getSpanU().contains(interval.getVMin()) ) { - if ( isegment->isFixed() ) return false; - leftDogleg++; - } - if ( isegment->getSpanU().contains(interval.getVMax()) ) { - if ( isegment->isFixed() ) return false; - rightDogleg++; + if (not isNotAligned()) { + forEach ( AutoSegment*, isegment, getAligneds() ) { + if (isegment->getSpanU().contains(interval.getVMin())) { + if (isegment->isFixed()) return false; + leftDogleg++; + } + if (isegment->getSpanU().contains(interval.getVMax())) { + if (isegment->isFixed()) return 0; + rightDogleg++; + } } } - if ( (leftDogleg == 1) and (rightDogleg <= 1) ) return true; - if ( (leftDogleg <= 1) and (rightDogleg == 1) ) return true; + if ( (leftDogleg == 1) and (rightDogleg <= 1) ) return KbDoglegOnLeft; + if ( (leftDogleg <= 1) and (rightDogleg == 1) ) return KbDoglegOnRight; ltrace(200) << "leftCount:" << leftDogleg << " rightCount:" << rightDogleg << endl; - return false; + return 0; } - void AutoSegment::makeDogLeg ( Interval interval, bool upLayer, bool& leftDogleg ) + AutoSegment* AutoSegment::makeDogleg ( AutoContact* from ) { - ltrace(200) << "AutoSegment::makeDogLeg(Interval)" << endl; + ltrace(200) << "AutoSegment::makeDogleg(AutoContact*) " << from << endl; + ltracein(200); + ltrace(200) << this << endl; + RoutingGauge* rg = Session::getRoutingGauge(); + size_t segmentDepth = rg->getLayerDepth( getLayer() ); + const vector& doglegs = Session::getDoglegs(); + size_t index = doglegs.size(); + bool isSource = (getAutoSource() == from); + + ltrace(200) << "isSource:" << isSource << endl; + + makeDogleg( from->getGCell(), KbNoCheckLayer ); + if (doglegs.size() == index) { + ltraceout(200); + return NULL; + } + doglegs[ index+1 ]->setAxis( isHorizontal() ? from->getX() : from->getY() ); + + if (not from->getLayer()->contains(getLayer())) { + ltrace(200) << "Contact layer do not contains Segment layer, adjust layers" << endl; + + if (getLayer()->above(from->getLayer())) { + ltrace(200) << "Go Down from depth " << segmentDepth << endl; + + doglegs[ index + 1 ]->setLayer( rg->getRoutingLayer(segmentDepth-1) ); + ltrace(200) << "doglegs[i+1]: " << doglegs[index+1] << endl; + + if (isSource) { + doglegs[ index + 0 ]->setLayer( rg->getRoutingLayer(segmentDepth-2) ); + doglegs[ index + 1 ]->getAutoSource()->setLayer( rg->getContactLayer(segmentDepth-2) ); + doglegs[ index + 1 ]->getAutoTarget()->setLayer( rg->getContactLayer(segmentDepth-1) ); + ltrace(200) << "doglegs[i+0]: " << doglegs[index+0] << endl; + ltrace(200) << "doglegs[i+1]: " << doglegs[index+1]->getAutoSource() << endl; + ltrace(200) << "doglegs[i+1]: " << doglegs[index+1]->getAutoTarget() << endl; + } else { + doglegs[ index + 2 ]->setLayer( rg->getRoutingLayer(segmentDepth-2) ); + doglegs[ index + 1 ]->getAutoTarget()->setLayer( rg->getContactLayer(segmentDepth-2) ); + doglegs[ index + 1 ]->getAutoSource()->setLayer( rg->getContactLayer(segmentDepth-1) ); + ltrace(200) << "doglegs[i+2]: " << doglegs[index+2] << endl; + ltrace(200) << "doglegs[i+1]: " << doglegs[index+1]->getAutoTarget() << endl; + ltrace(200) << "doglegs[i+1]: " << doglegs[index+1]->getAutoSource() << endl; + } + } else { + ltrace(200) << "Go Up from depth " << segmentDepth << endl; + + doglegs[ index + 1 ]->setLayer( rg->getRoutingLayer(segmentDepth+1) ); + ltrace(200) << "doglegs[i+1]: " << doglegs[index+1] << endl; + + if (isSource) { + doglegs[ index + 0 ]->setLayer( rg->getRoutingLayer(segmentDepth+2) ); + doglegs[ index + 1 ]->getAutoSource()->setLayer( rg->getContactLayer(segmentDepth+1) ); + doglegs[ index + 1 ]->getAutoTarget()->setLayer( rg->getContactLayer(segmentDepth ) ); + ltrace(200) << "doglegs[i+0]: " << doglegs[index+0] << endl; + ltrace(200) << "doglegs[i+1]: " << doglegs[index+1]->getAutoSource() << endl; + ltrace(200) << "doglegs[i+1]: " << doglegs[index+1]->getAutoTarget() << endl; + } else { + doglegs[ index + 2 ]->setLayer( rg->getRoutingLayer(segmentDepth+2) ); + doglegs[ index + 1 ]->getAutoTarget()->setLayer( rg->getContactLayer(segmentDepth+1) ); + doglegs[ index + 1 ]->getAutoSource()->setLayer( rg->getContactLayer(segmentDepth ) ); + ltrace(200) << "doglegs[i+2]: " << doglegs[index+2] << endl; + ltrace(200) << "doglegs[i+1]: " << doglegs[index+1]->getAutoTarget() << endl; + ltrace(200) << "doglegs[i+1]: " << doglegs[index+1]->getAutoSource() << endl; + } + } + } + + ltraceout(200); + return doglegs[ index + (isSource?0:2) ]; + } + + + unsigned int AutoSegment::makeDogleg ( Interval interval, unsigned int flags ) + { + ltrace(200) << "AutoSegment::makeDogleg(Interval) - " << interval << endl; + ltracein(200); + + bool leftDogleg = true; + unsigned int rflags = 0; size_t leftDoglegCount = 0; size_t rightDoglegCount = 0; AutoSegment* leftCandidate = NULL; AutoSegment* rightCandidate = NULL; - if ( getSpanU().contains(interval.getVMin()) ) { leftCandidate = this; leftDoglegCount++; } - if ( getSpanU().contains(interval.getVMax()) ) { rightCandidate = this; rightDoglegCount++; } + if (getSpanU().contains(interval.getVMin())) { leftCandidate = this; leftDoglegCount++; } + if (getSpanU().contains(interval.getVMax())) { rightCandidate = this; rightDoglegCount++; } - forEach ( AutoSegment*, isegment, getCollapseds() ) { - if ( isegment->getSpanU().contains(interval.getVMin()) ) { leftCandidate = *isegment; leftDoglegCount++; } - if ( isegment->getSpanU().contains(interval.getVMax()) ) { rightCandidate = *isegment; rightDoglegCount++; } + if (not isNotAligned()) { + forEach ( AutoSegment*, isegment, getAligneds(flags) ) { + if (isegment->getSpanU().contains(interval.getVMin())) { leftCandidate = *isegment; leftDoglegCount++; } + if (isegment->getSpanU().contains(interval.getVMax())) { rightCandidate = *isegment; rightDoglegCount++; } + } } - leftDogleg = true; - if ( (leftDoglegCount != 1) and (rightDoglegCount != 1) ) return; - if ( !leftDoglegCount ) { + if ( (leftDoglegCount != 1) and (rightDoglegCount != 1) ) { ltraceout(200); return 0; } + if (not leftDoglegCount) { leftDogleg = false; leftCandidate = rightCandidate; rightCandidate = NULL; } - if ( leftCandidate && rightCandidate ) { - ltrace(200) << "Left Constraint: " << leftCandidate->getSourceConstraints(true) << endl; - ltrace(200) << "Right Constraint: " << rightCandidate->getTargetConstraints(true) << endl; + if (leftCandidate and rightCandidate) { + ltrace(200) << "Left Constraint: " << leftCandidate->getSourceConstraints(KbNativeConstraints) << endl; + ltrace(200) << "Right Constraint: " << rightCandidate->getTargetConstraints(KbNativeConstraints) << endl; - if ( leftCandidate ->getTargetConstraints(true).getSize() - < rightCandidate->getSourceConstraints(true).getSize() ) { + if ( leftCandidate ->getTargetConstraints(KbNativeConstraints).getSize() + < rightCandidate->getSourceConstraints(KbNativeConstraints).getSize() ) { leftCandidate = rightCandidate; leftDogleg = false; } } else { - if ( !leftCandidate ) { + if (not leftCandidate) { leftCandidate = rightCandidate; leftDogleg = false; } } - if ( leftCandidate ) { - leftCandidate->_makeDogLeg ( getAutoSource()->getGCell(), upLayer ); + if (leftCandidate) { + DbU::Unit axis; + // Ugly: Hard-wired track spacing. + if (leftDogleg) axis = interval.getVMin() - DbU::lambda(5.0); + else axis = interval.getVMax() + DbU::lambda(5.0); - const vector& dogLegs = Session::getDogLegs(); - if ( dogLegs.size() >= 2 ) { - DbU::Unit axis; - if ( leftDogleg ) - axis = interval.getVMin() - DbU::lambda(5.0); // Ugly: Hard-wired track spacing. - else - axis = interval.getVMax() + DbU::lambda(5.0); // Ugly: Hard-wired track spacing. + ltrace(200) << "Break @" << DbU::getValueString(axis) << " " << leftCandidate << endl; - ltrace(200) << "AutoSegment::makeDogLeg(): @" << DbU::getValueString(axis) << endl; - dogLegs[1]->setAxis ( axis ); + unsigned int direction = getDirection(); + GCell* gcell = leftCandidate->getAutoSource()->getGCell(); + GCell* end = leftCandidate->getAutoTarget()->getGCell(); + while ( gcell != end ) { + if (gcell->getSide(direction).contains(axis)) break; + gcell = (direction == KbHorizontal) ? gcell->getRight() : gcell->getUp(); + } + + ltrace(200) << "In " << gcell << endl; + rflags = leftCandidate->_makeDogleg( gcell, flags ); + + const vector& doglegs = Session::getDoglegs(); + if (doglegs.size() >= 2) { + ltrace(200) << "AutoSegment::makeDogleg(): @" << DbU::getValueString(axis) << endl; + doglegs[1]->setAxis( axis ); } } + + ltraceout(200); + return rflags | (leftDogleg ? KbDoglegOnLeft : KbDoglegOnRight); } - void AutoSegment::makeDogLeg ( GCell* dogLegGCell, bool upLayer ) + unsigned int AutoSegment::makeDogleg ( GCell* doglegGCell, unsigned int flags ) { - ltrace(160) << "AutoSegment::makeDogLeg(GCell*)" << endl; + ltrace(500) << "Deter| AutoSegment::makeDogleg(GCell*) " << doglegGCell << endl; + ltrace(500) << "Deter| in " << this << endl; ltracein(160); - if ( isFixed() ) { - cerr << Error("AutoSegment::makeDogLeg(): Cannot make a dog leg on a fixed segment.\n" - " (on: %s)",_getString().c_str()) << endl; - return; + unsigned int rflags = 0; + + if (doglegGCell->isUnderIoPad()) { + cerr << Bug( "Attempt to make a dogleg in a GCell under a Pad\n" + " %s" + , getString(doglegGCell).c_str() ) << endl; } - invalidate (); + if (isFixed()) { + cerr << Error( "AutoSegment::makeDogleg(): Cannot make a dog leg on a fixed segment.\n" + " (on: %s)", _getString().c_str() ) << endl; + return 0; + } - if ( dogLegGCell->getUSide(getDirection()).intersect(getSpanU()) ) { + if (doglegGCell->getSide(getDirection()).intersect(getSpanU())) { ltrace(159) << "Dogleg in " << this << endl; - _makeDogLeg ( dogLegGCell, upLayer ); - //Session::revalidate ( getNet() ); + rflags = _makeDogleg( doglegGCell, flags ); } else { ltrace(159) << "Looking in aligneds." << endl; - forEach ( AutoSegment*, aligned, getCollapseds() ) { - ltrace(159) << "| Try in " << *aligned << endl; - if ( dogLegGCell->getUSide(getDirection()).intersect(aligned->getSpanU()) ) { - ltrace(159) << "Dogleg in " << *aligned << endl; - aligned->_makeDogLeg ( dogLegGCell, upLayer ); - //Session::revalidate ( getNet() ); - ltraceout(160); - return; + if (not isNotAligned()) { + forEach ( AutoSegment*, aligned, getAligneds(flags) ) { + ltrace(159) << "| Try in " << *aligned << endl; + if (doglegGCell->getSide(getDirection()).intersect(aligned->getSpanU())) { + ltrace(159) << "Dogleg in " << *aligned << endl; + rflags = aligned->_makeDogleg( doglegGCell, flags ); + ltraceout(160); + return 0; + } } } cerr << Bug("Cannot make a dogleg in %s at %s" - ,_getString().c_str(), getString(dogLegGCell).c_str()) << endl; + ,_getString().c_str(), getString(doglegGCell).c_str()) << endl; } ltraceout(160); + + return rflags; } @@ -1689,7 +1654,7 @@ namespace Katabatic { { bool coherency = true; - coherency = coherency && checkInvalidated(); + coherency = coherency && checkNotInvalidated(); coherency = coherency && checkPositions(); coherency = coherency && checkConstraints(); @@ -1697,40 +1662,45 @@ namespace Katabatic { } + string AutoSegment::_getStringFlags () const + { + string state; + state += isFixed () ?" F":" -"; + state += isUnsetAxis () ? "u": "-"; + state += isStrap () ? "S": "-"; + state += isCanonical () ? "C": "-"; + state += isGlobal () ? "G": "-"; + state += isWeakGlobal () ? "g": "-"; + state += isStrongTerminal() ? "T": "-"; + state += isWeakTerminal1 () ? "W": "-"; + state += isWeakTerminal2 () ? "w": "-"; + state += isNotAligned () ? "A": "-"; + state += isSlackened () ? "S": "-"; + state += isInvalidated () ? "i": "-"; + return state; + } + + string AutoSegment::_getString () const { - string s = getSegment()->_getString(); - s.insert ( 1, "id: " ); - s.insert ( 4, getString(_id) ); - s.insert ( s.size()-1, (_isFixed )?" F":" -" ); - s.insert ( s.size()-1, (_strap )? "S": "-" ); - s.insert ( s.size()-1, (_isCanonical )? "C": "-" ); - s.insert ( s.size()-1, (_isCollapsed )? "c": "-" ); - s.insert ( s.size()-1, (_isGlobal )? "g": "-" ); - s.insert ( s.size()-1, (_isTopologicEnd)? "e": "-" ); - s.insert ( s.size()-1, (_isTerminal )? "t": "-" ); - s.insert ( s.size()-1, (_slackened )? "S": "-" ); - s.insert ( s.size()-1, (_invalidated )? "i": "-" ); + string s = base()->_getString(); + //s.insert ( 1, "id: " ); + //s.insert ( 4, getString(_id) ); + s.insert ( s.size()-1, _getStringFlags() ); return s; } Record* AutoSegment::_getRecord () const { - Record* record = getSegment()->_getRecord (); - record->add ( getSlot ( "_gcell" , _gcell ) ); - record->add ( getSlot ( "_isHorizontal" , &_isHorizontal ) ); - record->add ( getSlot ( "_isFixed" , &_isFixed ) ); - record->add ( getSlot ( "_strap" , &_strap ) ); - record->add ( getSlot ( "_layerChange" , &_layerChange ) ); - record->add ( getSlot ( "_isCanonical" , &_isCanonical ) ); - record->add ( getSlot ( "_isCollapsed" , &_isCollapsed ) ); - record->add ( getSlot ( "_isGlobal" , &_isGlobal ) ); - record->add ( getSlot ( "_isTerminal" , &_isTerminal ) ); - record->add ( getSlot ( "_slackened" , &_slackened ) ); - record->add ( getSlot ( "_invalidated" , &_invalidated ) ); - record->add ( getSlot ( "_sourcePosition", &_sourcePosition ) ); - record->add ( getSlot ( "_targetPosition", &_targetPosition ) ); + Record* record = base()->_getRecord (); + record->add ( getSlot ( "_gcell" , _gcell ) ); + record->add ( getSlot ( "_id" , &_id ) ); + record->add ( getSlot ( "_flags" , &_flags ) ); + record->add ( getSlot ( "_userContraints", &_userConstraints ) ); + record->add ( getSlot ( "_sourcePosition", &_sourcePosition ) ); + record->add ( getSlot ( "_targetPosition", &_targetPosition ) ); + record->add ( getSlot ( "_parent" , _parent ) ); return record; } @@ -1740,75 +1710,103 @@ namespace Katabatic { , Segment* hurricaneSegment ) { - static Layer* verticalLayer = DataBase::getDB()->getTechnology()->getLayer ( "METAL3" ); - static Layer* horizontalLayer = DataBase::getDB()->getTechnology()->getLayer ( "METAL2" ); + static const Layer* horizontalLayer = Session::getRoutingLayer( 1 ); + static const Layer* verticalLayer = Session::getRoutingLayer( 2 ); + bool reattachSource = false; + bool reattachTarget = false; AutoSegment* segment; - Horizontal* horizontal; - Vertical* vertical; + Horizontal* horizontal = dynamic_cast( hurricaneSegment ); + Vertical* vertical = dynamic_cast( hurricaneSegment ); + AutoContact* reference = source; - Contact* contact = dynamic_cast(hurricaneSegment->getSource()); - AutoContact* autoContact = Session::lookup(contact); - if ( contact == NULL ) { - throw Error ( badSegmentSource, getString(hurricaneSegment).c_str() ); - if ( autoContact and ( autoContact != source ) ) - throw Error ( mismatchSegmentSource - , getString(hurricaneSegment).c_str() - , getString(contact).c_str() ); + ltrace(159) << "Source:" << source << endl; + ltrace(159) << "Target:" << target << endl; + + if (target->isFixed()) { + if (source->isFixed()) { + if ( (horizontal) and (source->getY() != target->getY())) + cerr << Warning( "Straight AutoHorizontal connecting misaligned contacts:\n" + " %s\n" + " %s" + , getString(source).c_str() + , getString(target).c_str() + ) << endl; + if ( (vertical) and (source->getX() != target->getX())) + cerr << Warning( "Straight AutoVertical connecting misaligned contacts:\n" + " %s\n" + " %s" + , getString(source).c_str() + , getString(target).c_str() + ) << endl; + } else + reference = target; } - contact = dynamic_cast(hurricaneSegment->getTarget()); - autoContact = Session::lookup(contact); - if ( contact == NULL ) { - throw Error ( badSegmentTarget, getString(hurricaneSegment).c_str() ); - if ( autoContact and ( autoContact != target ) ) + Contact* contact = dynamic_cast( hurricaneSegment->getSource() ); + AutoContact* autoContact = Session::lookup( contact ); + if (contact == NULL) { + throw Error( badSegmentSource, getString(hurricaneSegment).c_str() ); + if ( autoContact and (autoContact != source) ) + throw Error( mismatchSegmentSource + , getString(hurricaneSegment).c_str() + , getString(contact).c_str() ); + } else { + if (autoContact != source) reattachSource = true; + } + + contact = dynamic_cast( hurricaneSegment->getTarget() ); + autoContact = Session::lookup( contact ); + if (contact == NULL) { + throw Error( badSegmentTarget, getString(hurricaneSegment).c_str() ); + if ( autoContact and (autoContact != target) ) throw Error ( mismatchSegmentTarget , getString(hurricaneSegment).c_str() , getString(contact).c_str() ); + } else { + if (autoContact != source) reattachTarget = true; } - Hook* hook = hurricaneSegment->getSourceHook(); - hook->detach (); - hook->attach ( source->getBodyHook() ); + if (reattachSource) { + Hook* hook = hurricaneSegment->getSourceHook(); + hook->detach (); + hook->attach ( source->getBodyHook() ); + } - hook = hurricaneSegment->getTargetHook(); - hook->detach (); - hook->attach ( target->getBodyHook() ); + if (reattachTarget) { + Hook* hook = hurricaneSegment->getTargetHook(); + hook->detach (); + hook->attach ( target->getBodyHook() ); + } - if ( (horizontal = dynamic_cast(hurricaneSegment) ) ) { - if ( horizontal->getLayer() != horizontalLayer ) { - if ( !Session::getKatabatic()->isGMetal(horizontal->getLayer()) ) + if (horizontal) { + if (horizontal->getLayer() != horizontalLayer) { + if ( not Session::getKatabatic()->isGMetal(horizontal->getLayer()) ) cerr << Warning("Segment %s forced to %s." ,getString(horizontal).c_str() ,getString(horizontalLayer).c_str()) << endl; - horizontal->setLayer ( horizontalLayer ); + horizontal->setLayer( horizontalLayer ); } - segment = AutoHorizontal::create ( horizontal - , AutoSegment::Global - , false - , false - ); - } else if ( (vertical = dynamic_cast(hurricaneSegment)) ) { - if ( vertical->getLayer() != verticalLayer ) { - if ( !Session::getKatabatic()->isGMetal(vertical->getLayer()) ) + horizontal->setY( reference->getY() ); + segment = new AutoHorizontal ( horizontal ); + segment->_postCreate(); + } else if (vertical) { + if (vertical->getLayer() != verticalLayer) { + if ( not Session::getKatabatic()->isGMetal(vertical->getLayer()) ) cerr << Warning("Segment %s forced to %s." ,getString(vertical).c_str() ,getString(verticalLayer).c_str()) << endl; - vertical->setLayer ( verticalLayer ); + vertical->setLayer( verticalLayer ); } - segment = AutoVertical::create ( vertical - , AutoSegment::Global - , false - , false - ); + vertical->setX( reference->getX() ); + segment = new AutoVertical ( vertical ); + segment->_postCreate(); } else { - throw Error ( badSegment, getString(source).c_str(), getString(target).c_str() ); + throw Error( badSegment, getString(source).c_str(), getString(target).c_str() ); } - ltrace(99) << "Creating " << segment << endl; - return segment; } @@ -1816,77 +1814,56 @@ namespace Katabatic { AutoSegment* AutoSegment::create ( AutoContact* source , AutoContact* target , unsigned int dir - , int type - , bool terminal - , bool collapsed ) { - //static Layer* verticalLayer = DataBase::getDB()->getTechnology()->getLayer ( "METAL3" ); - //static Layer* horizontalLayer = DataBase::getDB()->getTechnology()->getLayer ( "METAL2" ); + static const Layer* horizontalLayer = Session::getRoutingLayer( 1 ); + static const Layer* verticalLayer = Session::getRoutingLayer( 2 ); - static const Layer* horizontalLayer = Session::getRoutingLayer ( 1 ); - static const Layer* verticalLayer = Session::getRoutingLayer ( 2 ); - - GCell* gcell; - GCell* end; AutoSegment* segment; + AutoContact* reference = source; - if ( dir & Constant::Horizontal ) { - segment = AutoHorizontal::create ( source - , target - , horizontalLayer - , source->getY() - , DbU::lambda(2.0) - , type - , terminal - , collapsed - ); - if ( type == AutoSegment::Global ) { - if ( source->getGCell()->getX() < target->getGCell()->getX() ) { - gcell = source->getGCell()->getRight(); - end = target->getGCell(); - } else { - gcell = target->getGCell()->getRight(); - end = source->getGCell(); - } - for ( ; gcell != end ; gcell = gcell->getRight() ) { - if ( !gcell ) { - cerr << Error("AutoSegment::create() : NULL GCell.") << endl; - break; - } - gcell->addHSegment ( segment ); - } - } - } else if ( dir & Constant::Vertical ) { - segment = AutoVertical::create ( source - , target - , verticalLayer - , source->getX() - , DbU::lambda(2.0) - , type - , terminal - , collapsed - ); - if ( type == AutoSegment::Global ) { - if ( source->getGCell()->getY() < target->getGCell()->getY() ) { - gcell = source->getGCell()->getUp(); - end = target->getGCell(); - } else { - gcell = target->getGCell()->getUp(); - end = source->getGCell(); - } - for ( ; gcell != end ; gcell = gcell->getUp() ) { - if ( !gcell ) { - cerr << Error("AutoSegment::create() : NULL GCell.") << endl; - break; - } - gcell->addVSegment ( segment ); - } - } + ltrace(159) << "Source:" << source << endl; + ltrace(159) << "Target:" << target << endl; + + if (target->isFixed()) { + if (source->isFixed()) { + if ( (dir == KbHorizontal) and (source->getY() != target->getY())) + cerr << Warning( "Straight AutoHorizontal connecting misaligned contacts:\n" + " %s\n" + " %s" + , getString(source).c_str() + , getString(target).c_str() + ) << endl; + if ( (dir == KbVertical) and (source->getX() != target->getX())) + cerr << Warning( "Straight AutoVertical connecting misaligned contacts:\n" + " %s\n" + " %s" + , getString(source).c_str() + , getString(target).c_str() + ) << endl; + } else + reference = target; + } + + if (dir & KbHorizontal) { + segment = create( source + , target + , Horizontal::create( source->base() + , target->base() + , horizontalLayer + , reference->getY() + , DbU::lambda(2.0) ) ); + } else if (dir & KbVertical) { + segment = create( source + , target + , Vertical::create( source->base() + , target->base() + , verticalLayer + , reference->getX() + , DbU::lambda(2.0) + ) ); } else - throw Error ( badSegment, getString(source).c_str(), getString(target).c_str() ); - - ltrace(99) << "create() " << segment << endl; + throw Error( badSegment, getString(source).c_str(), getString(target).c_str() ); return segment; } @@ -1899,9 +1876,7 @@ namespace Katabatic { } - bool AutoSegment::isTopologicalBound ( AutoSegment* seed - , bool superior - , bool isHorizontal ) + bool AutoSegment::isTopologicalBound ( AutoSegment* seed, unsigned int flags ) { ltrace(80) << "isTopologicalBound() - " << seed << endl; ltracein(80); @@ -1910,64 +1885,63 @@ namespace Katabatic { vector stack; DbU::Unit axis; - if ( superior ) axis = seed->getTargetU(); - else axis = seed->getSourceU(); + if (flags & KbSuperior) axis = seed->getTargetU(); + else axis = seed->getSourceU(); ltrace(80) << "check for bound " << DbU::getValueString(axis) << endl; - exploreds.insert ( seed->getAutoSource() ); - exploreds.insert ( seed->getAutoTarget() ); + exploreds.insert( seed->getAutoSource() ); + exploreds.insert( seed->getAutoTarget() ); - if ( seed->getLength() ) { - if ( superior ) stack.push_back ( seed->getAutoTarget() ); - else stack.push_back ( seed->getAutoSource() ); + if (seed->getLength()) { + if (flags & KbSuperior) stack.push_back( seed->getAutoTarget() ); + else stack.push_back( seed->getAutoSource() ); } else { - stack.push_back ( seed->getAutoTarget() ); - stack.push_back ( seed->getAutoSource() ); + stack.push_back( seed->getAutoTarget() ); + stack.push_back( seed->getAutoSource() ); } - while ( !stack.empty() ) { + while ( not stack.empty() ) { AutoContact* currentContact = stack.back(); - stack.pop_back (); + stack.pop_back(); - ltrace(80) << "Exploring: " << (void*)currentContact - << " " << currentContact << endl; + ltrace(80) << "Exploring: " << (void*)currentContact << " " << currentContact << endl; - exploreds.insert ( currentContact ); + exploreds.insert( currentContact ); - if ( currentContact->getAnchor() ) { ltraceout(80); return true; } + if (currentContact->getAnchor()) { ltraceout(80); return true; } forEach ( Component*, component, currentContact->getSlaveComponents() ) { - Segment* segment = dynamic_cast(*component); - if ( !segment ) continue; + Segment* segment = dynamic_cast( *component ); + if (not segment) continue; - AutoSegment* autoSegment = Session::lookup ( segment ); - if ( !autoSegment ) continue; + AutoSegment* autoSegment = Session::lookup( segment ); + if (not autoSegment) continue; - if ( !autoSegment->getLength() ) { + if (not autoSegment->getLength()) { AutoContact* contact = autoSegment->getAutoSource(); - if ( contact && ( contact != currentContact ) ) { - if ( exploreds.find(contact) == exploreds.end() ) - stack.push_back ( contact ); + if (contact and (contact != currentContact)) { + if (exploreds.find(contact) == exploreds.end()) + stack.push_back( contact ); } contact = autoSegment->getAutoTarget(); - if ( contact && ( contact != currentContact ) ) { - if ( exploreds.find(contact) == exploreds.end() ) - stack.push_back ( contact ); + if (contact and (contact != currentContact)) { + if (exploreds.find(contact) == exploreds.end()) + stack.push_back( contact ); } continue; } - if ( autoSegment->isHorizontal() != isHorizontal ) continue; + if (autoSegment->isHorizontal() xor (flags & KbHorizontal)) continue; ltrace(80) << "| " << autoSegment << endl; - if ( superior ) { - if ( autoSegment->getTargetU() > axis ) { ltraceout(80); return true; } + if (flags & KbSuperior) { + if (autoSegment->getTargetU() > axis) { ltraceout(80); return true; } } else { - if ( autoSegment->getSourceU() < axis ) { ltraceout(80); return true; } + if (autoSegment->getSourceU() < axis) { ltraceout(80); return true; } } } } @@ -1977,6 +1951,7 @@ namespace Katabatic { } +#if THIS_IS_DISABLED unsigned int AutoSegment::getPerpandicularState ( AutoContact* contact , AutoSegment* source , AutoSegment* current @@ -2011,76 +1986,79 @@ namespace Katabatic { return state; } +#endif void AutoSegment::getTopologicalInfos ( AutoSegment* seed - , vector& collapseds + , vector& aligneds , vector& perpandiculars , DbU::Unit& leftBound , DbU::Unit& rightBound ) { ltrace(80) << "getTopologicalInfos() - " << seed << endl; + ltracein(80); leftBound = DbU::Max; rightBound = DbU::Min; AutoSegmentStack stack; - stack.push ( seed->getAutoSource(), seed ); - stack.push ( seed->getAutoTarget(), seed ); + stack.push( seed->getAutoSource(), seed ); + stack.push( seed->getAutoTarget(), seed ); while ( not stack.isEmpty() ) { - AutoContact* sourceContact = stack.getAutoContact (); - AutoSegment* sourceSegment = stack.getAutoSegment (); + AutoContact* sourceContact = stack.getAutoContact(); + AutoSegment* sourceSegment = stack.getAutoSegment(); - stack.pop (); + stack.pop(); - DbU::Unit constraint; + DbU::Unit constraint; - if ( seed->isHorizontal() ) constraint = sourceContact->getCBXMax(); - else constraint = sourceContact->getCBYMax(); - if ( constraint < leftBound ) leftBound = constraint; + if (seed->isHorizontal()) constraint = sourceContact->getCBXMax(); + else constraint = sourceContact->getCBYMax(); + if (constraint < leftBound) leftBound = constraint; - if ( seed->isHorizontal() ) constraint = sourceContact->getCBXMin(); - else constraint = sourceContact->getCBYMin(); - if ( constraint > rightBound ) rightBound = constraint; + if (seed->isHorizontal()) constraint = sourceContact->getCBXMin(); + else constraint = sourceContact->getCBYMin(); + if (constraint > rightBound) rightBound = constraint; - forEach ( Component*, component, sourceContact->getSlaveComponents() ) { - Segment* segment = dynamic_cast(*component); - if ( ( not segment ) || ( segment == sourceSegment->getSegment() ) ) continue; + ltrace(200) << "Segments of: " << sourceContact << endl; + LocatorHelper helper (sourceContact, KbHorizontal|KbWithPerpands); + for ( ; helper.isValid() ; helper.progress() ) { + AutoSegment* currentSegment = helper.getSegment(); + ltrace(200) << "Looking for: " << currentSegment << endl; + if (currentSegment == sourceSegment) continue; - AutoSegment* currentSegment = Session::lookup ( segment ); - if ( not currentSegment ) { - cerr << Error("Can't lookup for %s.",getString(segment).c_str()) << endl; + if (AutoSegment::areAlignedsAndDiffLayer(currentSegment,seed)) { + cerr << Error("Aligned segments not in same layer\n" + " %s\n" + " %s." + ,getString(seed).c_str() + ,getString(currentSegment).c_str()) << endl; continue; } - unsigned int state = getPerpandicularState ( sourceContact - , sourceSegment - , currentSegment - , seed ); - if ( state & PerpandicularAny ) { - ltrace(79) << "Perpandicular: " << currentSegment << endl; - perpandiculars.push_back ( currentSegment ); - } - if ( state & (PerpandicularIndirect - |ParallelOrExpanded - |ParallelAndLayerChange ) ) { - ltrace(79) << "Reject: " << currentSegment << endl; - continue; - } + if (AutoSegment::areAligneds(currentSegment,seed)) { + aligneds.push_back( currentSegment ); - if ( not areAligneds(currentSegment,seed) ) { - collapseds.push_back ( currentSegment ); - ltrace(79) << "collapsed: " << currentSegment << endl; + AutoContact* targetContact = currentSegment->getOppositeAnchor( sourceContact ); + ltrace(200) << "Target: " << targetContact << endl; + if (targetContact) { + if ( (seed->isHorizontal() and sourceContact->isHTee()) + or (seed->isVertical () and sourceContact->isVTee()) ) { + ltrace(200) << "Stacking target. " << endl; + stack.push( targetContact, currentSegment ); + } + } + } else { + ltrace(200) << "| perpandicular " << currentSegment << endl; + perpandiculars.push_back( currentSegment ); } - - Component* opposite = segment->getOppositeAnchor ( sourceContact->getContact() ); - AutoContact* targetContact = Session::lookup(static_cast(opposite)); - if ( targetContact ) stack.push ( targetContact, currentSegment ); } } + + ltraceout(80); } @@ -2090,11 +2068,11 @@ namespace Katabatic { int count = 0; for ( size_t i=0 ; i < collapseds.size() ; i++ ) { - if ( collapseds[i]->isTerminal() ) + if (collapseds[i]->isStrongTerminal()) count++; } - if ( seed->getAutoSource()->isTerminal() ) count++; - if ( seed->getAutoTarget()->isTerminal() ) count++; + if (seed->getAutoSource()->isTerminal()) count++; + if (seed->getAutoTarget()->isTerminal()) count++; return count; } diff --git a/katabatic/src/AutoSegments.cpp b/katabatic/src/AutoSegments.cpp index 94430bed..4d686256 100644 --- a/katabatic/src/AutoSegments.cpp +++ b/katabatic/src/AutoSegments.cpp @@ -2,25 +2,17 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./AutoSegments.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ #include "hurricane/Error.h" @@ -46,61 +38,52 @@ namespace Katabatic { // ------------------------------------------------------------------- // Class : "Katabatic::AutoSegmentStack". - void AutoSegmentStack::push ( AutoContact* contact, AutoSegment* segment ) { ltrace(80) << "Stacking " << contact << " + " << segment << endl; - - push_back(make_pair(contact,segment)); + push_back( make_pair(contact,segment) ); } // ------------------------------------------------------------------- // Class : "Katabatic::AutoSegments_OnContact". - AutoSegments_OnContact::Locator::Locator ( AutoSegment* master, Contact* contact ) : AutoSegmentHL() - , _master(master) - , _element(NULL) + , _master (master) + , _element (NULL) { _hook = contact->getBodyHook()->getPreviousMasterHook(); - progress (); + progress(); } AutoSegmentHL* AutoSegments_OnContact::Locator::getClone () const - { - return new Locator(*this); - } + { return new Locator(*this); } AutoSegment* AutoSegments_OnContact::Locator::getElement () const - { - return _element; - } + { return _element; } bool AutoSegments_OnContact::Locator::isValid () const - { - return !_hook; - } + { return !_hook; } void AutoSegments_OnContact::Locator::progress () { ltrace(80) << "AutoSegments_OnContact::Locator::progress()" << endl; - while ( _hook && !_hook->isMaster() ) { + while (_hook and not _hook->isMaster()) { _hook = _hook->getNextHook(); _element = NULL; if ( _hook->isMaster() ) { _hook = NULL; break; } Segment* segment = dynamic_cast( _hook->getComponent() ); - if ( segment ) _element = Session::lookup ( segment ); + if (segment) _element = Session::lookup( segment ); - if ( !_element || (_element == _master) ) continue; + if (not _element or (_element == _master)) continue; break; } @@ -117,15 +100,11 @@ namespace Katabatic { AutoSegmentHC* AutoSegments_OnContact::getClone () const - { - return new AutoSegments_OnContact(*this); - } + { return new AutoSegments_OnContact(*this); } AutoSegmentHL* AutoSegments_OnContact::getLocator () const - { - return new Locator(_master,_contact); - } + { return new Locator(_master,_contact); } string AutoSegments_OnContact::_getString () const @@ -138,114 +117,96 @@ namespace Katabatic { // ------------------------------------------------------------------- -// Class : "AutoSegments_Collapsed". +// Class : "AutoSegments_Aligneds". - - AutoSegments_Collapsed::Locator::Locator ( AutoSegment* segment, bool withPerpand ) + AutoSegments_Aligneds::Locator::Locator ( AutoSegment* segment, unsigned int flags ) : AutoSegmentHL() - , _withPerpand(withPerpand) + , _flags (flags) , _master(segment) - , _stack() + , _stack () { - if ( not _master ) return; + if (not _master) return; + _flags |= (_master->isHorizontal()) ? KbHorizontal : KbVertical; + + ltrace(80) << "AutoSegments_Aligneds::Locator::Locator() - _flags:" << _flags << endl; AutoContact* contact = segment->getAutoSource(); - if ( contact ) _stack.push ( contact, segment ); + if (contact) _stack.push( contact, segment ); contact = segment->getAutoTarget(); - if ( contact ) _stack.push ( contact, segment ); + if (contact) _stack.push( contact, segment ); - progress (); + progress(); } - AutoSegmentHL* AutoSegments_Collapsed::Locator::getClone () const + AutoSegmentHL* AutoSegments_Aligneds::Locator::getClone () const + { return new Locator(*this); } + + + bool AutoSegments_Aligneds::Locator::isValid () const + { return not _stack.isEmpty(); } + + + void AutoSegments_Aligneds::Locator::progress () { - return new Locator(*this); - } + ltrace(80) << "AutoSegments_Aligneds::Locator::progress()" << endl; - - bool AutoSegments_Collapsed::Locator::isValid () const - { - return !_stack.isEmpty(); - } - - - void AutoSegments_Collapsed::Locator::progress () - { - ltrace(80) << "AutoSegments_Collapsed::Locator::progress()" << endl; - - while ( !_stack.isEmpty() ) { + while (not _stack.isEmpty()) { AutoContact* sourceContact = _stack.getAutoContact (); AutoSegment* sourceSegment = _stack.getAutoSegment (); _stack.pop (); - forEach ( Component*, component, sourceContact->getSlaveComponents() ) { - if ( *component == sourceSegment->getSegment() ) continue; + LocatorHelper helper (sourceContact, _flags); + for ( ; helper.isValid() ; helper.progress() ) { + AutoSegment* currentSegment = helper.getSegment(); + ltrace(80) << "Looking at: " << currentSegment << endl; - Segment* segment = dynamic_cast(*component); - if ( !segment ) continue; + if (currentSegment == sourceSegment) continue; - AutoSegment* currentSegment = Session::lookup ( segment ); - if ( !currentSegment ) { - cerr << Error("Can't lookup for %s.",getString(segment).c_str()) << endl; + if ( (not (_flags & KbNoCheckLayer)) + and AutoSegment::areAlignedsAndDiffLayer(currentSegment,_master)) { + cerr << Error("Aligned segments not in same layer (aligneds locator)\n" + " %s\n" + " %s." + ,getString(_master).c_str() + ,getString(currentSegment).c_str()) << endl; continue; } - unsigned int state = AutoSegment::getPerpandicularState ( sourceContact - , sourceSegment - , currentSegment - , _master - ); - if ( state & (AutoSegment::PerpandicularIndirect - |AutoSegment::ParallelOrExpanded - |AutoSegment::ParallelAndLayerChange ) ) { - ltrace(98) << "Reject: " << currentSegment << endl; - continue; - } - - AutoContact* targetContact = currentSegment->getOppositeAnchor ( sourceContact ); - if ( targetContact ) _stack.push ( targetContact, currentSegment ); + AutoContact* targetContact = currentSegment->getOppositeAnchor( sourceContact ); + if (targetContact) _stack.push( targetContact, currentSegment ); } - if ( _stack.isEmpty() ) break; - if ( _stack.getAutoSegment() == _master ) continue; - if ( AutoSegment::areAligneds(_stack.getAutoSegment(),_master) || _withPerpand ) break; + if (_stack.getAutoSegment() == _master) continue; + break; } } - string AutoSegments_Collapsed::Locator::_getString () const + string AutoSegments_Aligneds::Locator::_getString () const { - string s = "<" + _TName("AutoSegments_Collapsed::Locator") - + ">"; - + string s = "<" + _TName("AutoSegments_Aligneds::Locator") + ">"; return s; } - AutoSegmentHC* AutoSegments_Collapsed::getClone () const + AutoSegmentHC* AutoSegments_Aligneds::getClone () const + { return new AutoSegments_Aligneds(*this); } + + + AutoSegmentHL* AutoSegments_Aligneds::getLocator () const + { return new Locator(_segment,_flags); } + + + AutoSegment* AutoSegments_Aligneds::Locator::getElement () const + { return _stack.getAutoSegment(); } + + + string AutoSegments_Aligneds::_getString () const { - return new AutoSegments_Collapsed(*this); - } - - - AutoSegmentHL* AutoSegments_Collapsed::getLocator () const - { - return new Locator(_segment,_withPerpand); - } - - - AutoSegment* AutoSegments_Collapsed::Locator::getElement () const - { - return _stack.getAutoSegment(); - } - - - string AutoSegments_Collapsed::_getString () const - { - string s = "<" + _TName("AutoSegments_Collapsed") + " " + string s = "<" + _TName("AutoSegments_Aligneds") + " " + getString(_segment) + ">"; return s; @@ -253,126 +214,113 @@ namespace Katabatic { // ------------------------------------------------------------------- -// Class : "AutoSegments_CollapsedPerpandicular". +// Class : "AutoSegments_Perpandiculars". - - AutoSegments_CollapsedPerpandicular::Locator::Locator ( AutoSegment* segment ) + AutoSegments_Perpandiculars::Locator::Locator ( AutoSegment* master ) : AutoSegmentHL() - , _master(segment) - , _stack() + , _flags (KbWithPerpands) + , _master (master) + , _stack () , _perpandiculars() { - ltrace(80) << "AutoSegments_CollapsedPerpandicular::Locator::Locator()" << endl; + ltrace(80) << "AutoSegments_Perpandiculars::Locator::Locator()" << endl; ltrace(80) << " " << _master << endl; - if ( not _master ) return; + if (not _master) return; + if (_master->isHorizontal()) _flags |= KbHorizontal; + else _flags |= KbVertical; - AutoContact* contact = segment->getAutoSource(); - if ( contact ) _stack.push ( contact, segment ); + AutoContact* contact = _master->getAutoSource(); + if ( contact ) _stack.push( contact, _master ); - contact = segment->getAutoTarget(); - if ( contact ) _stack.push ( contact, segment ); + contact = _master->getAutoTarget(); + if ( contact ) _stack.push( contact, _master ); - progress (); + progress(); } - AutoSegment* AutoSegments_CollapsedPerpandicular::Locator::getElement () const + AutoSegment* AutoSegments_Perpandiculars::Locator::getElement () const { - if ( _perpandiculars.empty() ) return NULL; - return _perpandiculars.back (); + if (_perpandiculars.empty()) return NULL; + return _perpandiculars.back(); } - void AutoSegments_CollapsedPerpandicular::Locator::progress () + void AutoSegments_Perpandiculars::Locator::progress () { - ltrace(80) << "AutoSegments_CollapsedPerpandicular::Locator::progress()" << endl; + ltrace(80) << "AutoSegments_Perpandiculars::Locator::progress()" << endl; - if ( !_perpandiculars.empty() ) _perpandiculars.pop_back (); - if ( !_perpandiculars.empty() ) return; + if (not _perpandiculars.empty()) _perpandiculars.pop_back(); + if (not _perpandiculars.empty()) return; - while ( !_stack.isEmpty() ) { - AutoContact* sourceContact = _stack.getAutoContact (); - AutoSegment* sourceSegment = _stack.getAutoSegment (); + while ( not _stack.isEmpty() ) { + AutoContact* sourceContact = _stack.getAutoContact(); + AutoSegment* sourceSegment = _stack.getAutoSegment(); - _stack.pop (); + _stack.pop(); - forEach ( Component*, component, sourceContact->getSlaveComponents() ) { - if ( *component == sourceSegment->getSegment() ) continue; + LocatorHelper helper (sourceContact, _flags); + for ( ; helper.isValid() ; helper.progress() ) { + AutoSegment* currentSegment = helper.getSegment(); + if (currentSegment == sourceSegment) continue; - Segment* segment = dynamic_cast(*component); - if ( !segment ) continue; + if (AutoSegment::areAligneds(currentSegment,_master)) { + AutoContact* targetContact = currentSegment->getOppositeAnchor( sourceContact ); + if (targetContact) { + if ( (_master->isHorizontal() and sourceContact->isHTee()) + or (_master->isVertical () and sourceContact->isVTee()) ) { + if (AutoSegment::areAlignedsAndDiffLayer(currentSegment,_master)) { + cerr << Error("Aligned segments not in same layer (perpandicular locator)\n" + " %s\n" + " %s." + ,getString(_master).c_str() + ,getString(currentSegment).c_str()) << endl; + continue; + } - AutoSegment* currentSegment = Session::lookup ( segment ); - if ( !currentSegment ) { - cerr << Error("Can't lookup for %s.",getString(segment).c_str()) << endl; - continue; + ltrace(80) << "Stacking target. " << endl; + _stack.push( targetContact, currentSegment ); + } + } + } else { + _perpandiculars.push_back( currentSegment ); } - - ltrace(99) << " Try Perpandicular: " << currentSegment << endl; - unsigned int state = AutoSegment::getPerpandicularState ( sourceContact - , sourceSegment - , currentSegment - , _master - ); - - if ( state & AutoSegment::PerpandicularAny ) { - _perpandiculars.push_back ( currentSegment ); - ltrace(99) << "Stacked Perpandicular: " << currentSegment << endl; - } - if ( state & (AutoSegment::PerpandicularIndirect - |AutoSegment::ParallelOrExpanded - |AutoSegment::ParallelAndLayerChange ) ) - continue; - - ltrace(99) << "Stacked Opposite of: " << currentSegment << endl; - - AutoContact* targetContact = currentSegment->getOppositeAnchor ( sourceContact ); - if ( targetContact ) _stack.push ( targetContact, currentSegment ); } - if ( _stack.isEmpty() ) break; - if ( _stack.getAutoSegment() == _master ) continue; - if ( !_perpandiculars.empty() ) break; + if (_stack.isEmpty()) break; + if (_stack.getAutoSegment() == _master) continue; + if (not _perpandiculars.empty()) break; } } - AutoSegmentHL* AutoSegments_CollapsedPerpandicular::Locator::getClone () const + AutoSegmentHL* AutoSegments_Perpandiculars::Locator::getClone () const + { return new Locator(*this); } + + + bool AutoSegments_Perpandiculars::Locator::isValid () const + { return not _perpandiculars.empty(); } + + + AutoSegmentHC* AutoSegments_Perpandiculars::getClone () const + { return new AutoSegments_Perpandiculars(*this); } + + + AutoSegmentHL* AutoSegments_Perpandiculars::getLocator () const + { return new Locator(_segment); } + + + string AutoSegments_Perpandiculars::Locator::_getString () const { - return new Locator(*this); - } - - - bool AutoSegments_CollapsedPerpandicular::Locator::isValid () const - { - return !_perpandiculars.empty(); - } - - - AutoSegmentHC* AutoSegments_CollapsedPerpandicular::getClone () const - { - return new AutoSegments_CollapsedPerpandicular(*this); - } - - - AutoSegmentHL* AutoSegments_CollapsedPerpandicular::getLocator () const - { - return new Locator(_segment); - } - - - string AutoSegments_CollapsedPerpandicular::Locator::_getString () const - { - string s = "<" + _TName("AutoSegments_CollapsedPerpandicular::Locator") - + ">"; + string s = "<" + _TName("AutoSegments_Perpandiculars::Locator") + ">"; return s; } - string AutoSegments_CollapsedPerpandicular::_getString () const + string AutoSegments_Perpandiculars::_getString () const { - string s = "<" + _TName("AutoSegments_CollapsedPerpandicular") + " " + string s = "<" + _TName("AutoSegments_Perpandiculars") + " " + getString(_segment) + ">"; return s; @@ -382,42 +330,30 @@ namespace Katabatic { // ------------------------------------------------------------------- // Class : "AutoSegments_AnchorOnGCell". - - AutoSegments_AnchorOnGCell::Locator::Locator ( GCell* fcell, bool sourceAnchor, unsigned int direction ) + AutoSegments_AnchorOnGCell::Locator::Locator ( GCell* fcell, unsigned int flags ) : AutoSegmentHL() - , _sourceAnchor(sourceAnchor) - , _direction(direction) - , _itContact(fcell->getContacts()->begin()) - , _itEnd(fcell->getContacts()->end()) + , _flags (flags) + , _itContact (fcell->getContacts().begin()) + , _itEnd (fcell->getContacts().end()) , _hookLocator(NULL) - , _element(NULL) - { - progress (); - } + , _element (NULL) + { progress(); } AutoSegments_AnchorOnGCell::Locator::~Locator () - { - if ( _hookLocator ) delete _hookLocator; - } + { if (_hookLocator) delete _hookLocator; } AutoSegment* AutoSegments_AnchorOnGCell::Locator::getElement () const - { - return _element; - } + { return _element; } AutoSegmentHL* AutoSegments_AnchorOnGCell::Locator::getClone () const - { - return new Locator(*this); - } + { return new Locator(*this); } bool AutoSegments_AnchorOnGCell::Locator::isValid () const - { - return _element != NULL; - } + { return _element != NULL; } void AutoSegments_AnchorOnGCell::Locator::progress () @@ -426,8 +362,8 @@ namespace Katabatic { ltracein(79); while ( true ) { - if ( _hookLocator == NULL ) { - if ( _itContact == _itEnd ) { + if (_hookLocator == NULL) { + if (_itContact == _itEnd) { ltrace(79) << "No more AutoContacts" << endl; ltraceout(79); return; @@ -438,18 +374,22 @@ namespace Katabatic { _hookLocator = (*_itContact)->getBodyHook()->getSlaveHooks().getLocator(); _itContact++; } else { - _hookLocator->progress (); + _hookLocator->progress(); } while ( _hookLocator->isValid() ) { ltrace(79) << _hookLocator->getElement() << endl; Hook* hook = dynamic_cast(_hookLocator->getElement()); - if ( hook ) { - _element = Session::lookup ( static_cast(hook->getComponent()) ); - if ( _element->isHorizontal() ) { - if ( _direction & Constant::Horizontal ) { ltraceout(79); return; } - } else - if ( _direction & Constant::Vertical ) { ltraceout(79); return; } + if (hook) { + if ( ((_flags & KbBySource) and (dynamic_cast(hook))) + or ((_flags & KbByTarget) and (dynamic_cast(hook))) ) { + _element = Session::lookup( static_cast(hook->getComponent()) ); + + if (_element->isHorizontal()) { + if (_flags & KbHorizontal) { ltraceout(79); return; } + } else + if (_flags & KbVertical) { ltraceout(79); return; } + } } _hookLocator->progress(); } @@ -463,22 +403,17 @@ namespace Katabatic { string AutoSegments_AnchorOnGCell::Locator::_getString () const { - string s = "<" + _TName("AutoSegments_AnchorOnGCell::Locator") - + ">"; + string s = "<" + _TName("AutoSegments_AnchorOnGCell::Locator") + ">"; return s; } AutoSegmentHC* AutoSegments_AnchorOnGCell::getClone () const - { - return new AutoSegments_AnchorOnGCell(*this); - } + { return new AutoSegments_AnchorOnGCell(*this); } AutoSegmentHL* AutoSegments_AnchorOnGCell::getLocator () const - { - return new Locator(_fcell,_sourceAnchor,_direction); - } + { return new Locator(_fcell,_flags); } string AutoSegments_AnchorOnGCell::_getString () const @@ -491,109 +426,55 @@ namespace Katabatic { // ------------------------------------------------------------------- -// Class : "Katabatic::AutoSegments_AnchoredBySource". +// Class : "Katabatic::AutoSegments_CachedOnContact". + + AutoSegments_CachedOnContact::Locator::Locator ( AutoContact* sourceContact, unsigned int direction ) + : AutoSegmentHL() + , _helper(new LocatorHelper(sourceContact,direction)) + { } -AutoSegments_AnchoredBySource::Locator::Locator ( AutoContact* sourceAnchor, unsigned int direction ) - : AutoSegmentHL() - , _direction(direction) - , _hookLocator(NULL) - , _element(NULL) -{ - _contactLocator = sourceAnchor->getCollapseds(_direction).getLocator(); - progress (); -} + AutoSegments_CachedOnContact::Locator::~Locator () + { delete _helper; } - AutoSegments_AnchoredBySource::Locator::~Locator () - { - if ( _hookLocator ) delete _hookLocator; - if ( _contactLocator ) delete _contactLocator; - } + AutoSegment* AutoSegments_CachedOnContact::Locator::getElement () const + { return _helper->getSegment(); } - AutoSegment* AutoSegments_AnchoredBySource::Locator::getElement () const - { - return _element; - } - - - AutoSegmentHL* AutoSegments_AnchoredBySource::Locator::getClone () const - { - return new Locator(*this); - } + AutoSegmentHL* AutoSegments_CachedOnContact::Locator::getClone () const + { return new Locator(*this); } - bool AutoSegments_AnchoredBySource::Locator::isValid () const + bool AutoSegments_CachedOnContact::Locator::isValid () const + { return _helper->isValid(); } + + + void AutoSegments_CachedOnContact::Locator::progress () { - return _element != NULL; + ltrace(80) << "AutoSegments_CachedOnContact::Locator::progress()" << endl; + _helper->progress(); } - void AutoSegments_AnchoredBySource::Locator::progress () + AutoSegmentHL* AutoSegments_CachedOnContact::getLocator () const + { return new Locator(_sourceContact,_direction); } + + + AutoSegmentHC* AutoSegments_CachedOnContact::getClone () const + { return new AutoSegments_CachedOnContact(*this); } + + + string AutoSegments_CachedOnContact::Locator::_getString () const { - ltrace(80) << "AutoSegments_AnchoredBySource::Locator::progress()" << endl; - ltracein(79); - - while ( true ) { - if ( _hookLocator == NULL ) { - if ( !_contactLocator->isValid() ) { - ltrace(79) << "No more AutoContacts" << endl; - ltraceout(79); - return; - } - - ltrace(79) << _contactLocator->getElement() << endl; - - _hookLocator = _contactLocator->getElement()->getBodyHook()->getSlaveHooks().getLocator(); - _contactLocator->progress (); - } else { - _hookLocator->progress (); - } - - while ( _hookLocator->isValid() ) { - ltrace(79) << _hookLocator->getElement() << endl; - Hook* hook = dynamic_cast(_hookLocator->getElement()); - if ( hook ) { - _element = Session::lookup ( static_cast(hook->getComponent()) ); - if ( _element->isHorizontal() ) { - if ( _direction & Constant::Horizontal ) { ltraceout(79); return; } - } else - if ( _direction & Constant::Vertical ) { ltraceout(79); return; } - } - _hookLocator->progress(); - } - _hookLocator = NULL; - _element = NULL; - } - - ltraceout(79); - } - - - AutoSegmentHL* AutoSegments_AnchoredBySource::getLocator () const - { - return new Locator(_sourceContact,_direction); - } - - - AutoSegmentHC* AutoSegments_AnchoredBySource::getClone () const - { - return new AutoSegments_AnchoredBySource(*this); - } - - - string AutoSegments_AnchoredBySource::Locator::_getString () const - { - string s = "<" + _TName("AutoSegments_AnchoredBySource::Locator") - + ">"; + string s = "<" + _TName("AutoSegments_CachedOnContact::Locator") + ">"; return s; } - string AutoSegments_AnchoredBySource::_getString () const + string AutoSegments_CachedOnContact::_getString () const { - string s = "<" + _TName("AutoSegments_AnchoredBySource") + " " + string s = "<" + _TName("AutoSegments_CachedOnContact") + " " + getString(_sourceContact) + ">"; return s; @@ -603,23 +484,16 @@ AutoSegments_AnchoredBySource::Locator::Locator ( AutoContact* sourceAnchor, uns // ------------------------------------------------------------------- // Class : "AutoSegments_IsAccountable". - AutoSegmentHF* AutoSegments_IsAccountable::getClone () const - { - return new AutoSegments_IsAccountable(); - } + { return new AutoSegments_IsAccountable(); } bool AutoSegments_IsAccountable::accept ( AutoSegment* segment ) const - { - return segment->isCanonical() && !segment->isCollapsed(); - } + { return segment->isCanonical(); } string AutoSegments_IsAccountable::_getString () const - { - return ""; - } + { return ""; } // ------------------------------------------------------------------- @@ -627,30 +501,18 @@ AutoSegments_AnchoredBySource::Locator::Locator ( AutoContact* sourceAnchor, uns AutoSegmentHF* AutoSegments_InDirection::getClone () const - { - return new AutoSegments_InDirection(_direction); - } + { return new AutoSegments_InDirection(_direction); } bool AutoSegments_InDirection::accept ( AutoSegment* segment ) const { - return ( segment->isHorizontal() && (_direction & Constant::Horizontal) ) - || ( segment->isVertical () && (_direction & Constant::Vertical ) ); + return ( segment->isHorizontal() and (_direction & KbHorizontal) ) + or ( segment->isVertical () and (_direction & KbVertical ) ); } string AutoSegments_InDirection::_getString () const - { - return ""; - } + { return ""; } - - - -// x-----------------------------------------------------------------x -// | Functions Definitions | -// x-----------------------------------------------------------------x - - -} // End of Katabatic namespace. +} // Katabatic namespace. diff --git a/katabatic/src/AutoVertical.cpp b/katabatic/src/AutoVertical.cpp index 327daee7..4992c70b 100644 --- a/katabatic/src/AutoVertical.cpp +++ b/katabatic/src/AutoVertical.cpp @@ -2,115 +2,28 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./AutoVertical.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ #include #include "hurricane/Bug.h" #include "hurricane/Vertical.h" #include "crlcore/RoutingGauge.h" -#include "katabatic/AutoContact.h" +#include "katabatic/AutoContactTurn.h" #include "katabatic/AutoVertical.h" #include "katabatic/AutoHorizontal.h" -namespace { - - using namespace std; - using namespace Hurricane; - using namespace Katabatic; - - - void slacken ( AutoVertical* segment, bool fromSource ) - { - AutoContact* contact = NULL; - Point slackPoint; - if (fromSource) { - contact = segment->getAutoSource(); - slackPoint = Point ( segment->getSourceX(), segment->getSourceY() ); - } else { - contact = segment->getAutoTarget(); - slackPoint = Point ( segment->getTargetX(), segment->getTargetY() ); - } - if ( !contact ) return; - - forEach ( Horizontal*, ihorizontal, contact->getSlaveComponents().getSubSet() ) { - AutoSegment* autoHorizontal = Session::lookup ( *ihorizontal ); - if ( autoHorizontal ) { - autoHorizontal->invalidate (); - if ( autoHorizontal->isGlobal() ) return; - } - } - - size_t depth = Session::getRoutingGauge()->getLayerDepth ( segment->getLayer() ); - Layer* contactLayer = Session::getRoutingGauge()->getContactLayer ( depth - 1 ); - const Layer* slackLayer = Session::getRoutingGauge()->getRoutingLayer ( depth - 1 ); - - if ( fromSource ) segment->getSourceHook()->detach (); - else segment->getTargetHook()->detach (); - - AutoContact* contact1 = AutoContact::create ( contact->getGCell(), segment->getNet(), contactLayer ); - AutoContact* contact2 = AutoContact::create ( contact->getGCell(), segment->getNet(), contactLayer ); - - AutoSegment* vsegment = AutoVertical::create ( contact - , contact1 - , segment->getLayer() - , slackPoint.getX() - , DbU::lambda(2.0) - , AutoSegment::Local - , true // terminal - , false // collapsed - ); - - AutoSegment* hsegment = AutoHorizontal::create ( contact1 - , contact2 - , slackLayer - , slackPoint.getY() - , DbU::lambda(2.0) - , AutoSegment::Local - , false - , false - ); - - if ( fromSource ) - segment->getSourceHook()->attach ( contact2->getContact()->getBodyHook() ); - else - segment->getTargetHook()->attach ( contact2->getContact()->getBodyHook() ); - contact->restoreHConnexity ( slackPoint.getY(), true ); - - //contact->setHAlignate ( true ); - - hsegment->setSlackenStrap ( true ); - hsegment->setSlackened ( true ); - vsegment->setSlackened ( true ); - - ltrace(200) << "Session::slacken() new paral: " << vsegment << endl; - ltrace(200) << "Session::slacken() perpand: " << hsegment << endl; - ltrace(200) << "Session::slacken() original: " << segment << endl; - } - - -} // End of local namespace. - - namespace Katabatic { @@ -126,31 +39,41 @@ namespace Katabatic { // Class : "Katabatic::AutoVertical". - AutoVertical::AutoVertical ( Vertical* vertical - , int type - , bool terminal - , bool collapsed - ) - : AutoSegment(vertical,false,type,terminal,collapsed) + Segment* AutoVertical::base () { return _vertical; } + Segment* AutoVertical::base () const { return _vertical; } + Vertical* AutoVertical::getVertical () { return _vertical; } + DbU::Unit AutoVertical::getSourceU () const { return _vertical->getSourceY(); } + DbU::Unit AutoVertical::getTargetU () const { return _vertical->getTargetY(); } + DbU::Unit AutoVertical::getDuSource () const { return _vertical->getDySource(); } + DbU::Unit AutoVertical::getDuTarget () const { return _vertical->getDyTarget(); } + Interval AutoVertical::getSpanU () const { return Interval(_vertical->getSourceY(),_vertical->getTargetY()); } + void AutoVertical::setDuSource ( DbU::Unit du ) { _vertical->setDySource(du); } + void AutoVertical::setDuTarget ( DbU::Unit du ) { _vertical->setDyTarget(du); } + string AutoVertical::_getTypeName () const { return "AutoVertical"; } + + + AutoVertical::AutoVertical ( Vertical* vertical ) + : AutoSegment(vertical) , _vertical(vertical) - { } + { + ltrace(99) << "CTOR AutoVertical " << this << endl; + ltrace(99) << " over " << vertical << endl; + } void AutoVertical::_postCreate () { AutoSegment::_postCreate (); - orient (); - setPositions (); AutoContact* source = getAutoSource(); - if ( source->isTerminal() ) source->setX ( _vertical->getX() ); + if (source->isTerminal()) source->setX( _vertical->getX() ); AutoContact* target = getAutoTarget(); - if ( target->isTerminal() ) target->setX ( _vertical->getX() ); + if (target->isTerminal()) target->setX( _vertical->getX() ); + + if ( source->getGCell() != target->getGCell() ) { + setFlags( SegGlobal ); - if ( source->getGCell() == target->getGCell() ) { - setGlobal ( false ); - } else { GCell* gcell; GCell* end; @@ -174,7 +97,7 @@ namespace Katabatic { void AutoVertical::_preDestroy () { - ltrace(200) << "AutoVertical::_preDestroy() - " << (void*)this << endl; + ltrace(200) << "AutoVertical::_preDestroy() - " << endl; ltrace(200) << " " << _getString() << endl; ltracein(90); @@ -211,52 +134,15 @@ namespace Katabatic { AutoVertical::~AutoVertical () { if ( Session::doDestroyBaseSegment() and not Session::doDestroyTool() ) { - ltrace(200) << "~AutoVertical() - " << (void*)_vertical << endl; + ltrace(200) << "~AutoVertical() - " << endl; _vertical->destroy (); } } - AutoVertical* AutoVertical::create ( Vertical* vertical - , int type - , bool terminal - , bool collapsed - ) + Interval AutoVertical::getSourceConstraints ( unsigned int flags ) const { - AutoSegment::_preCreate ( vertical->getSource(), vertical->getTarget() ); - AutoVertical* autoVertical = new AutoVertical ( vertical, type, terminal, collapsed ); - - autoVertical->_postCreate (); - return autoVertical; - } - - - AutoVertical* AutoVertical::create ( AutoContact* source - , AutoContact* target - , const Layer* layer - , DbU::Unit x - , DbU::Unit width - , int type - , bool terminal - , bool collapsed - ) - { - AutoSegment::_preCreate ( source, target ); - AutoVertical* autoVertical - = new AutoVertical ( Vertical::create ( source->getContact() - , target->getContact() - , layer - , x - , width ), type, terminal, collapsed ); - - autoVertical->_postCreate (); - return autoVertical; - } - - - Interval AutoVertical::getSourceConstraints ( bool native ) const - { - if ( native ) { + if (flags & KbNativeConstraints) { Box nativeBox ( getAutoSource()->getNativeConstraintBox() ); return Interval ( nativeBox.getXMin(), nativeBox.getXMax() ); } @@ -264,9 +150,9 @@ namespace Katabatic { } - Interval AutoVertical::getTargetConstraints ( bool native ) const + Interval AutoVertical::getTargetConstraints ( unsigned int flags ) const { - if ( native ) { + if (flags & KbNativeConstraints) { Box nativeBox ( getAutoTarget()->getNativeConstraintBox() ); return Interval ( nativeBox.getXMin(), nativeBox.getXMax() ); } @@ -307,7 +193,7 @@ namespace Katabatic { unsigned int AutoVertical::getDirection () const - { return Constant::Vertical; } + { return KbVertical; } size_t AutoVertical::getGCells ( vector& gcells ) const @@ -331,76 +217,140 @@ namespace Katabatic { bool AutoVertical::_canSlacken () const { + ltraceout(200); + Interval sourceConstraints = Interval(getAutoSource()->getCBXMin(),getAutoSource()->getCBXMax()); Interval targetConstraints = Interval(getAutoTarget()->getCBXMin(),getAutoTarget()->getCBXMax()); // Ugly: should uses topRightShrink from GCell. - sourceConstraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); - targetConstraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + sourceConstraints.inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + targetConstraints.inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); // Ugly: GCell's track number is hardwired. - if ( sourceConstraints.getSize() / DbU::lambda(5.0) < 10 ) return true; - if ( targetConstraints.getSize() / DbU::lambda(5.0) < 10 ) return true; + if (sourceConstraints.getSize() / DbU::lambda(5.0) < 10) { ltraceout(200); return true; } + if (targetConstraints.getSize() / DbU::lambda(5.0) < 10) { ltraceout(200); return true; } + ltraceout(200); return false; } - void AutoVertical::_slacken () + bool AutoVertical::_slacken ( unsigned int flags ) { - AutoContact* contact = getAutoSource(); - Interval constraints = Interval(contact->getCBXMin(),contact->getCBXMax()); + ltrace(200) << "AutoVertical::_slacken() " << this << endl; + ltracein(200); - constraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + if ( not isStrongTerminal() + or (not (_flags & (SegGlobal|SegWeakGlobal)) and (getLength() < DbU::lambda(5.0)*5)) ) + { ltraceout(200); return false; } - // Ugly: GCell's track number is hardwired. - if ( constraints.getSize() / DbU::lambda(5.0) < 10 ) ::slacken ( this, true ); + ltrace(200) << "_flags:" << (_flags & (SegGlobal|SegWeakGlobal)) << endl; + ltrace(200) << "test:" << (getLength() < DbU::lambda(5.0)*5) << endl; + ltrace(200) << "length:" << DbU::getValueString(getLength()) << endl; - contact = getAutoTarget (); - constraints = Interval(contact->getCBXMin(),contact->getCBXMax()); - constraints.inflate ( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + bool success = false; + bool slackened = false; + bool halfSlackened = false; + int lowSlack = (flags & KbHalfSlacken) ? 3 : 10; + AutoContact* source = getAutoSource(); + AutoSegment* parallel = this; - if ( constraints.getSize() / DbU::lambda(5.0) < 10 ) ::slacken ( this, false ); + if (source->isTerminal()) { + Interval constraints = source->getUConstraints (KbHorizontal).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + Interval nativeConstraints = source->getNativeUConstraints(KbHorizontal).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + int slack = constraints.getSize() / DbU::lambda(5.0); + int nativeSlack = nativeConstraints.getSize() / DbU::lambda(5.0); - setSlackened ( true ); + // Ugly: GCell's track number is hardwired. + if ((slack < lowSlack) or (nativeSlack - slack < 3)) { + _makeDogleg( source->getGCell(), KbNoFlags ); + slackened = true; + } else if (slack < 10) { + halfSlackened = true; + } + + const vector& doglegs = Session::getDoglegs(); + if (doglegs.size() >= 2) { + ltrace(200) << "AutoSegment::_slaken(): Source @" << DbU::getValueString(getSourcePosition()) << endl; + doglegs[doglegs.size()-2]->_setAxis( getSourcePosition() ); + success = true; + + parallel = doglegs[ doglegs.size()-1 ]; + } + } + + AutoContact* target = NULL; + if (parallel) { + target = parallel->getAutoTarget(); + } else { + target = getAutoTarget(); + } + + if (target->isTerminal()) { + Interval constraints = target->getUConstraints (KbHorizontal).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + Interval nativeConstraints = target->getNativeUConstraints(KbHorizontal).inflate( 0, /*Katabatic::GCell::getTopRightShrink()*/ DbU::lambda(1.0) ); + int slack = constraints.getSize() / DbU::lambda(5.0); + int nativeSlack = nativeConstraints.getSize() / DbU::lambda(5.0); + + // Ugly: GCell's track number is hardwired. + if ((slack < lowSlack) or (nativeSlack - slack < 3)) { + _makeDogleg( target->getGCell(), KbNoFlags ); + slackened = true; + } else if (slack < 10) { + halfSlackened = true; + } + + const vector& doglegs = Session::getDoglegs(); + if (doglegs.size() >= 2) { + ltrace(200) << "AutoSegment::_slaken(): Source @" << DbU::getValueString(getTargetPosition()) << endl; + doglegs[doglegs.size()-2]->_setAxis( getTargetPosition() ); + success = true; + } + } + + if (halfSlackened) { + setFlags( SegHalfSlackened ); + } else if (slackened) { + setFlags ( SegSlackened ); + unsetFlags( SegHalfSlackened ); + } + ltraceout(200); + + return success; } - bool AutoVertical::canDesalignate ( AutoContact* contact ) const - { return contact->canVDesalignate (); } - - - void AutoVertical::desalignate ( AutoContact* contact ) - { contact->vDesalignate(); } - - - void AutoVertical::alignate ( DbU::Unit axis ) + void AutoVertical::_setAxis ( DbU::Unit axis ) { - if ( _vertical->getX() == axis ) return; + setFlags( SegAxisSet ); - ltrace(159) << "alignate() " << this << " @X " << DbU::getLambda(axis) << endl; + if (_vertical->getX() == axis) return; - _vertical->setX ( axis ); - invalidate (); + ltrace(159) << "_setAxis() @X " << DbU::getLambda(axis) << " " << this << endl; + + _vertical->setX( axis ); + invalidate(); AutoContact* anchor = getAutoSource(); - anchor->invalidate (); - if ( anchor->isTerminal() ) anchor->setX ( axis ); + anchor->invalidate(); + if (anchor->isTerminal()) anchor->setX( axis ); anchor = getAutoTarget(); - anchor->invalidate (); - if ( anchor->isTerminal() ) anchor->setX ( axis ); + anchor->invalidate(); + if (anchor->isTerminal()) anchor->setX( axis ); } - void AutoVertical::orient () + void AutoVertical::updateOrient () { - if ( _vertical->getTargetY() < _vertical->getSourceY() ) - _vertical->invert (); + if (_vertical->getTargetY() < _vertical->getSourceY()) { + ltrace(80) << "updateOrient() " << this << " (before S/T swap)" << endl; + _vertical->invert(); + } } - void AutoVertical::setPositions () + void AutoVertical::updatePositions () { _sourcePosition = _vertical->getSourceY() - Session::getExtensionCap(); _targetPosition = _vertical->getTargetY() + Session::getExtensionCap(); @@ -442,14 +392,15 @@ namespace Katabatic { Interval sourceConstraints = Interval(getAutoSource()->getCBXMin(),getAutoSource()->getCBXMax()); Interval targetConstraints = Interval(getAutoTarget()->getCBXMin(),getAutoTarget()->getCBXMax()); - if ( !sourceConstraints.intersect(targetConstraints) ) { - cerr << Error ( "%p:%s\n Constraints incoherency: S:%p:%s, T:%p:%s" - , (void*)base() + if (not sourceConstraints.intersect(targetConstraints)) { + cerr << Error ( "%s\n Constraints incoherency:\n" + " S:%s %s\n" + " T:%s %s" , _getString().c_str() - , getAutoSource()->getContact() , getString(sourceConstraints).c_str() - , getAutoSource()->getContact() + , getString(getAutoSource()).c_str() , getString(targetConstraints).c_str() + , getString(getAutoTarget()).c_str() ) << endl; return false; } @@ -458,254 +409,281 @@ namespace Katabatic { } - void AutoVertical::_computeTerminal () + bool AutoVertical::canMoveULeft ( float reserve ) const { - _computeTerminal(_vertical); + if (not isGlobal()) return false; + if (not getAutoSource()->isTurn() or not getAutoTarget()->isTurn()) return false; + if (not getAutoSource()->getGCell()->getLeft()) return false; - ltrace(99) << "_computeTerminal() S:" << getAutoSource()->isTerminal() - << " T:" << getAutoTarget()->isTerminal() - << " " << this << endl; + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + AutoSegment* perpandiculars[2] = { autoSource->getSegment(0), autoTarget->getSegment(0) }; + + if ( ( (not perpandiculars[0]->isGlobal()) or (perpandiculars[0]->getAutoSource() == autoSource) ) + and ( (not perpandiculars[1]->isGlobal()) or (perpandiculars[1]->getAutoSource() == autoTarget) ) ) + return false; + + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + unsigned int depth = Session::getRoutingGauge()->getLayerDepth( getLayer() ); + float currMaxDensity = 0.0; + float leftMaxDensity = 0.0; + + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getUp() ) { + if (currMaxDensity < gcell->getWDensity(depth)) currMaxDensity = gcell->getWDensity( depth ); + } + + begin = begin->getLeft(); + end = end ->getLeft(); + + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getUp() ) { + if (leftMaxDensity < gcell->getWDensity(depth)) leftMaxDensity = gcell->getWDensity( depth ); + } + + return (leftMaxDensity + reserve < currMaxDensity); } - void AutoVertical::moveULeft () + bool AutoVertical::canMoveURight ( float reserve ) const { - if ( not getAutoSource()->isCorner() or not getAutoTarget()->isCorner() ) return; - if ( not getAutoSource()->getGCell()->getLeft() ) return; + if (not isGlobal()) return false; + if (not getAutoSource()->isTurn() or not getAutoTarget()->isTurn()) return false; + if (not getAutoSource()->getGCell()->getRight()) return false; - Session::setInvalidateMask ( Session::RestoreVCon|Session::NetCanonize ); - Session::invalidate ( getNet() ); + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + AutoSegment* perpandiculars[2] = { autoSource->getSegment(0), autoTarget->getSegment(0) }; - AutoContact* autoSource = getAutoSource(); - AutoContact* autoTarget = getAutoTarget(); - GCell* begin = autoSource->getGCell(); - GCell* end = autoTarget->getGCell(); + if ( ( (not perpandiculars[0]->isGlobal()) or (perpandiculars[0]->getAutoTarget() == autoSource) ) + and ( (not perpandiculars[1]->isGlobal()) or (perpandiculars[1]->getAutoTarget() == autoTarget) ) ) + return false; - forEach ( Horizontal*, isegment, autoSource->getSlaveComponents().getSubSet() ) { - AutoSegment* segment = Session::lookup ( *isegment ); - if ( segment->isLocal() ) { - segment->setGlobal ( true ); - continue; - } + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + unsigned int depth = Session::getRoutingGauge()->getLayerDepth( getLayer() ); + float currMaxDensity = 0.0; + float leftMaxDensity = 0.0; - if ( segment->getAutoSource() == autoSource ) { - begin->addHSegment ( segment ); + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getUp() ) { + if (currMaxDensity < gcell->getWDensity(depth)) currMaxDensity = gcell->getWDensity( depth ); + } + + begin = begin->getRight(); + end = end ->getRight(); + + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getUp() ) { + if (leftMaxDensity < gcell->getWDensity(depth)) leftMaxDensity = gcell->getWDensity( depth ); + } + + return (leftMaxDensity + reserve < currMaxDensity); + } + + + bool AutoVertical::moveULeft () + { + if (not getAutoSource()->isTurn() or not getAutoTarget()->isTurn()) return false; + if (not getAutoSource()->getGCell()->getLeft()) return false; + + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + AutoSegment* perpandicular = autoSource->getSegment(0); + + if (perpandicular->isLocal()) { + perpandicular->setFlags( Katabatic::SegGlobal ); + } else { + if (perpandicular->getAutoSource() == autoSource) { + begin->addHSegment( perpandicular ); } else { - if ( begin->getLeft() == segment->getAutoSource()->getGCell() ) { - segment->setGlobal ( false ); - segment->getAutoSource()->invalidate (); + if (begin->getLeft() == perpandicular->getAutoSource()->getGCell()) { + perpandicular->unsetFlags( Katabatic::SegGlobal ); } else - begin->getLeft()->removeHSegment ( segment ); + begin->getLeft()->removeHSegment( perpandicular ); } } - forEach ( Horizontal*, isegment, autoTarget->getSlaveComponents().getSubSet() ) { - AutoSegment* segment = Session::lookup ( *isegment ); - if ( segment->isLocal() ) { - segment->setGlobal ( true ); - continue; - } - - if ( segment->getAutoSource() == autoTarget ) { - begin->addHSegment ( segment ); + perpandicular = autoTarget->getSegment(0); + if (perpandicular->isLocal()) { + perpandicular->setFlags( Katabatic::SegGlobal ); + } else { + if (perpandicular->getAutoSource() == autoTarget) { + end->addHSegment( perpandicular ); } else { - if ( end->getLeft() == segment->getAutoSource()->getGCell() ) { - segment->setGlobal ( false ); - segment->getAutoSource()->invalidate (); + if (end->getLeft() == perpandicular->getAutoSource()->getGCell()) { + perpandicular->unsetFlags( Katabatic::SegGlobal ); } else - end->getLeft()->removeHSegment ( segment ); + end->getLeft()->removeHSegment( perpandicular ); } } - if ( begin != end ) { - for ( GCell* gcell = begin->getUp() ; gcell != end ; gcell = gcell->getUp() ) - gcell->removeVSegment ( this ); + if (begin != end) { + for ( GCell* gcell=begin->getUp() ; gcell and gcell!=end ; gcell=gcell->getUp() ) + gcell->removeVSegment( this ); } begin = begin->getLeft(); end = end ->getLeft(); - autoSource->setGCell ( begin ); - autoTarget->setGCell ( end ); - if ( begin != end ) { - for ( GCell* gcell = begin->getUp() ; gcell != end ; gcell = gcell->getUp() ) - gcell->addVSegment ( this ); + autoSource->setGCell( begin ); + autoTarget->setGCell( end ); + if (begin != end) { + for ( GCell* gcell=begin->getUp() ; gcell and gcell!=end ; gcell=gcell->getUp() ) + gcell->addVSegment( this ); } - DbU::Unit x = begin->getUSide(Constant::Horizontal).getVMax(); - setAxis ( x, AxisSet); + DbU::Unit x = begin->getSide( KbHorizontal ).getVMax(); + setAxis( x ); - Session::revalidateTopology (); + return true; } - void AutoVertical::moveURight () + bool AutoVertical::moveURight () { ltrace(200) << "AutoVertical::moveURight()" << endl; - if ( not getAutoSource()->isCorner() or not getAutoTarget()->isCorner() ) return; - if ( not getAutoSource()->getGCell()->getRight() ) return; + if (not getAutoSource()->isTurn() or not getAutoTarget()->isTurn()) return true; + if (not getAutoSource()->getGCell()->getRight()) return true; - Session::setInvalidateMask ( Session::RestoreVCon|Session::NetCanonize ); - Session::invalidate ( getNet() ); + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); + AutoSegment* perpandicular = autoSource->getSegment(0); - AutoContact* autoSource = getAutoSource(); - AutoContact* autoTarget = getAutoTarget(); - GCell* begin = autoSource->getGCell(); - GCell* end = autoTarget->getGCell(); - - forEach ( Horizontal*, isegment, autoSource->getSlaveComponents().getSubSet() ) { - AutoSegment* segment = Session::lookup ( *isegment ); - if ( segment->isLocal() ) { - segment->setGlobal ( true ); - continue; - } - - if ( segment->getAutoTarget() == autoSource ) { - begin->addHSegment ( segment ); + if (perpandicular->isLocal()) { + perpandicular->setFlags( Katabatic::SegGlobal ); + } else { + if (perpandicular->getAutoTarget() == autoSource) { + begin->addHSegment( perpandicular ); } else { - if ( begin->getRight() == segment->getAutoTarget()->getGCell() ) { - segment->setGlobal ( false ); - segment->getAutoTarget()->invalidate (); + if (begin->getRight() == perpandicular->getAutoTarget()->getGCell()) { + perpandicular->unsetFlags( Katabatic::SegGlobal ); } else - begin->getRight()->removeHSegment ( segment ); + begin->getRight()->removeHSegment( perpandicular ); } } - forEach ( Horizontal*, isegment, autoTarget->getSlaveComponents().getSubSet() ) { - AutoSegment* segment = Session::lookup ( *isegment ); - if ( segment->isLocal() ) { - segment->setGlobal ( true ); - continue; - } - - if ( segment->getAutoTarget() == autoTarget ) { - begin->addHSegment ( segment ); + perpandicular = autoTarget->getSegment(0); + if (perpandicular->isLocal()) { + perpandicular->setFlags( Katabatic::SegGlobal ); + } else { + if (perpandicular->getAutoTarget() == autoTarget) { + end->addHSegment( perpandicular ); } else { - if ( end->getRight() == segment->getAutoTarget()->getGCell() ) { - segment->setGlobal ( false ); - segment->getAutoTarget()->invalidate (); + if (end->getRight() == perpandicular->getAutoTarget()->getGCell()) { + perpandicular->unsetFlags( Katabatic::SegGlobal ); } else - end->getRight()->removeHSegment ( segment ); + end->getRight()->removeHSegment( perpandicular ); } } - if ( begin != end ) { - for ( GCell* gcell = begin->getUp() ; gcell != end ; gcell = gcell->getUp() ) - gcell->removeVSegment ( this ); + if (begin != end) { + for ( GCell* gcell=begin->getUp() ; gcell and gcell!=end ; gcell=gcell->getUp() ) + gcell->removeVSegment( this ); } begin = begin->getRight(); end = end ->getRight(); - autoSource->setGCell ( begin ); - autoTarget->setGCell ( end ); - if ( begin != end ) { - for ( GCell* gcell = begin->getUp() ; gcell != end ; gcell = gcell->getUp() ) - gcell->addVSegment ( this ); + autoSource->setGCell( begin ); + autoTarget->setGCell( end ); + if (begin != end) { + for ( GCell* gcell=begin->getUp() ; gcell and gcell!=end ; gcell=gcell->getUp() ) + gcell->addVSegment( this ); } - DbU::Unit x = begin->getUSide(Constant::Horizontal).getVMin(); - setAxis ( x, AxisSet ); + DbU::Unit x = begin->getSide( KbHorizontal ).getVMin(); + setAxis( x ); ltrace(200) << "Moved to axis: " << DbU::getValueString(x) << endl; - Session::revalidateTopology (); + return true; } - void AutoVertical::_makeDogLeg ( GCell* dogLegGCell, bool upLayer ) + unsigned int AutoVertical::_makeDogleg ( GCell* doglegGCell, unsigned int flags ) { - AutoContact* autoSource = getAutoSource(); - AutoContact* autoTarget = getAutoTarget(); - GCell* begin = autoSource->getGCell(); - GCell* end = autoTarget->getGCell(); - unsigned int fragmentType = AutoSegment::Global; - unsigned int splittedType = AutoSegment::Global; + ltrace(200) << "AutoVertical::_makeDogleg(GCell*)" << endl; - Session::dogLegReset (); + AutoContact* autoSource = getAutoSource(); + AutoContact* autoTarget = getAutoTarget(); + GCell* begin = autoSource->getGCell(); + GCell* end = autoTarget->getGCell(); - //DbU::Unit dogLegAxis = (detachSource)?dogLegGCell->getYMax():dogLegGCell->getY(); - DbU::Unit dogLegAxis = (dogLegGCell->getYMax() + dogLegGCell->getY()) / 2; - if ( isLocal() ) - dogLegAxis = (getSourceY() + getTargetY()) / 2; + //Session::doglegReset(); - ltrace(159) << "Detaching Target AutoContact." << endl; - if ( end == dogLegGCell ) { - fragmentType = AutoSegment::Local; - } - if ( begin == dogLegGCell ) { - splittedType = AutoSegment::Local; - setGlobal ( false ); - } + DbU::Unit doglegAxis = (doglegGCell->getYMax() + doglegGCell->getY()) / 2; + if (isLocal()) + doglegAxis = (getSourceY() + getTargetY()) / 2; - autoTarget->invalidate (); - autoTarget->setInvalidatedTopology ( true ); - - if ( dogLegGCell != end ) { - GCell* gcell = dogLegGCell; + if (doglegGCell == begin) unsetFlags( SegGlobal ); + if (doglegGCell != end) { + GCell* gcell = doglegGCell; do { - if ( gcell != begin ) - gcell->removeVSegment ( this ); - gcell = gcell->getUp (); - } while ( gcell && (gcell != end) ); + if (gcell != begin) + gcell->removeVSegment( this ); + gcell = gcell->getUp(); + } while ( gcell and (gcell != end) ); } - Session::dogLeg ( this ); - size_t depth = Session::getRoutingGauge()->getLayerDepth ( _vertical->getLayer() ); + bool upLayer = (depth+1 < Session::getRoutingGauge()->getDepth()); Layer* contactLayer = Session::getRoutingGauge()->getContactLayer ( depth + ((upLayer)?0:-1) ); - const Layer* dogLegLayer = Session::getRoutingGauge()->getRoutingLayer ( depth + ((upLayer)?1:-1) ); + const Layer* doglegLayer = Session::getRoutingGauge()->getRoutingLayer ( depth + ((upLayer)?1:-1) ); - _vertical->getTargetHook()->detach (); - AutoContact* dlContact1 = AutoContact::create ( dogLegGCell, _vertical->getNet(), contactLayer ); - AutoContact* dlContact2 = AutoContact::create ( dogLegGCell, _vertical->getNet(), contactLayer ); - AutoSegment* segment1 = AutoHorizontal::create ( dlContact1 - , dlContact2 - , dogLegLayer - , dogLegAxis - , DbU::lambda(2.0) - , AutoSegment::Local - , false - , false - ); - segment1->setDogleg ( true ); - ltrace(200) << "New " << (void*)dlContact1->getContact() << ":" << dlContact1->getContact() << "." << endl; - ltrace(200) << "New " << (void*)dlContact2->getContact() << ":" << dlContact2->getContact() << "." << endl; - ltrace(200) << "Session::dogLeg() perpand: " << segment1 << endl; - Session::dogLeg ( segment1 ); + Session::dogleg( this ); + targetDetach(); + invalidate(); + autoTarget->invalidate( KbTopology ); + AutoContact* dlContact1 = AutoContactTurn::create( doglegGCell, _vertical->getNet(), contactLayer ); + ltrace(200) << dlContact1 << endl; + AutoContact* dlContact2 = AutoContactTurn::create( doglegGCell, _vertical->getNet(), contactLayer ); + ltrace(200) << dlContact2 << endl; + AutoSegment* segment1 = AutoSegment::create( dlContact1 , dlContact2, KbHorizontal ); + ltrace(200) << segment1 << endl; + segment1->setLayer( doglegLayer ); + segment1->_setAxis( doglegAxis ); + segment1->setFlags( SegDogleg|SegSlackened|SegCanonical|SegNotAligned ); + ltrace(200) << "New " << dlContact1->base() << "." << endl; + ltrace(200) << "New " << dlContact2->base() << "." << endl; + Session::dogleg( segment1 ); - _vertical->getTargetHook()->attach ( dlContact1->getContact()->getBodyHook() ); - AutoSegment* segment2 = AutoVertical::create ( dlContact2 - , autoTarget - , getLayer() - , getX() - , DbU::lambda(2.0) - , fragmentType - , false - , false - ); - segment2->setAxis ( getX(), AxisSet ); - ltrace(200) << "Session::dogLeg() new paral: " << segment2 << endl; - ltrace(200) << "Session::dogLeg() original: " << this << endl; - Session::dogLeg ( segment2 ); + targetAttach( dlContact1 ); + AutoSegment* segment2 = AutoVertical::create ( dlContact2, autoTarget, KbVertical ); + autoTarget->cacheAttach( segment2 ); + segment2->setLayer( getLayer() ); + segment2->_setAxis( getX() ); + segment2->setFlags( (isSlackened()?SegSlackened:0) ); + Session::dogleg( segment2 ); - setGlobal ( (splittedType == AutoSegment::Global) ); - - if ( (splittedType == AutoSegment::Global) or ( fragmentType == AutoSegment::Global ) ) { - if ( splittedType == AutoSegment::Local ) autoSource->restoreHConnexity ( getX(), true ); - else autoTarget->restoreHConnexity ( getX(), true ); + if (isStrongTerminal()) { + if (autoSource->getAnchor()) { + segment1->setFlags( SegWeakTerminal1 ); + segment2->setFlags( SegWeakTerminal1 ); + } else { + unsetFlags( SegStrongTerminal ); + setFlags( SegWeakTerminal1 ); + segment1->setFlags( SegWeakTerminal1 ); + segment2->setFlags( SegStrongTerminal ); + } + } else if (isWeakTerminal()) { + segment1->setFlags( SegWeakTerminal1 ); + segment2->setFlags( SegWeakTerminal1 ); } - setTerminal ( false ); - segment2->setTerminal ( false ); - if ( autoSource->getAnchor() and not isGlobal() ) setTerminal ( true ); - if ( autoTarget->getAnchor() and not segment2->isGlobal() ) segment2->setTerminal ( true ); + ltrace(200) << "Session::dogleg[x+1] perpand: " << segment1 << endl; + ltrace(200) << "Session::dogleg[x+2] new paral: " << segment2 << endl; + ltrace(200) << "Session::dogleg[x+0] original: " << this << endl; - segment1->setSlackened ( true ); - segment2->setSlackened ( isSlackened() ); + dlContact1->updateCache(); + dlContact2->updateCache(); + //autoTarget->updateCache(); - Session::invalidate ( getNet() ); - Session::revalidateTopology (); + segment2->canonize( flags ); + if (not isCanonical()) canonize( flags ); + + return (upLayer) ? KbUseAboveLayer : KbUseBelowLayer; } diff --git a/katabatic/src/CMakeLists.txt b/katabatic/src/CMakeLists.txt index 5f30b779..aba79c50 100644 --- a/katabatic/src/CMakeLists.txt +++ b/katabatic/src/CMakeLists.txt @@ -1,3 +1,4 @@ +# -*- explicit-buffer-name: "CMakeLists.txt" -*- if ( CHECK_DETERMINISM ) add_definitions ( -DCHECK_DETERMINISM ) @@ -12,25 +13,35 @@ endif ( CHECK_DETERMINISM ) ${Boost_INCLUDE_DIRS} ${PYTHON_INCLUDE_PATH} ) - set ( includes katabatic/Configuration.h + set ( includes katabatic/Constants.h + katabatic/Observer.h + katabatic/Configuration.h katabatic/ChipTools.h - katabatic/AutoContact.h katabatic/AutoContacts.h - katabatic/AutoSegment.h katabatic/AutoSegments.h + katabatic/AutoContact.h + katabatic/AutoContactTerminal.h + katabatic/AutoContactTurn.h + katabatic/AutoContactHTee.h + katabatic/AutoContactVTee.h + katabatic/AutoSegment.h katabatic/AutoSegments.h katabatic/AutoHorizontal.h katabatic/AutoVertical.h - katabatic/Grid.h katabatic/GridCollections.h + katabatic/Grid.h katabatic/GridCollections.h katabatic/GridBox.h - katabatic/GCell.h katabatic/GCells.h + katabatic/GCell.h katabatic/GCells.h katabatic/GCellGrid.h katabatic/Session.h katabatic/KatabaticEngine.h - katabatic/GraphicKatabaticEngine.h + #katabatic/GraphicKatabaticEngine.h ) - set ( mocIncludes katabatic/GraphicKatabaticEngine.h ) +# set ( mocIncludes katabatic/GraphicKatabaticEngine.h ) set ( cpps Configuration.cpp + Observer.cpp ChipTools.cpp AutoContact.cpp - AutoContacts.cpp + AutoContactTerminal.cpp + AutoContactTurn.cpp + AutoContactHTee.cpp + AutoContactVTee.cpp AutoSegment.cpp AutoSegments.cpp AutoHorizontal.cpp @@ -45,15 +56,16 @@ endif ( CHECK_DETERMINISM ) NetConstraints.cpp NetOptimals.cpp KatabaticEngine.cpp - GraphicKatabaticEngine.cpp + #GraphicKatabaticEngine.cpp ) set ( pyCpps PyKatabatic.cpp ) - qt4_wrap_cpp ( mocCpps ${mocIncludes} ) +# qt4_wrap_cpp ( mocCpps ${mocIncludes} ) - add_library ( katabatic ${cpps} ${mocCpps} ) - set_target_properties ( katabatic PROPERTIES VERSION 1.0 SOVERSION 1 ) - target_link_libraries ( katabatic ${KNIK_LIBRARIES} +# add_library ( katabatic ${cpps} ${mocCpps} ) + add_library ( katabatic ${cpps} ) + set_target_properties ( katabatic PROPERTIES VERSION 1.0 SOVERSION 1 ) + target_link_libraries ( katabatic ${KNIK_LIBRARIES} ${CORIOLIS_LIBRARIES} ${HURRICANE_PYTHON_LIBRARIES} ${HURRICANE_GRAPHICAL_LIBRARIES} @@ -73,7 +85,7 @@ endif ( CHECK_DETERMINISM ) PREFIX "" OUTPUT_NAME "Katabatic" ) - target_link_libraries ( pyKatabatic katabatic + target_link_libraries ( pyKatabatic katabatic ${CORIOLIS_PYTHON_LIBRARIES} ) diff --git a/katabatic/src/ChipTools.cpp b/katabatic/src/ChipTools.cpp index e1fca00f..a1fb4158 100644 --- a/katabatic/src/ChipTools.cpp +++ b/katabatic/src/ChipTools.cpp @@ -2,25 +2,17 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./ChipTools.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ #include @@ -80,42 +72,46 @@ namespace { for ( GCell* gcell=begin ; gcell != NULL ; ) { ltrace(200) << "Pre-break in " << gcell << endl; - if ( (flags & Constant::Horizontal) and (flags & GlobalSegments) ) { - vector* hsegments = gcell->getHSegments(); - for ( size_t i=0 ; i<(*hsegments).size() ; ++i ) { - if ( not ((*hsegments)[i]->getLayer()->getMask() & mask) ) continue; + if ( (flags & KbHorizontal) and (flags & KbGlobalSegment) ) { + const vector& hsegments = gcell->getHSegments(); + for ( size_t i=0 ; igetLayer()->getMask() & mask) ) continue; - ltrace(200) << "Pre-break: " << (*hsegments)[i] << " @" << gcell << endl; - (*hsegments)[i]->makeDogLeg ( gcell, true ); + ltrace(200) << "Pre-break: " << hsegments[i] << " @" << gcell << endl; +#ifdef THIS_IS_DISABLED + hsegments[i]->makeDogLeg ( gcell, true ); +#endif } if ( gcell == end ) break; gcell = gcell->getUp(); } - if ( (flags & Constant::Vertical) and (flags & GlobalSegments) ) { - vector* vsegments = gcell->getVSegments(); - for ( size_t i=0 ; i<(*vsegments).size() ; ++i ) { - if ( not ((*vsegments)[i]->getLayer()->getMask() & mask) ) continue; + if ( (flags & KbVertical) and (flags & KbGlobalSegment) ) { + const vector& vsegments = gcell->getVSegments(); + for ( size_t i=0 ; igetLayer()->getMask() & mask) ) continue; - ltrace(200) << "Pre-break: " << (*vsegments)[i] << " @" << gcell << endl; - (*vsegments)[i]->makeDogLeg ( gcell, true ); + ltrace(200) << "Pre-break: " << vsegments[i] << " @" << gcell << endl; +#if THIS_IS_DISABLED + vsegments[i]->makeDogLeg ( gcell, true ); +#endif } if ( gcell == end ) break; gcell = gcell->getUp(); } - if ( flags & GlobalSegments ) { - vector* contacts = gcell->getContacts(); - vector segments; - for ( size_t i=0 ; isize() ; i++ ) { - forEach ( Component*, component, (*contacts)[i]->getSlaveComponents() ) { + if (flags & KbGlobalSegment) { + const vector& contacts = gcell->getContacts(); + vector segments; + for ( size_t i=0 ; igetSlaveComponents() ) { Segment* segment = dynamic_cast(*component); - AutoSegment* autoSegment = Session::lookup ( segment ); + AutoSegment* autoSegment = Session::lookup( segment ); if ( autoSegment and (autoSegment->getDirection() & flags) ) - segments.push_back ( autoSegment ); + segments.push_back( autoSegment ); } } @@ -123,7 +119,9 @@ namespace { ltrace(200) << "Pre-break: " << segments[i]->getDirection() << "&" << flags << " " << segments[i] << endl; - segments[i]->makeDogLeg ( gcell, true ); +#if THIS_IS_DISABLED + segments[i]->makeDogLeg( gcell, true ); +#endif } } } @@ -161,8 +159,8 @@ namespace Katabatic { void KatabaticEngine::slackenBorder ( Box bb, Layer::Mask mask, unsigned int flags ) { - GCell* begin = getGCellGrid()->getGCell ( Point(bb.getXMin(),bb.getYMin()) ); - GCell* end = getGCellGrid()->getGCell ( Point(bb.getXMin(),bb.getYMax()) ); + GCell* begin = getGCellGrid()->getGCell ( Point(bb.getXMin(),bb.getYMin()) ); + GCell* end = getGCellGrid()->getGCell ( Point(bb.getXMin(),bb.getYMax()) ); breakSegments ( begin, end, mask, flags ); @@ -230,7 +228,7 @@ namespace Katabatic { _bottomPadsBb = Box ( _chipBb.getXMin() , _chipBb.getYMin(), _chipBb.getXMax(), _chipCorona.getOuterBox().getYMin() ); _topPadsBb = Box ( _chipBb.getXMin(), _chipCorona.getOuterBox().getYMax(), _chipBb.getXMax(), _chipBb.getYMax() ); - cmess1 << " o Design is a full chip." << endl; + cmess1 << " o Design is a complete chip." << endl; cmess1 << " - Core: <" << _core->getName() << ">/<" << _core->getMasterCell()->getName() << ">." << endl; cmess1 << " - Corona: " << _chipCorona << "." << endl; diff --git a/katabatic/src/Configuration.cpp b/katabatic/src/Configuration.cpp index 992a4dfb..52c1e9f9 100644 --- a/katabatic/src/Configuration.cpp +++ b/katabatic/src/Configuration.cpp @@ -1,26 +1,17 @@ - -// -*- C++ -*- +// -*- mode: C++; explicit-buffer-name: "Configuration.cpp" -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./Configuartion.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ #include @@ -28,6 +19,7 @@ #include #include "vlsisapd/configuration/Configuration.h" +#include "hurricane/Warning.h" #include "hurricane/Technology.h" #include "hurricane/DataBase.h" #include "hurricane/Cell.h" @@ -49,6 +41,7 @@ namespace Katabatic { using std::vector; using Hurricane::tab; using Hurricane::inltrace; + using Hurricane::Warning; using Hurricane::Technology; using Hurricane::DataBase; using CRL::AllianceFramework; @@ -88,6 +81,10 @@ namespace Katabatic { _gmetalv = DataBase::getDB()->getTechnology()->getLayer("gmetalv"); _gcontact = DataBase::getDB()->getTechnology()->getLayer("gcontact"); + if (_gcontact == NULL) cerr << Warning("Cannot get \"gcontact\" layer from the Technology.") << endl; + if (_gmetalv == NULL) cerr << Warning("Cannot get \"gmetalv\" layer from the Technology.") << endl; + if (_gmetalh == NULL) cerr << Warning("Cannot get \"gmetalh\" layer from the Technology.") << endl; + vector::const_iterator ilayerGauge = rg->getLayerGauges().begin(); for ( ; ilayerGauge != rg->getLayerGauges().end() ; ++ilayerGauge ) { RoutingLayerGauge* layerGauge = (*ilayerGauge); @@ -130,13 +127,13 @@ namespace Katabatic { bool ConfigurationConcrete::isGMetal ( const Layer* layer ) const { - if ( !layer ) return false; - if ( ( layer != _gmetalh ) - && ( layer != _gmetalv ) - && ( layer != _gcontact ) ) - return false; + return (layer and ((layer == _gmetalh) or (layer == _gmetalv))); + } - return true; + + bool ConfigurationConcrete::isGContact ( const Layer* layer ) const + { + return (layer and (layer == _gcontact)); } diff --git a/katabatic/src/GCell.cpp b/katabatic/src/GCell.cpp index ad99545a..bc9a3653 100644 --- a/katabatic/src/GCell.cpp +++ b/katabatic/src/GCell.cpp @@ -2,14 +2,14 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./GCell.cpp" | // +-----------------------------------------------------------------+ @@ -259,38 +259,6 @@ namespace Katabatic { using Hurricane::Bug; using Hurricane::Horizontal; using Hurricane::Vertical; - - -// ------------------------------------------------------------------- -// Class : "Katabatic::GCell::BlockedAxis". - - - GCell::BlockedAxis::BlockedAxis ( GCell* gcell ) - : _gcell (gcell) - , _axisSets(new set* [_gcell->getDepth()]) - { - for ( size_t i=0 ; i<_gcell->getDepth() ; ++i ) _axisSets[i] = NULL; - } - - - const set& GCell::BlockedAxis::getAxisSet ( size_t depth ) const - { - static const set _emptySet; - - if ( (depth >= _gcell->getDepth()) or (not _axisSets[depth]) ) - return _emptySet; - - return *(_axisSets[depth]); - } - - - void GCell::BlockedAxis::addAxis ( size_t depth, DbU::Unit axis ) - { - if ( depth >= _gcell->getDepth() ) return; - if ( not _axisSets[depth] ) _axisSets[depth] = new set(); - - _axisSets[depth]->insert ( axis ); - } @@ -305,14 +273,14 @@ namespace Katabatic { bool GCell::CompareByDensity::operator() ( GCell* lhs, GCell* rhs ) { - float difference = roundfp ( lhs->getDensity(_depth) - rhs->getDensity(_depth) ); - if ( difference != 0.0 ) return (difference > 0.0); + //float difference = roundfp ( lhs->getDensity(_depth) - rhs->getDensity(_depth) ); + float difference = lhs->getDensity(_depth) - rhs->getDensity(_depth); + if (difference != 0.0) return (difference > 0.0); //int difference = floatCompare ( lhs->getDensity(_depth), rhs->getDensity(_depth) ); //if ( abs(difference) > 1000 ) return difference > 0; - if ( lhs->getIndex() < rhs->getIndex() ) return true; - return false; + return lhs->getIndex() < rhs->getIndex(); } @@ -355,9 +323,8 @@ namespace Katabatic { , _globalsCount (new float [_depth]) //, _blockedAxis (this) //, _saturateDensities (new float [_depth]) - , _saturated (false) - , _invalid (true) - , _key (0.0,_index) + , _flags (GCellInvalidated) + , _key (this,1) { for ( size_t i=0 ; i<_depth ; i++ ) { _blockages [i] = 0; @@ -371,6 +338,7 @@ namespace Katabatic { ++_pinDepth; } + updateKey(1); _allocateds++; } @@ -388,13 +356,14 @@ namespace Katabatic { GCell* GCell::create ( GCellGrid* gcellGrid, unsigned int index, Box box ) { - if ( !_topRightShrink ) + if (_topRightShrink == 0) _topRightShrink = 1 /*DbU::lambda(0.0)*/; - GCell* gcell = new GCell ( gcellGrid, index, box.inflate(0 - ,0 - ,-_topRightShrink - ,-_topRightShrink) ); + DbU::Unit trShrink = ( gcellGrid->isOnTopBorder (index) + or gcellGrid->isOnRightBorder(index)) ? 0 : _topRightShrink; + + ltrace(90) << "Gcell::create()" << endl; + GCell* gcell = new GCell ( gcellGrid, index, box.inflate( 0 ,0 ,-trShrink ,-trShrink ) ); gcell->_postCreate (); @@ -428,7 +397,7 @@ namespace Katabatic { bool GCell::isAboveDensity ( float threshold ) const { - if (_invalid) const_cast(this)->updateDensity(); + if (not isValid()) const_cast(this)->updateDensity(); float difference = roundfp ( getDensity() - threshold ); //int difference = floatDifference(getDensity(),threshold,10000); @@ -463,7 +432,7 @@ namespace Katabatic { void GCell::getDensities ( float* densities ) const { - if (_invalid) const_cast(this)->updateDensity(); + if (not isValid()) const_cast(this)->updateDensity(); for ( unsigned int i=0 ; i<_depth ; i++ ) { densities[i] = _densities[i]; @@ -511,13 +480,13 @@ namespace Katabatic { { return getGCellGrid()->getGCellDown(this); } - Interval GCell::getUSide ( unsigned int direction ) const + Interval GCell::getSide ( unsigned int direction ) const { Interval side; switch ( direction ) { default: - case Constant::Horizontal: side = Interval(_box.getXMin(),_box.getXMax()); break; - case Constant::Vertical: side = Interval(_box.getYMin(),_box.getYMax()); break; + case KbHorizontal: side = Interval(_box.getXMin(),_box.getXMax()); break; + case KbVertical: side = Interval(_box.getYMin(),_box.getYMax()); break; } return side; } @@ -525,25 +494,25 @@ namespace Katabatic { AutoSegments GCell::getHStartSegments () { - return new AutoSegments_AnchorOnGCell (this,true,Constant::Horizontal); + return new AutoSegments_AnchorOnGCell (this,KbHorizontal|KbBySource); } AutoSegments GCell::getVStartSegments () { - return new AutoSegments_AnchorOnGCell (this,true,Constant::Vertical); + return new AutoSegments_AnchorOnGCell (this,KbVertical|KbBySource); } AutoSegments GCell::getHStopSegments () { - return new AutoSegments_AnchorOnGCell (this,false,Constant::Horizontal); + return new AutoSegments_AnchorOnGCell (this,KbHorizontal|KbByTarget); } AutoSegments GCell::getVStopSegments () { - return new AutoSegments_AnchorOnGCell (this,false,Constant::Vertical); + return new AutoSegments_AnchorOnGCell (this,KbVertical|KbByTarget); } @@ -571,19 +540,20 @@ namespace Katabatic { } - float GCell::getDensity ( bool update ) const + float GCell::getDensity ( unsigned int flags ) const { - if (_invalid and update) const_cast(this)->updateDensity(); + if (not isValid() and not(flags & NoUpdate)) const_cast(this)->updateDensity(); float density = 0.0; - if ( getGCellGrid()->getDensityMode() == GCellGrid::AverageHVDensity ) { + if (getGCellGrid()->getDensityMode() == GCellGrid::AverageHVDensity) { // Average density of all layers mixeds together. for ( size_t i=0 ; i<_depth ; i++ ) density += _densities[i]; - density = roundfp ( density/((float)(_depth-_pinDepth)) ); - } else if ( getGCellGrid()->getDensityMode() == GCellGrid::MaxHVDensity ) { + //density = roundfp ( density/((float)(_depth-_pinDepth)) ); + density = density/((float)(_depth-_pinDepth)); + } else if (getGCellGrid()->getDensityMode() == GCellGrid::MaxHVDensity) { // Maximum density between all horizontal vs. all vertical layers. size_t hplanes = 0; size_t vplanes = 0; @@ -598,8 +568,9 @@ namespace Katabatic { if (hplanes) hdensity /= hplanes; if (vplanes) vdensity /= vplanes; - density = roundfp ( (hdensity > vdensity) ? hdensity : vdensity ); - } else if ( getGCellGrid()->getDensityMode() == GCellGrid::AverageHDensity ) { + //density = roundfp ( (hdensity > vdensity) ? hdensity : vdensity ); + density = (hdensity > vdensity) ? hdensity : vdensity; + } else if (getGCellGrid()->getDensityMode() == GCellGrid::AverageHDensity) { // Average density between all horizontal layers. size_t hplanes = 0; float hdensity = 0.0; @@ -609,8 +580,9 @@ namespace Katabatic { } if (hplanes) hdensity /= hplanes; - density = roundfp ( hdensity ); - } else if ( getGCellGrid()->getDensityMode() == GCellGrid::AverageVDensity ) { + //density = roundfp ( hdensity ); + density = hdensity; + } else if (getGCellGrid()->getDensityMode() == GCellGrid::AverageVDensity) { // Average density between all vertical layers. size_t vplanes = 0; float vdensity = 0.0; @@ -621,30 +593,30 @@ namespace Katabatic { if (vplanes) vdensity /= vplanes; - density = roundfp ( vdensity ); + //density = roundfp ( vdensity ); + density = vdensity; } else if ( getGCellGrid()->getDensityMode() == GCellGrid::MaxDensity ) { // Density of the most saturated layer. for ( size_t i=_pinDepth ; i<_depth ; i++ ) { if ( _densities[i] > density ) density = _densities[i]; } density = roundfp(density); - } else if ( getGCellGrid()->getDensityMode() == GCellGrid::MaxHDensity ) { + } else if (getGCellGrid()->getDensityMode() == GCellGrid::MaxHDensity) { // Density of the most saturated horizontal layer. for ( size_t i=_pinDepth ; i<_depth ; i++ ) { if ( (i%2) and (_densities[i] > density) ) density = _densities[i]; } - density = roundfp(density); - } else if ( getGCellGrid()->getDensityMode() == GCellGrid::MaxVDensity ) { + //density = roundfp(density); + density = density; + } else if (getGCellGrid()->getDensityMode() == GCellGrid::MaxVDensity) { // Density of the most saturated vertical layer. for ( size_t i=_pinDepth ; i<_depth ; i++ ) { if ( (i%2 == 0) and (_densities[i] > density) ) density = _densities[i]; } - density = roundfp(density); + //density = roundfp(density); + density = density; } -#if defined(CHECK_DETERMINISM) - cerr << "Order: density " << setprecision(9) << density << endl; -#endif return density; } @@ -654,7 +626,7 @@ namespace Katabatic { if ( depth >= _depth ) return; _blockages[depth] += length; - _invalid = true; + _flags |= GCellInvalidated; // if ( _blockages[depth] >= 8.0 ) { // cinfo << Warning("%s is under power ring.",getString(this).c_str()) << endl; @@ -675,13 +647,6 @@ namespace Katabatic { } - // void GCell::addBlockedAxis ( unsigned int depth, DbU::Unit axis ) - // { - // _invalid = true; - // _blockedAxis.addAxis ( depth, axis ); - // } - - void GCell::removeContact ( AutoContact* ac ) { size_t begin = 0; @@ -696,8 +661,7 @@ namespace Katabatic { } if (found) { - ltrace(200) << "remove " << (void*)ac->base() << ":" << ac - << " from " << this << endl; + ltrace(200) << "remove " << ac << " from " << this << endl; _contacts.pop_back(); } else { cerr << Bug("%p:%s do not belong to %s." @@ -726,16 +690,14 @@ namespace Katabatic { } if ( _hsegments.size() == end ) { - cerr << Bug("%p %s do not go through %s." - ,(void*)segment + cerr << Bug("%s do not go through %s." ,getString(segment).c_str() ,_getString().c_str()) << endl; return; } if ( _hsegments.size() - end > 1 ) - cerr << Bug("%p %s has multiple occurrences of %s." - ,(void*)segment + cerr << Bug("%s has multiple occurrences of %s." ,_getString().c_str() ,getString(segment).c_str()) << endl; @@ -755,16 +717,14 @@ namespace Katabatic { } if ( _vsegments.size() == end ) { - cerr << Bug("%p %s do not go through %s." - ,(void*)segment + cerr << Bug("%s do not go through %s." ,getString(segment).c_str() ,_getString().c_str()) << endl; return; } if ( _vsegments.size() - end > 1 ) - cerr << Bug("%p %s has multiple occurrences of %s." - ,(void*)segment + cerr << Bug("%s has multiple occurrences of %s." ,_getString().c_str() ,getString(segment).c_str()) << endl; @@ -782,9 +742,9 @@ namespace Katabatic { size_t GCell::updateDensity () { - if ( not _invalid ) return (_saturated) ? 1 : 0; + if (isValid()) return (isSaturated()) ? 1 : 0; - _saturated = false; + _flags &= ~GCellSaturated; for ( size_t i=0 ; i<_vsegments.size() ; i++ ) { if ( _vsegments[i] == NULL ) @@ -794,12 +754,6 @@ namespace Katabatic { sort ( _hsegments.begin(), _hsegments.end(), AutoSegment::CompareByDepthLength() ); sort ( _vsegments.begin(), _vsegments.end(), AutoSegment::CompareByDepthLength() ); -#if defined(CHECK_DETERMINISM) - cerr << "Order: Update density " << this << endl; - for ( size_t i=0 ; i<_hsegments.size() ; i++ ) cerr << "Order: " << _hsegments[i] << endl; - for ( size_t i=0 ; i<_vsegments.size() ; i++ ) cerr << "Order: " << _vsegments[i] << endl; -#endif - float hcapacity = getHCapacity (); float vcapacity = getVCapacity (); float ccapacity = hcapacity * vcapacity * 4; @@ -809,7 +763,6 @@ namespace Katabatic { DbU::Unit uLengths2 [ _depth ]; float localCounts [ _depth ]; UsedFragments ufragments [ _depth ]; - //set usedAxis [ _depth ]; for ( size_t i=0 ; i<_depth ; i++ ) { _feedthroughs[i] = 0.0; @@ -827,8 +780,6 @@ namespace Katabatic { ufragments[i].setCapacity ( (size_t)vcapacity ); break; } - - //usedAxis [i] = _blockedAxis.getAxisSet ( i ); } // Compute wirelength associated to contacts (in DbU::Unit converted to float). @@ -864,7 +815,6 @@ namespace Katabatic { } count++; _feedthroughs[depth] += 1.0; - //usedAxis[depth].insert ( _hsegments[i]->getAxis() ); } if ( count ) { uLengths2[depth] += count * _box.getWidth(); @@ -889,7 +839,6 @@ namespace Katabatic { } count++; _feedthroughs[depth] += 1.0; - //usedAxis[depth].insert ( _vsegments[i]->getAxis() ); } if ( count ) { uLengths2[depth] += count * _box.getHeight(); @@ -915,9 +864,6 @@ namespace Katabatic { ufragments[depth].merge ( (*isegment)->getAxis(), (*isegment)->getSpanU() ); if ( (axis != (*isegment)->getAxis()) or (layer != (*isegment)->getLayer()) ) { - //_feedthroughs[depth] += 1; - //usedAxis[depth].insert ( axis ); - count = 0; axis = (*isegment)->getAxis(); layer = (*isegment)->getLayer(); @@ -925,10 +871,6 @@ namespace Katabatic { } ++count; } - if ( count ) { - //_feedthroughs[depth] += 1; - //usedAxis[depth].insert ( axis ); - } } // Normalize: 0 < d < 1.0 (divide by H/V capacity). @@ -937,82 +879,51 @@ namespace Katabatic { case Constant::Horizontal: _densities [i] = ((float)uLengths2[i]) / ( hcapacity * (float)_box.getWidth() ); _feedthroughs [i] += (float)(_blockages[i] / _box.getWidth()); - //_fragmentations[i] = (hcapacity - _feedthroughs[i]) / (localCounts[i] + 1.0); _fragmentations[i] = (float)ufragments[i].getMaxFree().getSize() / (float)_box.getWidth(); - - // if ( ((float)ufragments[i].getMaxFree().getSize() + (float)uLengths2[i]) - // > ( hcapacity * (float)_box.getWidth() ) ) { - // cerr << "INCOHERENCY: " << this << "\n " - // << "on d:" << i - // << " frag:" << DbU::getValueString(ufragments[i].getMaxFree().getSize()) - // << " ulength2:" << DbU::getValueString(uLengths2[i]) - // << " capacity:" << DbU::getValueString(hcapacity * _box.getWidth()) - // << " " << getVectorString(_fragmentations,_depth) << endl; - - // } break; case Constant::Vertical: _densities [i] = ((float)uLengths2[i]) / ( vcapacity * (float)_box.getHeight() ); _feedthroughs [i] += (float)(_blockages[i] / _box.getHeight()); - //_fragmentations[i] = (vcapacity - _feedthroughs[i]) / (localCounts[i] + 1.0); _fragmentations[i] = (float)ufragments[i].getMaxFree().getSize() / (float)_box.getHeight(); - - // if ( ((float)ufragments[i].getMaxFree().getSize() + (float)uLengths2[i]) - // > ( vcapacity * (float)_box.getHeight() ) ) { - // cerr << "INCOHERENCY: " << this << "\n " - // << " on d:" << i - // << " frag:" << DbU::getValueString(ufragments[i].getMaxFree().getSize()) - // << " ulength2:" << DbU::getValueString(uLengths2[i]) - // << " capacity:" << DbU::getValueString(vcapacity * _box.getHeight()) - // << " " << getVectorString(_fragmentations,_depth) << endl; - - // } break; } - if ( _densities[i] >= 1.0 ) _saturated = true; - //if ( usedAxis[i].size() > _feedthroughs[i] ) _feedthroughs[i] = usedAxis[i].size(); + if (_densities[i] >= 1.0) + _flags |= GCellSaturated; } - _cDensity = ( (float)_contacts.size() ) / ccapacity; - _invalid = false; + _cDensity = ( (float)_contacts.size() ) / ccapacity; + _flags &= ~GCellInvalidated; - for ( size_t i=0 ; i<_depth ; i++ ) { _densities[i] = roundfp ( _densities[i] ); } - _cDensity = roundfp (_cDensity ); + //for ( size_t i=0 ; i<_depth ; i++ ) { _densities[i] = roundfp ( _densities[i] ); } + //_cDensity = roundfp (_cDensity ); - ltrace(190) << "updateDensity: " << this << endl; + //ltrace(190) << "updateDensity: " << this << endl; - checkDensity (); + checkDensity(); -#if defined(CHECK_DETERMINISM) - float gdensity = getDensity(); - cerr << "Order: [" << getIndex() << "] " - << getVectorString(_densities,_depth) - << " " << setprecision(9) << gdensity << endl; -#endif - - return ( _saturated ) ? 1 : 0 ; + return isSaturated() ? 1 : 0 ; } size_t GCell::checkDensity () const { - if ( _invalid ) const_cast(this)->updateDensity (); + if (not isValid()) const_cast(this)->updateDensity (); - if ( not Session::getDemoMode() and Session::getWarnGCellOverload() ) { + if ( not Session::isInDemoMode() and Session::doWarnGCellOverload() ) { for ( size_t i=0 ; i<_depth ; i++ ) { if ( _densities[i] > 1.0 ) { - cinfo << Warning("%s @%dx%d overloaded in %s (M2:%.2f M3:%.2f M4:%.2f M5:%.2f)" - ,_getString().c_str() - ,getColumn() - ,getRow() - ,getString(Session::getRoutingGauge()->getRoutingLayer(i)->getName()).c_str() - ,_densities[1] // M2 - ,_densities[2] // M3 - //,_blockages[2] // M4 - ,_densities[3] // M5 - ,_densities[4] // M6 - ) + cparanoid << Warning( "%s @%dx%d overloaded in %s (M2:%.2f M3:%.2f M4:%.2f M5:%.2f)" + , _getString().c_str() + , getColumn() + , getRow() + , getString(Session::getRoutingGauge()->getRoutingLayer(i)->getName()).c_str() + , _densities[1] // M2 + , _densities[2] // M3 + //, _blockages[2] // M4 + , _densities[3] // M5 + , _densities[4] // M6 + ) << endl; } } @@ -1037,41 +948,13 @@ namespace Katabatic { // } } - return ( _saturated ) ? 1 : 0 ; - } - - - void GCell::rpDesaturate ( set& globalNets ) - { - set rps; - getRoutingPads ( rps ); - - set rpNets; - set::iterator irp = rps.begin(); - for ( ; irp != rps.end() ; ++irp ) { - if ( (*irp)->getLayer() != Session::getRoutingLayer(0) ) continue; - rpNets.insert ( (*irp)->getNet() ); - } - - if ( rpNets.size() < Session::getSaturateRp() ) return; - - cinfo << Warning("%s has %zd terminals (h:%zd, v:%zd)" - ,getString(this).c_str() - ,rps.size() - ,_hsegments.size() - ,_vsegments.size() - ) << endl; - - AutoSegment* segment; - while ( (_densities[1] > 0.5) and stepDesaturate(1,globalNets,segment,true) ) { - ltrace(200) << "Moved up: " << segment << endl; - } + return isSaturated() ? 1 : 0 ; } bool GCell::hasFreeTrack ( size_t depth, float reserve ) const { - if (_invalid) const_cast(this)->updateDensity(); + if (not isValid()) const_cast(this)->updateDensity(); #if DEPRECATED float capacity; @@ -1119,182 +1002,6 @@ namespace Katabatic { } - bool GCell::stepDesaturate ( unsigned int depth, set& globalNets, AutoSegment*& moved, bool force ) - { -#if defined(CHECK_DETERMINISM) - cerr << "Order: stepDesaturate [" << getIndex() << "] depth:" << depth << endl; -#endif - - updateDensity (); - //float density = getDensity(); - moved = NULL; - - //float density = _densities[depth]; - //float densityUp = _densities[depth+2]; - - if ( not force and not isSaturated(depth) ) return false; - - float capacity; - vector::iterator isegment; - vector::iterator iend; - - switch ( Session::getRoutingGauge()->getLayerDirection(depth) ) { - case Constant::Horizontal: - iend = _hsegments.end (); - isegment = _hsegments.begin (); - capacity = getHCapacity (); - break; - case Constant::Vertical: - iend = _vsegments.end (); - isegment = _vsegments.begin (); - capacity = getVCapacity (); - break; - } - - for ( ; (isegment != iend) ; isegment++ ) { - unsigned int segmentDepth = Session::getRoutingGauge()->getLayerDepth((*isegment)->getLayer()); - - if ( segmentDepth < depth ) continue; - if ( segmentDepth > depth ) break; - - globalNets.insert ( (*isegment)->getNet() ); -#if defined(CHECK_DETERMINISM) - cerr << "Order: Move up " << (*isegment) << endl; -#endif - // cerr << "Move up " << (*isegment) << endl; - // if ( not (*isegment)->canMoveUp(0.5/*,AutoSegment::Propagate*/) ) { - // cinfo << Warning("Shear effect on: %s.",getString(*isegment).c_str()) << endl; - // return false; - // } - - (*isegment)->changeDepth ( depth+2, false, false ); - moved = (*isegment); - - //(*isegment)->shearUp ( this, moved, 0.5, AutoSegment::AllowTerminal ); - //updateDensity (); - - //cmess2 << " - GCell [" << getIndex() << "] @" << getColumn() << "x" << getRow() - // << ":" << setprecision(4) << density - // << " [cap:" << _densities[depth] - // << " M+2: " << (_densities[depth+2] + (1.0 / capacity)) - // << " displaced:" << (*isegment) << "]." - // << endl; - - if ( moved ) { - // cerr << "Desaturating: " << _densities[depth] << " > " << Session::getSaturateRatio() << " " - // << Session::getRoutingGauge()->getRoutingLayer(depth)->getName() << " " - // << this << endl; - // cerr << "Moved up: " << moved << endl; - return true; - } - } - - return false; - } - - - bool GCell::stepNetDesaturate ( unsigned int depth, set& globalNets, GCell::SetId& invalidateds ) - { -#if defined(CHECK_DETERMINISM) - cerr << "Order: stepDesaturate [" << getIndex() << "] depth:" << depth << endl; -#endif - ltrace(200) << "stepNetDesaturate() - " << this << endl; - - updateDensity (); - - //if ( not force and not isSaturated(depth) ) return false; - - float capacity; - vector::iterator isegment; - vector::iterator iend; - - switch ( Session::getRoutingGauge()->getLayerDirection(depth) ) { - case Constant::Horizontal: - iend = _hsegments.end (); - isegment = _hsegments.begin (); - capacity = getHCapacity (); - break; - case Constant::Vertical: - iend = _vsegments.end (); - isegment = _vsegments.begin (); - capacity = getVCapacity (); - break; - } - - for ( ; (isegment != iend) ; isegment++ ) { - unsigned int segmentDepth = Session::getRoutingGauge()->getLayerDepth((*isegment)->getLayer()); - - if ( segmentDepth < depth ) continue; - if ( segmentDepth > depth ) break; - -#if defined(CHECK_DETERMINISM) - cerr << "Order: Move up " << (*isegment) << endl; -#endif - - //cerr << " Seed segment: " << *isegment << endl; - if ( getGCellGrid()->getKatabatic()->_moveUpNetTrunk(*isegment,globalNets,invalidateds) ) - return true; - } - - return false; - } - - - void GCell::desaturate ( unsigned int depth, set& globalNets ) - { - updateDensity (); - - float density = _densities[depth]; - float densityUp = _densities[depth+2]; - - if ( density < Session::getSaturateRatio() ) return; - - float capacity; - vector::iterator isegment; - vector::iterator iend; - - switch ( Session::getRoutingGauge()->getLayerDirection(depth) ) { - case Constant::Horizontal: - iend = _hsegments.end (); - isegment = _hsegments.begin (); - capacity = getHCapacity (); - break; - default: - case Constant::Vertical: - iend = _vsegments.end (); - isegment = _vsegments.begin (); - capacity = getHCapacity (); - break; - } - - unsigned int overload = (unsigned int)( ( density - Session::getSaturateRatio() ) * capacity ); - unsigned int displaced = 0; - - for ( ; (isegment != iend) && (displaced < overload) ; isegment++ ) { - unsigned int segmentDepth = Session::getRoutingGauge()->getLayerDepth((*isegment)->getLayer()); - - if ( segmentDepth < depth ) continue; - if ( segmentDepth > depth ) break; - - globalNets.insert ( (*isegment)->getNet() ); - (*isegment)->changeDepth ( depth+2, false, false ); - - displaced++; - } - - float desaturated = density - ((float)(displaced)) / capacity; - - cmess2 << " - GCell [" << getIndex() << "] @" << getColumn() << "x" << getRow() - << ":" << setprecision(4) << density - << " -> " << desaturated - << " [displaced:" << displaced - << " cap:" << capacity - << " M+2: " << densityUp - << " -> " << (densityUp + ((float)(displaced)) / capacity) << "]." - << endl; - } - - bool GCell::checkEdgeSaturation ( float threshold ) const { unsigned int edgeUpUsage = 0; @@ -1318,7 +1025,6 @@ namespace Katabatic { edgeUpUsage++; } } - //edgeUpSaturation = (float)edgeUpUsage/((float)getVCapacity()*2.0); edgeUpSaturation = (float)edgeUpUsage/getGCellGrid()->getVEdgeCapacity(); } @@ -1338,7 +1044,6 @@ namespace Katabatic { edgeRightUsage++; } } - //edgeRightSaturation = (float)edgeRightUsage/((float)getHCapacity()*2.0); edgeRightSaturation = (float)edgeRightUsage/getGCellGrid()->getHEdgeCapacity(); } @@ -1346,7 +1051,7 @@ namespace Katabatic { if ( (edgeUpSaturation > threshold) or (edgeRightSaturation > threshold) ) { overload = true; - cinfo << Warning("In %s, (over %.2f) ", _getString().c_str(), threshold); + cparanoid << Warning("In %s, (over %.2f) ", _getString().c_str(), threshold); ostringstream message; message << setprecision(3); @@ -1359,13 +1064,177 @@ namespace Katabatic { << " " << edgeRightSaturation; } - cinfo << message.str() << "." << endl; + cparanoid << message.str() << "." << endl; } return overload; } + void GCell::rpDesaturate ( set& globalNets ) + { + set rps; + getRoutingPads ( rps ); + + set rpNets; + set::iterator irp = rps.begin(); + for ( ; irp != rps.end() ; ++irp ) { + if ( (*irp)->getLayer() != Session::getRoutingLayer(0) ) continue; + rpNets.insert ( (*irp)->getNet() ); + } + + if ( rpNets.size() < Session::getSaturateRp() ) return; + + cerr << Warning("%s has %zd terminals (h:%zd, v:%zd)" + ,getString(this).c_str() + ,rps.size() + ,_hsegments.size() + ,_vsegments.size() + ) << endl; + + AutoSegment* segment; + while ( (_densities[1] > 0.5) and stepDesaturate(1,globalNets,segment,KbForceMove) ) { + ltrace(200) << "Moved up: " << segment << endl; + } + } + + + bool GCell::stepDesaturate ( unsigned int depth + , set& globalNets + , AutoSegment*& moved + , unsigned int flags + ) + { + ltrace(500) << "Deter| GCell::stepDesaturate() [" << getIndex() << "] depth:" << depth << endl; + + updateDensity (); + moved = NULL; + + if ( not (flags & KbForceMove) and not isSaturated(depth) ) return false; + + float capacity; + vector::iterator isegment; + vector::iterator iend; + + switch ( Session::getRoutingGauge()->getLayerDirection(depth) ) { + case Constant::Horizontal: + iend = _hsegments.end (); + isegment = _hsegments.begin (); + capacity = getHCapacity (); + break; + case Constant::Vertical: + iend = _vsegments.end (); + isegment = _vsegments.begin (); + capacity = getVCapacity (); + break; + } + + for ( ; (isegment != iend) ; isegment++ ) { + unsigned int segmentDepth = Session::getRoutingGauge()->getLayerDepth((*isegment)->getLayer()); + + if ( segmentDepth < depth ) continue; + if ( segmentDepth > depth ) break; + + globalNets.insert ( (*isegment)->getNet() ); + ltrace(500) << "Deter| Move up " << (*isegment) << endl; + +#if THIS_IS_DISABLED + (*isegment)->changeDepth ( depth+2, false, false ); +#endif + moved = (*isegment); + + if (moved) return true; + } + + return false; + } + + + bool GCell::stepBalance ( unsigned int depth, GCell::SetIndex& invalidateds ) + { + ltrace(200) << "stepBalance() - " << this << endl; + + updateDensity (); + + float capacity; + vector::iterator isegment; + vector::iterator iend; + set globalNets; + + switch ( Session::getRoutingGauge()->getLayerDirection(depth) ) { + case Constant::Horizontal: + iend = _hsegments.end (); + isegment = _hsegments.begin (); + capacity = getHCapacity (); + break; + case Constant::Vertical: + iend = _vsegments.end (); + isegment = _vsegments.begin (); + capacity = getVCapacity (); + break; + } + + for ( ; (isegment != iend) ; isegment++ ) { + unsigned int segmentDepth = Session::getRoutingGauge()->getLayerDepth((*isegment)->getLayer()); + + if ( segmentDepth < depth ) continue; + if ( segmentDepth > depth ) break; + + // Hard-coded: reserve 3 tracks (1/20 * 3). + if ((*isegment)->canMoveULeft(0.05)) { + getGCellGrid()->getKatabatic()->moveULeft(*isegment,globalNets,invalidateds); + return true; + } + if ((*isegment)->canMoveURight(0.05)) { + getGCellGrid()->getKatabatic()->moveURight(*isegment,globalNets,invalidateds); + return true; + } + } + + return false; + } + + + bool GCell::stepNetDesaturate ( unsigned int depth, set& globalNets, GCell::SetIndex& invalidateds ) + { + ltrace(500) << "Deter| GCell::stepNetDesaturate() depth:" << depth << endl; + ltrace(500) << "Deter| " << this << endl; + + updateDensity (); + + float capacity; + vector::iterator isegment; + vector::iterator iend; + + switch ( Session::getRoutingGauge()->getLayerDirection(depth) ) { + case Constant::Horizontal: + iend = _hsegments.end (); + isegment = _hsegments.begin (); + capacity = getHCapacity (); + break; + case Constant::Vertical: + iend = _vsegments.end (); + isegment = _vsegments.begin (); + capacity = getVCapacity (); + break; + } + + for ( ; (isegment != iend) ; isegment++ ) { + unsigned int segmentDepth = Session::getRoutingGauge()->getLayerDepth((*isegment)->getLayer()); + + if ( segmentDepth < depth ) continue; + if ( segmentDepth > depth ) break; + + ltrace(500) << "Deter| Move up " << (*isegment) << endl; + + if ( getGCellGrid()->getKatabatic()->moveUpNetTrunk(*isegment,globalNets,invalidateds) ) + return true; + } + + return false; + } + + Box GCell::getBoundingBox () const { return _box; @@ -1374,8 +1243,8 @@ namespace Katabatic { void GCell::translate ( const DbU::Unit&, const DbU::Unit& ) { - cinfo << Warning("Calling GCell::translate() on %s is likely a bug." - ,_getString().c_str()) << endl; + cerr << Warning("Calling GCell::translate() on %s is likely a bug." + ,_getString().c_str()) << endl; } @@ -1388,12 +1257,14 @@ namespace Katabatic { << DbU::getValueString(box.getXMin()) << ":" << DbU::getValueString(box.getYMin()) << " " << DbU::getValueString(box.getXMax()) << ":" << DbU::getValueString(box.getYMax()) << " " << setprecision(3) -#if not defined(CHECK_DETERMINISM) - << getDensity(false) << " " -#endif + << getDensity(NoUpdate) << " " << "d:" << _depth << " " << getVectorString(_densities ,_depth) << " " << getVectorString(_feedthroughs,_depth) + << " " + << (isValid () ? "-" : "i") + << (isSaturated () ? "s" : "-") + << (isUnderIoPad() ? "P" : "-") << ">"; return s.str(); @@ -1410,8 +1281,7 @@ namespace Katabatic { record->add ( getSlot ( "_contacts" , &_contacts ) ); record->add ( getSlot ( "_box" , &_box ) ); record->add ( getSlot ( "_depth" , &_depth ) ); - record->add ( getSlot ( "_saturated" , _saturated ) ); - record->add ( getSlot ( "_invalid" , _invalid ) ); + record->add ( getSlot ( "_flags" , &_flags ) ); RoutingGauge* rg = getGCellGrid()->getKatabatic()->getRoutingGauge(); @@ -1459,79 +1329,58 @@ namespace Katabatic { // ------------------------------------------------------------------- -// Class : "Kite::DyKeyQueue". +// Class : "Kite::GCellDensitySet". - DyKeyQueue::DyKeyQueue ( unsigned int depth ) + GCellDensitySet::GCellDensitySet ( unsigned int depth ) : _depth (depth) - , _map () + , _set () , _requests() { } - DyKeyQueue::DyKeyQueue ( unsigned int depth, const vector& gcells ) + GCellDensitySet::GCellDensitySet ( unsigned int depth, const std::vector& gcells ) : _depth (depth) - , _map () + , _set () , _requests() { for ( size_t i=0 ; i& DyKeyQueue::getGCells () const - { return _map; } - - - void DyKeyQueue::invalidate ( GCell* gcell ) - { push ( gcell ); } - - - void DyKeyQueue::push ( GCell* gcell ) - { _requests.insert ( gcell ); } - - - void DyKeyQueue::revalidate () + void GCellDensitySet::requeue () { - ltrace(190) << "DyKeyQueue::revalidate()" << endl; + ltrace(190) << "GCellDensitySet::requeue()" << endl; std::set::iterator iinserted; - GCell::SetId::iterator igcell = _requests.begin(); + GCell::SetIndex::iterator igcell = _requests.begin(); // Remove invalidateds GCell from the queue. for ( ; igcell != _requests.end() ; ++igcell ) { - iinserted = _map.find(*igcell); - if ( iinserted != _map.end() ) { - _map.erase ( iinserted ); + iinserted = _set.find(*igcell); + if (iinserted != _set.end()) { + _set.erase( iinserted ); } } // Re-insert invalidateds GCell in the queue *after* updating the key. for ( igcell = _requests.begin() ; igcell != _requests.end() ; ++igcell ) { - (*igcell)->updateKey (_depth); - _map.insert ( *igcell ); + (*igcell)->updateKey( _depth ); + _set.insert( *igcell ); } - _requests.clear (); - } - - - GCell* DyKeyQueue::pop () - { - if ( _map.empty() ) return NULL; - std::set::iterator igcell = _map.begin(); - GCell* gcell = *igcell; - _map.erase ( igcell ); - return gcell; + _requests.clear(); } diff --git a/katabatic/src/GCellGrid.cpp b/katabatic/src/GCellGrid.cpp index 18686c18..e77b168d 100644 --- a/katabatic/src/GCellGrid.cpp +++ b/katabatic/src/GCellGrid.cpp @@ -2,25 +2,17 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./GCellGrid.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ #include "hurricane/Error.h" @@ -64,7 +56,7 @@ namespace Katabatic { void GCellGrid::_postCreate () { - KnikEngine* knik; + KnikEngine::KnikEngine* knik; knik = KnikEngine::get ( getCell() ); if ( !knik ) throw Error ( missingKnikEngine, "GCellGrid::_postCreate()", getString(getCell()).c_str() ); @@ -156,14 +148,14 @@ namespace Katabatic { } - void GCellGrid::updateContacts ( bool openSession ) + void GCellGrid::updateContacts ( unsigned int flags ) { - if ( openSession ) Session::open ( _katabatic ); + if (flags & KbOpenSession) Session::open( _katabatic ); forEach ( GCell*, gcell, getGCells() ) - gcell->updateContacts (); + gcell->updateContacts(); - if ( openSession ) Session::close (); + if (flags & KbOpenSession) Session::close(); } diff --git a/katabatic/src/GraphicKatabaticEngine.cpp b/katabatic/src/GraphicKatabaticEngine.cpp index b4ba3f8e..13744718 100644 --- a/katabatic/src/GraphicKatabaticEngine.cpp +++ b/katabatic/src/GraphicKatabaticEngine.cpp @@ -2,14 +2,9 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | @@ -17,10 +12,7 @@ // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Header : "./GraphicKatabaticEngine.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ #include @@ -90,9 +82,13 @@ namespace Katabatic { const GCell* gcell = static_cast(go); QPainter& painter = widget->getPainter(); - painter.setBrush - ( Graphics::getColorScale(ColorScale::Fire).getBrush((size_t)(gcell->getDensity()*255.0) - ,widget->getDarkening()) ); + if (gcell->isUnderIoPad()) { + ( Graphics::getColorScale(ColorScale::Fire).getBrush(128.0,widget->getDarkening()) ); + } else { + painter.setBrush + ( Graphics::getColorScale(ColorScale::Fire).getBrush((size_t)(gcell->getDensity()*255.0) + ,widget->getDarkening()) ); + } painter.drawRect ( widget->dbuToDisplayRect(gcell->getBoundingBox()) ); } diff --git a/katabatic/src/Grid.cpp b/katabatic/src/Grid.cpp index 24872bd6..87868288 100644 --- a/katabatic/src/Grid.cpp +++ b/katabatic/src/Grid.cpp @@ -2,25 +2,17 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./Grid.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ # include diff --git a/katabatic/src/KatabaticEngine.cpp b/katabatic/src/KatabaticEngine.cpp index 04398cb5..b87a7977 100644 --- a/katabatic/src/KatabaticEngine.cpp +++ b/katabatic/src/KatabaticEngine.cpp @@ -2,44 +2,41 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./KatabaticEngine.cpp" | // +-----------------------------------------------------------------+ -#include -#include - -#include "hurricane/DebugSession.h" -#include "hurricane/Bug.h" -#include "hurricane/Error.h" -#include "hurricane/Warning.h" -#include "hurricane/DataBase.h" -#include "hurricane/Technology.h" -#include "hurricane/Layer.h" -#include "hurricane/BasicLayer.h" -#include "hurricane/NetExternalComponents.h" -#include "hurricane/Cell.h" - -#include "crlcore/Utilities.h" -#include "crlcore/Catalog.h" -#include "crlcore/Measures.h" -#include "crlcore/AllianceFramework.h" - -#include "katabatic/Session.h" -#include "katabatic/AutoContact.h" -#include "katabatic/AutoSegment.h" -#include "katabatic/GCell.h" -#include "katabatic/GCellGrid.h" -#include "katabatic/KatabaticEngine.h" +#include +#include +#include "hurricane/DebugSession.h" +#include "hurricane/Bug.h" +#include "hurricane/Error.h" +#include "hurricane/Warning.h" +#include "hurricane/DataBase.h" +#include "hurricane/Technology.h" +#include "hurricane/Layer.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/NetExternalComponents.h" +#include "hurricane/Cell.h" +#include "crlcore/Utilities.h" +#include "crlcore/Catalog.h" +#include "crlcore/Measures.h" +#include "crlcore/AllianceFramework.h" +#include "katabatic/Session.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/GCell.h" +#include "katabatic/GCellGrid.h" +#include "katabatic/KatabaticEngine.h" namespace { @@ -55,77 +52,30 @@ namespace { Contact* source = dynamic_cast(segment->getSource()); Contact* target = dynamic_cast(segment->getTarget()); - layers.clear (); + layers.clear(); - if ( source != NULL ) { + if (source != NULL) { forEach ( Hook*, ihook, source->getBodyHook()->getSlaveHooks() ) { ltrace(88) << "* Slave: " << (*ihook)->getComponent() << endl; - if ( (*ihook)->getComponent() == segment ) continue; - layers.insert ( (*ihook)->getComponent()->getLayer() ); + if ((*ihook)->getComponent() == segment) continue; + layers.insert( (*ihook)->getComponent()->getLayer() ); } } - if ( target != NULL ) { + if (target != NULL) { forEach ( Hook*, ihook, target->getBodyHook()->getSlaveHooks() ) { ltrace(88) << "* Slave: " << (*ihook)->getComponent() << endl; - if ( (*ihook)->getComponent() == segment ) continue; - layers.insert ( (*ihook)->getComponent()->getLayer() ); + if ((*ihook)->getComponent() == segment) continue; + layers.insert( (*ihook)->getComponent()->getLayer() ); } } size_t supplemental = (layers.find(segment->getLayer()) == layers.end()) ? 1 : 0; if ( (source->getAnchor() != NULL) or (target->getAnchor() != NULL) ) supplemental++; -#if 0 - bool bottomConnect = false; - bool topConnect = false; - - if ( source ) { - if ( segment->getLayer() != source->getLayer() ) { - if ( source->getLayer()->getTop() == segment->getLayer() ) { - bottomConnect = true; - ltrace(88) << "Source bottom connected: " << source << endl; - } else { - topConnect = true; - ltrace(88) << "Source top connected: " << source << endl; - } - } - forEach ( Hook*, ihook, source->getBodyHook()->getSlaveHooks() ) { - ltrace(88) << "* Slave: " << (*ihook)->getComponent() << endl; - if ( (*ihook)->getComponent() == segment ) continue; - if ( (*ihook)->getComponent()->getLayer() == segment->getLayer() ) { - if ( bottomConnect ) topConnect = true; - else bottomConnect = true; - break; - } - } - } - - if ( target ) { - if ( segment->getLayer() != target->getLayer() ) { - if ( target->getLayer()->getTop() == segment->getLayer() ) { - bottomConnect = true; - ltrace(88) << "Target bottom connected: " << target << endl; - } else { - topConnect = true; - ltrace(88) << "Target top connected: " << target << endl; - } - } - forEach ( Hook*, ihook, target->getBodyHook()->getSlaveHooks() ) { - ltrace(88) << "* Slave: " << (*ihook)->getComponent() << endl; - if ( (*ihook)->getComponent() == segment ) continue; - if ( (*ihook)->getComponent()->getLayer() == segment->getLayer() ) { - if ( bottomConnect ) topConnect = true; - else bottomConnect = true; - break; - } - } - } -#endif ltraceout(88); - //return topConnect && bottomConnect; return layers.size()+supplemental > 2; } @@ -181,59 +131,75 @@ namespace Katabatic { // ------------------------------------------------------------------- // Class : "Katabatic::KatabaticEngine". - Name KatabaticEngine::_toolName = "Katabatic"; KatabaticEngine* KatabaticEngine::get ( const Cell* cell ) - { - return static_cast(ToolEngine::get(cell,staticGetName())); - } + { return static_cast(ToolEngine::get(cell,staticGetName())); } const Name& KatabaticEngine::staticGetName () - { - return _toolName; - } + { return _toolName; } const Name& KatabaticEngine::getName () const - { - return _toolName; - } + { return _toolName; } KatabaticEngine::KatabaticEngine ( Cell* cell ) : ToolEngine (cell) , _timer () - , _state (StateCreation) - , _destroyBaseContact(true) - , _destroyBaseSegment(false) - , _demoMode (false) - , _warnGCellOverload (false) + , _state (EngineCreation) + , _flags (EngineDestroyBaseContact) , _configuration (new ConfigurationConcrete()) , _gcellGrid (NULL) , _chipTools (cell) , _routingNets () { - addMeasure ( cell, "Gates" - , AllianceFramework::getInstancesCount(cell,AllianceFramework::IgnoreFeeds - |AllianceFramework::Recursive) ); + addMeasure( cell, "Gates" + , AllianceFramework::getInstancesCount(cell,AllianceFramework::IgnoreFeeds + |AllianceFramework::Recursive) ); } void KatabaticEngine::_postCreate () - { - ToolEngine::_postCreate (); - } + { ToolEngine::_postCreate(); } void KatabaticEngine::createDetailedGrid () { - _gcellGrid = GCellGrid::create ( this ); - Session::revalidate (); + _gcellGrid = GCellGrid::create( this ); + Session::revalidate(); - addMeasure ( getCell(), "GCells", _gcellGrid->getGCellVector()->size() ); + addMeasure( getCell(), "GCells", _gcellGrid->getGCellVector()->size() ); + + if (getChipTools().isChip()) { + unsigned int columns = _gcellGrid->getColumns(); + unsigned int rows = _gcellGrid->getRows(); + + for ( unsigned int depth=0 ; depth<8 ; ++depth ) { + // West. + forEach( GCell*, igcell, _gcellGrid->getGCellsColumn(depth,0,rows-1)) { + ltrace(89) << "Setting as West Pad:" << (*igcell) << endl; + igcell->setUnderIoPad(); + } + // East. + forEach( GCell*, igcell, _gcellGrid->getGCellsColumn(columns-1-depth,0,rows-1)) { + ltrace(89) << "Setting as East Pad:" << (*igcell) << endl; + igcell->setUnderIoPad(); + } + // South. + forEach( GCell*, igcell, _gcellGrid->getGCellsRow(depth,0,columns-1)) { + ltrace(89) << "Setting as South Pad:" << (*igcell) << endl; + igcell->setUnderIoPad(); + } + // North. + forEach( GCell*, igcell, _gcellGrid->getGCellsRow(rows-1-depth,0,columns-1)) { + ltrace(89) << "Setting as North Pad:" << (*igcell) << endl; + igcell->setUnderIoPad(); + } + } + } } @@ -241,18 +207,16 @@ namespace Katabatic { { ltrace(90) << "KatabaticEngine::create() - " << cell << endl; - KatabaticEngine* katabatic = new KatabaticEngine ( cell ); + KatabaticEngine* katabatic = new KatabaticEngine( cell ); - katabatic->_postCreate (); + katabatic->_postCreate(); return katabatic; } KatabaticEngine::~KatabaticEngine () - { - delete _configuration; - } + { delete _configuration; } void KatabaticEngine::_preDestroy () @@ -260,14 +224,14 @@ namespace Katabatic { ltrace(90) << "Katabatic::_preDestroy ()" << endl; ltracein(90); - if ( getState() < Katabatic::StateGutted ) - setState ( Katabatic::StatePreDestroying ); + if (getState() < Katabatic::EngineGutted) + setState( Katabatic::EnginePreDestroying ); - _gutKatabatic (); - _state = StateGutted; + _gutKatabatic(); + _state = EngineGutted; ltrace(89) << "About to delete base class ToolEngine." << endl; - ToolEngine::_preDestroy (); + ToolEngine::_preDestroy(); ltrace(89) << "Exiting Katabatic::_preDestroy()." << endl; ltraceout(90); @@ -275,55 +239,61 @@ namespace Katabatic { cmess2 << " - GCells := " << GCell::getAllocateds() << endl; cmess2 << " - AutoContacts := " << AutoContact::getAllocateds() << endl; cmess2 << " - AutoSegments := " << AutoSegment::getAllocateds() << endl; - cmess2 << " - SegmentEnds := " << AutoContact::getSegmentEndAllocateds() << endl; } void KatabaticEngine::_gutKatabatic () { - Session::open ( this ); + Session::open( this ); - _destroyBaseContact = false; - _destroyBaseSegment = false; + unsetFlags( EngineDestroyBaseContact|EngineDestroyBaseSegment ); - if ( _state == StateDriving ) { + if (_state == EngineDriving) { ltracein(90); ltrace(90) << "Saving AutoContacts/AutoSegments." << endl; + size_t fixedSegments = 0; + AutoSegmentLut::const_iterator isegment = _autoSegmentLut.begin(); + for ( ; isegment != _autoSegmentLut.end() ; ++isegment ) { + if ((*isegment).second->isFixed()) fixedSegments++; + } + cmess1 << " o Driving Hurricane data-base." << endl; - cmess1 << Dots::asSizet(" - AutoSegments",AutoSegment::getAllocateds()) << endl; - cmess1 << Dots::asSizet(" - AutoContacts",AutoContact::getAllocateds())<< endl; + cmess1 << Dots::asSizet(" - Active AutoSegments",AutoSegment::getAllocateds()-fixedSegments) << endl; + cmess1 << Dots::asSizet(" - Active AutoContacts",AutoContact::getAllocateds()-fixedSegments*2) << endl; + cmess1 << Dots::asSizet(" - AutoSegments" ,AutoSegment::getAllocateds()) << endl; + cmess1 << Dots::asSizet(" - AutoContacts" ,AutoContact::getAllocateds()) << endl; forEach ( Net*, inet, _cell->getNets() ) - _saveNet ( *inet ); + _saveNet( *inet ); //_autoContactLut.clear (); ltraceout(90); } - if ( _state < StateGutted ) { + if (_state < EngineGutted ) { ltrace(90) << "Gutting Katabatic." << endl; - _state = StateGutted; - _destroyBaseContact = true; + _state = EngineGutted; + setFlags( EngineDestroyBaseContact ); - _destroyAutoSegments (); - _destroyAutoContacts (); + _destroyAutoSegments(); + _destroyAutoContacts(); - if ( _gcellGrid ) { - _gcellGrid->destroy (); + if (_gcellGrid) { + _gcellGrid->destroy(); _gcellGrid = NULL; } } - Session::close (); + Session::close(); } AutoSegment* KatabaticEngine::_lookup ( Segment* segment ) const { - AutoSegmentLut::const_iterator it = _autoSegmentLut.find ( segment ); - if ( it == _autoSegmentLut.end() ) return NULL; + AutoSegmentLut::const_iterator it = _autoSegmentLut.find( segment ); + if (it == _autoSegmentLut.end()) return NULL; return (*it).second; } @@ -331,25 +301,25 @@ namespace Katabatic { void KatabaticEngine::_link ( AutoSegment* autoSegment ) { - if ( _state > StateActive ) return; - _autoSegmentLut [ autoSegment->getSegment() ] = autoSegment; + if (_state > EngineActive) return; + _autoSegmentLut[ autoSegment->base() ] = autoSegment; } void KatabaticEngine::_unlink ( AutoSegment* autoSegment ) { - if ( _state > StateDriving ) return; + if (_state > EngineDriving) return; - AutoSegmentLut::iterator it = _autoSegmentLut.find ( autoSegment->getSegment() ); - if ( it != _autoSegmentLut.end() ) - _autoSegmentLut.erase ( it ); + AutoSegmentLut::iterator it = _autoSegmentLut.find( autoSegment->base() ); + if (it != _autoSegmentLut.end()) + _autoSegmentLut.erase( it ); } AutoContact* KatabaticEngine::_lookup ( Contact* contact ) const { - AutoContactLut::const_iterator it = _autoContactLut.find ( contact ); - if ( it == _autoContactLut.end() ) { + AutoContactLut::const_iterator it = _autoContactLut.find( contact ); + if (it == _autoContactLut.end()) { return NULL; } return (*it).second; @@ -358,35 +328,34 @@ namespace Katabatic { void KatabaticEngine::_link ( AutoContact* autoContact ) { - if ( _state > StateActive ) return; + if (_state > EngineActive) return; _autoContactLut [ autoContact->base() ] = autoContact; } void KatabaticEngine::_unlink ( AutoContact* autoContact ) { - if ( _state > StateActive ) return; + if ( _state > EngineActive ) return; - AutoContactLut::iterator it = _autoContactLut.find ( autoContact->getContact() ); - if ( it != _autoContactLut.end() ) - _autoContactLut.erase ( it ); + AutoContactLut::iterator it = _autoContactLut.find( autoContact->base() ); + if (it != _autoContactLut.end()) + _autoContactLut.erase( it ); } void KatabaticEngine::xmlWriteGCellGrid ( const string& fileName ) { - ofstream file ( fileName.c_str() ); - - xmlWriteGCellGrid ( file ); + ofstream file (fileName.c_str()); + xmlWriteGCellGrid( file ); file.close (); } void KatabaticEngine::xmlWriteGCellGrid ( ostream& o ) { - if ( _gcellGrid ) - _gcellGrid->_xmlWrite ( o ); + if (_gcellGrid) + _gcellGrid->_xmlWrite( o ); else cerr << Error("Cannot dump GCellGrid: not allocated yet.") << endl; } @@ -394,28 +363,32 @@ namespace Katabatic { void KatabaticEngine::startMeasures () { - _timer.resetIncrease (); - _timer.start (); + _timer.resetIncrease(); + _timer.start(); } void KatabaticEngine::stopMeasures () - { - _timer.stop (); - } + { _timer.stop(); } void KatabaticEngine::printMeasures ( const string& tag ) const { - cmess1 << " - Done in " << Timer::getStringTime(_timer.getCombTime()) - << " [+" << Timer::getStringMemory(_timer.getIncrease()) << "]." << endl; - cmess1 << " (raw measurements : " << _timer.getCombTime() - << "s [+" << (_timer.getIncrease()>>10) << "Ko/" - << (_timer.getMemorySize()>>10) << "Ko])" << endl; + ostringstream result; - if ( not tag.empty() ) { - addMeasure ( getCell(), tag+"T", _timer.getCombTime () ); - addMeasure ( getCell(), tag+"S", (_timer.getMemorySize() >> 20) ); + result << Timer::getStringTime(_timer.getCombTime()) + << ", " << Timer::getStringMemory(_timer.getIncrease()); + cmess1 << Dots::asString( " - Done in", result.str() ) << endl; + + result.str(""); + result << _timer.getCombTime() + << "s, +" << (_timer.getIncrease()>>10) << "Kb/" + << (_timer.getMemorySize()>>10) << "Kb"; + cmess2 << Dots::asString( " - Raw measurements", result.str() ) << endl; + + if (not tag.empty()) { + addMeasure( getCell(), tag+"T", _timer.getCombTime () ); + addMeasure( getCell(), tag+"S", (_timer.getMemorySize() >> 20) ); } } @@ -423,35 +396,32 @@ namespace Katabatic { bool KatabaticEngine::_check ( const char* message ) const { bool coherency = true; - if ( message ) + if (message) cerr << " o checking Katabatic DB (" << message << ")." << endl; - AutoSegmentLut::const_iterator it = _autoSegmentLut.begin (); - AutoSegmentLut::const_iterator end = _autoSegmentLut.end (); + AutoSegmentLut::const_iterator it = _autoSegmentLut.begin(); + AutoSegmentLut::const_iterator end = _autoSegmentLut.end (); for ( ; it != end ; it++ ) coherency = coherency && it->second->_check(); vector::const_iterator itGCell = _gcellGrid->getGCellVector()->begin(); vector::const_iterator endGCell = _gcellGrid->getGCellVector()->end(); for ( ; itGCell != endGCell ; itGCell++ ) { - vector::const_iterator itAutoContact = (*itGCell)->getContacts()->begin(); - vector::const_iterator endAutoContact = (*itGCell)->getContacts()->end(); + vector::const_iterator itAutoContact = (*itGCell)->getContacts().begin(); + vector::const_iterator endAutoContact = (*itGCell)->getContacts().end(); for ( ; itAutoContact != endAutoContact ; itAutoContact++ ) { - (*itAutoContact)->checkTopology (); + (*itAutoContact)->checkTopology(); } } - if ( message ) - cerr << " - completed." << endl; + if (message) cerr << " - completed." << endl; return coherency; } - void KatabaticEngine::refresh ( bool openSession ) - { - if ( _gcellGrid ) _gcellGrid->updateContacts ( openSession ); - } + void KatabaticEngine::refresh ( unsigned int flags ) + { if (_gcellGrid) _gcellGrid->updateContacts( flags ); } void KatabaticEngine::_destroyAutoSegments () @@ -460,16 +430,16 @@ namespace Katabatic { size_t expandeds = 0; - AutoSegmentLut::iterator it = _autoSegmentLut.begin (); - AutoSegmentLut::iterator end = _autoSegmentLut.end (); + AutoSegmentLut::iterator it = _autoSegmentLut.begin(); + AutoSegmentLut::iterator end = _autoSegmentLut.end (); for ( ; it != end ; it++ ) { - if ( !it->second->isCollapsed() ) expandeds++; - it->second->destroy (); + expandeds++; + it->second->destroy(); } - if ( _state == StateDriving ) + if (_state == EngineDriving) cerr << " - Expandeds := " << expandeds << endl; - _autoSegmentLut.clear (); + _autoSegmentLut.clear(); } @@ -477,12 +447,12 @@ namespace Katabatic { { ltrace(90) << "Katabatic::_destroyAutoContacts ()" << endl; - AutoContactLut::iterator it = _autoContactLut.begin (); - AutoContactLut::iterator end = _autoContactLut.end (); + AutoContactLut::iterator it = _autoContactLut.begin(); + AutoContactLut::iterator end = _autoContactLut.end (); for ( ; it != end ; it++ ) - it->second->destroy (); + it->second->destroy(); - _autoContactLut.clear (); + _autoContactLut.clear(); } @@ -492,79 +462,79 @@ namespace Katabatic { void KatabaticEngine::loadGlobalRouting ( unsigned int method, NetSet& nets ) { - if ( _state < StateGlobalLoaded ) + if (_state < EngineGlobalLoaded) throw Error ("KatabaticEngine::loadGlobalRouting() : global routing not present yet."); - if ( _state > StateGlobalLoaded ) + if (_state > EngineGlobalLoaded) throw Error ("KatabaticEngine::loadGlobalRouting() : global routing already loaded."); - AllianceFramework* af = AllianceFramework::get (); - if ( nets.empty() ) { + AllianceFramework* af = AllianceFramework::get(); + if (nets.empty()) { forEach ( Net*, net, _cell->getNets() ) { const char* excludedType = NULL; - if ( net->getType() == Net::Type::POWER ) excludedType = "POWER"; - if ( net->getType() == Net::Type::GROUND ) excludedType = "GROUND"; - if ( net->getType() == Net::Type::CLOCK ) excludedType = "CLOCK"; - if ( excludedType ) { - cout << "[INFO] " << getString(*net).c_str() << " is not a routable net (" - << excludedType << ",excluded)." << endl; + if (net->getType() == Net::Type::POWER ) excludedType = "POWER"; + if (net->getType() == Net::Type::GROUND) excludedType = "GROUND"; + if (net->getType() == Net::Type::CLOCK ) excludedType = "CLOCK"; + if (excludedType) { + cparanoid << Warning( "%s is not a routable net (%s,excluded)." + , getString(*net).c_str(), excludedType ) << endl; continue; } - if ( af->isBLOCKAGE(net->getName()) ) continue; + if (af->isBLOCKAGE(net->getName())) continue; _routingNets.insert ( *net ); } } else { NetSet::iterator it = nets.begin(); for ( ; it != nets.end() ; it++ ) { const char* excludedType = NULL; - if ( (*it)->getType() == Net::Type::POWER ) excludedType = "POWER"; - if ( (*it)->getType() == Net::Type::GROUND ) excludedType = "GROUND"; - if ( (*it)->getType() == Net::Type::CLOCK ) excludedType = "CLOCK"; - if ( af->isBLOCKAGE((*it)->getName()) ) excludedType = "BLOCKAGE"; - if ( excludedType ) { - cout << "[INFO] " << getString(*it).c_str() << " is not a routable net (" - << excludedType << "), removed from set." << endl; + if ((*it)->getType() == Net::Type::POWER ) excludedType = "POWER"; + if ((*it)->getType() == Net::Type::GROUND) excludedType = "GROUND"; + if ((*it)->getType() == Net::Type::CLOCK ) excludedType = "CLOCK"; + if (af->isBLOCKAGE((*it)->getName())) excludedType = "BLOCKAGE"; + if (excludedType) { + cparanoid << Warning( "%s is not a routable net (%s), removed from set." + , getString(*it).c_str(), excludedType ) << endl; } else - _routingNets.insert ( *it ); + _routingNets.insert( *it ); } } switch ( method ) { - case LoadGrByNet: _loadGrByNet(); break; - case LoadGrByGCell: + case EngineLoadGrByNet: _loadGrByNet(); break; + case EngineLoadGrByGCell: default: - throw Error ( badMethod - , "Katabatic::loadGlobalRouting()" - , method - , getString(_cell).c_str() - ); + throw Error( badMethod + , "Katabatic::loadGlobalRouting()" + , method + , getString(_cell).c_str() + ); } - _state = StateActive; + _state = EngineActive; } void KatabaticEngine::finalizeLayout () { ltrace(90) << "Katabatic::finalizeLayout()" << endl; - if ( _state > StateDriving ) return; + if (_state > EngineDriving) return; - _state = StateDriving; + _state = EngineDriving; - startMeasures (); - _gutKatabatic (); - stopMeasures (); - printMeasures ( "fin" ); + startMeasures(); + _gutKatabatic(); + stopMeasures (); + printMeasures( "fin" ); - _state = StateGutted; + _state = EngineGutted; } void KatabaticEngine::_alignate ( Net* net ) { - DebugSession::open ( net, 99 ); + DebugSession::open( net, 99 ); - ltrace(100) << "Katabatic::_alignate ( " << net << " )" << endl; + ltrace(100) << "Katabatic::_alignate( " << net << " )" << endl; ltracein(99); //cmess2 << " - " << getString(net) << endl; @@ -575,28 +545,28 @@ namespace Katabatic { forEach ( Component*, icomponent, net->getComponents() ) { Segment* segment = dynamic_cast(*icomponent); - if ( segment ) { - AutoSegment* seedSegment = Session::lookup ( segment ); - if ( seedSegment ) unexploreds.push_back ( seedSegment ); + if (segment) { + AutoSegment* seedSegment = Session::lookup( segment ); + if (seedSegment) unexploreds.push_back( seedSegment ); } } - sort ( unexploreds.begin(), unexploreds.end(), AutoSegment::CompareId() ); + sort( unexploreds.begin(), unexploreds.end(), AutoSegment::CompareId() ); for ( size_t i=0 ; igetSegment()) == exploredSegments.end() ) { + if (exploredSegments.find(seedSegment->base()) == exploredSegments.end()) { ltrace(99) << "New chunk from: " << seedSegment << endl; - aligneds.push_back ( seedSegment ); + aligneds.push_back( seedSegment ); - forEach ( AutoSegment*, collapsed, seedSegment->getCollapseds() ) { + forEach ( AutoSegment*, collapsed, seedSegment->getAligneds() ) { ltrace(99) << "Aligned: " << *collapsed << endl; - aligneds.push_back ( *collapsed ); - exploredSegments.insert ( collapsed->getSegment() ); + aligneds.push_back( *collapsed ); + exploredSegments.insert( collapsed->base() ); } ltracein(99); - sort ( aligneds.begin(), aligneds.end(), AutoSegment::CompareId() ); + sort( aligneds.begin(), aligneds.end(), AutoSegment::CompareId() ); ltrace(99) << "Seed: " << (void*)aligneds[0]->base() << " " << aligneds[0] << endl; for ( size_t j=1 ; jgetAxis()) << endl; - aligneds[0]->setAxis ( aligneds[0]->getAxis(), Realignate|AxisSet ); - aligneds.clear (); + aligneds[0]->setAxis( aligneds[0]->getAxis(), KbRealignate ); + aligneds.clear(); ltraceout(99); } @@ -614,86 +584,88 @@ namespace Katabatic { ltraceout(99); - DebugSession::close (); + DebugSession::close(); + } + + + void KatabaticEngine::updateNetTopology ( Net* net ) + { + DebugSession::open( net ); + + ltrace(100) << "Katabatic::updateNetTopology( " << net << " )" << endl; + ltracein(99); + + vector contacts; + forEach ( Component*, icomponent, net->getComponents() ) { + Contact* contact = dynamic_cast( *icomponent ); + if (contact) { + AutoContact* autoContact = Session::lookup( contact ); + if (autoContact and autoContact->isInvalidatedCache()) + contacts.push_back( autoContact ); + } + } + + for ( size_t i=0 ; iupdateTopology(); + + ltraceout(99); + DebugSession::close(); } void KatabaticEngine::_computeNetTerminals ( Net* net ) { - DebugSession::open ( net, 88 ); + DebugSession::open( net, 88 ); - ltrace(100) << "Katabatic::_computeNetTerminals ( " << net << " )" << endl; + ltrace(100) << "Katabatic::_computeNetTerminals( " << net << " )" << endl; ltracein(99); vector segments; forEach ( Segment*, segment, net->getSegments() ) { - AutoSegment* autoSegment = Session::lookup ( *segment ); - if ( !autoSegment ) continue; - if ( autoSegment->isInvalidated() ) autoSegment->_computeTerminal(); + AutoSegment* autoSegment = Session::lookup( *segment ); + if (autoSegment == NULL) continue; + if (autoSegment->isInvalidated()) autoSegment->computeTerminal(); } ltraceout(99); - DebugSession::close (); + DebugSession::close(); } void KatabaticEngine::_saveNet ( Net* net ) { - DebugSession::open ( net, 88 ); + DebugSession::open( net, 88 ); ltrace(90) << "Katabatic::_saveNet() " << net << endl; ltracein(90); - vector autoContacts; - - forEach ( Contact*, icontact, net->getContacts() ) { - AutoContact* autoContact = Session::lookup ( *icontact ); - if ( autoContact ) - autoContacts.push_back ( autoContact ); - } - - ltrace(90) << "Breaking/Deleting AutoContacts." << endl; - vector::iterator it = autoContacts.begin(); - for ( ; it != autoContacts.end() ; it++ ) { - ltrace(90) << "Examining " << (void*)*it << " " << (*it) << endl; - ltracein(90); - ltrace(90) << "In " << (void*)((*it)->getGCell()) << " - " - << (*it)->getGCell() << endl; - - (*it)->breakUp (); - // AutoContacts are destroyed through the tool. - //(*it)->destroy (); - - ltraceout(90); - } - - +#if 0 ltrace(90) << "Deleting zero-length segments." << endl; vector nullSegments; set connectedLayers; forEach ( Segment*, segment, net->getSegments() ) { - if ( segment->getLength() ) { - if ( net->isExternal() ) { - NetExternalComponents::setExternal ( *segment ); + if (segment->getLength()) { + if (net->isExternal()) { + NetExternalComponents::setExternal( *segment ); } continue; } - if ( Session::lookup(*segment) == NULL ) { + if (Session::lookup(*segment) == NULL) { ltrace(90) << "* Not associated to an AutoSegment: " << *segment << endl; continue; } - if ( not isTopAndBottomConnected(*segment,connectedLayers) ) { - nullSegments.push_back ( *segment ); + if (not isTopAndBottomConnected(*segment,connectedLayers)) { + nullSegments.push_back( *segment ); ltrace(90) << "* Null Length: " << *segment << endl; } } - - setDestroyBaseSegment ( true ); + + setFlags( EngineDestroyBaseSegment ); for ( size_t i = 0 ; i < nullSegments.size() ; i++ ) { Contact* source = dynamic_cast(nullSegments[i]->getSource()); Contact* target = dynamic_cast(nullSegments[i]->getTarget()); @@ -703,17 +675,17 @@ namespace Katabatic { continue; } - if ( source->getAnchor() ) { - if ( target->getAnchor() ) { + if (source->getAnchor()) { + if (target->getAnchor()) { continue; //cerr << Bug("Both source & target are anchored while deleting zero-length segment:\n" // " %s.",getString(nullSegments[i]).c_str()) << endl; } else - swap ( source, target ); + swap( source, target ); } ltrace(90) << "Deleting: " << nullSegments[i] << endl; - if ( isTopAndBottomConnected(nullSegments[i],connectedLayers) ) { + if (isTopAndBottomConnected(nullSegments[i],connectedLayers)) { ltrace(90) << "Deletion cancelled, no longer top or bottom connected." << endl; continue; } @@ -722,7 +694,7 @@ namespace Katabatic { ltrace(90) << "* Target: " << (void*)target << " " << target << endl; const Layer* layer = DataBase::getDB()->getTechnology() - ->getViaBetween ( *connectedLayers.begin(), *connectedLayers.rbegin() ); + ->getViaBetween( *connectedLayers.begin(), *connectedLayers.rbegin() ); ltrace(90) << *connectedLayers.begin() << " + " << *connectedLayers.rbegin() << endl; ltrace(90) << "* Shrink layer: " << layer << endl; @@ -732,32 +704,33 @@ namespace Katabatic { continue; } - Session::lookup ( nullSegments[i] )->destroy (); + Session::lookup( nullSegments[i] )->destroy (); vector slaveHooks; Hook* masterHook = source->getBodyHook()->getPreviousMasterHook(); while ( masterHook->getNextHook() != source->getBodyHook() ) { - slaveHooks.push_back ( masterHook->getNextHook() ); + slaveHooks.push_back( masterHook->getNextHook() ); ltrace(90) << "* detach: " << (void*)masterHook->getNextHook()->getComponent() << " " << masterHook->getNextHook()->getComponent() << endl; - masterHook->getNextHook()->detach (); + masterHook->getNextHook()->detach(); } - source->destroy (); + source->destroy(); - masterHook = target->getBodyHook (); + masterHook = target->getBodyHook(); for ( size_t j=0 ; j < slaveHooks.size() ; j++ ) { - slaveHooks[j]->attach ( masterHook ); + slaveHooks[j]->attach( masterHook ); } ltrace(90) << (void*)target << " " << target << " setLayer: " << layer << endl; - target->setLayer ( layer ); + target->setLayer( layer ); } - setDestroyBaseSegment ( false ); + unsetFlags( EngineDestroyBaseSegment ); +#endif ltraceout(90); - DebugSession::close (); + DebugSession::close(); } @@ -788,23 +761,22 @@ namespace Katabatic { vector segments; forEach ( Segment*, isegment, net->getComponents().getSubSet() ) { - AutoSegment* autoSegment = _lookup ( *isegment ); - if ( autoSegment ) - segments.push_back ( autoSegment ); + AutoSegment* autoSegment = _lookup( *isegment ); + if (autoSegment) + segments.push_back( autoSegment ); } sort ( segments.begin(), segments.end(), AutoSegment::CompareId() ); Interval constraints; for ( size_t i=0 ; igetConstraints ( constraints ); + segments[i]->getConstraints( constraints ); cerr << "Order: " << i << " " << segments[i]->isCanonical() - << " " << segments[i]->isCollapsed() << " " << setw(6) << DbU::getValueString(segments[i]->getSourceU()) << " " << setw(6) << DbU::getValueString(segments[i]->getLength()) << " " << segments[i]->isGlobal() - << " " << segments[i]->isTerminal() + << " " << segments[i]->isStrongTerminal() << " " << segments[i]->isHorizontal() << " " << setw(6) << DbU::getValueString(segments[i]->getAxis()) << " " << segments[i]->isFixed() @@ -818,21 +790,12 @@ namespace Katabatic { void KatabaticEngine::_print () const { -#if defined(CHECK_DETERMINISM) - cerr << "Order: Nets components." << endl; -#endif - vector nets; forEach ( Net*, inet, getCell()->getNets() ) { - nets.push_back ( *inet ); + nets.push_back( *inet ); } sort ( nets.begin(), nets.end(), NetCompareByName() ); - -#if defined(CHECK_DETERMINISM) - for ( size_t i=0 ; iadd ( getSlot ( "_demoMode" , _demoMode ) ); - record->add ( getSlot ( "_state" , _state ) ); - record->add ( getSlot ( "_configuration" , _configuration ) ); - record->add ( getSlot ( "_gcellGrid" , _gcellGrid ) ); - record->add ( getSlot ( "_chipTools" , _chipTools ) ); - record->add ( getSlot ( "_routingNets" , &_routingNets ) ); - record->add ( getSlot ( "_autoContactLut" , &_autoContactLut ) ); - record->add ( getSlot ( "_autoSegmentLut" , &_autoSegmentLut ) ); + record->add( getSlot( "_flags" , _flags ) ); + record->add( getSlot( "_state" , _state ) ); + record->add( getSlot( "_configuration" , _configuration ) ); + record->add( getSlot( "_gcellGrid" , _gcellGrid ) ); + record->add( getSlot( "_chipTools" , _chipTools ) ); + record->add( getSlot( "_routingNets" , &_routingNets ) ); + record->add( getSlot( "_autoContactLut" , &_autoContactLut ) ); + record->add( getSlot( "_autoSegmentLut" , &_autoSegmentLut ) ); - return ( record ); + return record; } diff --git a/katabatic/src/LayerAssign.cpp b/katabatic/src/LayerAssign.cpp index 515dd91e..21152d2d 100644 --- a/katabatic/src/LayerAssign.cpp +++ b/katabatic/src/LayerAssign.cpp @@ -2,49 +2,38 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./LayerAssign.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -#include -#include - -#include "hurricane/Bug.h" -#include "hurricane/Warning.h" -#include "hurricane/DebugSession.h" -#include "hurricane/Net.h" -#include "hurricane/NetExternalComponents.h" -#include "hurricane/Layer.h" -#include "hurricane/RoutingPad.h" -#include "hurricane/Pad.h" -#include "hurricane/Plug.h" -#include "hurricane/Instance.h" -#include "hurricane/Vertical.h" -#include "hurricane/Horizontal.h" - -#include "crlcore/RoutingGauge.h" - -#include "katabatic/AutoContact.h" -#include "katabatic/AutoSegment.h" -#include "katabatic/GCellGrid.h" -#include "katabatic/KatabaticEngine.h" +#include +#include +#include "hurricane/Bug.h" +#include "hurricane/Warning.h" +#include "hurricane/DebugSession.h" +#include "hurricane/Net.h" +#include "hurricane/NetExternalComponents.h" +#include "hurricane/Layer.h" +#include "hurricane/RoutingPad.h" +#include "hurricane/Pad.h" +#include "hurricane/Plug.h" +#include "hurricane/Instance.h" +#include "hurricane/Vertical.h" +#include "hurricane/Horizontal.h" +#include "crlcore/RoutingGauge.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/GCellGrid.h" +#include "katabatic/KatabaticEngine.h" namespace Katabatic { @@ -56,44 +45,12 @@ namespace Katabatic { using Hurricane::Warning; - void KatabaticEngine::_splitContactsOfNet ( Net* net ) - { - DebugSession::open ( net, 90 ); - - ltrace(100) << "Katabatic::_splitContactsOfNet ( " << net << " )" << endl; - ltracein(99); - - Session::invalidate ( net ); - set globalContacts; - - forEach ( Segment*, isegment, net->getSegments() ) { - if ( ( (*isegment)->getLayer() == Session::getRoutingLayer(3) ) - || ( (*isegment)->getLayer() == Session::getRoutingLayer(4) ) ) { - AutoContact* contact = Session::lookup ( dynamic_cast((*isegment)->getSource()) ); - if ( contact ) globalContacts.insert ( contact ); - - contact = Session::lookup ( dynamic_cast((*isegment)->getTarget()) ); - if ( contact ) globalContacts.insert ( contact ); - } - } - - set::iterator it = globalContacts.begin(); - for ( ; it != globalContacts.end() ; it++ ) { - (*it)->split (); - } - - ltraceout(99); - - DebugSession::close (); - } - - void KatabaticEngine::_desaturate ( unsigned int depth , set& globalNets , unsigned long& total , unsigned long& globals ) { - if ( depth+2 >= Session::getConfiguration()->getAllowedDepth() ) { + if (depth+2 >= Session::getConfiguration()->getAllowedDepth()) { cerr << Warning("Katabatic::_desaturate(): %s, no remaining upper layers." ,getString(Session::getRoutingGauge()->getRoutingLayer(depth)->getName()).c_str() ) << endl; @@ -103,17 +60,14 @@ namespace Katabatic { cmess1 << " o Desaturate layer " << Session::getRoutingGauge()->getRoutingLayer(depth)->getName() << endl; - //vector gcells = *(_gcellGrid->getGCellVector()); - //vector invalidateds; - DyKeyQueue queue ( depth, *(_gcellGrid->getGCellVector()) ); - GCell::SetId invalidateds; + GCellDensitySet queue ( depth, *(_gcellGrid->getGCellVector()) ); + GCell::SetIndex invalidateds; bool optimized = true; while ( optimized ) { Session::revalidate (); optimized = false; - //sort ( gcells.begin(), gcells.end(), GCell::CompareByDensity(depth) ); - queue.revalidate (); + queue.requeue (); std::set::const_iterator igcell = queue.getGCells().begin(); size_t i = 0; @@ -121,35 +75,21 @@ namespace Katabatic { ltrace(400) << "_desaturate: [" << depth << "]:" << (*igcell)->getDensity(depth) << " " << *igcell << endl; - if ( not (*igcell)->isSaturated ( depth ) ) { + if (not (*igcell)->isSaturated(depth)) { ltrace(400) << "STOP desaturated: @" << i << " " << *igcell << endl; for ( ; igcell!=queue.getGCells().end() ; ++igcell ) { - if ( (*igcell)->isSaturated ( depth ) ) { - cerr << "[ERROR] Still saturated: @" << i << " " << *igcell << endl; + if ( (*igcell)->isSaturated( depth ) ) { + cparanoid << "[ERROR] Still saturated: @" << i << " " << *igcell << endl; break; } } break; } - //ltrace(190) << "step desaturate: @ " << i << " " << *igcell << endl; - - // AutoSegment* segment = NULL; - // optimized = (*igcell)->stepDesaturate ( depth, globalNets, segment ); - - // if ( segment ) { - // ++total; ++globals; - // segment->getGCells ( invalidateds ); - // for ( size_t j=0 ; jstepNetDesaturate ( depth, globalNets, invalidateds ); + optimized = (*igcell)->stepNetDesaturate( depth, globalNets, invalidateds ); if ( optimized ) { - for ( GCell::SetId::iterator igcell=invalidateds.begin() ; igcell!=invalidateds.end() ; ++igcell ) { - queue.invalidate ( *igcell ); + for ( GCell::SetIndex::iterator igcell=invalidateds.begin() ; igcell!=invalidateds.end() ; ++igcell ) { + queue.unqueue( *igcell ); } break; } @@ -162,7 +102,7 @@ namespace Katabatic { { DebugSession::open ( net, 90 ); - ltrace(100) << "Katabatic::_layerAssignByLength ( " << net << " )" << endl; + ltrace(100) << "Katabatic::_layerAssignByLength( " << net << " )" << endl; ltracein(99); bool isGlobal = false; @@ -171,21 +111,20 @@ namespace Katabatic { forEach ( Segment*, isegment, net->getSegments() ) { total++; if ( (*isegment)->getLength() > getGlobalThreshold() ) { - if ( !isGlobal ) { + if (not isGlobal) { isGlobal = true; - globalNets.insert ( net ); - //cmess2 << " - " << getString(net) << endl; + globalNets.insert( net ); } global++; - if ( (*isegment)->getLayer() == Session::getRoutingLayer(1) ) (*isegment)->setLayer ( Session::getRoutingLayer(3) ); - if ( (*isegment)->getLayer() == Session::getRoutingLayer(2) ) (*isegment)->setLayer ( Session::getRoutingLayer(4) ); + if ((*isegment)->getLayer() == Session::getRoutingLayer(1)) (*isegment)->setLayer( Session::getRoutingLayer(3) ); + if ((*isegment)->getLayer() == Session::getRoutingLayer(2)) (*isegment)->setLayer( Session::getRoutingLayer(4) ); } } ltraceout(99); - DebugSession::close (); + DebugSession::close(); } @@ -201,7 +140,7 @@ namespace Katabatic { void KatabaticEngine::_layerAssignByTrunk ( Net* net, set& globalNets, unsigned long& total, unsigned long& global ) { - DebugSession::open ( net, 90 ); + DebugSession::open( net, 90 ); ltrace(100) << "Katabatic::_layerAssignByTrunk ( " << net << " )" << endl; ltracein(99); @@ -214,27 +153,25 @@ namespace Katabatic { forEach ( Segment*, isegment, net->getSegments() ) { netTotal++; - if ( (*isegment)->getLength() > getGlobalThreshold() ) { + if ((*isegment)->getLength() > getGlobalThreshold()) { isGlobal = true; netTotal = 0; - globalNets.insert ( net ); + globalNets.insert( net ); break; } } - if ( isGlobal ) { - //cmess2 << " - " << getString(net) << endl; - + if (isGlobal) { forEach ( Segment*, isegment, net->getSegments() ) { netTotal++; - AutoSegment* autoSegment = Session::lookup ( *isegment ); - if ( autoSegment && !autoSegment->isTerminal() ) { + AutoSegment* autoSegment = Session::lookup( *isegment ); + if ( autoSegment and not autoSegment->isStrongTerminal() ) { netGlobal++; ltrace(99) << "Migrate to M4/M5: " << autoSegment << endl; - if ( autoSegment->isHorizontal() ) autoSegment->setLayer ( Session::getRoutingLayer(3) ); - if ( autoSegment->isVertical () ) autoSegment->setLayer ( Session::getRoutingLayer(4) ); + if (autoSegment->isHorizontal()) autoSegment->setLayer( Session::getRoutingLayer(3) ); + if (autoSegment->isVertical ()) autoSegment->setLayer( Session::getRoutingLayer(4) ); } } } @@ -244,7 +181,7 @@ namespace Katabatic { ltraceout(99); - DebugSession::close (); + DebugSession::close(); } @@ -254,171 +191,331 @@ namespace Katabatic { NetSet::iterator inet = _routingNets.begin(); for ( ; inet != _routingNets.end() ; ++inet ) - _layerAssignByTrunk ( *inet, globalNets, total, global ); + _layerAssignByTrunk( *inet, globalNets, total, global ); } - bool KatabaticEngine::_moveUpNetTrunk ( AutoSegment* seed, set& globalNets, GCell::SetId& invalidateds ) + void KatabaticEngine::moveULeft ( AutoSegment* seed, set& globalNets, GCell::SetIndex& invalidateds ) { Net* net = seed->getNet(); - DebugSession::open ( net, 90 ); + DebugSession::open( net, 90 ); - ltrace(400) << "_moveUpNetTrunk() - " << seed << endl; + ltrace(500) << "Deter| Move left: " << seed << endl; - if ( not seed->canMoveUp(1.0,AutoSegment::Propagate|AutoSegment::AllowTerminal) ) { - DebugSession::close (); + seed->moveULeft(); + globalNets.insert( net ); + + GCell* begin = seed->getAutoSource()->getGCell(); + GCell* end = seed->getAutoTarget()->getGCell(); + + if (seed->isHorizontal()) { + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getRight() ) + invalidateds.insert( gcell ); + + begin = begin->getDown(); + end = end ->getDown(); + + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getRight() ) + invalidateds.insert( gcell ); + } else { + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getUp() ) + invalidateds.insert( gcell ); + + begin = begin->getLeft(); + end = end ->getLeft(); + + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getUp() ) + invalidateds.insert( gcell ); + } + + DebugSession::close(); + } + + + void KatabaticEngine::moveURight ( AutoSegment* seed, set& globalNets, GCell::SetIndex& invalidateds ) + { + Net* net = seed->getNet(); + DebugSession::open( net, 90 ); + + ltrace(500) << "Deter| Move right: " << seed << endl; + + seed->moveURight(); + globalNets.insert( net ); + + GCell* begin = seed->getAutoSource()->getGCell(); + GCell* end = seed->getAutoTarget()->getGCell(); + + if (seed->isHorizontal()) { + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getRight() ) + invalidateds.insert( gcell ); + + begin = begin->getUp(); + end = end ->getUp(); + + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getRight() ) + invalidateds.insert( gcell ); + } else { + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getUp() ) + invalidateds.insert( gcell ); + + begin = begin->getRight(); + end = end ->getRight(); + + for ( GCell* gcell=begin ; gcell and gcell!=end ; gcell=gcell->getUp() ) + invalidateds.insert( gcell ); + } + + DebugSession::close(); + } + + + bool KatabaticEngine::moveUpNetTrunk ( AutoSegment* seed, set& globalNets, GCell::SetIndex& invalidateds ) + { + Net* net = seed->getNet(); + unsigned int seedDepth = Session::getRoutingGauge()->getLayerDepth(seed->getLayer()); + + DebugSession::open( net, 90 ); + ltrace(500) << "Deter| moveUpNetTrunk() depth:" << seedDepth << " " << seed << endl; + + if (not seed->canMoveUp( 1.0, KbPropagate|KbAllowTerminal|KbNoCheckLayer) ) { + ltrace(500) << "Deter| Reject seed move up, cannot move up." << endl; + DebugSession::close(); return false; } ltracein(400); - globalNets.insert ( net ); + globalNets.insert( net ); vector globals; vector locals; forEach ( Segment*, isegment, net->getSegments() ) { - AutoSegment* autoSegment = Session::lookup ( *isegment ); + AutoSegment* autoSegment = Session::lookup( *isegment ); - if ( not autoSegment ) continue; - if ( autoSegment->isLocal() ) { - if ( autoSegment->isTerminal() ) continue; - locals.push_back ( autoSegment ); + //ltrace(500) << "Deter| Loop " << autoSegment << endl; + + if (not autoSegment) continue; + if (autoSegment->isLocal()) { + if (autoSegment->isStrongTerminal()) continue; + locals.push_back( autoSegment ); } else { // Ugly: Hard-coded GCell side. - if ( (autoSegment->getLength() < DbU::lambda(150.0)) and (autoSegment != seed) ) - locals.push_back ( autoSegment ); + if ( (autoSegment->getLength() < 3*DbU::lambda(50.0)) and (autoSegment != seed) ) + locals.push_back( autoSegment ); else - globals.push_back ( autoSegment ); + globals.push_back( autoSegment ); } } - sort ( globals.begin(), globals.end(), AutoSegment::CompareId() ); - sort ( locals.begin(), locals.end(), AutoSegment::CompareId() ); + sort( globals.begin(), globals.end(), AutoSegment::CompareId() ); + sort( locals.begin(), locals.end(), AutoSegment::CompareId() ); for ( size_t i=0 ; igetLayerDepth( globals[i]->getLayer() ); + if (depth > seedDepth+1) continue; if ( globals[i]->isVertical() and (globals[i] != seed) ) continue; - if ( globals[i]->canMoveUp(1.0,AutoSegment::Propagate|AutoSegment::AllowTerminal) ) { - unsigned int depth = Session::getRoutingGauge()->getLayerDepth(globals[i]->getLayer()); - globals[i]->changeDepth ( depth+2, true, false ); + if ( globals[i]->canMoveUp(1.0,KbPropagate|KbAllowTerminal|KbNoCheckLayer) ) { + globals[i]->changeDepth( depth+2, KbWithNeighbors ); - ltrace(400) << " | Trunk move up G:" << globals[i] << endl; + //ltrace(500) << "Deter| Trunk move up G:" << globals[i] << endl; vector gcells; - globals[i]->getGCells ( gcells ); + globals[i]->getGCells( gcells ); for ( size_t j=0 ; jcanPivotUp(2.0,AutoSegment::Propagate|AutoSegment::IgnoreContact) ) { - if ( locals[i]->canPivotUp(2.0,AutoSegment::Propagate) ) { - //if ( locals[i]->isGlobal() and locals[i]->isTopologicEnd() ) continue; - // if ( (locals[i]->isGlobal()) - // and (locals[i]->getMaxUnderDensity(AutoSegment::Propagate) < 5.0) ) continue; + unsigned int depth = Session::getRoutingGauge()->getLayerDepth(locals[i]->getLayer()); + if (depth > seedDepth+1) continue; - unsigned int depth = Session::getRoutingGauge()->getLayerDepth(locals[i]->getLayer()); - locals[i]->changeDepth ( depth+2, true, false ); + if (locals[i]->canPivotUp(2.0,KbPropagate|KbNoCheckLayer)) { + locals[i]->changeDepth( depth+2, KbWithNeighbors ); - ltrace(400) << " | Trunk move up L:" << locals[i] << endl; + //ltrace(500) << "Deter| Trunk move up L:" << locals[i] << endl; vector gcells; - locals[i]->getGCells ( gcells ); + locals[i]->getGCells( gcells ); for ( size_t j=0 ; jgetRoutingLayer(depth)->getName() << endl; + + GCellDensitySet queue ( depth, *(_gcellGrid->getGCellVector()) ); + GCell::SetIndex invalidateds; + + bool optimized = true; + while ( optimized ) { + Session::revalidate(); + optimized = false; + queue.requeue(); + + std::set::const_iterator igcell = queue.getGCells().begin(); + size_t i = 0; + for ( ; igcell!=queue.getGCells().end() ; ++igcell, ++i ) { + ltrace(400) << "_balance: [" << depth << "]:" + << (*igcell)->getDensity(depth) << " " << *igcell << endl; + + if (not (*igcell)->isSaturated(depth)) { + ltrace(400) << "STOP desaturated: @" << i << " " << *igcell << endl; + for ( ; igcell!=queue.getGCells().end() ; ++igcell ) { + if ((*igcell)->isSaturated(depth)) { + cparanoid << Error( "Still saturated: @%d %s", i, getString(*igcell).c_str() ) << endl; + break; + } + } + break; + } + + optimized = (*igcell)->stepBalance( depth, invalidateds ); + if (optimized) { + for ( GCell::SetIndex::iterator igcell=invalidateds.begin() ; igcell!=invalidateds.end() ; ++igcell ) { + queue.unqueue( *igcell ); + } + break; + } + } + } + + + Session::close(); + stopMeasures(); + printMeasures( "balance" ); + } + + + void KatabaticEngine::balanceGlobalDensity () + { + ltrace(500) << "Deter| Balance Global Density" << endl; + + //_balanceGlobalDensity( 1 ); // metal2 + //_balanceGlobalDensity( 2 ); // metal3 + + set globalNets; + GCell::SetIndex invalidateds; + + Session::open( this ); + + vector segments; + + AutoSegmentLut::iterator ilut = _autoSegmentLut.begin(); + for ( ; ilut!=_autoSegmentLut.end() ; ++ilut ) { + AutoSegment* segment = (*ilut).second; + + if (segment->isLocal()) continue; + if (not segment->isCanonical()) continue; + + segments.push_back( segment ); + } + + // Sort on id before moving to ensure determinism. + sort( segments.begin(), segments.end(), AutoSegment::CompareId() ); + + for ( size_t i=0 ; icanMoveULeft(0.10)) { + getGCellGrid()->getKatabatic()->moveULeft(segments[i],globalNets,invalidateds); + } else if (segments[i]->canMoveURight(0.10)) { + getGCellGrid()->getKatabatic()->moveURight(segments[i],globalNets,invalidateds); + } + + for ( GCell::SetIndex::iterator igcell=invalidateds.begin() ; igcell!=invalidateds.end() ; ++igcell ) { + (*igcell)->updateDensity(); + } + invalidateds.clear(); + Session::revalidate(); + } + + Session::close(); + } + + void KatabaticEngine::layerAssign ( unsigned int method ) { + ltrace(500) << "Deter| Layer Assignment" << endl; + set globalNets; unsigned long total = 0; unsigned long global = 0; - startMeasures (); - Session::open ( this ); + startMeasures(); + Session::open( this ); switch ( method ) { - case LayerAssignByLength: _layerAssignByLength(total,global,globalNets); break; - case LayerAssignByTrunk: _layerAssignByTrunk (total,global,globalNets); break; - case NoNetLayerAssign: break; + case EngineLayerAssignByLength: _layerAssignByLength( total, global, globalNets ); break; + case EngineLayerAssignByTrunk: _layerAssignByTrunk ( total, global, globalNets ); break; + case EngineNoNetLayerAssign: break; default: - stopMeasures (); - Session::close (); - throw Error ( badMethod - , "Katabatic::layerAssign()" - , method - , getString(_cell).c_str() - ); + stopMeasures(); + Session::close(); + throw Error( badMethod + , "Katabatic::layerAssign()" + , method + , getString(_cell).c_str() + ); } - set::iterator inet = globalNets.begin(); - for ( ; inet != globalNets.end() ; inet++ ) - _splitContactsOfNet ( *inet ); - globalNets.clear (); + globalNets.clear(); + Session::revalidate(); - Session::revalidate (); - - // Look for RoutingPad overload. - // vector gcells = *(_gcellGrid->getGCellVector()); - // for ( size_t i=0 ; irpDesaturate ( globalNets ); - // } - - if ( getConfiguration()->getAllowedDepth() > 2) { + if (getConfiguration()->getAllowedDepth() > 2) { for ( int i=0 ; i < 3 ; i++ ) { for ( size_t depth=1 ; depth < getConfiguration()->getAllowedDepth()-2; ++depth ) { - _desaturate ( depth, globalNets, total, global ); - if ( (depth > 1) and ((depth-1)%2 == 1) ) Session::revalidate (); + _desaturate( depth, globalNets, total, global ); + if ( (depth > 1) and ((depth-1)%2 == 1) ) Session::revalidate(); } globalNets.clear (); - if ( not _gcellGrid->updateDensity () ) break; + if (not _gcellGrid->updateDensity()) break; } - Session::revalidate (); + Session::revalidate(); } - //refresh ( false ); #if defined(CHECK_DATABASE) - _check ( "after layer assignment" ); -#endif -#if defined(CHECK_DETERMINISM) - NetSet::iterator inet = _routingNets.begin(); - for ( ; inet != _routingNets.end() ; inet++ ) - _print ( *inet ); + _check( "after layer assignment" ); #endif - Session::setWarnGCellOverload ( true ); - _gcellGrid->checkDensity (); + Session::setKatabaticFlags( EngineWarnOnGCellOverload ); + _gcellGrid->checkDensity(); - Session::close (); + Session::close(); - stopMeasures (); - printMeasures ( "assign" ); + stopMeasures(); + printMeasures( "assign" ); - cmess2 << " - Total segments : " << total << endl; - cmess2 << " - Global segments : " << global << endl; - cmess2 << " - Ratio : " - << ((float)global/(float)total)*100.0 << "%." << endl; + // cmess2 << " - Total segments : " << total << endl; + // cmess2 << " - Global segments : " << global << endl; + // cmess2 << " - Ratio : " + // << ((float)global/(float)total)*100.0 << "%." << endl; } -} // End of Katabatic namespace. +} // Katabatic namespace. diff --git a/katabatic/src/LoadGrByNet.cpp b/katabatic/src/LoadGrByNet.cpp index 88cdfcd7..aec727b7 100644 --- a/katabatic/src/LoadGrByNet.cpp +++ b/katabatic/src/LoadGrByNet.cpp @@ -1,888 +1,347 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./LoadGrByNet.cpp" | // +-----------------------------------------------------------------+ -#include -#include - -#include "hurricane/Bug.h" -#include "hurricane/Error.h" -#include "hurricane/Warning.h" -#include "hurricane/DebugSession.h" -#include "hurricane/Layer.h" -#include "hurricane/Technology.h" -#include "hurricane/DataBase.h" -#include "hurricane/Net.h" -#include "hurricane/NetExternalComponents.h" -#include "hurricane/RoutingPad.h" -#include "hurricane/RoutingPads.h" -#include "hurricane/Pad.h" -#include "hurricane/Plug.h" -#include "hurricane/Cell.h" -#include "hurricane/Instance.h" -#include "hurricane/Vertical.h" -#include "hurricane/Horizontal.h" - -#include "crlcore/AllianceFramework.h" -#include "crlcore/RoutingGauge.h" -#include "crlcore/Measures.h" - -#include "katabatic/AutoContact.h" -#include "katabatic/AutoSegment.h" -#include "katabatic/GCellGrid.h" -#include "katabatic/KatabaticEngine.h" +#include +#include +#include "hurricane/Bug.h" +#include "hurricane/Error.h" +#include "hurricane/Warning.h" +#include "hurricane/DebugSession.h" +#include "hurricane/Layer.h" +#include "hurricane/Technology.h" +#include "hurricane/DataBase.h" +#include "hurricane/Net.h" +#include "hurricane/NetExternalComponents.h" +#include "hurricane/RoutingPad.h" +#include "hurricane/RoutingPads.h" +#include "hurricane/Pad.h" +#include "hurricane/Plug.h" +#include "hurricane/Cell.h" +#include "hurricane/Instance.h" +#include "hurricane/Vertical.h" +#include "hurricane/Horizontal.h" +#include "crlcore/AllianceFramework.h" +#include "crlcore/RoutingGauge.h" +#include "crlcore/Measures.h" +#include "katabatic/AutoContactTerminal.h" +#include "katabatic/AutoContactTurn.h" +#include "katabatic/AutoContactHTee.h" +#include "katabatic/AutoContactVTee.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/GCellGrid.h" +#include "katabatic/KatabaticEngine.h" namespace { - /*! \defgroup loadGlobalRouting 2. Global Routing Loading (internal) - * - * This module documents how the global routing built by \c Knik is - * loaded into the \c Katabatic data-base. It is intented for developpers - * only. - */ - - //! \addtogroup loadGlobalRouting - //! \{ - - /*! \enum GCellConfiguration::Topology - * set of flags used to build the topology of a GCell. - * \see GCellConfiguration::_topology - */ - - /*! \var GCellConfiguration::GLOBAL_VERTICAL_END - * The GCell has exactly one global, which is either from the north - * or south side. - */ - - /*! \var GCellConfiguration::GLOBAL_HORIZONTAL_END - * The GCell has exactly one global, which is either from the east - * or west side. - */ - - /*! \var GCellConfiguration::GLOBAL_HORIZONTAL - * The GCell has exactly two global, which are east \& west - * (straight horizontal). - */ - - /*! \var GCellConfiguration::GLOBAL_VERTICAL - * The GCell has exactly two global, which are north \& south - * (straight vertical). - */ - - /*! \var GCellConfiguration::GLOBAL_BEND - * The GCell has exactly two global, which are perpandicular. - * For example : east \& south. - */ - - /*! \var GCellConfiguration::GLOBAL_FORK - * The GCell has three or four globals. - */ - - /*! \var GCellConfiguration::GLOBAL_END - * Mask value : the GCell has one global, either vertical or horizontal. - */ - - /*! \var GCellConfiguration::GLOBAL_SPLIT - * Mask value used by some functions as a mask argument to - * _GCell_GlobalContacts() tell if AutoContact must be splitted or not. - * - */ - - - /*! \union GCellConfiguration::UState - * \brief State of the GCellConfiguration (\b internal). - * - * This union allows the GCellConfiguration to be accessed as - * separate fields : - *

      - *
    • \b UState.fields.globals : number of \b GLOBAL AutoSegment. - *
    • \b UState.fields.L1 : number of terminal in \e metal1. - *
    • \b UState.fields.L2 : number of terminal in \e metal2. - *
    • \b UState.fields.L3 : number of terminal in \e metal3. - *
    - * And as a unique integer value : - *
      - *
    • \b UState.state : composite variable, to be used in \c switches. - *
    - * This implementation mixing \c union and \c struct should be portable, - * I've faith in compilers :-) - * - * \see GCellConfiguration. - */ - - - /*! \class GCellConfiguration - * \brief Build the wiring for a Net inside a GCell (\b internal). - * - * \see \ref buildRules. - */ - - /*! \var UState GCellConfiguration::_state; - * An integer value summarizing the state of the \c GCell. It counts - * global wires, and \c Plug/Pin by layer. - */ - - /*! \var unsigned int GCellConfiguration::_topology; - * An integer value summarizing the topology of the globals AutoSegment - * of the GCell. - * - * \see Topology, _GCell_GlobalContacts(). - */ - - /*! \var Net* GCellConfiguration::_net; - * The current \c Net we are building (guessed from the \c fromSplitter). - */ - - /*! \var CGell* GCellConfiguration::_gcell; - * The \c GCell in which we are (guessed from the \c GCell). - */ - - /*! \var unsigned int GCellConfiguration::_fromHook; - * By which side of the \c GCell are we coming in. - */ - - /*! \var AutoContact* GCellConfiguration::_sourceContact; - * The AutoContact from the previously processed \c GCell. - */ - - /*! \var AutoContact* GCellConfiguration::_southWestContact; - * The South West AutoContact of the current \c GCell. - */ - - /*! \var AutoContact* GCellConfiguration::_northEastContact; - * The North East AutoContact of the current \c GCell. - * (may be equal to _southWestContact, if there's only one AutoContact). - */ - - /*! \var Hook* GCellConfiguration::_east; - * The SplitterContact of the east side of the \c GCell (may be \c NULL - * if none is present). - */ - - /*! \var Hook* GCellConfiguration::_west; - * The SplitterContact of the west side of the \c GCell (may be \c NULL - * if none is present). - */ - - /*! \var Hook* GCellConfiguration::_north; - * The SplitterContact of the north side of the \c GCell (may be \c NULL - * if none is present). - */ - - /*! \var Hook* GCellConfiguration::_south; - * The SplitterContact of the south side of the \c GCell (may be \c NULL - * if none is present). - */ - - /*! \var vector GCellConfiguration::_routingPads; - * The table of \c RoutingPad associated to \c Plug/Pin. - */ - - /*! \function GCellConfiguration::GCellConfiguration ( GCellGrid* gcellGrid, Hook* fromHook, AutoContact* sourceContact=NULL ) - * \param gcellGrid The \c GCell where we are. - * \param fromHook From where do we enter the \c GCell. - * \param sourceContact The global routing AutoContact from the previously - * processed \c GCell. May be \c NULL for the first - * \c GCell of a \c Net. - * - * Constructor (see \ref secUsingGCell). - */ - - /*! \function unsigned int GCellConfiguration::getStateG () const; - * \return The composite state value. - */ - - /*! \function void GCellConfiguration::construct ( ForkStack& forks ); - * Build the GCell wires (see \ref secUsingGCell). - */ - - /*! \function void GCellConfiguration::_GCell_GlobalContacts ( bool split, AutoContact* southWestContact=NULL, AutoContact* northEastContact=NULL ); - * create AutoContact needed for global wiring. If \e split is - * \False one contact is created and set into both _southWestContact - * _northEastContact. Otherwise two separated contacts are created. - * - * \see GCellConfiguration::_topology, Topology. - */ - - /*! \function AutoContact* GCellConfiguration::_GCell_rp_L2H ( RoutingPad* rp, AutoContact* target=NULL, bool hcollapse=false ) - * \param rp Source RoutingPad. - * \param target Ending AutoContact (created if needed). - * \param hcollapse collapse the horizontal AutoSegment. - * - * Draw horizontal AutoSegment from the center of a RoutingPad. - * \image html GCellConfiguration-10.png "_GCell_rp_L2H" - * \image latex GCellConfiguration-10.pdf "_GCell_rp_L2H" width=0.2\textwidth - */ - - /*! \function AutoContact* GCellConfiguration::_GCell_rp_L2H_L3V ( RoutingPad* rp, AutoContact* target=NULL, bool hcollapse=false, bool vcollapse=false ) - * \param rp Source RoutingPad. - * \param target Ending AutoContact (created if needed). - * \param hcollapse collapse the horizontal AutoSegment. - * \param vcollapse collapse the vertical AutoSegment. - * - * Draw a simple bend from the center of a RoutingPad. The horizontal - * AutoSegment comes first (starting from the source). Both AutoSegments - * are flagged as \e terminal. - * \image html GCellConfiguration-11.png "_GCell_rp_L2H_L3V" - * \image latex GCellConfiguration-11.pdf "_GCell_rp_L2H_L3V" width=0.2\textwidth - */ - - /*! \function AutoContact* GCellConfiguration::_GCell_rp_StairCaseH ( RoutingPad* rp1, RoutingPad* rp2 ) - * - * Draw an horizontal staircase (\b HVH) between two RoutingPad. - * \image html GCellConfiguration-12.png "_GCell_rp_StairCaseH" - * \image latex GCellConfiguration-12.pdf "_GCell_rp_StairCaseH" width=0.4\textwidth - */ - - /*! \function AutoContact* GCellConfiguration::_GCell_rp_StairCaseV ( RoutingPad* rp1, RoutingPad* rp2 ) - * Draw a vertical staircase (\b VHV) between two RoutingPad. - * \image html GCellConfiguration-13.png "_GCell_rp_StairCaseV" - * \image latex GCellConfiguration-13.pdf "_GCell_rp_StairCaseV" width=0.1\textwidth - */ - - /*! \function AutoContact* GCellConfiguration::_GCell_L3V_L2H ( AutoContact* source, AutoContact* target=NULL, bool hcollapse=false, bool vcollapse=false, bool terminal=false ) - * \param source The starting AutoContact. - * \param target The ending AutoContact (created if needed). - * \param hcollapse collapse the horizontal AutoSegment. - * \param vcollapse collapse the vertical AutoSegment. - * \param terminal collapse the horizontal AutoSegment. - * - * Draw a simple bend source to target AutoContact. If target is \e NULL, create - * the target. The \e terminal parameter will apply to both horizontal \& vertical - * AutoSegment. The horizontal AutoSegment comes first. - * \image html GCellConfiguration-15.png "_GCell_L3V_L2H" - * \image latex GCellConfiguration-15.pdf "_GCell_L3V_L2H" width=0.2\textwidth - */ - - /*! \function AutoContact* GCellConfiguration::_GCell_L2H_L3V ( AutoContact* source, AutoContact* target=NULL, bool hcollapse=false, bool vcollapse=false, bool terminal=false ) - * \param source The starting AutoContact. - * \param target The ending AutoContact (created if needed). - * \param hcollapse collapse the horizontal AutoSegment. - * \param vcollapse collapse the vertical AutoSegment. - * \param terminal collapse the horizontal AutoSegment. - * - * Draw a simple bend source to target AutoContact. If target is \e NULL, create - * the target. The \e terminal parameter will apply to both horizontal \& vertical - * AutoSegment. The vertical AutoSegment comes first. - * \image html GCellConfiguration-16.png "_GCell_L2H_L3V" - * \image latex GCellConfiguration-16.pdf "_GCell_L2H_L3V" width=0.2\textwidth - */ - - /*! \function void GCellConfiguration::_GCell_1G_1L1 () - * Optimized topology for one \e metal1 terminal and one global AutoSegment. - */ - - /*! \function void GCellConfiguration::_GCell_1G_xL1 () - * - * Topology for one global AutoSegment and any number of \e metal1 terminals. - * \image html GCellConfiguration-3.png "_GCell_1G_xL1" - * \image latex GCellConfiguration-3.pdf "_GCell_1G_xL1" width=0.8\textwidth - */ - - /*! \function void GCellConfiguration::_GCell_xG_xL1_xL3 () - * - * Topology for two or more global AutoSegment and any number of \e metal1 or - * \e metal3 terminals. They share the same topology since they are are both - * vertical and connected through \e metal2. - * - * Building rules : - *
      - *
    • Global AutoContact are always splitted except when in the - * \e Bend topology. - *
    • Local terminal AutoSegment are always attached to the South - * West AutoContact except in the Straight Horizontal - * topology or when there is no South global segment. - *
    - * - * \image html GCellConfiguration-14.png "Straight Horizontal" - * \image html GCellConfiguration-21.png "Straight Vertical \& Fork (L1 horizontal)" - * \image html GCellConfiguration-22.png "Forks (L1 horizontal)" - * \image html GCellConfiguration-23.png "Forks (L1 vertical)" - * \image html GCellConfiguration-24.png "Bend" - * \image latex GCellConfiguration-14.pdf "Straight Horizontal" width=0.4\textwidth - * \image latex GCellConfiguration-21.pdf "Straight Vertical (L1 horizontal)" width=0.8\textwidth - * \image latex GCellConfiguration-22.pdf "Forks (L1 horizontal)" width=0.8\textwidth - * \image latex GCellConfiguration-23.pdf "Forks (L1 vertical)" width=0.8\textwidth - * \image latex GCellConfiguration-24.pdf "Bend" width=0.4\textwidth - */ - - /*! \function void GCellConfiguration::_GCell_xG_xL2() - * - * Topology for any global AutoSegment and any number of \e metal2 terminals. - * - * Building rules : - *
      - *
    • Global AutoContact are always splitteds, except for the - * \e Bend and \e End topology. - *
    • Anchor the local connecting AutoContact on the biggest - * \RoutingPad, except for the Straight Horizontal - * and the \e End (horizontal) topology. In thoses cases, - * uses the leftmost or rightmost \RoutingPad. - *
    • Prefers vertical AutoSegment to start from the \RoutingPad, - * this needs East and/or West global to be present. - *
    - * - * \image html GCellConfiguration-30.png "Straight H/V" - * \image html GCellConfiguration-31.png "Forks with East \& West" - * \image html GCellConfiguration-32.png "Forks without East or West" - * \image html GCellConfiguration-33.png "Complete Fork" - * \image html GCellConfiguration-34.png "All Bends" - * \image html GCellConfiguration-35.png "East or West End" - * \image html GCellConfiguration-36.png "North or South End" - * \image latex GCellConfiguration-30.pdf "Straight H/V" width=0.95\textwidth - * \image latex GCellConfiguration-31.pdf "Forks with East \& West" width=0.95\textwidth - * \image latex GCellConfiguration-32.pdf "Forks without East or West" width=0.95\textwidth - * \image latex GCellConfiguration-33.pdf "Complete Fork" width=0.48\textwidth - * \image latex GCellConfiguration-34.pdf "All Bends" width=0.48\textwidth - * \image latex GCellConfiguration-35.pdf "East or West End" width=0.95\textwidth - * \image latex GCellConfiguration-36.pdf "North or South End" width=0.48\textwidth - */ - - /*! \function void GCellConfiguration::_GCell_xG_1L1_1L2 () - * - * Topology for one or more global AutoSegment, one \e metal1 and one - * \e metal2 terminals. - * - * Building rules : - *
      - *
    • Global AutoContact are always splitted except when in the - * \e Bend or \e End topology. - *
    • Local terminal AutoSegment are always attached to an - * AutoContact with one vertical global, the South West - * whenever possible (South global present). - *
    - * - * \image html GCellConfiguration-40.png "End H/V" - * \image html GCellConfiguration-41.png "Straight H/V" - * \image html GCellConfiguration-42.png "Forks without East or West" - * \image html GCellConfiguration-43.png "Forks without North or South" - * \image html GCellConfiguration-44.png "Complete Fork" - * \image html GCellConfiguration-45.png "Any Bend" - * \image latex GCellConfiguration-40.pdf "End H/V" width=0.95\textwidth - * \image latex GCellConfiguration-41.pdf "Straight H/V" width=0.95\textwidth - * \image latex GCellConfiguration-42.pdf "Forks without East or West" width=0.95\textwidth - * \image latex GCellConfiguration-43.pdf "Forks without North or South" width=0.95\textwidth - * \image latex GCellConfiguration-44.pdf "Complete Fork" width=0.48\textwidth - * \image latex GCellConfiguration-45.pdf "Any Bend" width=0.48\textwidth - */ - - - /*! \class SortRpByX - * \brief \c RoutingPad \b Compare functor (\b internal) - */ - - /*! \function inline SortRpByX::SortRpByX ( bool decreasing ); - * \param decreasing Tells if the sort is done in decreasing order. - * - * This object is a \c Compare functor for the \c sort \c algorithm - * over \c STL container made of \c RoutingPad pointers. If \c decreasing - * is false the container elements will be sorted by increasing X - * coordinates. Otherwise the sort is decreasing. - * - * See GCellConfiguration class. - */ - - - /*! \class SortRpByY - * \brief \c RoutingPad \b Compare functor (\b internal) - */ - /*! \function inline SortRpByY::SortRpByY ( bool decreasing ); - * \param decreasing Tells if the sort is done in decreasing order. - * - * This object is a \c Compare functor for the \c sort \c algorithm - * over \c STL container made of \c RoutingPad pointers. If \c decreasing - * is false the container elements will be sorted by increasing Y - * coordinates. Otherwise the sort is decreasing. - * - * See GCellConfiguration class. - */ - - - /* \function RoutingPad* lookupOrCreate ( Plug* plug ); - * \param plug A net's plug. - * \return A RoutingPad associated to the plug. - * - * create a \RoutingPad for the plug or find an already created - * one. To keep track - */ - - /* \function RoutingPad* getRoutingPad ( Plug* plug, const Box& boundingBox ); - * \param plug A net's plug. - * \param boundingBox An area. - * \return A RoutingPad associated to the plug. - * - * creates a RoutingPad built on plug. Select the best external - * component of the master net to uses : the largest component - * in the highest layer in the given boundingBox area. - * - * If no component is found under the boundingBox area a - * warning is issued and a component outside the area will be - * used. - */ - - /* \function RoutingPad* getRoutingPad ( Pin* pin ); - * \param pin A net's pin. - * \return A RoutingPad associated to the pin. - * - * Unlike for the RoutingPad from a plug, there is no choice - * for the external component : it's the pin itself. - */ - - /* \function bool arePerpandicular ( unsigned int dir1, unsigned int dir2 ); - * \param dir1 First direction. - * \param dir2 Second direction. - * \return \True if the two direction are perpandiculars. As it proceed - * with bits operators first and second direction could contains - * other flags than \HORIZONTAL and \VERTICAL. - */ - - /* \function unsigned int areOppositeSPs ( SplitterContact* spc1, SplitterContact* spc2 ); - * \param spc1 First SplitterContact. - * \param spc2 Second SplitterContact. - * \return \True if the two SplitterContact are from the opposites Fences - * of a Nimbox. - */ - - /* \function Point getEastPosition ( RoutingPad* rp ); - * \return Between the source and target point, the one with the greatest - * X coordinate (source, if equal). - */ - - /* \function Point getWestPosition ( RoutingPad* rp ); - * \return Between the source and target point, the one with the lowest - * X coordinate (target, if equal). - */ - - /* \function Point getNorthPosition ( RoutingPad* rp ); - * \return Between the source and target point, the one with the greatest - * Y coordinate (source, if equal). - */ - - /* \function Point getSouthPosition ( RoutingPad* rp ); - * \return Between the source and target point, the one with the lowest - * Y coordinate (target, if equal). - */ - - /*! \function void singleGCell ( KatabaticEngine* ktbt, Net* net ); - * \param ktbt A Katabatic \ToolEngine (gives the grid). - * \param net The net for which to build the topology. - * - * This function handle the special case where a whole net - * is included inside only one GCell. - * - * \important For the time being we assumes that the net is a two - * terminal net only. If this is not the case the topology - * will be incomplete an so the routing. - */ - - - /*! \class ForkStack - * \brief Stack of \c Hook / AutoContact (\b internal). - * - * A simple stack of pair of \c Hook / AutoContact. It's used - * to handle the recursivity while building a Net's initial wiring in - * _loadNetGlobalRouting(). - */ - - /*! \function void ForkStack::push ( Hook* from, AutoContact* contact ); - * Stack a new pair of \c Hook / AutoContact. - */ - - /*! \function void ForkStack::pop (); - * Pop an element. The popped element is \b not returned, it's contents are lost. - */ - - /*! \function Hook* ForkStack::getFrom () const; - * \return The \c Hook on top of the stack. \c NULL if - * the stack is empty. - */ - - /*! \function Contact* ForkStack::getContact () const; - * \return The \c Contact on top of the stack. \c NULL if - * the stack is empty. - */ - - //! \} - - - /*! \defgroup buildRules 1. Rules for building wires (internal) - * - * - * \section secACConf AutoContact configurations. - * - * In this section we details how an AutoContact resise itself, and - * introduce some terminology. - * - * First we distinguish two kinds of segments attached to an AutoContact, - * segments that crosses the GCell boundary are considered as global - * and others are locals. - * - * As globals AutoSegments crosses the GCell boundaries, when their - * extention is adjusted by the AutoContact we have the guarantee that - * they will span from the border of the GCell to the AutoContact. - * The AutoContact relies strongly on this hypothesis. - * - * The configuration of an AutoContact is computed in two stages : - *
      - *
    1. We compute the smallest box enclosing all the intersections of - * global segments axis, this box is drawn in red in the figures - * below. We refers this box as the "Junction Box". - * In some cases the enclosing box is not sufficent to make additionnal - * connections with the local segments (see figures G2.1 and G3.1), - * only in those case we take them in account in the junction box. - *
    2. In the second stage we extend the local segments to reach the - * skeleton made by globals segments. In most cases, we do not have - * choices for the extension, but in G4.3 and G4.4. - *
    - * - * orientation meaning : (west, east, south and north) - *
      - *
    • For global segments, it indicates which side of the GCell it - * crosses. - *
    • For local segments, it tells it's relative position to the - * junction box. An horizontal segment will be south if it's axis - * is inferior to the YMin of the junction box and north otherwise. - * In the same way a vertical segment will be west if is axis is - * inferior to the XMin of the junction box and east otherwise. - *
    - * - * \image html AutoContactG1-1.png "One Global Routing" - * \image html AutoContactG2-1.png "Two Global Routing" - * \image html AutoContactG3-1.png "Three Global Routing" - * \image html AutoContactG3-2.png "Three Global Routing" - * \image html AutoContactG4-1.png "Four Global Routing" - * \image html AutoContactG4-2.png "Four Global Routing" - * \image html AutoContactG4-3.png "Four Global Routing" - * \image latex AutoContactG1-1.pdf "One Global Routing" width=0.3\textwidth - * \image latex AutoContactG2-1.pdf "Two Global Routing" width=0.8\textwidth - * \image latex AutoContactG3-1.pdf "Three Global Routing" width=0.8\textwidth - * \image latex AutoContactG3-2.pdf "Three Global Routing" width=0.8\textwidth - * \image latex AutoContactG4-1.pdf "Four Global Routing" width=0.8\textwidth - * \image latex AutoContactG4-2.pdf "Four Global Routing" width=0.8\textwidth - * \image latex AutoContactG4-3.pdf "Four Global Routing" width=0.8\textwidth - * - * - * The "four sides" box problem : - * - * In cases G4.3 and G4.4 we must uses three sides of the junction box - * to perform the connection. To minimize wirelength we uses the two small - * sides and one of the long size. Which one is the question... For the - * moment we systematically choose the lower one (that is west or south). - * A problem arises when, by displacing segments, the router change which - * side is the shortest one. A Solution to this problem is proposed - * in \ref ssecFaultyAutoContact. - * - * - * \section secSegStruct Routing Segments Organisation. - * - * Router movements : - *
      - *
    • Horizontal segments : only translated vertically, - * extensions are not changed, the segment do not - * shrink neither grow. - *
    • Vertical segments : only translated horizontally. - * Extensions remains the same. - *
    - * - * Autocontact adjustements : - * - * When an horizontal segment is vertically moved, vertical ones - * that are linked to it through AutoContact must have their - * extension adapted : either shrinked or elongated. - * - * \image html AutoContact-2.png "Segment Structure" - * \image html AutoContact-3.png "Segment Displacement" - * \image latex AutoContact-2.pdf "Segment Structure" width=0.5\textwidth - * \image latex AutoContact-3.pdf "Segment Displacement" width=0.5\textwidth - * - * - * \subsection ssecFaultyAutoContact AutoContact Geometry restrictions. - * - * \important The property we want to emphasis here is that whenever a - * segment is moved by the router the size of it's - * source or target extensions must not change. Only the - * extensions of segments perpandicularly connected to it will - * change. - * Unfortunatly, not all topologies will ensure that property. - * The following figures shows all those invalid topologies, and - * their correct counterparts. We are looking here from an AutoContact - * point of view : how does the AutoContact resizes when an AutoSegment - * moves. - * - * First case - * - * Three globals (\b G1, \b G2, \b G3) and one local - * (\b L1). \b L1 is perpandicular to \b G1 and \b G3. According to the - * AutoContact sizing specification, \b L1 will be extended to reach - * either \b G1 or \b G3, according to it's relative position from - * \b G2. Problem arises when the router moves \b L1 and crosses the - * position of \b G2. In the figure below, \b L1 is moved up so it - * will extend to \b G3 instead of \b G1. So \b L1 horizontal size - * will change as it is moved. - * - * \image html AutoContactG3-3.png "Three Globals : Problem" - * \image latex AutoContactG3-3.pdf "Three Globals : Problem" width=0.8\textwidth - * - * To avoid the problem, simply split \b AC1 in two AutoContact (\b AC-SW \& - * \b AC-NE). This way, \b L1 will always be extented to reach the same - * global AutoSegment (here : \b G1). - * - * \image html AutoContactG3-4.png "Three Globals : Solution" - * \image latex AutoContactG3-4.pdf "Three Globals : Solution" width=0.8\textwidth - * - * Second case - * - * Four globals (\b G1 to \b G4). This is the - * four side box problem (see \ref secACConf). To minimize wirelength, - * the \b AC1 AutoContact will uses only three side of the junction box : - * the two shortest and one of the longest. The problem shows when \b G3 - * is moved to the right changing shortest and longest sides. - * \b G2 is then shrinked (which is not a problem because it's perpandicular - * to \b G3), and \b G3 is extended, which is the problem. - * - * \image html AutoContactG4-4.png "Four Globals : Problem" - * \image latex AutoContactG4-4.pdf "Four Globals : Problem" width=0.8\textwidth - * - * As for the first case, we choose to split the \b AC1 AutoContact in two - * (\b AC-SW \& \b AC-NE) and link them with one local AutoSegment (horizontal). - * We arbitrarily group the globals in a South West AutoContact - * (\b AC-SW) and North East AutoContact (\b AC-NE). The connexion - * between them is horizontal because there is slighly more horizontal - * resources. - * - * \image html AutoContactG4-5.png "Four Globals : Solution" - * \image latex AutoContactG4-5.pdf "Four Globals : Solution" width=0.8\textwidth - * - * \important We now can express a more synthetic building rule : an AutoContact - * must never contain more than two global segments. - * This rule allow a simpler managment mechanism for the AutoContact - * self sizing procedure (i.e. : speedup). - * - * - * \subsection ssecFaultyTopologies Topologies Leading to Gaps. - * - * First Case - * - * The figure "incomplete AutoContact 1" shows how two contiguous local - * AutoSegments could lead to a gap in the AutoContact generated - * geometry. The local AutoSegment \b L2 is the only vertical component of - * the red AutoContact, thus it's source point will be moved to ensure - * the vertical connection between \b G1 and \b G2. In the other hand, - * the target of \b L2 is bound by the horizontal position of \b L1. - * So, if \b G2 (or \b G1) is moved above \b L1 a gap will appear whithin the - * AutoContact geometry. - * - * \image html GCellConfiguration-1.png "incomplete AutoContact 1" - * \image latex GCellConfiguration-1.pdf "incomplete AutoContact 1" width=0.8\textwidth - * - * To avoid this problem, the red AutoContact have to be split in two - * AutoContacts linked together though a third local AutoSegment \b L3, - * as shown on figure "Correct topology". Note that, in this figure we - * present an unlikely case : most of the time \b L3 will have a zero - * size, and if not, would uses the same track as \b L2. The \b L3 AutoSegment - * will have the correct length because is source moves with \b G2 and it's - * target with \b G1 (or the other way around, according to the relative - * horizontal positions of \b G1 and \b G2). Another point to note is that - * there can only be (at most) two global horizontal AutoSegment, one on - * left and one on the right. And finally, one say that we could have - * suppressed the \b L2 AutoSegment, but in this case it would forces - * the alignement of either \b G1 or \b G2 with \b L1, which could be a - * severe constraint. - * - * \image html GCellConfiguration-2.png "Correct Topology 1" - * \image latex GCellConfiguration-2.pdf "Correct Topology 1" width=0.8\textwidth - * - * Second Case - * - * The following figure "Invalid Configuration 2" illustrate the problem - * that arises when a local AutoSegment is used to connect more than two - * vertical AutoSegments. In other words, is not a mere "dog leg" (double bend). - * This implies that on a least one supporting AutoContact there is more - * than one vertical AutoSegment attached (\e AC2 in our case). - * - * As per definition, the \e L4 AutoSegment has it's source X position sets - * by \e AC1 and it's target X position sets by \e AC2. On \e AC1 there will - * be no problems : the X position is given by \e L3 and we always can - * extend \e L4 to reach it. On the other end, for \e AC2, as the connexity - * is ensured only by extending/shrinking the AutoSegment target X position - * we will never be able to reach both \e L7 \& L6 as they are on either - * side of \e L3. Only one of them will be reached, \e L6 or \e L7 - * depending on how the AutoContact will expand. - * - * To avoid this problem, we introduce the AutoContact horizontal and/or - * vertical locking. For instance, when an AutoContact is vertically - * locked (says \e AC2), then \e L6 \& \e L7 will be kept at the same - * X coordinate. Note that this is not done by the AutoContact itself - * but rather by declaring \e L6 \& \e L7 as collapsed (as if they where - * connected through a collapsed horizontal AutoSegment). - * - * \image html GCellConfiguration-20.png "incomplete Topology 2 (detail)" - * \image latex GCellConfiguration-20.pdf "incomplete Topology 2 (detail)" width=0.8\textwidth - * - * \image html GCellConfiguration-18.png "incomplete Topology 2 (context)" - * \image latex GCellConfiguration-18.pdf "incomplete Topology 2 (context)" width=0.8\textwidth - * - * \image html GCellConfiguration-19.png "Correct Topology 2" - * \image latex GCellConfiguration-19.pdf "Correct Topology 2" width=0.8\textwidth - * - * For more details about the AutoSegment collapsing whereabouts, see - * \ref collapseCanonical. - * - * - * \section secLegalCatalog Catalog of Legal Topologies. - * - * Summarize the set of legal topologies regarding the following - * rules : - *
      - *
    • Rule 1 : An AutoContact must have at least one - * horizontal and one vertical attached to it. With the only - * expeption of those anchored on RoutingPad. - *
    • Rule 2 : An AutoContact must never have more than - * two global AutoSegment. With the only exception of - * AutoContacts with exactly three globals (and no locals). - *
    • Rule 3 : When the side of a Junction Box is made - * of a local AutoSegment, perpandicular AutoSegments must be - * locked together. - *
    • Rule 4 : AutoContact with two globals and any number - * of local must be lockeds in at least one direction. - *
    - * - * Topologies for Dog-Leg (no-fork). - * - * First figure illustrate why rule 1 is needed. Second, the dog - * leg general case, and the latest how to circumvent rule 1 by - * collapsing \b L2. - * - * \image html LegalConstruct-1.png "Legal Construct : dog leg" - * \image latex LegalConstruct-1.pdf "Legal Construct : dog leg" width=0.8\textwidth - * - * Topologies for Elementary Local Fork. - * - * Illustrate how to build local fork, according to the number of global - * AutoSegments part of the fork. First and second case with the side of - * the Junction Box made of a global AutoSegment : no constraint. - * Third case : the side of the Junction Box is made of a local - * AutoSegment, then perpandicular AutoSegment on \b AC2 must be - * linked (here : vertical link) in compliance with Rule 3. - * - * \image html LegalConstruct-2.png "Legal Construct : elementary local fork" - * \image latex LegalConstruct-2.pdf "Legal Construct : elementary local fork" width=0.8\textwidth - * - * Topologies for Global Fork (3 branches). - * - * To comply with Rule 2, we must split the AutoContact in two : - * the South West (\b AC-SW) and North East (\b AC-NE). Whenever it's possible - * we join them through an horizontal AutoSegment. It's not possible if either - * \b G2 or \b G3 is missing. - * - * \image html LegalConstruct-4.png "Legal Construct : Global fork (3 branches, 1)" - * \image html LegalConstruct-5.png "Legal Construct : Global fork (3 branches, 2)" - * \image latex LegalConstruct-4.pdf "Legal Construct : Global fork (3 branches, 1)" width=0.8\textwidth - * \image latex LegalConstruct-5.pdf "Legal Construct : Global fork (3 branches, 2)" width=0.8\textwidth - * - * Topology for Global Fork (4 branches). - * - * Only one possibility, as shown in the figure below. Two AutoContact - * \b AC-SW \& \b AC-NE, and one horizontal AutoSegment. - * - * \image html LegalConstruct-6.png "Legal Construct : Global fork (4 branches)" - * \image latex LegalConstruct-6.pdf "Legal Construct : Global fork (4 branches)" width=0.8\textwidth - * - * \important If there are local connections inside a global fork, the local - * AutoSegment \b L1 will be replaced by a more complex topology. - * - * - * \section secGCellConfiguration Using GCellConfiguration - * - * After the global routing stage, the final router needs to achieve - * the routing topology in each GCell, for each Net. - * This wiring must connect the global wires (that crosses the - * GCell boundary) with any number of local terminals. - * - * This object is the atomic action of a recursive walk through - * the \c GCells of a \c Net. The recursivity is handled through - * a stack : see \c ForkStack. - * - * This classes uses a dictionnary of pre-defined shapes to build - * the interconnect. The dictionnary relies on the following - * hypothesis : - *
      - *
    1. The GCell is one slice height. This implies - * that in almost all cases, internal terminals in the same - * layer can be ordered form left to right. - *
    2. If there is two or more horizontal terminals, they are - * most likely aligned. - *
    3. If there is two or more vertical terminals they are - * not on top of each other, but rather side by side - *
    4. If there are terminals in layer other than M1, we must - * route through it. - *
    - * - * - * \section secUsingGCell Using a GCellConfiguration object - * - * Obviously, we need the Nimbus global routing structure to be present, as we - * uses \c Splitter to progress through the global routing. Using a - * GCellConfiguration is simple enough : - * - *
      - *
    • create a new GCellConfiguration. At this time we must - * supply the \c GCell to be processed, the \Splitter from which the - * \c GCell is entered and optionally a source AutoContact (from the - * previously processed \c GCell). The constructor go through the - * Net's ring inside the \GCell, finding \SplitterContact, \Plug and - * \Pin. Location of \SplitterContact are stored according to - * their positions (east/west/north/south), \RoutingPad are created - * for each \c Plug/Pin and stored into a \vector. The \c _state and - * \c _topology values are also computed, summarizing respectively - * the number of globals and locals (by layers) and the geometry of - * globals (end, straight, bend, fork) - * - *
    • The second step is to call the construct() method. \c construct() - * works in three steps : - * - *
        - *
      1. Draw the internal wiring of the \c GCell, using the appropriate - * \c _GCell_xG_xLx() fonction. - * - * Calls \c _GCell_GlobalContacts(), which create the south west - * (\c _southWestContact ) AutoContact and, if needed the north east - * one (\c _northEastContact ). If only \c _southWestContact is created, - * \c _northEastContact is set to the same value (i.e. is never \NULL). - * Those AutoContacts will supply the support for global \c AutoSegment - * (AutoSegment that goes to and from this \c GCell ). - * - * If the \c GCell has no internal terminal, then only global wiring - * has to be created, and no \c _GCell_xG_xLx() function is - * to be call. All we have to do is to call the \c _GCell_GlobalContacts(). - * function. And in the case we go through the GCell in straight line - * (aligned \c Splitter) we don't even do that. - * - *
      2. Draw the global routing from to previous \c GCell to the - * current one. That is from \c _sourceContact to \c _southWestContact - * or \c _northEastContact according to where we came from. - * - *
      3. Stack the pair of \c SplitterContact/AutoContact into - * the forks stack, except the one we come from (tagged by - * the \c _fromSP ). Here again, we stack either \c _southWestContact - * or \c _northEastContact according to where we came from. - *
      - *
    - */ +/*! \defgroup LoadGlobalRouting Global Routing Loading (internal) + * + * This module documents how the global routing built by \c Knik is + * loaded into the \c Katabatic data-base. It is intented for developpers + * only. + */ + +//! \addtogroup LoadGlobalRouting +//! \{ + +//! \enum LocalFunctionFlag +//! A set of flags for all functions of the LoadGrByNet module. +//! They can be combined to form the \e flags argument of functions. +//! the functions will ignore flags that are not intended to them. +//! +//! For \c HSmall, \c VSmall & \c Punctual see checkRoutingPadSize(). + +//! \var LocalFunctionFlag::NoFlags +//! A simple alias over zero to explicitly tell that no flag at all is +//! passed to the function. + +//! \var LocalFunctionFlag::HAccess +//! The constructed topology will be accessed through an horizontal +//! segment. The absence of this flag tell that the access will be done +//! trough a vertical. + +//! \var LocalFunctionFlag::VSmall +//! The RoutingPad vertically covers a very small number of access points, +//! so it is likely overconstrained for direct horizontal connexion. + +//! \var LocalFunctionFlag::HSmall +//! The RoutingPad horizontally covers a very small number of access points, +//! so it is likely overconstrained for direct vertical connexion. + +//! \var LocalFunctionFlag::Punctual +//! The RoutingPad covers only an access point in either direction. + +//! \var LocalFunctionFlag::DoSourceContact +//! When creating Katabatic::AutoContactTerminal on non-punctual RoutingPad, this flag +//! request the creation of a contact on the source point. + +//! \var LocalFunctionFlag::DoTargetContact +//! When creating Katabatic::AutoContactTerminal on non-punctual RoutingPad, this flag +//! request the creation of a contact on the target point. + + +//! \function unsigned int checkRoutingPadSize ( Component* rp ); +//! +//! Look at the geometrical size of the Component and assess if +//! it's span is too narrow either horizontally or vertically. +//! Return a combination of flags indicating it's state: +//! - HSmall : less than 3 pitches in horizontal direction. +//! - VSmall : less than 3 pitches in vertical direction. +//! - Punctual : one pitch in either directions. +//! +//! The component can be a RoutingPad, a Vertical or an Horizontal. +//! +//! \image html checkRoutingPadSize.png "checkRoutingPadSize()" + +/*! \class GCellTopology + * + * \brief Build the wiring for a Net inside a GCell (\b internal). + * + */ + +//! \function void GCellTopology::doRp_AutoContacts ( GCell* gcell, Component* rp, AutoContact*& source, AutoContact*& target, unsigned int flags ); +//! \param gcell The GCell into which create the AutoContact. +//! \param rp The Component we want to access. +//! \param source The AutoContact created on the \c source (\e returned). +//! \param target The AutoContact created on the \c target (\e returned). +//! \param flags Managed by this function: +//! - LocalFunctionFlag::DoSourceContact +//! - LocalFunctionFlag::DoTargetContact +//! +//! Create the AutoContact directly anchored on the Component (terminal). +//! Three cases are manageds: +//! -# Ordinary (non-punctual) \c METAL1 terminal: an AutoContactTerminal +//! is anchored on the RoutingPad. +//! -# Punctual \c METAL1 terminal, the access must never be blocked +//! by other routing. To ensure it, we create a fixed AutoSegment (anchored +//! on two AutoContactTerminal) to cover it. The \e normal AutoContactTerminal +//! is also created. +//! -# non \c METAL1 terminal, as for the punctual \c METAL1, a +//! fixed protection is added over the RoutingPad. If we access +//! horizontally a vertical RoutingPad or vertically an horizontal +//! one, an extra AutoContactTerminal is added (to allow is displacement +//! along the RoutingPad). +//! +//! To avoid creating a fixed protection over a RoutingPad multiple times, +//! the RoutingPad and it's associated protection is stored in a static +//! \c map : \c __routingPadAutoSegments. +//! +//! Conversely, because an AutoContactTerminal can only be connected to one +//! segment, each time this function is called a new terminal will be created +//! (or maybe two in case of non-punctual terminals). If only one AutoContact +//! is requested, it is created centered on the RoutingPad. The initial +//! position of AutoContact do not prevent them to move afterwards, +//! even those created on source/target on a non-punctual RoutingPad. +//! +//! \remark For clarity we describe the layer management of this function in term +//! of \c METAL, but it is the RoutingGauge depth which is actually used. +//! +//! \image html doRp_AutoContacts.png "doRp_AutoContacts()" + +//! \function AutoContact* GCellTopology::doRp_Access ( GCell* gcell, Component* rp, unsigned int flags ); +//! \param gcell The GCell into which create the AutoContact. +//! \param rp The Component onto which anchor the access contact. +//! \param flags Relevant flags are: +//! - HAccess, the terminal is to be accessed through an horizontal +//! segment. +//! - VSmall, force the terminal to be considered as small in the +//! vertical direction. +//! +//! If \c HAccess is set, the Component is to be accessed trough an horizontal +//! segment. If unset, the access is done vertically. +//! +//! Create an AutoContact to access a Component (terminal). If the Component +//! is not to be accessed through an horizontal segment, and do not cover a +//! large span in the horizontal direction (flag \c VSmall), a local horizontal +//! AutoSegment is added to slacken the vertical constraints. +//! +//! \image html doRp_Access.png "doRp_Access()" + +//! \function void GCellTopology::doRp_StairCaseH ( GCell* gcell, Component* rp1, Component* rp2 ); +//! +//! Build the wiring to connect to horizontal Component. Two cases: +//! - The Component are aligneds, then only a straight wire is created. +//! - They are \e not aligned, then a complete dogleg is created. +//! +//! \image html doRp_StairCaseH.png "doRp_StairCaseH()" + +//! \function void GCellTopology::doRp_StairCaseV ( GCell* gcell, Component* rp1, Component* rp2 ); +//! +//! Build the wiring to connect to vertical Components. Two cases: +//! - The Components are aligneds, then only a straight wire is created. +//! - They are \e not aligned, then a complete dogleg is created. +//! +//! \image html doRp_StairCaseV.png "doRp_StairCaseV()" + +//! \function GCellTopology::_do_xG (); +//! +//! Construct the topology, when there is only global wires (no local terminals). +//! +//! Some topology are not handled because they must not be managed by this +//! function: +//!
      +//!
    • One global: nonsensical because there also must be a terminal. +//!
    • Two aligned globals: in that case we do a straight wire whithout +//! any AutoContact (handled by the source/target of the wire). +//!
    +//! +//! \image html _do_xG.png "_do_xG()" + +//! \function void GCellTopology::_do_1G_1M1 (); +//! +//! Construct a topology where there is \e one global and one RoutingPad +//! in \c METAL1. The \c METAL1 is assumed to be vertical. +//! +//! \remark When accessing the RoutingPad through an horizontal global segment +//! and the vertical extension of the segment is small, the global is +//! still directly attached to the terminal, inducing a high constraint +//! on it. We left to job of slackening it to the router. +//! +//! \image html _do_1G_1M1.png "_do_1G_1M1()" + +//! \function void GCellTopology::_do_1G_xM1 (); +//! +//! Construct a topology where there is \e one global and any number of +//! RoutingPad in \c METAL1. The \c METAL1 is assumed to be vertical. +//! +//! The RoutingPads are linked together two by two. If the horizontal +//! segments are not aligned by the router, part of the routage will be +//! done through the RoutingPad itself. The global incoming segment will +//! connected to the leftmost, rightmost or centermost RoutingPad according +//! from wich side it comes from. +//! +//! \image html _do_1G_xM1.png "_do_1G_xM1()" + +//! \function void GCellTopology::_do_xG_1M1_1M2 (); +//! +//! Construct a topology where there is at least one global (and up to 4), +//! one \c METAL1 RoutingPad (assumed V) and one \c METAL2 RoutingPad (assumed H). +//! +//! In this topology, we want to try to reuse the \c METAL2 RoutingPad as a +//! feedtrough in the horizontal routage. Thus: +//! - The \c METAL1 and \c METAL2 RoutingPad are connected through a separate wiring. +//! - The south & west global wiring is attached to the leftmost contact of +//! the \c METAL2. +//! - The north & east global wiring is attached to the rightmost contact of +//! the \c METAL2. +//! +//! South/west and north/south can be build independantly. Depending on the number +//! of globals, they can consist of: +//! - Nothing (no south nor west). +//! - An AutoContact (west present). +//! - An horizontal plus a turn (south present). +//! - An horizontal plus a HTee (south & west present). +//! +//! \remark Not all configurations are represented below. +//! +//! \image html _do_xG_1M1_1M2.png "_do_xG_1M1_1M2()" + +//! \function void GCellTopology::_do_xG_xM1_xM3 (); +//! +//! Construct a topology where there is at least one global (and up to 4), +//! at least one \c METAL1 RoutingPad (assumed V) and at least one \c METAL3 +//! RoutingPad (assumed V). +//! +//! In this topology, we want to try to reuse the \c METAL3 RoutingPad as a +//! feedtrough in the vertical routage. Thus: +//! - The \c METAL1 and \c METAL3 RoutingPad are connected through a separate +//! wiring made of separate horizontals. +//! - The south-west global wiring is attached to the leftmost RoutingPad +//! if there isn't south or to the first \c METAL3 otherwise. +//! - The north-east global wiring is attached to the rightmost RoutingPad +//! if there isn't north or to the first \c METAL3 otherwise. +//! +//! South/west and north/south can be build independantly. Depending on the number +//! of globals, they can consist of: +//! - Nothing (no south nor west). +//! - An AutoContact on the leftmost RoutingPad (west present). +//! - An AutoContact on the first \c METAL3 (only south present). +//! - An AutoContact plus a vertical plus a VTee (south & west present). +//! +//! \image html _do_xG_xM1_xM3.png "_do_xG_xM1_xM3()" + +//! \function void GCellTopology::_do_xG_xM2 (); +//! +//! Construct a topology where there is at least one global (and up to 4), +//! and any number of \c METAL2 RoutingPads (assumeds H). +//! +//! In this topology, we want to try to reuse the \c METAL2 RoutingPad as a +//! feedtrough in the horizontal routage. Thus: +//! - The RoutingPad are connecteds trough a separate staircase (or +//! straight wire if aligneds). +//! - The south-west global wiring is attached to the leftmost RoutingPad +//! if there isn't south or to the biggest horizontal RoutingPad otherwise. +//! - The north-east global wiring is attached to the rightmost RoutingPad +//! if there isn't south or to the biggest horizontal RoutingPad otherwise. +//! +//! \image html _do_xG_xM2.png "_do_xG_xM2()" + +//! \function void GCellTopology::_do_1G_1M3 (); +//! +//! Construct a topology where there is one global and one \c METAL3 RoutingPad +//! (assumeds V). +//! +//! In this topology, we reuse the \c METAL3 RoutingPad as a feedtrough in the +//! vertical routage. Thus: +//! - If the global is either north or south, we directly connect to the +//! north end or south end of the RoutingPad. \red{The vertical global will} +//! \red{have no slack at all we assume that METAL3 terminals are only from} +//! \red{blocks and are aligneds vertically.} +//! - If the global is east or west \e and the RoutingPad is sufficiently +//! extended in the vertical direction, we connect an horizontal in the +//! normal way. +//! - If the global is not sufficiently extended, we add a turn to give some +//! slack to the global. +//! +//! +//! \image html _do_1G_1M3.png "_do_1G_1M3()" + +//! \function void GCellTopology::_do_xG_xM3 (); +//! +//! Construct a topology where there at least one global and two \c METAL3 RoutingPad +//! (assumed V). +//! +//! In this topology, we reuse the \c METAL3 RoutingPad as a feedtrough in the +//! vertical routage. \red{We assume that the most likely relative position} +//! \red{of the RoutingPads is to be aligned vertically}. +//! Thus: +//! - All RoutingPads are linked two by two trough vertical staircases. +//! - The south-west global wiring is attached to the bottommost RoutingPad +//! (without vertical slack). If a misalignment is detected, then a +//! dogleg is added. +//! - The north-east global wiring is attached to the topmost RoutingPad +//! (without vertical slack). +//! +//! South/west and north/south can be build independantly. Depending on the number +//! of globals, they can consist of: +//! - Nothing (no south nor west). +//! - An sliding AutoContact on the bottommost RoutingPad (west present). +//! - An fixed AutoContact on the bottommost RoutingPad (only south present). +//! - An fixed AutoContact plus a vertical plus a VTee (south & west present). +//! +//! \image html _do_xG_xM3.png "_do_xG_xM3()" + +//! \function void singleGCell ( KatabaticEngine* ktbt, Net* net ); +//! +//! All the RoutingPads of the net are concentrated under a single +//! GCell. This function assumes that all the terminals are in +//! \c METAL1 (vertical), and link them two by two by horizontal +//! wires. + +//! \} using namespace std; @@ -894,32 +353,41 @@ namespace { // --------------------------------------------------------------- // Local Enum/Types. - - enum SegmentSide { SegmentSouth = (1<<0) - , SegmentNorth = (1<<1) - , SegmentWest = (1<<2) - , SegmentEast = (1<<3) - }; + enum LocalFunctionFlag { NoFlags = 0x00000000 + , SortDecreasing = 0x00000001 + , HAccess = 0x00000002 + , VSmall = 0x00000004 + , HSmall = 0x00000008 + , Punctual = 0x00000010 + , HCollapse = 0x00000020 + , VCollapse = 0x00000040 + , Terminal = 0x00000080 + , DoSourceContact = 0x00000100 + , DoTargetContact = 0x00000200 + , SouthBound = 0x00010000 + , NorthBound = 0x00020000 + , WestBound = 0x00040000 + , EastBound = 0x00080000 + }; // --------------------------------------------------------------- // Local Variables. - const char* invalidGCell = - "Katabatic::GCellConfiguration () :\n\n" + "Katabatic::GCellTopology () :\n\n" " No GCell under point.\n"; const char* mismatchGCell = - "Katabatic::GCellConfiguration () :\n\n" + "Katabatic::GCellTopology () :\n\n" " Contacts under two different GCells.\n"; const char* missingGCell = - "Katabatic::GCellConfiguration () :\n\n" + "Katabatic::GCellTopology () :\n\n" " No Contact in GCell.\n"; - map __routingPadAutoSegments; + map __routingPadAutoSegments; // --------------------------------------------------------------- @@ -931,9 +399,7 @@ namespace { }; inline bool NetCompareByName::operator() ( const Net* lhs, const Net* rhs ) const - { - return lhs->getName() < rhs->getName(); - } + { return lhs->getName() < rhs->getName(); } // --------------------------------------------------------------- @@ -941,113 +407,140 @@ namespace { void lookupClear () + { __routingPadAutoSegments.clear (); } + + + void getPositions ( Component* anchor, Point& source, Point& target ) { - __routingPadAutoSegments.clear (); + Segment* segment = dynamic_cast( anchor ); + if (segment) { + source = segment->getSourcePosition(); + target = segment->getTargetPosition(); + return; + } + + RoutingPad* rp = dynamic_cast( anchor ); + if (rp) { + source = rp->getSourcePosition(); + target = rp->getTargetPosition(); + return; + } + + source = anchor->getPosition(); + target = anchor->getPosition(); } - void setIsRoutingPadSmall ( RoutingPad* rp, bool& hsmall, bool& vsmall, bool& punctual ) + unsigned int checkRoutingPadSize ( Component* anchor ) { - Point source = rp->getSourcePosition(); - Point target = rp->getTargetPosition(); + Point source; + Point target; - DbU::Unit width = abs ( target.getX() - source.getX() ); - DbU::Unit height = abs ( target.getY() - source.getY() ); + getPositions( anchor, source, target ); - hsmall = ( width < DbU::lambda(15.0)); - vsmall = ( height < DbU::lambda(15.0)); - punctual = (width == 0) && (height == 0); + DbU::Unit width = abs( target.getX() - source.getX() ); + DbU::Unit height = abs( target.getY() - source.getY() ); + + unsigned int flags = 0; + // HARDCODED VALUE. + flags |= (width < DbU::lambda(15.0)) ? HSmall : 0; + flags |= (height < DbU::lambda(15.0)) ? VSmall : 0; + flags |= ((width == 0) && (height == 0)) ? Punctual : 0; + + return flags; } Hook* getSegmentOppositeHook ( Hook* hook ) { Segment* segment = static_cast( hook->getComponent() ); - return segment->getOppositeHook ( hook ); + return segment->getOppositeHook( hook ); } - unsigned int getSegmentHookType ( Hook* hook ) + unsigned int getSegmentHookType ( Hook* hook ) { Horizontal* horizontal = dynamic_cast( hook->getComponent() ); - if ( horizontal ) { - if ( horizontal->getSourceX() > horizontal->getTargetX() ) + if (horizontal) { + if (horizontal->getSourceX() > horizontal->getTargetX()) cerr << Warning("Bad orientation of %s",getString(horizontal).c_str()) << endl; - if ( dynamic_cast(hook) ) - return SegmentEast; - return SegmentWest; - } - Vertical* vertical = dynamic_cast( hook->getComponent() ); - if ( vertical->getSourceY() > vertical->getTargetY() ) - cerr << Warning("Bad orientation of %s",getString(vertical).c_str()) << endl; + if (dynamic_cast(hook)) + return EastBound; + return WestBound; + } else { + Vertical* vertical = dynamic_cast( hook->getComponent() ); + if (vertical) { + if (vertical->getSourceY() > vertical->getTargetY()) + cerr << Warning("Bad orientation of %s",getString(vertical).c_str()) << endl; - if ( dynamic_cast(hook) ) - return SegmentNorth; - return SegmentSouth; + if (dynamic_cast(hook)) + return NorthBound; + } else { + cerr << Warning("Unmanaged Hook %s",getString(hook).c_str()) << endl; + } + } + return SouthBound; } // --------------------------------------------------------------- // Class : "SortRpByX". - class SortRpByX { public: - inline SortRpByX ( bool decreasing ); - inline bool operator() ( RoutingPad* rp1, RoutingPad* rp2 ); + inline SortRpByX ( unsigned int flags ); + inline bool operator() ( Component* rp1, Component* rp2 ); protected: - bool _decreasing; + unsigned int _flags; }; - inline SortRpByX::SortRpByX ( bool decreasing ) - : _decreasing(decreasing) + inline SortRpByX::SortRpByX ( unsigned int flags ) + : _flags(flags) { } - inline bool SortRpByX::operator() ( RoutingPad* rp1, RoutingPad* rp2 ) + inline bool SortRpByX::operator() ( Component* rp1, Component* rp2 ) { DbU::Unit x1 = rp1->getCenter().getX(); DbU::Unit x2 = rp2->getCenter().getX(); - if ( x1 == x2 ) return false; - return _decreasing xor ( x1 < x2 ); + if (x1 == x2) return false; + return (_flags & SortDecreasing) xor (x1 < x2); } // --------------------------------------------------------------- // Class : "SortRpByY". - class SortRpByY { public: - inline SortRpByY ( bool decreasing ); - inline bool operator() ( RoutingPad* rp1, RoutingPad* rp2 ); + inline SortRpByY ( unsigned int flags ); + inline bool operator() ( Component* rp1, Component* rp2 ); protected: - bool _decreasing; + unsigned int _flags; }; - inline SortRpByY::SortRpByY ( bool decreasing ) - : _decreasing(decreasing) + inline SortRpByY::SortRpByY ( unsigned int flags ) + : _flags(flags) { } - inline bool SortRpByY::operator() ( RoutingPad* rp1, RoutingPad* rp2 ) + inline bool SortRpByY::operator() ( Component* rp1, Component* rp2 ) { DbU::Unit y1 = rp1->getCenter().getY(); DbU::Unit y2 = rp2->getCenter().getY(); - if ( y1 == y2 ) return false; - return _decreasing xor ( y1 < y2 ); + if (y1 == y2) return false; + return (_flags & SortDecreasing) xor (y1 < y2); } // --------------------------------------------------------------- // Class : "ForkStack". - class ForkStack { public: inline void push ( Hook* from, AutoContact* contact ); @@ -1066,170 +559,147 @@ namespace { inline ForkStack::Element::Element ( Hook* from, AutoContact* contact ) : _from(from), _contact(contact) {} - inline void ForkStack::pop () { if ( !_stack.empty() ) _stack.pop_back(); } + inline void ForkStack::pop () { if (not _stack.empty()) _stack.pop_back(); } inline Hook* ForkStack::getFrom () const { return _stack.empty() ? NULL : _stack.back()._from; } inline AutoContact* ForkStack::getContact () const { return _stack.empty() ? NULL : _stack.back()._contact; } inline void ForkStack::push ( Hook* from, AutoContact* contact ) { - ltrace(80) << " Stacking " << (void*)from << " " << from << " + " << contact << endl; - _stack.push_back(Element(from,contact)); + ltrace(80) << " Stacking " << from << " + " << contact << endl; + _stack.push_back( Element(from,contact) ); } // --------------------------------------------------------------- - // Class : "GGellConfiguration". + // Class : "GGellTopology". - - class GCellConfiguration { + class GCellTopology { public: - // Methods. - static void init ( unsigned int degree ); - static void fixSegments (); - GCellConfiguration ( GCellGrid* gcellGrid - , Hook* fromHook - , AutoContact* sourceContact=NULL ); - void construct ( ForkStack& forks ); - inline unsigned int getStateG () const; - inline GCell* getGCell () const; - static bool _GCell_rp_AutoContacts ( GCell* gcell - , RoutingPad* rp - , AutoContact*& source - , AutoContact*& target - , bool haccess ); - static AutoContact* _GCell_rp_Access ( GCell* gcell - , RoutingPad* rp - , bool haccess - , bool forceVSmall ); - static AutoContact* _GCell_rp_L2H ( GCell* gcell - , RoutingPad* rp - , AutoContact* target =NULL - , bool hcollapse=false ); - static AutoContact* _GCell_rp_L2H_L3V ( GCell* gcell - , RoutingPad* rp - , AutoContact* target =NULL - , bool hcollapse=false - , bool vcollapse=false ); - static void _GCell_rp_StairCaseH ( GCell* gcell - , RoutingPad* rp1 - , RoutingPad* rp2 ); - static void _GCell_rp_StairCaseV ( GCell* gcell - , RoutingPad* rp1 - , RoutingPad* rp2 ); - static AutoContact* _GCell_L3V_L2H ( GCell* gcell - , Net* net - , AutoContact* source - , AutoContact* target =NULL - , bool hcollapse=false - , bool vcollapse=false - , bool terminal =false ); - static AutoContact* _GCell_L2H_L3V ( GCell* gcell - , Net* net - , AutoContact* source - , AutoContact* target =NULL - , bool hcollapse=false - , bool vcollapse=false - , bool terminal =false ); - protected: - // Internal Methods. - void _GCell_GlobalContacts ( bool split - , AutoContact* southWestContact=NULL - , AutoContact* northEastContact=NULL ); - void _GCell_xG_1Pad (); - void _GCell_1G_1L1 (); - void _GCell_1G_xL1 (); - void _GCell_xG_xL1_xL3 (); - void _GCell_xG_1L1_1L2 (); - void _GCell_xG_xL2 (); - void _GCell_1G_1L3 (); - void _GCell_xG_xL3 (); + static void init ( unsigned int degree ); + static void fixSegments (); + GCellTopology ( GCellGrid*, Hook* fromHook, AutoContact* sourceContact=NULL ); + void construct ( ForkStack& forks ); + inline unsigned int getStateG () const; + inline GCell* getGCell () const; + static void doRp_AutoContacts ( GCell*, Component*, AutoContact*& source, AutoContact*& target, unsigned int flags ); + static AutoContact* doRp_Access ( GCell*, Component*, unsigned int flags ); + static void doRp_StairCaseH ( GCell*, Component* rp1, Component* rp2 ); + static void doRp_StairCaseV ( GCell*, Component* rp1, Component* rp2 ); + private: + void _do_xG (); + void _do_xG_1Pad (); + void _do_1G_1PinM2 (); + void _do_1G_1M1 (); + void _do_1G_xM1 (); + void _do_xG_xM1_xM3 (); + void _do_xG_1M1_1M2 (); + void _do_xG_xM2 (); + void _do_1G_1M3 (); + void _do_xG_xM3 (); - protected: - // State Values. - enum State { GCELL_0G = 0 - , GCELL_2G = 2 - , GCELL_3G = 3 - , GCELL_4G = 4 - , GCELL_0G_2L1 = 0+(2<<3) - , GCELL_1G_1L1 = 1+(1<<3) - , GCELL_1G_2L1 = 1+(2<<3) - , GCELL_1G_3L1 = 1+(3<<3) - , GCELL_1G_4L1 = 1+(4<<3) - , GCELL_1G_1L2 = 1+(1<<6) - , GCELL_1G_2L2 = 1+(2<<6) - , GCELL_1G_3L2 = 1+(3<<6) - , GCELL_1G_4L2 = 1+(4<<6) - , GCELL_1G_1L3 = 1+(1<<9) - , GCELL_1G_2L3 = 1+(2<<9) - , GCELL_1G_3L3 = 1+(3<<9) - , GCELL_1G_4L3 = 1+(4<<9) - , GCELL_1G_1L1_1L2 = 1+(1<<3)+(1<<6) - , GCELL_1G_1L1_1L3 = 1+(1<<3)+(1<<9) - , GCELL_2G_1L1 = 2+(1<<3) - , GCELL_2G_2L1 = 2+(2<<3) - , GCELL_2G_3L1 = 2+(3<<3) - , GCELL_2G_4L1 = 2+(4<<3) - , GCELL_2G_1L2 = 2+(1<<6) - , GCELL_2G_2L2 = 2+(2<<6) - , GCELL_2G_3L2 = 2+(3<<6) - , GCELL_2G_4L2 = 2+(4<<6) - , GCELL_2G_1L3 = 2+(1<<9) - , GCELL_2G_2L3 = 2+(2<<9) - , GCELL_2G_3L3 = 2+(3<<9) - , GCELL_2G_4L3 = 2+(4<<9) - , GCELL_2G_1L1_1L2 = 2+(1<<3)+(1<<6) - , GCELL_3G_1L1 = 3+(1<<3) - , GCELL_3G_2L1 = 3+(2<<3) - , GCELL_3G_3L1 = 3+(3<<3) - , GCELL_3G_4L1 = 3+(4<<3) - , GCELL_3G_1L2 = 3+(1<<6) - , GCELL_3G_1L3 = 3+(1<<9) - , GCELL_3G_2L3 = 3+(2<<9) - , GCELL_3G_3L3 = 3+(3<<9) - , GCELL_3G_4L3 = 3+(4<<9) - , GCELL_4G_1L1 = 4+(1<<3) - , GCELL_4G_2L1 = 4+(2<<3) - , GCELL_4G_3L1 = 4+(3<<3) - , GCELL_4G_4L1 = 4+(4<<3) - , GCELL_4G_1L3 = 4+(1<<9) - , GCELL_1G_1Pad = 1+(1<<12) - , GCELL_2G_1Pad = 2+(1<<12) - }; + private: + enum ConnexityBits { GlobalBSize = 3 + , Metal1BSize = 3 + , Metal2BSize = 3 + , Metal3BSize = 3 + , PadsBSize = 3 + , PinsBSize = 3 + }; - protected: - // Topologies Flags/Values. - enum Topology { GLOBAL_VERTICAL_END = (1<<0) - , GLOBAL_HORIZONTAL_END = (1<<1) - , GLOBAL_HORIZONTAL = (1<<2) - , GLOBAL_VERTICAL = (1<<3) - , GLOBAL_BEND = (1<<4) - , GLOBAL_FORK = (1<<5) - , GLOBAL_FIXED = (1<<6) - , GLOBAL_END = GLOBAL_VERTICAL_END | GLOBAL_HORIZONTAL_END - , GLOBAL_SPLIT = GLOBAL_HORIZONTAL | GLOBAL_VERTICAL | GLOBAL_FORK - }; +#define CONNEXITY_VALUE( Gs, M1s, M2s, M3s, pads, pins ) \ + Gs + ((M1s ) << GlobalBSize) \ + + ((M2s ) << (GlobalBSize+Metal1BSize)) \ + + ((M3s ) << (GlobalBSize+Metal1BSize+Metal2BSize)) \ + + ((pads) << (GlobalBSize+Metal1BSize+Metal2BSize+Metal3BSize)) \ + + ((pins) << (GlobalBSize+Metal1BSize+Metal2BSize+Metal3BSize+PadsBSize)) - protected: - // State Attribute. - union UState { - unsigned int state; + // Connexity Name | G|M1|M2|M2|Pad|Pin| + enum ConnexityFlag { Conn_0G = CONNEXITY_VALUE( 0, 0, 0, 0, 0 , 0 ) + , Conn_2G = CONNEXITY_VALUE( 2, 0, 0, 0, 0 , 0 ) + , Conn_3G = CONNEXITY_VALUE( 3, 0, 0, 0, 0 , 0 ) + , Conn_4G = CONNEXITY_VALUE( 4, 0, 0, 0, 0 , 0 ) + , Conn_0G_2M1 = CONNEXITY_VALUE( 0, 2, 0, 0, 0 , 0 ) + , Conn_1G_1M1 = CONNEXITY_VALUE( 1, 1, 0, 0, 0 , 0 ) + , Conn_1G_2M1 = CONNEXITY_VALUE( 1, 2, 0, 0, 0 , 0 ) + , Conn_1G_3M1 = CONNEXITY_VALUE( 1, 3, 0, 0, 0 , 0 ) + , Conn_1G_4M1 = CONNEXITY_VALUE( 1, 4, 0, 0, 0 , 0 ) + , Conn_1G_1M2 = CONNEXITY_VALUE( 1, 0, 1, 0, 0 , 0 ) + , Conn_1G_2M2 = CONNEXITY_VALUE( 1, 0, 2, 0, 0 , 0 ) + , Conn_1G_3M2 = CONNEXITY_VALUE( 1, 0, 3, 0, 0 , 0 ) + , Conn_1G_4M2 = CONNEXITY_VALUE( 1, 0, 4, 0, 0 , 0 ) + , Conn_1G_1M3 = CONNEXITY_VALUE( 1, 0, 0, 1, 0 , 0 ) + , Conn_1G_2M3 = CONNEXITY_VALUE( 1, 0, 0, 2, 0 , 0 ) + , Conn_1G_3M3 = CONNEXITY_VALUE( 1, 0, 0, 3, 0 , 0 ) + , Conn_1G_4M3 = CONNEXITY_VALUE( 1, 0, 0, 4, 0 , 0 ) + , Conn_1G_1M1_1M2 = CONNEXITY_VALUE( 1, 1, 1, 0, 0 , 0 ) + , Conn_1G_1M1_1M3 = CONNEXITY_VALUE( 1, 1, 0, 1, 0 , 0 ) + // Connexity Name | G|M1|M2|M2|Pad|Pin| + , Conn_2G_1M1 = CONNEXITY_VALUE( 2, 1, 0, 0, 0 , 0 ) + , Conn_2G_2M1 = CONNEXITY_VALUE( 2, 2, 0, 0, 0 , 0 ) + , Conn_2G_3M1 = CONNEXITY_VALUE( 2, 3, 0, 0, 0 , 0 ) + , Conn_2G_4M1 = CONNEXITY_VALUE( 2, 4, 0, 0, 0 , 0 ) + , Conn_2G_1M2 = CONNEXITY_VALUE( 2, 0, 1, 0, 0 , 0 ) + , Conn_2G_2M2 = CONNEXITY_VALUE( 2, 0, 2, 0, 0 , 0 ) + , Conn_2G_3M2 = CONNEXITY_VALUE( 2, 0, 3, 0, 0 , 0 ) + , Conn_2G_4M2 = CONNEXITY_VALUE( 2, 0, 4, 0, 0 , 0 ) + , Conn_2G_1M3 = CONNEXITY_VALUE( 2, 0, 0, 1, 0 , 0 ) + , Conn_2G_2M3 = CONNEXITY_VALUE( 2, 0, 0, 2, 0 , 0 ) + , Conn_2G_3M3 = CONNEXITY_VALUE( 2, 0, 0, 3, 0 , 0 ) + , Conn_2G_4M3 = CONNEXITY_VALUE( 2, 0, 0, 4, 0 , 0 ) + , Conn_2G_1M1_1M2 = CONNEXITY_VALUE( 2, 1, 1, 0, 0 , 0 ) + // Connexity Name | G|M1|M2|M2|Pad|Pin| + , Conn_3G_1M1 = CONNEXITY_VALUE( 3, 1, 0, 0, 0 , 0 ) + , Conn_3G_2M1 = CONNEXITY_VALUE( 3, 2, 0, 0, 0 , 0 ) + , Conn_3G_3M1 = CONNEXITY_VALUE( 3, 3, 0, 0, 0 , 0 ) + , Conn_3G_4M1 = CONNEXITY_VALUE( 3, 4, 0, 0, 0 , 0 ) + , Conn_3G_1M2 = CONNEXITY_VALUE( 3, 0, 1, 0, 0 , 0 ) + , Conn_3G_1M3 = CONNEXITY_VALUE( 3, 0, 0, 1, 0 , 0 ) + , Conn_3G_2M3 = CONNEXITY_VALUE( 3, 0, 0, 2, 0 , 0 ) + , Conn_3G_3M3 = CONNEXITY_VALUE( 3, 0, 0, 3, 0 , 0 ) + , Conn_3G_4M3 = CONNEXITY_VALUE( 3, 0, 0, 4, 0 , 0 ) + // Connexity Name | G|M1|M2|M2|Pad|Pin| + , Conn_4G_1M1 = CONNEXITY_VALUE( 4, 1, 0, 0, 0 , 0 ) + , Conn_4G_2M1 = CONNEXITY_VALUE( 4, 2, 0, 0, 0 , 0 ) + , Conn_4G_3M1 = CONNEXITY_VALUE( 4, 3, 0, 0, 0 , 0 ) + , Conn_4G_4M1 = CONNEXITY_VALUE( 4, 4, 0, 0, 0 , 0 ) + , Conn_4G_1M3 = CONNEXITY_VALUE( 4, 0, 0, 1, 0 , 0 ) + , Conn_1G_1Pad = CONNEXITY_VALUE( 1, 0, 0, 0, 1 , 0 ) + , Conn_2G_1Pad = CONNEXITY_VALUE( 2, 0, 0, 0, 1 , 0 ) + , Conn_3G_1Pad = CONNEXITY_VALUE( 3, 0, 0, 0, 1 , 0 ) + , Conn_1G_1PinM2 = CONNEXITY_VALUE( 1, 0, 1, 0, 0 , 1 ) + }; + + // Connexity Union Type. + union UConnexity { + unsigned int connexity; struct { - unsigned int globals : 3; - unsigned int L1 : 3; - unsigned int L2 : 3; - unsigned int L3 : 3; - unsigned int Pad : 3; + unsigned int globals : GlobalBSize; + unsigned int M1 : Metal1BSize; + unsigned int M2 : Metal2BSize; + unsigned int M3 : Metal3BSize; + unsigned int Pad : PadsBSize; + unsigned int Pin : PinsBSize; } fields; }; + enum TopologyFlag { Global_Vertical_End = 0x00000001 + , Global_Horizontal_End = 0x00000002 + , Global_Horizontal = 0x00000004 + , Global_Vertical = 0x00000008 + , Global_Turn = 0x00000010 + , Global_Fork = 0x00000020 + , Global_Fixed = 0x00000040 + , Global_End = Global_Vertical_End | Global_Horizontal_End + , Global_Split = Global_Horizontal | Global_Vertical | Global_Fork + }; + // Attributes. private: static vector _toFixSegments; - static bool _onTopologicEnd; static unsigned int _degree; - UState _state; + UConnexity _connexity; unsigned int _topology; Net* _net; GCell* _gcell; @@ -1241,39 +711,37 @@ namespace { Hook* _west; Hook* _north; Hook* _south; - vector _routingPads; + vector _routingPads; }; - inline unsigned int GCellConfiguration::getStateG () const { return _state.fields.globals; } - inline GCell* GCellConfiguration::getGCell () const { return _gcell; } + inline unsigned int GCellTopology::getStateG () const { return _connexity.fields.globals; } + inline GCell* GCellTopology::getGCell () const { return _gcell; } - vector GCellConfiguration::_toFixSegments; - bool GCellConfiguration::_onTopologicEnd = false; - unsigned int GCellConfiguration::_degree = 0; + vector GCellTopology::_toFixSegments; + unsigned int GCellTopology::_degree = 0; - void GCellConfiguration::fixSegments () + void GCellTopology::fixSegments () { for ( size_t i=0 ; i<_toFixSegments.size() ; ++i ) - _toFixSegments[i]->setFixed ( true ); - _toFixSegments.clear (); + _toFixSegments[i]->setFlags( SegFixed ); + _toFixSegments.clear(); } - void GCellConfiguration::init ( unsigned int degree ) + void GCellTopology::init ( unsigned int degree ) { - _degree = degree; - _onTopologicEnd = false; - _toFixSegments.clear (); + _degree = degree; + _toFixSegments.clear(); } - GCellConfiguration::GCellConfiguration ( GCellGrid* gcellGrid - , Hook* fromHook - , AutoContact* sourceContact ) - : _state () + GCellTopology::GCellTopology ( GCellGrid* gcellGrid + , Hook* fromHook + , AutoContact* sourceContact ) + : _connexity () , _topology (0) , _gcell (NULL) , _sourceContact (sourceContact) @@ -1286,430 +754,352 @@ namespace { , _south (NULL) , _routingPads () { - ltrace(99) << "GCellConfiguration::GCellConfiguration ()" << endl; + _connexity.connexity = 0; + + ltrace(99) << "GCellTopology::GCellTopology()" << endl; ltracein(99); ltrace(99) << getString(fromHook) << endl; ltrace(99) << sourceContact << endl; - Segment* fromSegment = static_cast ( _fromHook->getComponent() ); - - _net = fromSegment->getNet (); - _state.state = 0; + Segment* fromSegment = static_cast( _fromHook->getComponent() ); + _net = fromSegment->getNet(); forEach ( Hook*, hook, fromHook->getHooks() ) { - Segment* toSegment = dynamic_cast(hook->getComponent()); - if ( toSegment ) { + Segment* toSegment = dynamic_cast( hook->getComponent() ); + + if (toSegment) { switch ( getSegmentHookType(*hook) ) { - case SegmentWest: _west = *hook; break; - case SegmentEast: _east = *hook; break; - case SegmentSouth: _south = *hook; break; - case SegmentNorth: _north = *hook; break; + case WestBound: _west = *hook; break; + case EastBound: _east = *hook; break; + case SouthBound: _south = *hook; break; + case NorthBound: _north = *hook; break; } - _state.fields.globals++; + + _connexity.fields.globals++; } else { - RoutingPad* rp = dynamic_cast(hook->getComponent()); + Component* anchor = hook->getComponent(); + RoutingPad* rp = dynamic_cast( anchor ); - if ( rp ) { - if ( AllianceFramework::get()->isPad(rp->_getEntityAsComponent()->getCell()) ) { - _state.fields.Pad++; + ltrace(99) << "| Looking for Anchor:" << anchor << " rp:" << rp << endl; + + if (anchor) { + Contact* contact = dynamic_cast( anchor ); + if (contact + and ( Session::getKatabatic()->isGContact( anchor->getLayer() ) + or Session::getKatabatic()->isGMetal ( anchor->getLayer() )) ) { + // Global routing articulation contact are in not ? + GCell* gcell = gcellGrid->getGCell( contact->getCenter() ); + ltrace(99) << "* Global Routing Articulation: " << contact << endl; + ltrace(99) << "| " << gcell << endl; + if (gcell == NULL) + throw Error( invalidGCell ); + if (_gcell == NULL) _gcell = gcell; + else if (_gcell != gcell) { + throw Error( mismatchGCell ); + } } else { - const Layer* layer = rp->getLayer(); - if ( layer == Session::getRoutingLayer(0) ) _state.fields.L1++; // M1 V - else if ( layer == Session::getRoutingLayer(1) ) _state.fields.L2++; // M2 H - else if ( layer == Session::getRoutingLayer(2) ) _state.fields.L3++; // M3 V - else if ( layer == Session::getRoutingLayer(3) ) _state.fields.L2++; // M4 H - else if ( layer == Session::getRoutingLayer(4) ) _state.fields.L3++; // M5 V - else { - cerr << Warning ( "Terminal layer %s of %s is not managed yet (ignored)." - , getString(layer->getName()).c_str() - , getString(rp).c_str() ) - << endl; - continue; - } - } + if (rp and AllianceFramework::get()->isPad(rp->_getEntityAsComponent()->getCell())) { + _connexity.fields.Pad++; + } else { + const Layer* layer = anchor->getLayer(); - ltrace(99) << "RoutingPad " << rp << endl; - _routingPads.push_back ( rp ); - } else { - Contact* contact = dynamic_cast(hook->getComponent()); - if ( contact ) { - GCell* gcell = gcellGrid->getGCell ( contact->getCenter() ); - ltrace(99) << gcell << " guessed from " << contact << endl; - if ( !gcell ) - throw Error ( invalidGCell ); - if ( !_gcell ) _gcell = gcell; - else if ( _gcell != gcell ) { - throw Error ( mismatchGCell ); + if (layer == Session::getRoutingLayer(0)) _connexity.fields.M1++; // M1 V + else if (layer == Session::getRoutingLayer(1)) _connexity.fields.M2++; // M2 H + else if (layer == Session::getRoutingLayer(2)) _connexity.fields.M3++; // M3 V + else if (layer == Session::getRoutingLayer(3)) _connexity.fields.M2++; // M4 H + else if (layer == Session::getRoutingLayer(4)) _connexity.fields.M3++; // M5 V + else { + cerr << Warning( "Terminal layer \"%s\" of %s is not managed yet (ignored)." + , getString(layer->getName()).c_str() + , getString(anchor).c_str() ) + << endl; + continue; + } + + if (dynamic_cast(rp->getOccurrence().getEntity())) _connexity.fields.Pin++; } + + ltrace(99) << "| Component to connect: " << anchor << endl; + _routingPads.push_back( anchor ); } } } } + ltrace(99) << "east: " << _east << endl; + ltrace(99) << "west: " << _west << endl; + ltrace(99) << "north:" << _north << endl; + ltrace(99) << "south:" << _south << endl; - if (_state.fields.globals == 1) { - if ( _north || _south ) _topology |= GLOBAL_VERTICAL_END; - else _topology |= GLOBAL_HORIZONTAL_END; - _onTopologicEnd = true; - } else if (_state.fields.globals == 2) { - if ( _east && _west ) _topology |= GLOBAL_HORIZONTAL; - else if ( _north && _south ) _topology |= GLOBAL_VERTICAL; - else _topology |= GLOBAL_BEND; + if (_connexity.fields.globals == 1) { + if ( _north or _south ) _topology |= Global_Vertical_End; + else _topology |= Global_Horizontal_End; + } else if (_connexity.fields.globals == 2) { + if ( _east && _west ) _topology |= Global_Horizontal; + else if ( _north && _south ) _topology |= Global_Vertical; + else _topology |= Global_Turn; } else { - _topology |= GLOBAL_FORK; + _topology |= Global_Fork; } ltraceout(99); - if ( !_gcell ) throw Error ( missingGCell ); + if (_gcell == NULL) throw Error( missingGCell ); } - void GCellConfiguration::construct ( ForkStack& forks ) + void GCellTopology::construct ( ForkStack& forks ) { - ltrace(99) << "GCellConfiguration::construct () [" << _state.state << "] in " << _gcell << endl; + ltrace(99) << "GCellTopology::construct() [" << _connexity.connexity << "] in " << _gcell << endl; ltracein(99); + _southWestContact = NULL; + _northEastContact = NULL; + bool straightLine = false; - switch ( _state.state ) { - case GCELL_1G_1Pad: - case GCELL_2G_1Pad: _GCell_xG_1Pad (); break; - case GCELL_1G_1L1: _GCell_1G_1L1 (); break; - case GCELL_1G_2L1: - case GCELL_1G_3L1: - case GCELL_1G_4L1: _GCell_1G_xL1 (); break; - case GCELL_1G_1L2: - case GCELL_1G_2L2: - case GCELL_1G_3L2: - case GCELL_1G_4L2: _GCell_xG_xL2 (); break; - case GCELL_1G_1L3: _GCell_1G_1L3 (); break; - case GCELL_1G_2L3: - case GCELL_1G_3L3: - case GCELL_1G_4L3: _GCell_xG_xL3 (); break; - case GCELL_1G_1L1_1L2: _GCell_xG_1L1_1L2 (); break; - case GCELL_1G_1L1_1L3: _GCell_1G_xL1 (); break; - case GCELL_2G_1L1: - case GCELL_2G_2L1: - case GCELL_2G_3L1: - case GCELL_2G_4L1: - case GCELL_3G_1L1: - case GCELL_3G_2L1: - case GCELL_3G_3L1: - case GCELL_3G_4L1: - case GCELL_3G_2L3: - case GCELL_3G_3L3: - case GCELL_3G_4L3: - case GCELL_4G_1L1: - case GCELL_4G_2L1: - case GCELL_4G_3L1: - case GCELL_4G_4L1: _GCell_xG_xL1_xL3 (); break; - case GCELL_2G_1L2: - case GCELL_2G_2L2: - case GCELL_2G_3L2: - case GCELL_2G_4L2: - case GCELL_3G_1L2: _GCell_xG_xL2 (); break; - case GCELL_2G_1L3: - case GCELL_2G_2L3: - case GCELL_2G_3L3: - case GCELL_2G_4L3: - case GCELL_3G_1L3: _GCell_xG_xL3 (); break; - case GCELL_2G_1L1_1L2: _GCell_xG_1L1_1L2 (); break; - case GCELL_2G: - if ( (_east && _west) || (_north && _south) ) { + switch ( _connexity.connexity ) { + case Conn_1G_1Pad: + case Conn_2G_1Pad: + case Conn_3G_1Pad: _do_xG_1Pad(); break; + case Conn_1G_1PinM2: _do_1G_1PinM2(); break; + case Conn_1G_1M1: _do_1G_1M1(); break; + case Conn_1G_2M1: + case Conn_1G_3M1: + case Conn_1G_4M1: _do_1G_xM1(); break; + case Conn_1G_1M2: + case Conn_1G_2M2: + case Conn_1G_3M2: + case Conn_1G_4M2: _do_xG_xM2(); break; + case Conn_1G_1M3: _do_1G_1M3(); break; + case Conn_1G_2M3: + case Conn_1G_3M3: + case Conn_1G_4M3: _do_xG_xM3 (); break; + case Conn_1G_1M1_1M2: _do_xG_1M1_1M2(); break; + case Conn_1G_1M1_1M3: _do_1G_xM1 (); break; + case Conn_2G_1M1: + case Conn_2G_2M1: + case Conn_2G_3M1: + case Conn_2G_4M1: + case Conn_3G_1M1: + case Conn_3G_2M1: + case Conn_3G_3M1: + case Conn_3G_4M1: + case Conn_3G_2M3: + case Conn_3G_3M3: + case Conn_3G_4M3: + case Conn_4G_1M1: + case Conn_4G_2M1: + case Conn_4G_3M1: + case Conn_4G_4M1: _do_xG_xM1_xM3(); break; + case Conn_2G_1M2: + case Conn_2G_2M2: + case Conn_2G_3M2: + case Conn_2G_4M2: + case Conn_3G_1M2: _do_xG_xM2(); break; + case Conn_2G_1M3: + case Conn_2G_2M3: + case Conn_2G_3M3: + case Conn_2G_4M3: + case Conn_3G_1M3: _do_xG_xM3 (); break; + case Conn_2G_1M1_1M2: _do_xG_1M1_1M2(); break; + case Conn_2G: + if ( (_east and _west) or (_north and _south) ) { straightLine = true; break; } - case GCELL_3G: - _GCell_GlobalContacts ( false ); - break; - case GCELL_4G: - _GCell_GlobalContacts ( true ); - AutoSegment::create ( _southWestContact - , _northEastContact - , Constant::Horizontal - , AutoSegment::Local - , false - , false - ); + case Conn_3G: + case Conn_4G: + _do_xG(); break; default: - cerr << Bug("Unmanaged Configuration [%d] = [%d+%d+%d+%d,%d] %s in %s" - ,_state.state - ,_state.fields.globals - ,_state.fields.L1 - ,_state.fields.L2 - ,_state.fields.L3 - ,_state.fields.Pad - ,_net->_getString().c_str() - ,getString(_gcell).c_str() + cerr << Bug( "Unmanaged Configuration [%d] = [%d+%d+%d+%d,%d+%d] %s in %s\n" + " The global routing seems to be defective." + , _connexity.connexity + , _connexity.fields.globals + , _connexity.fields.M1 + , _connexity.fields.M2 + , _connexity.fields.M3 + , _connexity.fields.Pin + , _connexity.fields.Pad + , _net->_getString().c_str() + , getString(_gcell).c_str() ) << endl; - _GCell_GlobalContacts ( false ); + _do_xG(); } - if ( straightLine ) { - cerr << Error("Straight aligned segments (ignored)") << endl; - ltraceout(99); + if (straightLine) { + // This a global router problem. + cerr << Bug( "Unmanaged configuration: straight line,\n" + " The global routing seems to be defective." + ) << endl; return; - } - - if ( _sourceContact ) { - AutoContact* targetContact - = ( getSegmentHookType(_fromHook) & (SegmentNorth|SegmentEast) ) - ? _northEastContact : _southWestContact ; - AutoSegment* globalSegment = AutoSegment::create ( _sourceContact - , targetContact - , static_cast( _fromHook->getComponent() ) - ); - globalSegment->setTopologicEnd ( _onTopologicEnd ); - _onTopologicEnd = false; - globalSegment->setBipoint ( (_degree == 2) ); - - ltrace(99) << "Create global segment: " << globalSegment << endl; - - if ( globalSegment->isHorizontal() - and ( (Session::getRoutingGauge()->getLayerDepth(_sourceContact->getLayer()->getBottom()) > 1) - or (Session::getRoutingGauge()->getLayerDepth(targetContact ->getLayer()->getBottom()) > 1)) ) { - globalSegment->setLayer ( Session::getRoutingLayer(3) ); - ltrace(99) << "Source:" << _sourceContact << endl; - ltrace(99) << "Target:" << targetContact << endl; - ltrace(99) << "Moving up global:" << globalSegment << endl; - } - if ( (_topology & GLOBAL_FIXED) and (globalSegment->getLength() < DbU::lambda(100.0)) ) - _toFixSegments.push_back ( globalSegment ); + } else { + if (_sourceContact) { + AutoContact* targetContact + = ( getSegmentHookType(_fromHook) & (NorthBound|EastBound) ) + ? _northEastContact : _southWestContact ; + AutoSegment* globalSegment = AutoSegment::create( _sourceContact + , targetContact + , static_cast( _fromHook->getComponent() ) + ); + globalSegment->setFlags( (_degree == 2) ? SegBipoint : 0 ); - if ( _state.fields.globals < 2 ) { - ltraceout(99); - return; - } - } else - _fromHook = NULL; + ltrace(99) << "Create global segment: " << globalSegment << endl; - if ( _east && (_fromHook != _east) ) { - Hook* toHook = getSegmentOppositeHook ( _east ); - ltrace(99) << "Pushing " << getString(toHook) << endl; - ltrace(99) << "Pushing " << _northEastContact << endl; - forks.push ( toHook, _northEastContact ); +#if THIS_IS_DEPRECATED + if ( globalSegment->isHorizontal() + and ( (Session::getRoutingGauge()->getLayerDepth(_sourceContact->getLayer()->getBottom()) > 1) + or (Session::getRoutingGauge()->getLayerDepth(targetContact ->getLayer()->getBottom()) > 1)) ) { + globalSegment->setLayer ( Session::getRoutingLayer(3) ); + ltrace(99) << "Source:" << _sourceContact << endl; + ltrace(99) << "Target:" << targetContact << endl; + ltrace(99) << "Moving up global:" << globalSegment << endl; + } +#endif + // HARDCODED VALUE. + if ( (_topology & Global_Fixed) and (globalSegment->getLength() < DbU::lambda(100.0)) ) + _toFixSegments.push_back( globalSegment ); + + if (_connexity.fields.globals < 2) { + ltraceout(99); + return; + } + } else + _fromHook = NULL; } - if ( _west && (_fromHook != _west) ) { - Hook* toHook = getSegmentOppositeHook ( _west ); - ltrace(99) << "Pushing " << getString(toHook) << endl; - ltrace(99) << "Pushing " << _southWestContact << endl; - forks.push ( toHook, _southWestContact ); + + if ( _east and (_fromHook != _east) ) { + Hook* toHook = getSegmentOppositeHook( _east ); + ltrace(99) << "Pushing East (to) " << getString(toHook) << endl; + ltrace(99) << "Pushing East (from) " << _northEastContact << endl; + forks.push( toHook, _northEastContact ); } - if ( _north && (_fromHook != _north) ) { - Hook* toHook = getSegmentOppositeHook ( _north ); - ltrace(99) << "Pushing " << getString(toHook) << endl; - ltrace(99) << "Pushing " << _northEastContact << endl; - forks.push ( toHook, _northEastContact ); + if ( _west and (_fromHook != _west) ) { + Hook* toHook = getSegmentOppositeHook( _west ); + ltrace(99) << "Pushing West (to) " << getString(toHook) << endl; + ltrace(99) << "Pushing West (from) " << _southWestContact << endl; + forks.push( toHook, _southWestContact ); } - if ( _south && (_fromHook != _south) ) { - Hook* toHook = getSegmentOppositeHook ( _south ); - ltrace(99) << "Pushing " << getString(toHook) << endl; - ltrace(99) << "Pushing " << _southWestContact << endl; - forks.push ( toHook, _southWestContact ); + if ( _north and (_fromHook != _north) ) { + Hook* toHook = getSegmentOppositeHook( _north ); + ltrace(99) << "Pushing North (to) " << getString(toHook) << endl; + ltrace(99) << "Pushing North (from) " << _northEastContact << endl; + forks.push( toHook, _northEastContact ); + } + if ( _south and (_fromHook != _south) ) { + Hook* toHook = getSegmentOppositeHook( _south ); + ltrace(99) << "Pushing South (to) " << getString(toHook) << endl; + ltrace(99) << "Pushing South (from) " << _southWestContact << endl; + forks.push( toHook, _southWestContact ); } ltraceout(99); } - void GCellConfiguration::_GCell_GlobalContacts ( bool split - , AutoContact* southWestContact - , AutoContact* northEastContact - ) + void GCellTopology::doRp_AutoContacts ( GCell* gcell + , Component* rp + , AutoContact*& source + , AutoContact*& target + , unsigned int flags + ) { - ltrace(99) << "GlobalContacts(" << split << ")" << endl; - - if ( southWestContact ) - _southWestContact = southWestContact; - else { - _southWestContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); - } - - if ( split ) { - if ( northEastContact ) - _northEastContact = northEastContact; - else { - _northEastContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); - } - } else - _northEastContact = _southWestContact; - } - - - bool GCellConfiguration::_GCell_rp_AutoContacts ( GCell* gcell - , RoutingPad* rp - , AutoContact*& source - , AutoContact*& target - , bool haccess - ) - { - ltrace(99) << "_GCell_rp_AutoContacts()" << endl; + ltrace(99) << "doRp_AutoContacts()" << endl; ltracein(99); - - const Layer* rpLayer = Session::getContactLayer(0); - Point sourcePosition = rp->getSourcePosition(); - Point targetPosition = rp->getTargetPosition(); - unsigned int direction = Session::getRoutingGauge()->getLayerDirection(rp->getLayer()); + ltrace(99) << rp << endl; source = target = NULL; - // Non-M1 terminal. - if ( rp->getLayer() != Session::getRoutingLayer(0) ) { - map::iterator irp = __routingPadAutoSegments.find ( rp ); - if ( irp != __routingPadAutoSegments.end() ) { - source = irp->second->getAutoSource(); - target = irp->second->getAutoTarget(); - } else { - // Non-M1 Fixed protection. - if ( sourcePosition.getX() > targetPosition.getX() ) swap ( sourcePosition, targetPosition ); - if ( sourcePosition.getY() > targetPosition.getY() ) swap ( sourcePosition, targetPosition ); + Point sourcePosition; + Point targetPosition; + const Layer* rpLayer = rp->getLayer(); + unsigned int direction = Session::getLayerDirection( rp->getLayer() ); - GCell* sourceGCell = Session::getKatabatic()->getGCellGrid()->getGCell ( sourcePosition ); - GCell* targetGCell = Session::getKatabatic()->getGCellGrid()->getGCell ( targetPosition ); + getPositions( rp, sourcePosition, targetPosition ); - source = AutoContact::fromRp ( sourceGCell - , rp - , rp->getLayer() - , sourcePosition - , DbU::lambda(1.0), DbU::lambda(1.0) - , true - ); + if (sourcePosition.getX() > targetPosition.getX()) swap( sourcePosition, targetPosition ); + if (sourcePosition.getY() > targetPosition.getY()) swap( sourcePosition, targetPosition ); - target = AutoContact::fromRp ( targetGCell - , rp - , rp->getLayer() - , targetPosition - , DbU::lambda(1.0), DbU::lambda(1.0) - , true - ); + GCell* sourceGCell = Session::getKatabatic()->getGCellGrid()->getGCell( sourcePosition ); + GCell* targetGCell = Session::getKatabatic()->getGCellGrid()->getGCell( targetPosition ); - unsigned int segmentType - = (sourceGCell == targetGCell) ? AutoSegment::Local : AutoSegment::Global; + if (rp->getLayer() == Session::getRoutingLayer(0)) { + rpLayer = Session::getContactLayer(0); + direction = KbHorizontal; + } - AutoSegment* segment = AutoSegment::create ( source - , target - , direction - , segmentType - , true - , false - ); - segment->setFixed ( true ); - __routingPadAutoSegments.insert ( make_pair(rp,segment) ); + // Non-M1 terminal or punctual M1 protections. + if ((rp->getLayer() != Session::getRoutingLayer(0)) or (sourcePosition == targetPosition)) { + map::iterator irp = __routingPadAutoSegments.find( rp ); + if (irp == __routingPadAutoSegments.end()) { + AutoContact* sourceProtect = AutoContactTerminal::create( sourceGCell + , rp + , rpLayer + , sourcePosition + , DbU::lambda(1.0), DbU::lambda(1.0) + ); + AutoContact* targetProtect = AutoContactTerminal::create( targetGCell + , rp + , rpLayer + , targetPosition + , DbU::lambda(1.0), DbU::lambda(1.0) + ); + sourceProtect->setFlags( CntFixed ); + targetProtect->setFlags( CntFixed ); - // Associate a M2 fixed protection to punctual M3 terminals. - // if ( ( rp->getLayer() == Session::getRoutingLayer(2) ) - // and ( sourcePosition == targetPosition ) ) { - // AutoContact* sourceM2 = AutoContact::fromRp ( sourceGCell - // , rp - // , Session::getContactLayer(1) - // , sourcePosition - // , DbU::lambda(1.0), DbU::lambda(1.0) - // , true - // ); + AutoSegment* segment = AutoSegment::create( sourceProtect, targetProtect, direction ); + segment->setFlags( SegFixed ); - // AutoContact* targetM2 = AutoContact::fromRp ( sourceGCell - // , rp - // , Session::getContactLayer(1) - // , targetPosition - // , DbU::lambda(1.0), DbU::lambda(1.0) - // , true - // ); - - // AutoSegment* segmentM2 = AutoSegment::create ( sourceM2 - // , targetM2 - // , Constant::Horizontal - // , AutoSegment::Local - // , true - // , false - // ); - // segmentM2->setFixed ( true ); - // } - } - - if ( not (haccess xor (direction == Constant::Horizontal)) ) { - ltraceout(99); - return true; + __routingPadAutoSegments.insert( make_pair(rp,segment) ); } } - // Punctual M1. - if ( ( rp->getLayer() == Session::getRoutingLayer(0) ) - and ( sourcePosition == targetPosition ) ) { - map::iterator irp = __routingPadAutoSegments.find ( rp ); - if ( irp == __routingPadAutoSegments.end() ) { - GCell* sourceGCell = Session::getKatabatic()->getGCellGrid()->getGCell ( sourcePosition ); - - source = AutoContact::fromRp ( sourceGCell - , rp - , Session::getContactLayer(0) - , sourcePosition - , DbU::lambda(1.0), DbU::lambda(1.0) - , true - ); - - target = AutoContact::fromRp ( sourceGCell - , rp - , Session::getContactLayer(0) - , targetPosition - , DbU::lambda(1.0), DbU::lambda(1.0) - , true - ); - - AutoSegment* segment = AutoSegment::create ( source - , target - , Constant::Horizontal - , AutoSegment::Local - , true - , false - ); - segment->setFixed ( true ); - __routingPadAutoSegments.insert ( make_pair(rp,segment) ); - } + if (sourcePosition != targetPosition) { + if (flags & DoSourceContact) + source = AutoContactTerminal::create( sourceGCell + , rp + , rpLayer + , sourcePosition + , DbU::lambda(1.0), DbU::lambda(1.0) + ); + if (flags & DoTargetContact) + target = AutoContactTerminal::create( targetGCell + , rp + , rpLayer + , targetPosition + , DbU::lambda(1.0), DbU::lambda(1.0) + ); } - if ( rp->getLayer() != Session::getRoutingLayer(0) ) - rpLayer = Session::getContactLayer(1); + if (not source and not target) { + source = target = AutoContactTerminal::create( gcell + , rp + , rpLayer + , rp->getCenter() + , DbU::lambda(1.0), DbU::lambda(1.0) + ); + } - source = target = AutoContact::fromRp ( gcell - , rp - , rpLayer - , rp->getCenter() - , DbU::lambda(1.0), DbU::lambda(1.0) - ); ltraceout(99); - return false; + return; } - AutoContact* GCellConfiguration::_GCell_rp_Access ( GCell* gcell - , RoutingPad* rp - , bool haccess - , bool forceVSmall ) + AutoContact* GCellTopology::doRp_Access ( GCell* gcell, Component* rp, unsigned int flags ) { - ltrace(99) << "_GCell_rp_Access()" << endl; + ltrace(99) << "doRp_Access() - flags:" << flags << endl; ltracein(99); AutoContact* rpContactSource; AutoContact* rpContactTarget; - bool hsmall; - bool vsmall; - bool punctual; - setIsRoutingPadSmall ( rp, hsmall, vsmall, punctual ); - vsmall = vsmall || forceVSmall; + flags |= checkRoutingPadSize( rp ); - _GCell_rp_AutoContacts ( gcell, rp, rpContactSource, rpContactTarget, haccess ); + doRp_AutoContacts( gcell, rp, rpContactSource, rpContactTarget, flags ); - if ( not haccess and hsmall ) { - AutoContact* subContact1 = AutoContact::create ( gcell, rp->getNet(), Session::getContactLayer(1) ); - AutoSegment::create ( rpContactSource - , subContact1 - , Constant::Horizontal - , AutoSegment::Local - , true - , false - ); + if ( not (flags & HAccess) and (flags & HSmall) ) { + AutoContact* subContact1 = AutoContactTurn::create( gcell, rp->getNet(), Session::getContactLayer(1) ); + AutoSegment::create( rpContactSource, subContact1, KbHorizontal ); rpContactSource = subContact1; } @@ -1719,346 +1109,276 @@ namespace { } - AutoContact* GCellConfiguration::_GCell_rp_L2H ( GCell* gcell, RoutingPad* rp, AutoContact* target, bool hcollapse ) + void GCellTopology::doRp_StairCaseH ( GCell* gcell, Component* rp1, Component* rp2 ) { - ltrace(99) << "rp_L2H " << rp << endl; + ltrace(99) << "doRp_StairCaseH()" << endl; - AutoContact* rpContactSource; - AutoContact* rpContactTarget; - unsigned int segmentType = AutoSegment::Local; + if (rp1->getCenter().getX() > rp2->getCenter().getX()) swap( rp1, rp2 ); - if ( _GCell_rp_AutoContacts(gcell,rp,rpContactSource,rpContactTarget,true) ) { - if ( gcell->getIndex() > rpContactSource->getGCell()->getIndex() ) - swap ( rpContactSource, rpContactTarget ); - if ( gcell->getIndex() != rpContactSource->getGCell()->getIndex() ) - segmentType = AutoSegment::Global; - } + AutoContact* rp1ContactSource = NULL; + AutoContact* rp1ContactTarget = NULL; + AutoContact* rp2ContactSource = NULL; + AutoContact* rp2ContactTarget = NULL; + const Layer* viaLayer = NULL; - if ( !target ) - target = AutoContact::create ( gcell, rp->getNet(), Session::getContactLayer(1) ); + doRp_AutoContacts( gcell, rp1, rp1ContactSource, rp1ContactTarget, DoTargetContact ); + doRp_AutoContacts( gcell, rp2, rp2ContactSource, rp2ContactTarget, DoSourceContact ); - AutoSegment::create ( rpContactSource, target, Constant::Horizontal, segmentType, true, hcollapse ); - - return target; - } - - - AutoContact* GCellConfiguration::_GCell_rp_L2H_L3V ( GCell* gcell, RoutingPad* rp, AutoContact* target, bool hcollapse, bool vcollapse ) - { - ltrace(99) << "rp_L2H+L3V " << rp << endl; - ltracein(99); - - AutoContact* source = _GCell_rp_L2H ( gcell, rp, NULL, hcollapse ); - - if ( !target ) { - target = AutoContact::create ( gcell, rp->getNet(), Session::getContactLayer(1) ); - } - - AutoSegment::create ( source, target, Constant::Vertical, AutoSegment::Local, true, vcollapse ); - - ltraceout(99); - - return target; - } - - - void GCellConfiguration::_GCell_rp_StairCaseH ( GCell* gcell, RoutingPad* rp1, RoutingPad* rp2 ) - { - ltrace(99) << "_GCell_rp_StairCaseH()" << endl; - - if ( rp1->getCenter().getX() > rp2->getCenter().getX() ) - swap ( rp1, rp2 ); - - AutoContact* rp1ContactSource; - AutoContact* rp1ContactTarget; - AutoContact* rp2ContactSource; - AutoContact* rp2ContactTarget; - const Layer* viaLayer; - - _GCell_rp_AutoContacts ( gcell, rp1, rp1ContactSource, rp1ContactTarget, true ); - _GCell_rp_AutoContacts ( gcell, rp2, rp2ContactSource, rp2ContactTarget, true ); - - if ( rp1ContactTarget->getY() == rp2ContactSource->getY() ) { + if (rp1ContactTarget->getY() == rp2ContactSource->getY()) { ltrace(99) << "Aligned horizontal routing pads : straight wire" << endl; - viaLayer = rp1->getLayer (); - AutoSegment::create ( rp1ContactTarget - , rp2ContactSource - , Constant::Horizontal - , AutoSegment::Local - , true - ); + viaLayer = rp1->getLayer(); + AutoSegment::create( rp1ContactTarget, rp2ContactSource, KbHorizontal ); return; } viaLayer = Session::getContactLayer(1); - AutoContact* subContact1 = AutoContact::create ( gcell, rp1->getNet(), Session::getContactLayer(1) ); - AutoContact* subContact2 = AutoContact::create ( gcell, rp1->getNet(), Session::getContactLayer(1) ); + AutoContact* subContact1 = AutoContactTurn::create( gcell, rp1->getNet(), Session::getContactLayer(1) ); + AutoContact* subContact2 = AutoContactTurn::create( gcell, rp1->getNet(), Session::getContactLayer(1) ); - AutoSegment::create ( rp1ContactTarget, subContact1 , Constant::Vertical , AutoSegment::Local, true ); - AutoSegment::create ( subContact1 , subContact2 , Constant::Horizontal, AutoSegment::Local, true ); - AutoSegment::create ( subContact1 , rp2ContactSource, Constant::Vertical , AutoSegment::Local, true ); + AutoSegment::create( rp1ContactTarget, subContact1 , KbHorizontal ); + AutoSegment::create( subContact1 , subContact2 , KbVertical ); + AutoSegment::create( subContact1 , rp2ContactSource, KbHorizontal ); } - void GCellConfiguration::_GCell_rp_StairCaseV ( GCell* gcell, RoutingPad* rp1, RoutingPad* rp2 ) + void GCellTopology::doRp_StairCaseV ( GCell* gcell, Component* rp1, Component* rp2 ) { - ltrace(99) << "_GCell_rp_StairCaseV()" << endl; + ltrace(99) << "doRp_StairCaseV()" << endl; - if ( rp1->getCenter().getY() > rp2->getCenter().getY() ) - swap ( rp1, rp2 ); + if (rp1->getCenter().getY() > rp2->getCenter().getY()) swap( rp1, rp2 ); - AutoContact* rp1ContactSource; - AutoContact* rp1ContactTarget; - AutoContact* rp2ContactSource; - AutoContact* rp2ContactTarget; - const Layer* viaLayer; + AutoContact* rp1ContactSource = NULL; + AutoContact* rp1ContactTarget = NULL; + AutoContact* rp2ContactSource = NULL; + AutoContact* rp2ContactTarget = NULL; + const Layer* viaLayer = NULL; - _GCell_rp_AutoContacts ( gcell, rp1, rp1ContactSource, rp1ContactTarget, false ); - _GCell_rp_AutoContacts ( gcell, rp2, rp2ContactSource, rp2ContactTarget, false ); + doRp_AutoContacts( gcell, rp1, rp1ContactSource, rp1ContactTarget, DoTargetContact ); + doRp_AutoContacts( gcell, rp2, rp2ContactSource, rp2ContactTarget, DoSourceContact ); - if ( rp1ContactTarget->getX() == rp2ContactSource->getX() ) { + if (rp1ContactTarget->getX() == rp2ContactSource->getX()) { ltrace(99) << "Aligned vertical routing pads : straight wire" << endl; - viaLayer = rp1->getLayer (); - AutoSegment::create ( rp1ContactTarget - , rp2ContactSource - , Constant::Vertical - , AutoSegment::Local - , true - ); + viaLayer = rp1->getLayer(); + AutoSegment::create( rp1ContactTarget, rp2ContactSource, KbVertical ); return; } viaLayer = Session::getContactLayer(1); - AutoContact* subContact1 = AutoContact::create ( gcell, rp1->getNet(), Session::getContactLayer(1) ); - AutoContact* subContact2 = AutoContact::create ( gcell, rp1->getNet(), Session::getContactLayer(1) ); + AutoContact* subContact1 = AutoContactTurn::create( gcell, rp1->getNet(), Session::getContactLayer(1) ); + AutoContact* subContact2 = AutoContactTurn::create( gcell, rp1->getNet(), Session::getContactLayer(1) ); - AutoSegment::create ( rp1ContactTarget, subContact1 , Constant::Horizontal, AutoSegment::Local, true ); - AutoSegment::create ( subContact1 , subContact2 , Constant::Vertical , AutoSegment::Local, true ); - AutoSegment::create ( subContact2 , rp2ContactSource, Constant::Horizontal, AutoSegment::Local, true ); + AutoSegment::create( rp1ContactTarget, subContact1 , KbVertical ); + AutoSegment::create( subContact1 , subContact2 , KbHorizontal ); + AutoSegment::create( subContact1 , rp2ContactSource, KbVertical ); } - AutoContact* GCellConfiguration::_GCell_L3V_L2H ( GCell* gcell - , Net* net - , AutoContact* source - , AutoContact* target - , bool hcollapse - , bool vcollapse - , bool terminal ) + void GCellTopology::_do_xG () { - AutoContact* subContact = AutoContact::create ( gcell, net, Session::getContactLayer(1) ); + ltrace(99) << "_do_xG()" << endl; - AutoSegment::create ( source, subContact, Constant::Vertical, AutoSegment::Local, terminal, vcollapse ); + if (_connexity.fields.globals == 2) { + _southWestContact + = _northEastContact + = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + } else if (_connexity.fields.globals == 3) { + if (_east and _west) { + _southWestContact = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + _northEastContact = AutoContactVTee::create( _gcell, _net, Session::getContactLayer(1) ); + if (_south) swap( _southWestContact, _northEastContact ); - if ( !target ) - target = AutoContact::create ( gcell, net, Session::getContactLayer(1) ); + AutoSegment::create( _southWestContact, _northEastContact, KbVertical ); + } else { + _southWestContact = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + _northEastContact = AutoContactHTee::create( _gcell, _net, Session::getContactLayer(1) ); + if (_west) swap( _southWestContact, _northEastContact ); - AutoSegment::create ( subContact, target, Constant::Horizontal, AutoSegment::Local, terminal, hcollapse ); - - return target; + AutoSegment::create( _southWestContact, _northEastContact, KbHorizontal ); + } + } else { // fields.globals == 4. + AutoContact* turn = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + _southWestContact = AutoContactHTee::create( _gcell, _net, Session::getContactLayer(1) ); + _northEastContact = AutoContactVTee::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( _southWestContact, turn, KbHorizontal ); + AutoSegment::create( turn, _northEastContact, KbVertical ); + } } - AutoContact* GCellConfiguration::_GCell_L2H_L3V ( GCell* gcell - , Net* net - , AutoContact* source - , AutoContact* target - , bool hcollapse - , bool vcollapse - , bool terminal ) + void GCellTopology::_do_xG_1Pad () { - AutoContact* subContact = AutoContact::create ( gcell, net, Session::getContactLayer(1) ); - - AutoSegment::create ( source, subContact, Constant::Horizontal, AutoSegment::Local, terminal, hcollapse ); - - if ( !target ) { - target = AutoContact::create ( gcell, net, Session::getContactLayer(1) ); - } - - AutoSegment::create ( subContact, target, Constant::Vertical, AutoSegment::Local, terminal, vcollapse ); - - return target; - } - - - void GCellConfiguration::_GCell_xG_1Pad () - { - ltrace(99) << "_GCell_1G_1Pad() [Managed Configuration - Optimized] " << _topology << endl; + ltrace(99) << "_do_xG_1Pad() [Managed Configuration - Optimized] " << _topology << endl; ltracein(99); - bool topRightPad = false; - Instance* padInstance = _routingPads[0]->getOccurrence().getPath().getHeadInstance(); + bool eastPad = false; + bool westPad = false; + bool northPad = false; + bool southPad = false; + Instance* padInstance = dynamic_cast(_routingPads[0])->getOccurrence().getPath().getHeadInstance(); switch ( padInstance->getTransformation().getOrientation() ) { - case Transformation::Orientation::ID: // North side. - case Transformation::Orientation::YR: // Right side. - case Transformation::Orientation::R3: // Right side (alterate). - topRightPad = true; - break; - case Transformation::Orientation::MY: // South side. - case Transformation::Orientation::R1: // Left side. - break; + case Transformation::Orientation::ID: northPad = true; break; + case Transformation::Orientation::YR: eastPad = true; break; + case Transformation::Orientation::R3: eastPad = true; break; + case Transformation::Orientation::MY: southPad = true; break; + case Transformation::Orientation::R1: westPad = true; break; default: - cerr << Warning("Unmanaged orientation %s for pad <%s>." - ,getString(padInstance->getTransformation().getOrientation()).c_str() - ,getString(padInstance).c_str()) << endl; + cerr << Warning( "Unmanaged orientation %s for pad <%s>." + , getString(padInstance->getTransformation().getOrientation()).c_str() + , getString(padInstance).c_str() ) << endl; break; } Point position = _routingPads[0]->getCenter(); AutoContact* source = NULL; - AutoContact* target = NULL; - AutoContact* swContact = NULL; - AutoContact* neContact = NULL; GCell* gcell = Session::getKatabatic()->getGCellGrid()->getGCell(position); - source = AutoContact::fromRp ( gcell - , _routingPads[0] - , Session::getContactLayer(3) - , position - , DbU::lambda(1.0), DbU::lambda(1.0) - , true - ); + source = AutoContactTerminal::create ( gcell + , _routingPads[0] + , Session::getContactLayer(3) + , position + , DbU::lambda(1.0), DbU::lambda(1.0) + ); + source->setFlags( CntFixed ); - if ( topRightPad ) { - _GCell_GlobalContacts ( false, source, NULL ); + if (northPad or eastPad) { + _southWestContact = _northEastContact = source; ltraceout(99); return; } - target = AutoContact::create ( gcell, _routingPads[0]->getNet(), Session::getContactLayer(2) ); - - AutoSegment* segment = AutoSegment::create ( source - , target - , Constant::Horizontal - , AutoSegment::Local - , true // Terminal. - , false // Collapsed. - ); - segment->setLayer ( Session::getRoutingLayer(3) ); - - if ( _topology & (GLOBAL_HORIZONTAL_END|GLOBAL_BEND|GLOBAL_HORIZONTAL) ) { - source = target; - target = AutoContact::create ( gcell, _routingPads[0]->getNet(), Session::getContactLayer(1) ); - - segment = AutoSegment::create ( source - , target - , Constant::Vertical - , AutoSegment::Local - , false // Terminal. - , false // Collapsed. - ); - //_toFixSegments.push_back ( segment ); - } - - swContact = target; - neContact = swContact; - - if ( _topology & (GLOBAL_HORIZONTAL|GLOBAL_VERTICAL) ) { - neContact = AutoContact::create ( gcell, _routingPads[0]->getNet(), Session::getContactLayer(1) ); - - int direction; - if ( _topology & GLOBAL_HORIZONTAL ) { - direction = Constant::Vertical; - swContact->setVAlignate ( true ); - } else { - direction = Constant::Horizontal; - swContact->setHAlignate ( true ); + // Check for straight lines, which are not managed by _do_xG(). + if (_connexity.fields.globals == 1) { + if (westPad and (_east != NULL)) { + AutoContact* turn = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + _northEastContact = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( source, turn, KbHorizontal ); + AutoSegment::create( turn, _northEastContact, KbVertical ); + ltraceout(99); + return; + } else if (southPad and (_north != NULL)) { + AutoContact* turn = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + _northEastContact = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( source, turn, KbVertical ); + AutoSegment::create( turn, _northEastContact, KbHorizontal ); + ltraceout(99); + return; } - - segment = AutoSegment::create ( swContact - , neContact - , direction - , AutoSegment::Local - , false // Terminal. - , false // Collapsed. - ); } - _GCell_GlobalContacts ( (_topology & (GLOBAL_HORIZONTAL|GLOBAL_VERTICAL)), swContact, neContact ); + ++_connexity.fields.globals; + --_connexity.fields.Pad; + + if (westPad ) _west = source->getBodyHook(); + if (southPad) _south = source->getBodyHook(); + + _do_xG(); + + if (westPad) { + AutoSegment::create( source, _southWestContact, KbHorizontal ); + _west = NULL; + } + if (southPad) { + AutoSegment::create( source, _southWestContact, KbVertical ); + _south = NULL; + } + --_connexity.fields.globals; ltraceout(99); } - void GCellConfiguration::_GCell_1G_1L1 () + void GCellTopology::_do_1G_1PinM2 () { - ltrace(99) << "_GCell_1G_1L1() [Managed Configuration - Optimized] " << _topology << endl; + ltrace(99) << "_do_1G_1PinM2() [Managed Configuration - Optimized] " << _topology << endl; ltracein(99); - bool haccess = false; - Hook* globalHook = NULL; - if ( _east ) { globalHook = _east; haccess = true; } - else if ( _west ) { globalHook = _west; haccess = true; } - else if ( _north ) { globalHook = _north; } - else if ( _south ) { globalHook = _south; } + AutoContact* rpContact = doRp_Access( _gcell, _routingPads[0], NoFlags ); + AutoContact* turn1 = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( rpContact, turn1, KbVertical ); - //Segment* globalSegment = dynamic_cast(globalHook->getComponent()); - //DbU::Unit length = (globalSegment) ? globalSegment->getLength() : 0; - - AutoContact* rpContact = _GCell_rp_Access ( _gcell - , _routingPads[0] - , (_topology & GLOBAL_HORIZONTAL_END) - , haccess //(length > DbU::lambda(50.0*2)) - ); - _GCell_GlobalContacts ( false, rpContact ); + if (_north or _south) { + AutoContact* turn2 = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( turn1, turn2, KbHorizontal ); + turn1 = turn2; + } + _southWestContact = _northEastContact = turn1; ltraceout(99); } - void GCellConfiguration::_GCell_1G_xL1 () + void GCellTopology::_do_1G_1M1 () { - ltrace(99) << "_GCell_1G_" << _state.fields.L1 << "L1() [Managed Configuration]" << endl; + ltrace(99) << "_do_1G_1M1() [Managed Configuration - Optimized] " << _topology << endl; ltracein(99); - AutoContact* subContact = NULL; - if ( _topology & GLOBAL_VERTICAL_END ) { - ltrace(99) << "Global Vertical End" << endl; + unsigned int flags = NoFlags; + Hook* globalHook = NULL; + if (_east ) { globalHook = _east; flags |= HAccess; } + else if (_west ) { globalHook = _west; flags |= HAccess; } + else if (_north) { globalHook = _north; flags |= VSmall; } + else if (_south) { globalHook = _south; flags |= VSmall; } - _southWestContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); - //_southWestContact->setHAlignate ( true ); + _southWestContact = _northEastContact = doRp_Access( _gcell, _routingPads[0], flags ); - sort ( _routingPads.begin(), _routingPads.end(), SortRpByX(false) ); // increasing X. - for ( unsigned int i = 0 ; i < _routingPads.size() ; i++ ) { - subContact = _GCell_rp_Access ( _gcell, _routingPads[i], true, false ); - AutoSegment::create ( _southWestContact, subContact, Constant::Horizontal, AutoSegment::Local, true, false ); - } - } else { - ltrace(99) << "Global Horizontal End" << endl; + ltraceout(99); + } - if ( _east ) sort ( _routingPads.begin(), _routingPads.end(), SortRpByX(false) ); // increasing X. - else sort ( _routingPads.begin(), _routingPads.end(), SortRpByX(true ) ); // decreasing X. - for ( unsigned int i = 0 ; i < _routingPads.size() ; i++ ) { - _southWestContact = _GCell_rp_Access ( _gcell, _routingPads[i], true, false ); - _southWestContact->setHAlignate ( true ); + void GCellTopology::_do_1G_xM1 () + { + ltrace(99) << "_do_1G_" << _connexity.fields.M1 << "M1() [Managed Configuration]" << endl; + ltracein(99); - if ( i ) - AutoSegment::create ( subContact, _southWestContact, Constant::Horizontal, AutoSegment::Local, true, false ); - - subContact = _southWestContact; - } + sort( _routingPads.begin(), _routingPads.end(), SortRpByX(NoFlags) ); // increasing X. + for ( unsigned int i=1 ; i<_routingPads.size() ; ++i ) { + AutoContact* leftContact = doRp_Access( _gcell, _routingPads[i-1], HAccess ); + AutoContact* rightContact = doRp_Access( _gcell, _routingPads[i ], HAccess ); + AutoSegment::create( leftContact, rightContact, KbHorizontal ); } - _northEastContact = _southWestContact; + Component* globalRp = NULL; + if (_east) globalRp = _routingPads[_routingPads.size()-1]; + else if (_west) globalRp = _routingPads[0]; + else { + globalRp = _routingPads[0]; + + ltrace(99) << "| Initial N/S Global RP: " << globalRp << endl; + for ( unsigned int i=1 ; i<_routingPads.size() ; ++i ) { + if (_routingPads[i]->getBoundingBox().getHeight() > globalRp->getBoundingBox().getHeight()) { + ltrace(99) << "| Better RP: " << globalRp << endl; + globalRp = _routingPads[i]; + } + } + } + + AutoContact* globalContact = doRp_Access( _gcell, globalRp, HAccess ); + + if (_north or _south) { + AutoContact* turn = globalContact; + globalContact = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( globalContact, turn, KbHorizontal ); + } + + _northEastContact = _southWestContact = globalContact; ltraceout(99); } - void GCellConfiguration::_GCell_xG_1L1_1L2 () + void GCellTopology::_do_xG_1M1_1M2 () { - ltrace(99) << "_GCell_xG_1L1_1L2() [Managed Configuration]" << endl; + ltrace(99) << "_do_xG_1M1_1M2() [Managed Configuration]" << endl; ltracein(99); - RoutingPad* rpL1; - RoutingPad* rpL2; - if ( _routingPads[0]->getLayer() == Session::getRoutingLayer(0) ) { + Component* rpL1; + Component* rpL2; + if (_routingPads[0]->getLayer() == Session::getRoutingLayer(0)) { rpL1 = _routingPads[0]; rpL2 = _routingPads[1]; } else { @@ -2068,129 +1388,151 @@ namespace { ltrace(99) << "rpL1 := " << rpL1 << endl; ltrace(99) << "rpL2 := " << rpL2 << endl; - AutoContact* rpL1ContactSource; - AutoContact* rpL1ContactTarget; - AutoContact* rpL2ContactSource; - AutoContact* rpL2ContactTarget; + AutoContact* rpL1ContactSource = NULL; + AutoContact* rpL1ContactTarget = NULL; + AutoContact* rpL2ContactSource = NULL; + AutoContact* rpL2ContactTarget = NULL; - _GCell_rp_AutoContacts ( _gcell, rpL1, rpL1ContactSource, rpL1ContactTarget, true ); - AutoContact* subContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); - AutoSegment::create ( rpL1ContactSource, subContact, Constant::Horizontal, AutoSegment::Local, true ); + doRp_AutoContacts( _gcell, rpL1, rpL1ContactSource, rpL1ContactTarget, NoFlags ); + doRp_AutoContacts( _gcell, rpL2, rpL2ContactSource, rpL2ContactTarget, NoFlags ); - _GCell_rp_AutoContacts ( _gcell, rpL2, rpL2ContactSource, rpL2ContactTarget, false ); - AutoSegment::create ( rpL2ContactSource, subContact, Constant::Vertical, AutoSegment::Local, true ); + AutoContact* subContact = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( rpL1ContactSource, subContact, KbHorizontal ); + AutoSegment::create( rpL2ContactSource, subContact, KbVertical ); - if ( _state.fields.globals > 0 ) { - _GCell_rp_AutoContacts ( _gcell, rpL2, _southWestContact, subContact, (_south == NULL) ); - if ( _state.fields.globals > 2 ) { - _GCell_rp_AutoContacts ( _gcell, rpL2, _northEastContact, subContact, (_north == NULL) ); - } else - _northEastContact = _southWestContact; + if (_south or _west) { + doRp_AutoContacts( _gcell, rpL2, rpL2ContactSource, rpL2ContactTarget, DoSourceContact ); + if (_south and _west) { + _southWestContact = AutoContactHTee::create( _gcell, _net, Session::getContactLayer(2) ); + AutoSegment::create( rpL2ContactSource, _southWestContact, KbHorizontal ); + } else { + if (_south) { + _southWestContact = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(2) ); + AutoSegment::create( rpL2ContactSource, _southWestContact, KbHorizontal ); + } else { + _southWestContact = rpL2ContactSource; + } + } + } + + if (_north or _east) { + doRp_AutoContacts( _gcell, rpL2, rpL2ContactSource, rpL2ContactTarget, DoTargetContact ); + if (_north and _east) { + _northEastContact = AutoContactHTee::create( _gcell, _net, Session::getContactLayer(2) ); + AutoSegment::create( rpL2ContactTarget, _northEastContact, KbHorizontal ); + } else { + if (_north) { + _northEastContact = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(2) ); + AutoSegment::create( rpL2ContactTarget, _northEastContact, KbHorizontal ); + } else { + _northEastContact = rpL2ContactTarget; + } + } } ltraceout(99); } - void GCellConfiguration::_GCell_xG_xL1_xL3 () + void GCellTopology::_do_xG_xM1_xM3 () { - ltrace(99) << "_GCell_xG_" << _state.fields.L1 - << "L1_" << _state.fields.L3 - << "L3() [G:" << _state.fields.globals << " Managed Configuration]" << endl; + ltrace(99) << "_do_xG_" << _connexity.fields.M1 + << "M1_" << _connexity.fields.M3 + << "M3() [G:" << _connexity.fields.globals << " Managed Configuration]" << endl; ltracein(99); - ltrace(99) << "_topology: " << _topology << endl; - ltrace(99) << "_north: " << _north << endl; - ltrace(99) << "_south: " << _south << endl; - ltrace(99) << "_east: " << _east << endl; - ltrace(99) << "_west: " << _west << endl; + ltrace(99) << "_connexity: " << _connexity.connexity << endl; + ltrace(99) << "_north: " << _north << endl; + ltrace(99) << "_south: " << _south << endl; + ltrace(99) << "_east: " << _east << endl; + ltrace(99) << "_west: " << _west << endl; - bool hsmall = false; - bool vsmall = false; - bool punctual = false; - AutoSegment* segment = NULL; + Component* rpM3 = NULL; + if (_routingPads[0]->getLayer() == Session::getRoutingLayer(2)) + rpM3 = _routingPads[0]; - sort ( _routingPads.begin(), _routingPads.end(), SortRpByX(false) ); // increasing X. - if ( _topology & GLOBAL_HORIZONTAL ) { - AutoContact* subContact1 = NULL; - AutoContact* subContact2 = NULL; - for ( unsigned int i = 0 ; i < _routingPads.size() ; i++ ) { - subContact1 = _GCell_rp_Access ( _gcell, _routingPads[i], true, false ); - subContact1->setHAlignate ( true ); + sort( _routingPads.begin(), _routingPads.end(), SortRpByX(NoFlags) ); // increasing X. + for ( unsigned int i=1 ; i<_routingPads.size() ; ++i ) { + AutoContact* leftContact = doRp_Access( _gcell, _routingPads[i-1], HAccess ); + AutoContact* rightContact = doRp_Access( _gcell, _routingPads[i ], HAccess ); + AutoSegment::create( leftContact, rightContact, KbHorizontal ); - if ( i ) { - segment = AutoSegment::create ( subContact1 - , subContact2 - , Constant::Horizontal - , AutoSegment::Local - , true - , false ); - segment->setStrap ( true ); - } else - _southWestContact = subContact1; + if (not rpM3 and (_routingPads[i]->getLayer() == Session::getRoutingLayer(2))) + rpM3 = _routingPads[i]; + } - subContact2 = subContact1; + AutoContact* unusedContact = NULL; + + if (rpM3) { + // At least one M3 RoutingPad is present: use it. + if (_west and not _south) { + _southWestContact = doRp_Access( _gcell, _routingPads[0], HAccess ); + } else if (not _west and _south) { + doRp_AutoContacts( _gcell, rpM3, _southWestContact, unusedContact, DoSourceContact ); + } else if (_west and _south) { + AutoContact* rpContact = NULL; + doRp_AutoContacts( _gcell, rpM3, rpContact, unusedContact, DoSourceContact ); + _southWestContact = AutoContactVTee::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( rpContact, _southWestContact, KbVertical ); + } + + if (_east and not _north) { + _northEastContact = doRp_Access( _gcell, _routingPads[_routingPads.size()-1], HAccess ); + } else if (not _east and _north) { + doRp_AutoContacts( _gcell, rpM3, unusedContact, _northEastContact, DoTargetContact ); + } else if (_east and _north) { + AutoContact* rpContact = NULL; + doRp_AutoContacts( _gcell, rpM3, unusedContact, rpContact, DoTargetContact ); + _northEastContact = AutoContactVTee::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( rpContact, _northEastContact, KbVertical ); } - _northEastContact = subContact1; } else { - ltrace(99) << "Not straight horizontal " << _south << endl; - - _GCell_GlobalContacts ( _topology & GLOBAL_SPLIT ); - AutoContact* localContact = (_south) ? _southWestContact : _northEastContact; - //localContact->setHAlignate ( true ); - - bool doTurn = (_topology & GLOBAL_SPLIT) and (_state.fields.Pad == 1); - for ( unsigned int i = 0 ; i < _routingPads.size() ; i++ ) { - AutoContact* rpContact = _GCell_rp_Access ( _gcell, _routingPads[i], true, false ); - AutoContact* turn1 - = (doTurn) ? AutoContact::create(_gcell,_net,Session::getContactLayer(1)) : localContact; - - segment = AutoSegment::create ( rpContact - , turn1 - , Constant::Horizontal - , AutoSegment::Local - , true - , false ); - setIsRoutingPadSmall ( _routingPads[i], hsmall, vsmall, punctual ); - if ( not vsmall ) segment->setStrap ( true ); - - if ( doTurn ) { - AutoContact* turn2 = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); - segment = AutoSegment::create ( turn1 - , turn2 - , Constant::Vertical - , AutoSegment::Local - , true - , false ); - segment->setStrap ( true ); - segment = AutoSegment::create ( turn2 - , localContact - , Constant::Horizontal - , AutoSegment::Local - , true - , false ); - segment->setStrap ( true ); + Component* southWestRp = _routingPads[0]; + ltrace(99) << "| Initial S-W Global RP: " << southWestRp << endl; + for ( unsigned int i=1 ; i<_routingPads.size() ; ++i ) { + if (southWestRp->getBoundingBox().getHeight() >= 4*DbU::lambda(5.0)) break; + if (_routingPads[i]->getBoundingBox().getHeight() > southWestRp->getBoundingBox().getHeight()) { + ltrace(99) << "| Better RP: " << southWestRp << endl; + southWestRp = _routingPads[i]; } } - if ( _topology & GLOBAL_BEND ) { - ltrace(99) << "Global Bend " << _southWestContact << endl; - _southWestContact->setVAlignate ( true ); + // All RoutingPad are M1. + if (_west and not _south) { + _southWestContact = doRp_Access( _gcell, southWestRp, HAccess ); + } else if (not _west and _south) { + AutoContact* rpContact = doRp_Access( _gcell, southWestRp, HAccess ); + _southWestContact = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( rpContact, _southWestContact, KbHorizontal ); + } else if (_west and _south) { + AutoContact* rpContact = doRp_Access( _gcell, southWestRp, HAccess ); + _southWestContact = AutoContactHTee::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( rpContact, _southWestContact, KbHorizontal ); } - if ( _topology & (GLOBAL_VERTICAL|GLOBAL_FORK) ) { - ltrace(99) << "Global Vertical/Global fork " << _south << endl; + Component* northEastRp = _routingPads[_routingPads.size()-1]; + ltrace(99) << "| Initial N-E Global RP: " << northEastRp << endl; - unsigned int direction = (not _south or not _north) ? Constant::Vertical : Constant::Horizontal; - segment = AutoSegment::create ( _southWestContact - , _northEastContact - , direction - , AutoSegment::Local - , false - , false - ); - segment->setStrap ( true ); - _northEastContact->setVAlignate ( true ); - _southWestContact->setVAlignate ( true ); + if (_routingPads.size() > 1) { + unsigned int i=_routingPads.size()-2; + do { + if (northEastRp->getBoundingBox().getHeight() >= 4*DbU::lambda(5.0)) break; + if (_routingPads[i]->getBoundingBox().getHeight() > northEastRp->getBoundingBox().getHeight()) { + ltrace(99) << "| Better RP: " << northEastRp << endl; + northEastRp = _routingPads[i]; + } + } while (i != 0); + } + + if (_east and not _north) { + _northEastContact = doRp_Access( _gcell, northEastRp, HAccess ); + } else if (not _east and _north) { + AutoContact* rpContact = doRp_Access( _gcell, northEastRp, HAccess ); + _northEastContact = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( rpContact, _northEastContact, KbHorizontal ); + } else if (_east and _north) { + AutoContact* rpContact = doRp_Access( _gcell, northEastRp, HAccess ); + _northEastContact = AutoContactHTee::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( rpContact, _northEastContact, KbHorizontal ); } } @@ -2198,248 +1540,234 @@ namespace { } - void GCellConfiguration::_GCell_xG_xL2 () + void GCellTopology::_do_xG_xM2 () { - ltrace(99) << "_GCell_" - << _state.fields.globals << "G_" - << _state.fields.L2 << "L2() [Managed Configuration - x]" << endl; + ltrace(99) << "_do_" + << _connexity.fields.globals << "G_" + << _connexity.fields.M2 << "M2() [Managed Configuration - x]" << endl; ltracein(99); - unsigned int lastRP = _routingPads.size() - 1; - RoutingPad* biggestRP = _routingPads[lastRP]; - - sort ( _routingPads.begin(), _routingPads.end(), SortRpByX(false) ); // increasing X. - - for ( unsigned int i = 0 ; i < lastRP ; i++ ) { - _GCell_rp_StairCaseH ( _gcell, _routingPads[i], _routingPads[i+1] ); - if ( _routingPads[i]->getBoundingBox().getWidth() - > biggestRP->getBoundingBox().getWidth() ) - biggestRP = _routingPads[i]; + Component* biggestRp = _routingPads[0]; + for ( unsigned int i=1 ; i<_routingPads.size() ; ++i ) { + doRp_StairCaseH( _gcell, _routingPads[i-1], _routingPads[i] ); + if (_routingPads[i]->getBoundingBox().getWidth() > biggestRp->getBoundingBox().getWidth()) + biggestRp = _routingPads[i]; } - RoutingPad* leftRP = biggestRP; - RoutingPad* rightRP = biggestRP; + AutoContact* unusedContact = NULL; - switch ( _topology ) { - case GLOBAL_VERTICAL_END: break; - case GLOBAL_HORIZONTAL_END: - if ( _west ) leftRP = _routingPads[0]; - if ( _east ) leftRP = _routingPads[lastRP]; - rightRP = leftRP; - break; - case GLOBAL_HORIZONTAL: - leftRP = _routingPads[0]; - rightRP = _routingPads[lastRP]; - break; - case GLOBAL_VERTICAL: break; - case GLOBAL_BEND: break; - case GLOBAL_FORK: break; + if (_west and not _south) { + doRp_AutoContacts( _gcell, _routingPads[0], _southWestContact, unusedContact, DoSourceContact ); + } else if (not _west and _south) { + _southWestContact = doRp_Access( _gcell, biggestRp, NoFlags ); + } else if (_west and _south) { + AutoContact* rpContact = doRp_Access( _gcell, biggestRp, NoFlags ); + _southWestContact = AutoContactVTee::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( rpContact, _southWestContact, KbVertical ); } - AutoContact* subContact; - if ( leftRP == rightRP ) { - _southWestContact = _GCell_rp_Access ( _gcell, leftRP, (_south == NULL) && (_north == NULL), false ); - _northEastContact = _southWestContact; - //_GCell_rp_AutoContacts ( _gcell, leftRP, _southWestContact, _northEastContact, (_south == NULL) && (_north == NULL) ); - } else { - ltrace(99) << "Using separate global contacts" << endl; - _GCell_rp_AutoContacts ( _gcell, leftRP , _southWestContact, subContact, (_south == NULL) ); - _GCell_rp_AutoContacts ( _gcell, rightRP, subContact, _northEastContact, (_north == NULL) ); - ltrace(99) << "leftRp: " << leftRP->getCenter() << " " << leftRP << endl; - ltrace(99) << "rightRp: " << rightRP->getCenter() << " " << rightRP << endl; + if (_east and not _north) { + doRp_AutoContacts( _gcell, _routingPads[_routingPads.size()-1], _northEastContact, unusedContact, DoSourceContact ); + } else if (not _east and _north) { + _northEastContact = doRp_Access( _gcell, biggestRp, NoFlags ); + } else if (_east and _north) { + AutoContact* rpContact = doRp_Access( _gcell, biggestRp, NoFlags ); + _northEastContact = AutoContactVTee::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( rpContact, _northEastContact, KbVertical ); } ltraceout(99); } - void GCellConfiguration::_GCell_1G_1L3 () + void GCellTopology::_do_1G_1M3 () { - ltrace(99) << "_GCell_1G_1L3() [Optimised Configuration]" << endl; + ltrace(99) << "_do_1G_1M3() [Optimised Configuration]" << endl; ltracein(99); - bool useEnds = (_north != NULL) or (_south != NULL); + unsigned int flags = (_east or _west) ? HAccess : NoFlags; + flags |= (_north) ? DoTargetContact : NoFlags; + flags |= (_south) ? DoSourceContact : NoFlags; - _GCell_rp_AutoContacts ( _gcell - , _routingPads[0] - , _southWestContact - , _northEastContact - , not useEnds - ); + doRp_AutoContacts( _gcell + , _routingPads[0] + , _southWestContact + , _northEastContact + , flags + ); + if (not _southWestContact) _southWestContact = _northEastContact; + if (not _northEastContact) _northEastContact = _southWestContact; ltrace(99) << "_southWest: " << _southWestContact << endl; ltrace(99) << "_northEast: " << _northEastContact << endl; - if ( useEnds ) { - ltrace(99) << "Using Ends" << endl; - if ( _north != NULL ) { - ltrace(99) << _gcell << endl; - ltrace(99) << "Using _northEast, _north: " << _north << endl; - ltrace(99) << " _south: " << _south << endl; - _southWestContact = _northEastContact; - } - - //AutoContact* subContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); - //AutoSegment::create ( _southWestContact, subContact, Constant::Horizontal, AutoSegment::Local, true ); - - //_southWestContact = _northEastContact = subContact; - } else { - if ( _routingPads[0]->getBoundingBox().getHeight() < DbU::lambda(15) ) { - AutoContact* subContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); - AutoSegment::create ( _southWestContact, subContact, Constant::Vertical, AutoSegment::Local, true ); + if (flags & HAccess) { + // HARDCODED VALUE. + if (_routingPads[0]->getBoundingBox().getHeight() < DbU::lambda(15)) { + AutoContact* subContact = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( _southWestContact, subContact, KbVertical ); _southWestContact = _northEastContact = subContact; } + } else { + if (_sourceContact) { + if (_sourceContact->getX() != _southWestContact->getX()) { + AutoContactTurn* turn1 = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoContactTurn* turn2 = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( _southWestContact, turn1, KbVertical ); + AutoSegment::create( turn1 , turn2, KbHorizontal ); + _southWestContact = _northEastContact = turn2; + } + } } ltraceout(99); } - void GCellConfiguration::_GCell_xG_xL3 () + void GCellTopology::_do_xG_xM3 () { - ltrace(99) << "_GCell_xG_" << _state.fields.L3 - << "L3() [Managed Configuration]" << endl; + ltrace(99) << "_do_xG_" << _connexity.fields.M3 + << "M3() [Managed Configuration]" << endl; ltracein(99); + ltrace(99) << "_west:" << _west << endl; + ltrace(99) << "_east:" << _east << endl; + ltrace(99) << "_south:" << _south << endl; + ltrace(99) << "_north:" << _north << endl; - AutoContact* unusedContact; - - if ( _south ) sort ( _routingPads.begin(), _routingPads.end(), SortRpByY(false) ); // increasing Y. - else sort ( _routingPads.begin(), _routingPads.end(), SortRpByY(true ) ); // decreasing Y. - - for ( unsigned int i = 1 ; i < _routingPads.size() ; i++ ) { - _GCell_rp_StairCaseV ( _gcell, _routingPads[i-1], _routingPads[i] ); + sort( _routingPads.begin(), _routingPads.end(), SortRpByY(NoFlags) ); // increasing Y. + for ( unsigned int i=1 ; i<_routingPads.size() ; i++ ) { + doRp_StairCaseV( _gcell, _routingPads[i-1], _routingPads[i] ); } - if ( (_routingPads.size() == 1) and (_state.fields.globals == 2) ) - _topology |= GLOBAL_FIXED; + AutoContact* unusedContact = NULL; + Component* rp = _routingPads[0]; - if ( _west or _south ) { - _GCell_rp_AutoContacts ( _gcell, _routingPads[0], _southWestContact, unusedContact, false ); - // _southWestContact = AutoContact::fromRp ( _gcell - // , _routingPads[0] - // , Session::getContactLayer(1) - // , _routingPads[0]->getCenter() - // , DbU::lambda(1.0), DbU::lambda(1.0) - // ); + if (_west and not _south) { + _southWestContact = doRp_Access( _gcell, rp, HAccess ); + } else if (not _west and _south) { + doRp_AutoContacts( _gcell, rp, _southWestContact, unusedContact, DoSourceContact ); + if (_sourceContact) { + if (_sourceContact->getX() != _southWestContact->getX()) { + ltrace(200) << "Misaligned South: _source:" << DbU::getValueString(_sourceContact->getX()) + << "_southWest:" << DbU::getValueString(_southWestContact->getX()) << endl; + + AutoContactTurn* turn1 = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoContactTurn* turn2 = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( _southWestContact, turn1, KbVertical ); + AutoSegment::create( turn1 , turn2, KbHorizontal ); + _southWestContact = turn2; + } + } + } else if (_west and _south) { + AutoContact* rpContact = NULL; + doRp_AutoContacts( _gcell, rp, rpContact, unusedContact, DoSourceContact ); + _southWestContact = AutoContactVTee::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( rpContact, _southWestContact, KbVertical ); } - if ( _west and not _south ) { - AutoContact* subContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); + rp = _routingPads[_routingPads.size()-1]; + if (_east and not _north) { + _northEastContact = doRp_Access( _gcell, rp, HAccess ); + } else if (not _east and _north) { + doRp_AutoContacts( _gcell, rp, unusedContact, _northEastContact, DoTargetContact ); + if (_sourceContact) { + if (_sourceContact->getX() != _northEastContact->getX()) { + ltrace(200) << "Misaligned North: _source:" << DbU::getValueString(_sourceContact->getX()) + << "_southWest:" << DbU::getValueString(_northEastContact->getX()) << endl; - AutoSegment::create ( subContact, _southWestContact, Constant::Vertical, AutoSegment::Local, true ); - _southWestContact = subContact; + AutoContactTurn* turn1 = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoContactTurn* turn2 = AutoContactTurn::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( _northEastContact, turn1, KbVertical ); + AutoSegment::create( turn1 , turn2, KbHorizontal ); + _northEastContact = turn2; + } + } + } else if (_east and _north) { + AutoContact* rpContact = NULL; + doRp_AutoContacts( _gcell, rp, unusedContact, rpContact, DoTargetContact ); + _northEastContact = AutoContactVTee::create( _gcell, _net, Session::getContactLayer(1) ); + AutoSegment::create( rpContact, _northEastContact, KbVertical ); } - if ( _east or _north ) { - _GCell_rp_AutoContacts ( _gcell, _routingPads[0], unusedContact, _northEastContact, false ); - // _northEastContact = AutoContact::fromRp ( _gcell - // , _routingPads[_routingPads.size()-1] - // , Session::getContactLayer(1) - // , _routingPads[_routingPads.size()-1]->getCenter() - // , DbU::lambda(1.0), DbU::lambda(1.0) - // ); - } - - if ( _east and not _north ) { - AutoContact* subContact = AutoContact::create ( _gcell, _net, Session::getContactLayer(1) ); - - AutoSegment::create ( subContact, _northEastContact, Constant::Vertical, AutoSegment::Local, true ); - _northEastContact = subContact; - } - - if ( !_southWestContact ) _southWestContact = _northEastContact; - if ( !_northEastContact ) _northEastContact = _southWestContact; - ltraceout(99); } void singleGCell ( KatabaticEngine* ktbt, Net* net ) { - ltrace(99) << "singleGCell () " << net << endl; + ltrace(99) << "singleGCell() " << net << endl; ltracein(99); - vector routingPads; + vector rpM1s; + Component* rpM2 = NULL; forEach ( RoutingPad*, irp, net->getRoutingPads() ) { - routingPads.push_back ( *irp ); + if (Session::getRoutingGauge()->getLayerDepth(irp->getLayer()) == 1) + rpM2 = *irp; + else + rpM1s.push_back( *irp ); } - if ( routingPads.size() < 2 ) { - cerr << Error("For %s, less than two Plugs/Pins (%d)." - ,getString(net).c_str() - ,routingPads.size()) << endl; + if ((rpM1s.size() < 2) and not rpM2) { + cerr << Error( "For %s, less than two Plugs/Pins (%d)." + , getString(net).c_str() + , rpM1s.size() ) << endl; ltraceout(99); return; } - // if ( routingPads.size() > 2 ) { - // cerr << Error("For %s, more than two Plugs/Pins (%d) in single GCell." - // ,getString(net).c_str() - // ,routingPads.size()) << endl; - // ltraceout(99); - // return; - // } + sort( rpM1s.begin(), rpM1s.end(), SortRpByX(NoFlags) ); // increasing X. - sort ( routingPads.begin(), routingPads.end(), SortRpByX(false) ); // increasing X. + GCell* gcell = ktbt->getGCellGrid()->getGCell( (*rpM1s.begin ())->getCenter() + , (*rpM1s.rbegin())->getCenter() ); - GCell* gcell = ktbt->getGCellGrid()->getGCell ( (*routingPads.begin ())->getCenter() - , (*routingPads.rbegin())->getCenter() ); - - if ( !gcell ) { - cerr << Error("No GCell under %s.",getString(routingPads[0]).c_str()) << endl; + if (not gcell) { + cerr << Error( "No GCell under %s.", getString(rpM1s[0]).c_str() ) << endl; ltraceout(99); return; } ltrace(80) << "singleGCell " << gcell << endl; - AutoContact* dummy = NULL; + AutoContact* turn = NULL; AutoContact* source = NULL; AutoContact* target = NULL; - for ( size_t irp=1 ; irpgetNativeConstraintBox (); - // Box targetBox = target->getNativeConstraintBox (); - - // if ( ( sourceBox.getYMax() < targetBox.getYMin() ) - // || ( sourceBox.getYMin() > targetBox.getYMax() ) ) { - // AutoContact* subContact1 = AutoContact::create ( gcell, net, Session::getContactLayer(1) ); - // AutoSegment::create ( source, subContact1, Constant::Vertical, AutoSegment::Local, true ); - - // AutoContact* subContact2 = AutoContact::create ( gcell, net, Session::getContactLayer(1) ); - // AutoSegment::create ( target, subContact2, Constant::Vertical, AutoSegment::Local, true ); - - // AutoSegment::create ( subContact1, subContact2, Constant::Horizontal, AutoSegment::Local, false ); - // } else - // AutoSegment::create ( source, target, Constant::Horizontal, AutoSegment::Local, true ); + if (rpM2) { + GCellTopology::doRp_AutoContacts( gcell, rpM1s[0], source, turn, DoSourceContact ); + GCellTopology::doRp_AutoContacts( gcell, rpM2 , target, turn, DoSourceContact ); + turn = AutoContactTurn::create( gcell, rpM2->getNet(), Session::getContactLayer(1) ); + AutoSegment::create( source, turn , KbHorizontal ); + AutoSegment::create( turn , target, KbVertical ); + } ltraceout(99); } -} // End of anonymous namespace. +} // Anonymous namespace. namespace Katabatic { - + using Hurricane::ltracein; + using Hurricane::ltraceout; + using Hurricane::ltracelevel; using Hurricane::Name; using Hurricane::DebugSession; using Hurricane::Error; using Hurricane::Warning; using Hurricane::Bug; using CRL::addMeasure; + using CRL::getMeasure; void KatabaticEngine::_loadGrByNet () @@ -2447,56 +1775,53 @@ namespace Katabatic { cmess1 << " o Loading Nets global routing from Knik." << endl; cmess1 << Dots::asDouble(" - Saturation",getMeasure(getCell(),"Sat.")->getData()) << endl; - startMeasures (); - Session::open ( this ); + startMeasures(); + Session::open( this ); - //sort ( _routingNets.begin(), _routingNets.end(), NetCompareByName() ); NetSet::iterator inet = _routingNets.begin(); while ( inet != _routingNets.end() ) { - _loadNetGlobalRouting ( *(inet++) ); + DebugSession::open( *inet, 80 ); + _loadNetGlobalRouting( *(inet++) ); + Session::revalidate(); + DebugSession::close(); } - Session::revalidate (); - - for ( inet=_routingNets.begin() ; inet != _routingNets.end() ; ++inet ) - _toOptimals ( *inet ); - - Session::revalidate (); - #if defined(CHECK_DATABASE) _check ( "after Katabatic loading" ); #endif - _print (); - //_gcellGrid->checkEdgeSaturation ( 0.60 ); - Session::close (); + _print(); + Session::close(); - stopMeasures (); - printMeasures ( "load" ); + stopMeasures(); + printMeasures( "load" ); - addMeasure ( getCell(), "Globals", AutoSegment::getGlobalsCount() ); - addMeasure ( getCell(), "Edges" , AutoSegment::getAllocateds() ); + addMeasure( getCell(), "Globals", AutoSegment::getGlobalsCount() ); + addMeasure( getCell(), "Edges" , AutoSegment::getAllocateds() ); } void KatabaticEngine::_loadNetGlobalRouting ( Net* net ) { - DebugSession::open ( net, 80 ); - - ltrace(100) << "Katabatic::_loadNetGlobalRouting ( " << net << " )" << endl; + ltrace(100) << "Katabatic::_loadNetGlobalRouting( " << net << " )" << endl; ltracein(99); - //cmess2 << " - " << net << endl; - ForkStack forks; Hook* sourceHook = NULL; AutoContact* sourceContact = NULL; - lookupClear (); + lookupClear(); - RoutingPads routingPads = net->getRoutingPads (); + RoutingPads routingPads = net->getRoutingPads(); size_t degree = routingPads.getSize(); - if ( degree < 2 ) { + + if (degree == 0) { + cmess2 << Warning("Net \"%s\" do not have any RoutingPad (ignored)." + ,getString(net->getName()).c_str()) << endl; + ltraceout(99); + return; + } + if (degree < 2) { #if 0 if ( !getDemoMode() ) cmess2 << Warning("Net \"%s\" have less than 2 plugs/pins (ignored)." @@ -2512,21 +1837,22 @@ namespace Katabatic { size_t unconnecteds = 0; size_t connecteds = 0; - GCellConfiguration::init ( degree ); + GCellTopology::init( degree ); ltrace(99) << "Start RoutingPad Ring" << endl; forEach ( RoutingPad*, startRp, routingPads ) { bool segmentFound = false; + forEach ( Hook*, ihook, startRp->getBodyHook()->getHooks() ) { ltrace(99) << "Component " << ihook->getComponent() << endl; - Segment* segment = dynamic_cast(ihook->getComponent()); + Segment* segment = dynamic_cast( ihook->getComponent() ); - if ( segment ) { + if (segment) { ++connecteds; segmentFound = true; - GCellConfiguration gcellConf ( getGCellGrid(), *ihook, NULL ); - if ( gcellConf.getStateG() == 1 ) { + GCellTopology gcellConf ( getGCellGrid(), *ihook, NULL ); + if (gcellConf.getStateG() == 1) { if ( (lowestGCell == NULL) or (lowestGCell->getIndex() > gcellConf.getGCell()->getIndex()) ) { ltrace(99) << "Starting from GCell " << gcellConf.getGCell() << endl; lowestGCell = gcellConf.getGCell(); @@ -2536,61 +1862,57 @@ namespace Katabatic { } } } + unconnecteds += (segmentFound) ? 0 : 1; if ( (unconnecteds > 10) and (connecteds == 0) ) { cerr << Warning("More than 10 unconnected RoutingPads (%u) on %s, missing global routing?" ,unconnecteds, getString(net->getName()).c_str() ) << endl; - _routingNets.erase ( net ); - + _routingNets.erase( net ); ltraceout(99); - DebugSession::close (); - return; } - // Comment the next line to enable the lowest GCell search. - //if ( startHook ) break; + // Uncomment the next line to disable the lowest GCell search. + // (takes first GCell with exactly one global). + //if (startHook) break; } ltraceout(99); - if ( startHook == NULL ) { singleGCell ( this, net ); ltraceout(99); return; } + if (startHook == NULL) { singleGCell( this, net ); ltraceout(99); return; } - GCellConfiguration startGCellConf ( getGCellGrid(), startHook, NULL ); - startGCellConf.construct ( forks ); + GCellTopology startGCellConf ( getGCellGrid(), startHook, NULL ); + startGCellConf.construct( forks ); - sourceHook = forks.getFrom (); - sourceContact = forks.getContact (); - forks.pop (); + sourceHook = forks.getFrom (); + sourceContact = forks.getContact(); + forks.pop(); while ( sourceHook ) { - GCellConfiguration gcellConf ( getGCellGrid(), sourceHook, sourceContact ); - gcellConf.construct ( forks ); + GCellTopology gcellConf ( getGCellGrid(), sourceHook, sourceContact ); + gcellConf.construct( forks ); - sourceHook = forks.getFrom (); - sourceContact = forks.getContact (); - forks.pop (); + sourceHook = forks.getFrom(); + sourceContact = forks.getContact(); + forks.pop(); + + ltrace(99) << "Popping (from) " << sourceHook << endl; + ltrace(99) << "Popping (to) " << sourceContact << endl; } - lookupClear (); - - set overconstraineds; - _computeNetConstraints ( net, overconstraineds ); - - Session::revalidate (); + lookupClear(); + Session::revalidate(); +#if THIS_IS_DISABLED set::iterator iover = overconstraineds.begin(); for ( ; iover != overconstraineds.end() ; ++iover ) { - (*iover)->makeDogLeg ( (*iover)->getAutoSource()->getGCell(), true ); + (*iover)->makeDogLeg( (*iover)->getAutoSource()->getGCell(), true ); } +#endif - Session::revalidate (); - - GCellConfiguration::fixSegments (); - + Session::revalidate(); + GCellTopology::fixSegments(); ltraceout(99); - - DebugSession::close (); } -} // End of Katabatic namespace. +} // Katabatic namespace. diff --git a/katabatic/src/NetConstraints.cpp b/katabatic/src/NetConstraints.cpp index a4a2bab2..a9e0318e 100644 --- a/katabatic/src/NetConstraints.cpp +++ b/katabatic/src/NetConstraints.cpp @@ -2,71 +2,51 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./NetConstraints.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -#include -#include - -#include "hurricane/DebugSession.h" -#include "hurricane/BasicLayer.h" -#include "hurricane/Net.h" -#include "hurricane/NetExternalComponents.h" -#include "hurricane/RoutingPad.h" -#include "hurricane/Pad.h" -#include "hurricane/Plug.h" -#include "hurricane/Instance.h" -#include "hurricane/Vertical.h" -#include "hurricane/Horizontal.h" -#include "hurricane/Cell.h" - -#include "katabatic/AutoContact.h" -#include "katabatic/AutoSegment.h" -#include "katabatic/Session.h" -#include "katabatic/KatabaticEngine.h" +#include +#include +#include "hurricane/DebugSession.h" +#include "hurricane/BasicLayer.h" +#include "hurricane/Net.h" +#include "hurricane/NetExternalComponents.h" +#include "hurricane/RoutingPad.h" +#include "hurricane/Pad.h" +#include "hurricane/Plug.h" +#include "hurricane/Instance.h" +#include "hurricane/Vertical.h" +#include "hurricane/Horizontal.h" +#include "hurricane/Cell.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/Session.h" +#include "katabatic/KatabaticEngine.h" namespace { - //! \addtogroup NetConstraints - //! \{ + // \addtogroup NetConstraints + // \{ - /*! \function void propagateConstraintFromRp ( RoutingPad* rp ) + /* \function void propagateConstraintFromRp ( RoutingPad* rp ) * \param rp The \c RoutingPad starting point. * * Do a full constraint propagation starting from this \c RoutingPad. */ - /*! \function void propagateConstraint ( AutoContactStack& segmentStack, DbU::Unit constraintMin, DbU::Unit constraintMax, unsigned int direction ) - * \param segmentStack A vector of \c AutoSegment. - * \param constraintMin The interval lower bound. - * \param constraintMax The interval upper bound. - * \param direction The propagation direction. - * - * Propagate the constraint in the appropriate direction through the vector - * of \c AutoSegments and any other linked through collapse. - */ - - //! \} + // \} using namespace std; @@ -79,198 +59,95 @@ namespace { // Local Functions. - void propagateConstraint ( AutoContactStack& segmentStack - , DbU::Unit constraintMin - , DbU::Unit constraintMax - , unsigned int direction - , set& faileds - ) + void propagateConstraintFromRp ( RoutingPad* rp ) { + ltrace(99) << "propagateConstraintFromRp() - " << rp << endl; ltracein(99); - while ( !segmentStack.isEmpty() ) { - AutoContact* sourceContact = segmentStack.getAutoContact (); - Segment* sourceSegment = segmentStack.getSegment (); - AutoSegment* sourceAutoSegment = Session::lookup ( sourceSegment ); - - segmentStack.pop (); - - if ( sourceContact->isAlignate(direction) ) { - ltrace(99) << "Apply to (source): " << (void*)sourceContact->base() << ":" << sourceContact << endl; - if ( not sourceContact->restrictConstraintBox(constraintMin,constraintMax,direction,false) ) - faileds.insert ( sourceAutoSegment ); - } - - - forEach ( Component*, icomponent, sourceContact->getSlaveComponents() ) { - if ( *icomponent == sourceSegment ) continue; - - Segment* targetSegment = dynamic_cast(*icomponent); - if ( !targetSegment ) continue; - - AutoSegment* targetAutoSegment = Session::lookup ( targetSegment ); - if ( !targetAutoSegment ) { - const BasicLayer* basicLayer = dynamic_cast(targetSegment->getLayer()); - if ( basicLayer && basicLayer->getMaterial() != BasicLayer::Material::metal ) - continue; - - cerr << Error("Can't lookup for ",getString(targetSegment).c_str()) << endl; - continue; - } - - AutoContact* targetContact = Session::lookup - ( dynamic_cast(targetAutoSegment->getOppositeAnchor(sourceContact->base())) ); - - if ( sourceAutoSegment and targetAutoSegment ) { - unsigned int state = AutoSegment::getPerpandicularState - ( sourceContact - , sourceAutoSegment - , targetAutoSegment - , (direction & Constant::Horizontal)?true:false - ); - - if ( !( state & (AutoSegment::PerpandicularIndirect - |AutoSegment::ParallelOrExpanded - |AutoSegment::ParallelAndLayerChange )) ) { - segmentStack.push ( targetContact, targetSegment ); - - if ( targetAutoSegment - && (targetAutoSegment->getDirection() == direction) - && targetContact->isAlignate(direction) ) { - ltrace(99) << "Apply to (target): " << (void*)targetContact->base() << ":" << targetContact << endl; - if ( not targetContact->restrictConstraintBox(constraintMin,constraintMax,direction,false) ) - faileds.insert ( targetAutoSegment ); - } - continue; - } - } - - } - } - - ltraceout(99); - ltrace(99) << "Finished propagating." << endl; - } - - - void propagateConstraintFromRp ( RoutingPad* rp, set& faileds ) - { - ltrace(99) << "propagateConstraintFromRp() - " << (void*)rp << " " << rp << endl; - forEach ( Component*, icomponent, rp->getSlaveComponents() ) { - ltrace(99) << "slave: " << *icomponent << endl; - AutoContact* contact = Session::lookup ( dynamic_cast(*icomponent) ); - if ( contact ) { - ltrace(99) << "Start slave: " << (void*)contact->getContact() << ":" << contact << endl; + ltrace(99) << "slave component: " << *icomponent << endl; + AutoContact* sourceContact = Session::lookup( dynamic_cast(*icomponent) ); + if (sourceContact) { + ltrace(99) << "Start slave: " << sourceContact << endl; - set collapsedContactsSet; - AutoContactStack collapsedContactsStack; - AutoContactStack verticalSegmentsStack; - AutoContactStack horizontalSegmentsStack; + set verticalSegments; + set horizontalSegments; - collapsedContactsStack.push ( contact, NULL ); - collapsedContactsSet.insert ( contact ); + forEach ( AutoSegment*, isegment, sourceContact->getAutoSegments() ) { + ltrace(99) << "Examining: " << (*isegment) << endl; + AutoContact* targetContact = isegment->getOppositeAnchor(sourceContact); - // Find all AutoContacts directly collapeds on the RoutingPad. - while ( !collapsedContactsStack.isEmpty() ) { - AutoContact* sourceContact = collapsedContactsStack.getAutoContact (); - Segment* sourceSegment = collapsedContactsStack.getSegment (); - Segment* segment; - - collapsedContactsStack.pop (); - - forEach ( Component*, icomponent2, sourceContact->getSlaveComponents() ) { - bool isHorizontal = true; - segment = dynamic_cast(*icomponent2); - if ( !segment && (segment = dynamic_cast(*icomponent2)) ) - isHorizontal = false; - if ( !segment || (segment == sourceSegment) ) continue; - - AutoSegment* autoSegment = Session::lookup ( segment ); - if ( !autoSegment ) { - const BasicLayer* basicLayer = dynamic_cast(segment->getLayer()); - if ( basicLayer && basicLayer->getMaterial() != BasicLayer::Material::metal ) - continue; - cerr << Error("Can't lookup for %s.",getString(segment).c_str()) << endl; - continue; - } - - ltrace(99) << "Examining: " << autoSegment << endl; - - AutoContact* targetContact = Session::lookup - ( dynamic_cast(autoSegment->getOppositeAnchor(sourceContact->base())) ); - - if ( targetContact ) { - if ( !autoSegment->isCollapsed() ) { - if ( isHorizontal ) { - ltrace(99) << "On horizontal stack " << (void*)segment << ":" << segment << endl; - horizontalSegmentsStack.push ( targetContact, segment ); - } else { - ltrace(99) << "On vertical stack " << (void*)segment << ":" << segment << endl; - verticalSegmentsStack.push ( targetContact, segment ); - } - } else { - ltrace(99) << "On collapsed stack " << (void*)segment << ":" << segment << endl; - collapsedContactsStack.push ( targetContact, segment ); - collapsedContactsSet.insert ( targetContact ); - } + if (targetContact) { + if (isegment->isHorizontal()) { + ltrace(99) << "On horizontal stack " << (*isegment) << endl; + horizontalSegments.insert( (*isegment) ); + } else { + ltrace(99) << "On vertical stack " << (*isegment) << endl; + verticalSegments.insert( (*isegment) ); } } } - // compute constraint on all AutoContacts collapseds, - // then sets all the constraint Box to the intersection. - ltrace(99) << "Computing constraint:" << endl; - ltracein(99); - set::iterator it = collapsedContactsSet.begin(); - set::iterator end = collapsedContactsSet.end(); - ltrace(99) << *it << " " << (*it)->getConstraintBox() << endl; - Box constraintBox = (*it++)->getConstraintBox (); - for ( ; it != end ; it++ ) { - (*it)->intersectConstraintBox ( constraintBox ); - ltrace(99) << *it << " " << constraintBox << endl; - } + Box constraintBox = sourceContact->getConstraintBox(); - if ( constraintBox.isEmpty() ) { - cerr << "[ERROR] incompatible segment collapse for " << rp << endl; - ltraceout(99); - break; - } - ltraceout(99); - - ltrace(99) << "Applying constraint " << constraintBox << " to:" << endl; - ltracein(99); - it = collapsedContactsSet.begin(); - for ( ; it != end ; it++ ) { - ltrace(99) << *it << endl; - (*it)->setConstraintBox ( constraintBox ); - } - ltraceout(99); - - // Propagate constraint through horizontally bound segments. + // Propagate constraint through horizontally aligned segments. ltrace(99) << "Propagate constraint on horizontal segments" << endl; - propagateConstraint ( horizontalSegmentsStack - , constraintBox.getYMin() - , constraintBox.getYMax() - , Constant::Horizontal - , faileds ); - // Propagate constraint through vertically bound segments. + set::iterator ihorizontal = horizontalSegments.begin(); + for ( ; ihorizontal != horizontalSegments.end() ; ++ihorizontal ) { + AutoContact* contact = NULL; + forEach ( AutoSegment*, ialigned, (*ihorizontal)->getAligneds() ) { + contact = ialigned->getAutoTarget(); + ltrace(99) << "contact: " << contact << endl; + if (contact) { + ltrace(99) << "Apply to (target): " << contact << endl; + contact->restrictConstraintBox( constraintBox.getYMin() + , constraintBox.getYMax() + , KbHorizontal ); + } + contact = ialigned->getAutoSource(); + ltrace(99) << "contact: " << contact << endl; + if (contact) { + ltrace(99) << "Apply to (source): " << contact << endl; + contact->restrictConstraintBox( constraintBox.getYMin() + , constraintBox.getYMax() + , KbHorizontal ); + } + } + } + + // Propagate constraint through vertically aligned segments. ltrace(99) << "Propagate constraint on vertical segments" << endl; - propagateConstraint ( verticalSegmentsStack - , constraintBox.getXMin() - , constraintBox.getXMax() - , Constant::Vertical - , faileds ); + + set::iterator ivertical = verticalSegments.begin(); + for ( ; ivertical != verticalSegments.end() ; ++ivertical ) { + AutoContact* contact = NULL; + forEach ( AutoSegment*, ialigned, (*ivertical)->getAligneds() ) { + contact = ialigned->getAutoTarget(); + if (contact) { + ltrace(99) << "Apply to (target): " << contact << endl; + contact->restrictConstraintBox( constraintBox.getXMin() + , constraintBox.getXMax() + , KbVertical ); + } + contact = ialigned->getAutoSource(); + if (contact) { + ltrace(99) << "Apply to (source): " << contact << endl; + contact->restrictConstraintBox( constraintBox.getXMin() + , constraintBox.getXMax() + , KbVertical ); + } + } + } } } ltrace(99) << "propagateConstraintFromRp() - Exit" << endl; + ltraceout(99); } -} // End of local namespace. - +} // Anonymous namespace. @@ -280,93 +157,37 @@ namespace Katabatic { using Hurricane::Cell; - void KatabaticEngine::_computeNetConstraints ( Net* net, set& faileds ) + void KatabaticEngine::computeNetConstraints ( Net* net ) { - DebugSession::open ( net ); + DebugSession::open( net ); - ltrace(100) << "Katabatic::_computeNetConstraints ( " << net << " )" << endl; + ltrace(100) << "Katabatic::computeNetConstraints( " << net << " )" << endl; ltracein(99); - //cmess2 << " - " << net << endl; - vector routingPads; forEach ( Component*, icomponent, net->getComponents() ) { - Contact* contact = dynamic_cast(*icomponent); - if ( contact ) { - AutoContact* autoContact = Session::lookup ( contact ); - if ( autoContact ) - autoContact->restoreNativeConstraintBox (); + Contact* contact = dynamic_cast( *icomponent ); + if (contact) { + AutoContact* autoContact = Session::lookup( contact ); + if (autoContact) + autoContact->restoreNativeConstraintBox(); } else { - RoutingPad* routingPad = dynamic_cast(*icomponent); - if ( routingPad ) routingPads.push_back ( routingPad ); + RoutingPad* routingPad = dynamic_cast( *icomponent ); + if (routingPad) routingPads.push_back( routingPad ); } } for ( size_t i=0 ; i processeds; - forEach ( Segment*, isegment, net->getSegments() ) { - AutoSegment* autoSegment = Session::lookup ( *isegment ); - if ( !autoSegment ) continue; - autoSegment->toConstraintAxis ( &processeds ); - } + // forEach ( Segment*, isegment, net->getSegments() ) { + // AutoSegment* autoSegment = Session::lookup( *isegment ); + // if (autoSegment) autoSegment->toConstraintAxis(); + // } ltraceout(99); - - DebugSession::close (); + DebugSession::close(); } - void KatabaticEngine::_collapseNets ( Nets nets, unsigned int depth ) - { - forEach ( Net*, inet, nets ) - _collapseNet ( *inet, depth ); - } - - - void KatabaticEngine::_collapseNet ( const Name& name, unsigned int depth ) - { - Net* net = getCell()->getNet ( name ); - - if ( !net ) { - cerr << Error("No net %s in %s" - ,getString(name).c_str() - ,getString(getCell()).c_str()) << endl; - return; - } - - _collapseNet ( net ); - } - - - void KatabaticEngine::_collapseNet ( Net* net, unsigned int depth ) - { - ltrace(100) << "Katabatic::_collapseNet ( " << net << " )" << endl; - ltracein(99); - - forEach ( Component*, icomponent, net->getComponents() ) { - RoutingPad* routingPad = dynamic_cast(*icomponent); - if ( routingPad ) { - ltrace(99) << "RoutingPad " << routingPad << endl; - forEach ( Component*, islaveComponent, routingPad->getSlaveComponents() ) { - ltrace(99) << "SlaveComponent " << *islaveComponent << endl; - Segment* segment = dynamic_cast(*islaveComponent); - if ( segment ) { - AutoSegment* autoSegment = Session::lookup ( segment ); - if ( !autoSegment ) continue; - - if ( autoSegment->isLocal() ) { - ltrace(99) << "Collapsing " << autoSegment << endl; - autoSegment->collapse (); - } - } - } // islaveComponent. - } - } // icomponent. - - ltraceout(99); - } - - -} // End of Katabatic namespace. +} // Katabatic namespace. diff --git a/katabatic/src/NetOptimals.cpp b/katabatic/src/NetOptimals.cpp index a32385e4..0c839c85 100644 --- a/katabatic/src/NetOptimals.cpp +++ b/katabatic/src/NetOptimals.cpp @@ -2,22 +2,21 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./NetOptimals.cpp" | // +-----------------------------------------------------------------+ -#include -#include - +#include +#include #include "hurricane/DebugSession.h" #include "hurricane/Net.h" #include "hurricane/Segment.h" @@ -28,7 +27,6 @@ namespace Katabatic { - using namespace std; using Hurricane::tab; using Hurricane::ltracein; @@ -42,56 +40,46 @@ namespace Katabatic { void KatabaticEngine::_computeNetOptimals ( Net* net ) { - DebugSession::open ( net, 88 ); - - ltrace(100) << "Katabatic::_computeNetOptimals ( " << net << " )" << endl; + DebugSession::open( net, 88 ); + ltrace(100) << "Katabatic::_computeNetOptimals( " << net << " )" << endl; ltracein(99); - //cmess2 << " - " << net << endl; - vector segments; forEach ( Segment*, segment, net->getSegments() ) { - AutoSegment* autoSegment = Session::lookup ( *segment ); - if ( !autoSegment ) continue; - segments.push_back ( autoSegment ); + AutoSegment* autoSegment = Session::lookup( *segment ); + if (autoSegment) segments.push_back( autoSegment ); } - sort ( segments.begin(), segments.end(), AutoSegment::CompareId() ); + sort( segments.begin(), segments.end(), AutoSegment::CompareId() ); set processeds; for ( size_t i=0 ; icomputeOptimal ( &processeds ); + segments[i]->computeOptimal( processeds ); ltraceout(99); - - DebugSession::close (); + DebugSession::close(); } - void KatabaticEngine::_toOptimals ( Net* net, bool onlyNew ) + void KatabaticEngine::toOptimals ( Net* net ) { - DebugSession::open ( net, 88 ); - - ltrace(100) << "Katabatic::_toOptimals ( " << net << " )" << endl; + DebugSession::open( net, 88 ); + ltrace(100) << "Katabatic::_toOptimals( " << net << " )" << endl; ltracein(99); - //cmess2 << " - " << net << endl; - vector segments; forEach ( Segment*, segment, net->getSegments() ) { - AutoSegment* autoSegment = Session::lookup ( *segment ); - if ( not autoSegment ) continue; - segments.push_back ( autoSegment ); + AutoSegment* autoSegment = Session::lookup( *segment ); + if (autoSegment) segments.push_back( autoSegment ); } - sort ( segments.begin(), segments.end(), AutoSegment::CompareId() ); + sort( segments.begin(), segments.end(), AutoSegment::CompareId() ); - set processeds; - for ( size_t i=0 ; itoOptimalAxis ( &processeds ); + for ( size_t i=0 ; iisCanonical()) segments[i]->toOptimalAxis(); + } ltraceout(99); - - DebugSession::close (); + DebugSession::close(); } -} // End of Katabatic namespace. +} // Katabatic namespace. diff --git a/katabatic/src/Observer.cpp b/katabatic/src/Observer.cpp new file mode 100644 index 00000000..9bc74180 --- /dev/null +++ b/katabatic/src/Observer.cpp @@ -0,0 +1,30 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2008-2013, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Module : "./Observer.cpp" | +// +-----------------------------------------------------------------+ + + +#include "katabatic/Observer.h" + + +namespace Katabatic { + +// ------------------------------------------------------------------- +// Classes : "BaseObserver" & "Observer". + + + void BaseObserver::notify ( unsigned int flags ) + { } + + +} // Katabatic namespace. diff --git a/katabatic/src/PowerRails.cpp b/katabatic/src/PowerRails.cpp index c972c662..7e9e1512 100644 --- a/katabatic/src/PowerRails.cpp +++ b/katabatic/src/PowerRails.cpp @@ -2,29 +2,20 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./PowerRails.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Module : "./PowerRails.cpp" | +// +-----------------------------------------------------------------+ #include - #include "hurricane/Warning.h" #include "hurricane/DataBase.h" #include "hurricane/Technology.h" @@ -41,7 +32,6 @@ namespace { - using namespace std; using namespace Hurricane; @@ -49,7 +39,6 @@ namespace { // ------------------------------------------------------------------- // Class : "::RailSegment". - class RailSegment { public: RailSegment ( DbU::Unit axis, DbU::Unit width ); @@ -88,32 +77,31 @@ namespace { switch ( direction ) { case Constant::Horizontal: - segment = Horizontal::create ( net - , layer - , _axis - , _width - , _span.getVMin() - , _span.getVMax() ); + segment = Horizontal::create( net + , layer + , _axis + , _width + , _span.getVMin() + , _span.getVMax() ); break; case Constant::Vertical: - segment = Vertical::create ( net - , layer - , _axis - , _width - , _span.getVMin() - , _span.getVMax() ); + segment = Vertical::create( net + , layer + , _axis + , _width + , _span.getVMin() + , _span.getVMax() ); break; } - if ( segment ) - NetExternalComponents::setExternal ( segment ); + if (segment) + NetExternalComponents::setExternal( segment ); } // ------------------------------------------------------------------- // Class : "::PowerRail". - class PowerRail { public: struct CompareByAxis : binary_function { @@ -147,9 +135,9 @@ namespace { PowerRail::~PowerRail () { - while ( !_segments.empty() ) { - delete _segments.front (); - _segments.pop_front (); + while (not _segments.empty()) { + delete _segments.front(); + _segments.pop_front(); } } @@ -165,34 +153,32 @@ namespace { list::iterator isegment = _segments.begin(); for ( ; (isegment != _segments.end()) && !inserted ; isegment++ ) { - if ( (*isegment)->getWidth() != width ) continue; + if ((*isegment)->getWidth() != width) continue; - if ( (*isegment)->getMin() > max ) { + if ((*isegment)->getMin() > max) { inserted = new RailSegment ( _axis, width ); - inserted->merge ( min ); - inserted->merge ( max ); - _segments.insert ( isegment, inserted ); + inserted->merge( min ); + inserted->merge( max ); + _segments.insert( isegment, inserted ); break; } - if ( (*isegment)->getMax() < min ) { - continue; - } + if ((*isegment)->getMax() < min) continue; inserted = *isegment; - (*isegment)->merge ( min ); - (*isegment)->merge ( max ); + (*isegment)->merge( min ); + (*isegment)->merge( max ); list::iterator imerge = isegment; - if ( imerge != _segments.end() ) imerge++; + if (imerge != _segments.end()) imerge++; - while ( imerge != _segments.end() ) { - if ( (*imerge)->getMin() > (*isegment)->getMax() ) break; + while (imerge != _segments.end()) { + if ((*imerge)->getMin() > (*isegment)->getMax()) break; - (*isegment)->merge ( (*imerge)->getMax() ); + (*isegment)->merge( (*imerge)->getMax() ); delete *imerge; - _segments.erase ( imerge ); + _segments.erase( imerge ); imerge = isegment; imerge++; } @@ -200,11 +186,11 @@ namespace { break; } - if ( !inserted ) { + if (not inserted) { inserted = new RailSegment ( _axis, width ); - inserted->merge ( min ); - inserted->merge ( max ); - _segments.insert ( _segments.end(), inserted ); + inserted->merge( min ); + inserted->merge( max ); + _segments.insert( _segments.end(), inserted ); } } @@ -217,7 +203,7 @@ namespace { list::const_iterator isegment = _segments.begin(); for ( ; isegment != _segments.end() ; isegment++ ) - (*isegment)->doLayout ( cell, railNet, _layer, _direction ); + (*isegment)->doLayout( cell, railNet, _layer, _direction ); } @@ -253,29 +239,29 @@ namespace { PowerPlane::~PowerPlane () { - while ( !_hrails.empty() ) { + while (not _hrails.empty()) { delete _hrails.back(); - _hrails.pop_back (); + _hrails.pop_back(); } - while ( !_vrails.empty() ) { + while (not _vrails.empty()) { delete _vrails.back(); - _vrails.pop_back (); + _vrails.pop_back(); } } size_t PowerPlane::find ( DbU::Unit axis, Constant::Direction direction ) const { - PowerRail bound(Net::Type::GROUND,NULL,Constant::Horizontal,axis); + PowerRail bound (Net::Type::GROUND,NULL,Constant::Horizontal,axis); - if ( direction == Constant::Horizontal ) { + if (direction == Constant::Horizontal) { vector::const_iterator it - = lower_bound(_hrails.begin(),_hrails.end(),&bound,PowerRail::CompareByAxis()); + = lower_bound( _hrails.begin(), _hrails.end(), &bound,PowerRail::CompareByAxis() ); return it - _hrails.begin(); } vector::const_iterator it - = lower_bound(_vrails.begin(),_vrails.end(),&bound,PowerRail::CompareByAxis()); + = lower_bound( _vrails.begin(), _vrails.end(), &bound,PowerRail::CompareByAxis() ); return it - _vrails.begin(); } @@ -297,18 +283,18 @@ namespace { rails = &_hrails; break; } - size_t i = find ( axis, direction ); - if ( ( i == rails->size() ) || ( (*rails)[i]->getAxis() != axis ) ) { + size_t i = find( axis, direction ); + if ( (i == rails->size()) or ((*rails)[i]->getAxis() != axis) ) { PowerRail* rail = new PowerRail (type,_layer,direction,axis); - rail->merge ( width, rmin, rmax ); - rails->push_back ( rail ); - sort ( rails->begin(), rails->end(), PowerRail::CompareByAxis() ); + rail->merge( width, rmin, rmax ); + rails->push_back( rail ); + sort( rails->begin(), rails->end(), PowerRail::CompareByAxis() ); } else { - if ( (*rails)[i]->getType() != type ) { + if ((*rails)[i]->getType() != type) { cerr << Error("Short between power rails at %d.",DbU::getValueString(axis).c_str()) << endl; return; } - (*rails)[i]->merge ( width, rmin, rmax ); + (*rails)[i]->merge( width, rmin, rmax ); } } @@ -316,17 +302,16 @@ namespace { void PowerPlane::doLayout ( Cell* cell, Net* powerNet, Net* groundNet ) const { for ( size_t i=0 ; i<_hrails.size() ; i++ ) - _hrails[i]->doLayout ( cell, powerNet, groundNet ); + _hrails[i]->doLayout( cell, powerNet, groundNet ); for ( size_t i=0 ; i<_vrails.size() ; i++ ) - _vrails[i]->doLayout ( cell, powerNet, groundNet ); + _vrails[i]->doLayout( cell, powerNet, groundNet ); } // ------------------------------------------------------------------- // Class : "::PowerRail". - class PowerGrid { public: PowerGrid ( Cell* ); @@ -350,8 +335,8 @@ namespace { , _planes () { forEach ( Net*, inet, _cell->getNets() ) { - if ( (inet->getType() == Net::Type::POWER) ) { - if ( !inet->isExternal() ) { + if (inet->getType() == Net::Type::POWER) { + if (not inet->isExternal()) { cerr << Warning("Ignoring non-external power net %s." ,getString(*inet).c_str()) << endl; continue; @@ -360,12 +345,12 @@ namespace { break; } } - if ( !_powerNet ) + if (not _powerNet) cerr << Error("Missing POWER net in Cell %s.",getString(_cell->getName()).c_str()) << endl; forEach ( Net*, inet, _cell->getNets() ) { - if ( inet->getType() == Net::Type::GROUND ) { - if ( !inet->isExternal() ) { + if (inet->getType() == Net::Type::GROUND) { + if (not inet->isExternal()) { cerr << Warning("Ignoring non-external ground net %s." ,getString(*inet).c_str()) << endl; continue; @@ -374,7 +359,7 @@ namespace { break; } } - if ( !_groundNet ) + if (not _groundNet) cerr << Error("Missing GROUND net in Cell %s.",getString(_cell->getName()).c_str()) << endl; } @@ -390,11 +375,11 @@ namespace { PowerPlane* PowerGrid::getPlane ( const Layer* layer ) { map::iterator iplane = _planes.find(layer); - if ( iplane != _planes.end() ) + if (iplane != _planes.end()) return iplane->second; PowerPlane* plane = new PowerPlane ( layer ); - _planes.insert ( make_pair(layer,plane) ); + _planes.insert( make_pair(layer,plane) ); return plane; } @@ -406,37 +391,37 @@ namespace { Point source = horizontal->getSourcePosition(); Point target = horizontal->getTargetPosition(); - transformation.applyOn ( source ); - transformation.applyOn ( target ); + transformation.applyOn( source ); + transformation.applyOn( target ); - if ( source.getX() > target.getX() ) swap ( source, target ); - plane->merge ( horizontal->getNet()->getType() - , Constant::Horizontal - , source.getY() - , horizontal->getWidth() - , source.getX() - , target.getX() - ); + if (source.getX() > target.getX()) swap( source, target ); + plane->merge( horizontal->getNet()->getType() + , Constant::Horizontal + , source.getY() + , horizontal->getWidth() + , source.getX() + , target.getX() + ); } void PowerGrid::merge ( const Transformation& transformation, Vertical* vertical ) { - PowerPlane* plane = getPlane ( vertical->getLayer() ); + PowerPlane* plane = getPlane( vertical->getLayer() ); Point source = vertical->getSourcePosition(); Point target = vertical->getTargetPosition(); - transformation.applyOn ( source ); - transformation.applyOn ( target ); + transformation.applyOn( source ); + transformation.applyOn( target ); - if ( source.getY() > target.getY() ) swap ( source, target ); - plane->merge ( vertical->getNet()->getType() - , Constant::Vertical - , source.getX() - , vertical->getWidth() - , source.getY() - , target.getY() - ); + if (source.getY() > target.getY()) swap( source, target ); + plane->merge( vertical->getNet()->getType() + , Constant::Vertical + , source.getX() + , vertical->getWidth() + , source.getY() + , target.getY() + ); } @@ -444,7 +429,7 @@ namespace { { map::const_iterator iplane = _planes.begin (); for ( ; iplane != _planes.end() ; iplane++ ) - iplane->second->doLayout ( _cell, _powerNet, _groundNet ); + iplane->second->doLayout( _cell, _powerNet, _groundNet ); } @@ -463,35 +448,33 @@ namespace { } forEach ( Component*, icomponent, inet->getComponents() ) { - if ( !NetExternalComponents::isExternal(*icomponent) ) continue; + if (not NetExternalComponents::isExternal(*icomponent)) continue; Horizontal* horizontal = dynamic_cast(*icomponent); - if ( horizontal ) - powerGrid.merge ( pathTransf, horizontal ); + if (horizontal) + powerGrid.merge( pathTransf, horizontal ); else { Vertical* vertical = dynamic_cast(*icomponent); - if ( vertical ) - powerGrid.merge ( pathTransf, vertical ); + if (vertical) + powerGrid.merge( pathTransf, vertical ); } } } forEach ( Instance*, iinstance, instanceCell->getInstances() ) { - Transformation instanceTransf = iinstance->getTransformation(); - pathTransf.applyOn ( instanceTransf ); + pathTransf.applyOn( instanceTransf ); - copyUpPowerRails ( instanceTransf, iinstance->getMasterCell(), powerGrid ); + copyUpPowerRails( instanceTransf, iinstance->getMasterCell(), powerGrid ); } } -} // End of local namespace. +} // Anonymous namespace. namespace Katabatic { - using Hurricane::Point; using Hurricane::Horizontal; using Hurricane::Net; @@ -501,13 +484,13 @@ namespace Katabatic { void KatabaticEngine::makePowerRails () { - PowerGrid powerGrid ( getCell() ); + PowerGrid powerGrid (getCell()); Transformation topTransformation; // ID. - copyUpPowerRails ( topTransformation, getCell(), powerGrid ); + copyUpPowerRails( topTransformation, getCell(), powerGrid ); - powerGrid.doLayout (); + powerGrid.doLayout(); } -} // End of Katabatic namespace. +} // Katabatic namespace. diff --git a/katabatic/src/PyKatabatic.cpp b/katabatic/src/PyKatabatic.cpp index 72af6825..58b5d198 100644 --- a/katabatic/src/PyKatabatic.cpp +++ b/katabatic/src/PyKatabatic.cpp @@ -2,14 +2,14 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2012-2012, All Rights Reserved +// Copyright (c) UPMC/LIP6 2012-2013, All Rights Reserved // // +-----------------------------------------------------------------+ // | C O R I O L I S | -// | K i t e - D e t a i l e d R o u t e r | +// | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./PyKatabatic.cpp" | // +-----------------------------------------------------------------+ @@ -35,7 +35,7 @@ namespace Katabatic { // x=================================================================x -# else // End of PyHurricane Shared Library Code Part. +# else // PyHurricane Shared Library Code Part. // x=================================================================x @@ -68,16 +68,16 @@ extern "C" { PyObject* dictionnary = PyModule_GetDict(module); PyObject* constant; - LoadObjectConstant(dictionnary,LoadGrByNet ,"LoadGrByNet" ); - LoadObjectConstant(dictionnary,LoadGrByGCell ,"LoadGrByGCell" ); - LoadObjectConstant(dictionnary,LayerAssignByLength,"LayerAssignByLength"); - LoadObjectConstant(dictionnary,LayerAssignByTrunk ,"LayerAssignByTrunk" ); - LoadObjectConstant(dictionnary,NoNetLayerAssign ,"NoNetLayerAssign" ); + LoadObjectConstant(dictionnary,EngineLoadGrByNet ,"EngineLoadGrByNet" ); + LoadObjectConstant(dictionnary,EngineLoadGrByGCell ,"EngineLoadGrByGCell" ); + LoadObjectConstant(dictionnary,EngineLayerAssignByLength,"EngineLayerAssignByLength"); + LoadObjectConstant(dictionnary,EngineLayerAssignByTrunk ,"EngineLayerAssignByTrunk" ); + LoadObjectConstant(dictionnary,EngineNoNetLayerAssign ,"EngineNoNetLayerAssign" ); } } // extern "C". -#endif // End of Python Module Code Part. +#endif // Python Module Code Part. } // Katabatic namespace. diff --git a/katabatic/src/Session.cpp b/katabatic/src/Session.cpp index 8179407f..aec9df14 100644 --- a/katabatic/src/Session.cpp +++ b/katabatic/src/Session.cpp @@ -2,42 +2,33 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | // | C++ Module : "./Session.cpp" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// +-----------------------------------------------------------------+ -#include -#include - -#include "hurricane/Error.h" -#include "hurricane/Horizontal.h" -#include "hurricane/Vertical.h" -#include "hurricane/Cell.h" -#include "hurricane/UpdateSession.h" -#include "crlcore/RoutingGauge.h" -#include "katabatic/Session.h" -#include "katabatic/AutoContact.h" -#include "katabatic/AutoSegment.h" -#include "katabatic/AutoSegment.h" -#include "katabatic/GCellGrid.h" -#include "katabatic/KatabaticEngine.h" +#include +#include +#include "hurricane/Error.h" +#include "hurricane/Horizontal.h" +#include "hurricane/Vertical.h" +#include "hurricane/Cell.h" +#include "hurricane/UpdateSession.h" +#include "crlcore/RoutingGauge.h" +#include "katabatic/Session.h" +#include "katabatic/AutoContact.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/AutoSegment.h" +#include "katabatic/GCellGrid.h" +#include "katabatic/KatabaticEngine.h" namespace { @@ -65,6 +56,7 @@ namespace Katabatic { using Hurricane::ltracein; using Hurricane::ltraceout; using Hurricane::inltrace; + using Hurricane::ltracelevel; using Hurricane::Error; using Hurricane::ForEachIterator; using Hurricane::UpdateSession; @@ -76,35 +68,33 @@ namespace Katabatic { // ------------------------------------------------------------------- // Class : "Katabatic::Session". - Session* Session::_session = NULL; Session* Session::get ( const char* message ) { - if ( not _session and message ) - throw Error ( openSessionError, message ); + if (not _session and message) + throw Error( openSessionError, message ); return _session; } Session::Session ( KatabaticEngine* ktbt ) - : _katabatic (ktbt) - , _technology (ktbt->getRoutingGauge()->getTechnology()) - , _routingGauge (ktbt->getRoutingGauge()) - , _autoContacts () - , _autoSegments () - , _revalidateds () - , _dogLegs () - , _netInvalidateds () - , _netRevalidateds () - , _invalidateMask (0) + : _katabatic (ktbt) + , _technology (ktbt->getRoutingGauge()->getTechnology()) + , _routingGauge (ktbt->getRoutingGauge()) + , _autoContacts () + , _doglegs () + , _segmentInvalidateds() + , _segmentRevalidateds() + , _netInvalidateds () + , _netRevalidateds () { } void Session::_postCreate () { - UpdateSession::open (); + UpdateSession::open(); _session = this; } @@ -113,18 +103,15 @@ namespace Katabatic { { } - size_t Session::_preDestroy () + void Session::_preDestroy () { - size_t count = 0; - if ( _katabatic->getState() <= StateActive ) { + if (_katabatic->getState() <= EngineActive) { _revalidate (); - if ( _katabatic->getGCellGrid() ) - _katabatic->getGCellGrid()->updateDensity (); + if (_katabatic->getGCellGrid()) + _katabatic->getGCellGrid()->updateDensity(); } UpdateSession::close(); - - return count; } @@ -134,49 +121,10 @@ namespace Katabatic { Configuration* Session::_getConfiguration () { return _katabatic->getConfiguration(); } - void Session::_splitContacts () + void Session::_invalidate ( Net* net ) { - ltrace(110) << "Katabatic::Session::_splitContacts()" << endl; - ltracein(110); - - for ( size_t i=0; i<_autoContacts.size() ; i++ ) - _autoContacts[i]->split (); - - ltraceout(110); - } - - - void Session::_restoreVCon () - { - ltrace(110) << "Katabatic::Session::_restoreVCon()" << endl; - ltracein(110); - - for ( size_t i=0; i<_autoContacts.size() ; i++ ) { - DbU::Unit y = DbU::Max; - forEach ( Horizontal*, isegment, _autoContacts[i]->getSlaveComponents().getSubSet() ) { - y = isegment->getY(); - } - _autoContacts[i]->restoreVConnexity ( y, true ); - } - - ltraceout(110); - } - - - void Session::_restoreHCon () - { - ltrace(110) << "Katabatic::Session::_restoreHCon()" << endl; - ltracein(110); - - for ( size_t i=0; i<_autoContacts.size() ; i++ ) { - DbU::Unit x = DbU::Max; - forEach ( Vertical*, isegment, _autoContacts[i]->getSlaveComponents().getSubSet() ) { - x = isegment->getX(); - } - _autoContacts[i]->restoreHConnexity ( x, true ); - } - - ltraceout(110); + ltrace(200) << "Session::invalidate(Net*) - " << net << endl; + _netInvalidateds.insert(net); } @@ -185,56 +133,64 @@ namespace Katabatic { ltrace(110) << "Katabatic::Session::_canonize()" << endl; ltracein(110); + if (_segmentInvalidateds.empty()) { + ltrace(110) << "Invalidated AutoSegment collection <_segmentInvalidateds> is empty." << endl; + ltraceout(110); + return; + } + set exploredSegments; vector aligneds; - sort ( _autoSegments.begin(), _autoSegments.end(), AutoSegment::CompareId() ); + // Should no longer be necessary to ensure determinism. + //sort( _segmentInvalidateds.begin(), _segmentInvalidateds.end(), AutoSegment::CompareId() ); - for ( size_t i=0 ; i<_autoSegments.size() ; i++ ) { - AutoSegment* seedSegment = _autoSegments[i]; + for ( size_t i=0 ; i<_segmentInvalidateds.size() ; i++ ) { + AutoSegment* seedSegment = _segmentInvalidateds[i]; + AutoSegment* canonical = seedSegment; - if ( exploredSegments.find(seedSegment->getSegment()) == exploredSegments.end() ) { + if (exploredSegments.find(seedSegment->base()) == exploredSegments.end()) { ltrace(110) << "New chunk from: " << seedSegment << endl; - aligneds.push_back ( seedSegment ); + aligneds.push_back( seedSegment ); - bool isCanonicalLocal = seedSegment->isLocal(); - forEach ( AutoSegment*, collapsed, seedSegment->getCollapseds() ) { - ltrace(110) << "Aligned: " << *collapsed << endl; - aligneds.push_back ( *collapsed ); - exploredSegments.insert ( collapsed->getSegment() ); + bool isWeakGlobal = seedSegment->isGlobal(); + if (not seedSegment->isNotAligned()) { + forEach ( AutoSegment*, aligned, seedSegment->getAligneds() ) { + ltrace(110) << "Aligned: " << *aligned << endl; + aligneds.push_back ( *aligned ); + exploredSegments.insert ( aligned->base() ); - if ( collapsed->isGlobal() ) isCanonicalLocal = false; - } - - ltracein(110); - sort ( aligneds.begin(), aligneds.end(), AutoSegment::CompareId() ); - - if ( aligneds.size() > 1 ) { - if ( not AutoSegment::CompareId() ( aligneds[0], aligneds[1] ) ) { - cerr << "Ambiguous canonization: " << aligneds[0]->base() << endl; - cerr << "Ambiguous canonization: " << aligneds[1]->base() << endl; + isWeakGlobal = isWeakGlobal or aligned->isGlobal(); + if (AutoSegment::CompareId()( *aligned, canonical )) + canonical = *aligned; } } - aligneds[0]->setCanonical ( true ); - aligneds[0]->setCanonicalLocal ( isCanonicalLocal ); - ltrace(110) << "Canonical: " << aligneds[0] << endl; + ltracein(110); - for ( size_t j=1 ; jisCanonical() ) { + canonical->setFlags( SegCanonical ); + ltrace(110) << "Canonical: " << canonical << endl; + + for ( size_t j=0 ; jsetFlags ( SegWeakGlobal ); + else aligneds[j]->unsetFlags( SegWeakGlobal ); + + if (aligneds[j] == canonical) continue; + if (aligneds[j]->isCanonical()) { cerr << Error("Session::_canonize(): On %s\n" " Segment is no longer the canonical one, this must not happens." ,getString(aligneds[j]).c_str()) << endl; } - aligneds[j]->setCanonical ( false ); + aligneds[j]->unsetFlags( SegCanonical ); ltrace(110) << "Secondary: " << aligneds[j] << endl; } + if (aligneds.empty()) canonical->setFlags( SegNotAligned ); - ltrace(159) << "Align @" << DbU::getLambda(aligneds[0]->getAxis()) - << " on " << aligneds[0] << endl; + ltrace(159) << "Align @" << DbU::getLambda(canonical->getAxis()) + << " on " << canonical << endl; - aligneds[0]->setAxis ( aligneds[0]->getAxis(), Realignate ); - aligneds.clear (); + canonical->setAxis( canonical->getAxis(), KbRealignate ); + aligneds.clear(); ltraceout(110); } } @@ -248,44 +204,26 @@ namespace Katabatic { ltrace(110) << "Katabatic::Session::_revalidateTopology()" << endl; ltracein(110); - set faileds; + set::iterator inet = _netInvalidateds.begin(); - if ( not _netInvalidateds.empty() ) { - set::iterator inet = _netInvalidateds.begin(); + for ( ; inet != _netInvalidateds.end() ; inet++ ) { + ltrace(110) << "Katabatic::Session::_revalidateTopology(Net*)" << *inet << endl; + _katabatic->updateNetTopology ( *inet ); + _katabatic->computeNetConstraints( *inet ); + _katabatic->_computeNetOptimals ( *inet ); + _katabatic->_computeNetTerminals ( *inet ); + } + _canonize (); - if ( _invalidateMask & NetSplitContacts ) { - _splitContacts (); - _invalidateMask &= ~NetSplitContacts; - } - - if ( _invalidateMask & RestoreVCon ) { - _restoreVCon (); - _invalidateMask &= ~RestoreVCon; - } - - if ( _invalidateMask & RestoreHCon ) { - _restoreVCon (); - _invalidateMask &= ~RestoreHCon; - } - - if ( _invalidateMask & NetCanonize ) { - for ( ; inet != _netInvalidateds.end() ; inet++ ) { - ltrace(110) << "Katabatic::Session::_revalidateTopology(Net*)" << *inet << endl; - _katabatic->_computeNetConstraints ( *inet, faileds ); - _katabatic->_computeNetOptimals ( *inet ); - _katabatic->_computeNetTerminals ( *inet ); - } - _canonize (); - - for ( size_t i=0 ; i<_autoSegments.size() ; ++i ) { - if ( _autoSegments[i]->isUnsetAxis() - and _autoSegments[i]->isCanonical() ) { - _autoSegments[i]->toOptimalAxis (); - } - } - _invalidateMask &= ~NetCanonize; + for ( size_t i=0 ; i<_segmentInvalidateds.size() ; ++i ) { + if (_segmentInvalidateds[i]->isCanonical()) { + if (_segmentInvalidateds[i]->isUnsetAxis()) _segmentInvalidateds[i]->toOptimalAxis(); + else _segmentInvalidateds[i]->toConstraintAxis(); } } + + _netRevalidateds.clear(); + _netRevalidateds.swap( _netInvalidateds ); ltraceout(110); } @@ -296,45 +234,45 @@ namespace Katabatic { ltrace(110) << "Katabatic::Session::revalidate()" << endl; ltracein(110); + ltrace(110) << "_segmentInvalidateds.size(): " << _segmentInvalidateds.size() << endl; + ltrace(110) << "_autoContacts.size(): " << _autoContacts.size() << endl; + size_t count = 0; - _revalidateTopology (); - _netRevalidateds.clear (); - _netRevalidateds.swap ( _netInvalidateds ); + if (not _netInvalidateds.empty()) _revalidateTopology(); - ltrace(110) << "AutoContacts Revalidate (after canonize)." << endl; + ltrace(110) << "AutoContacts Revalidate (after _revalidateTopology())." << endl; for ( size_t i=0 ; i < _autoContacts.size() ; i++, count++ ) - _autoContacts[i]->revalidate (); - _autoContacts.clear (); + _autoContacts[i]->updateGeometry(); + _autoContacts.clear(); - ltrace(110) << "AutoSegments Revalidate (after canonize)." << endl; + ltrace(110) << "AutoSegments Revalidate (after AutoContact::updateGeometry())." << endl; + ltrace(110) << "_segmentInvalidateds.size(): " << _segmentInvalidateds.size() << endl; - _dogLegs.clear (); - _revalidateds.clear (); - for ( size_t i=0 ; i < _autoSegments.size() ; i++, count++ ) { - _autoSegments[i]->revalidate (); + _segmentRevalidateds.clear(); + for ( size_t i=0 ; i < _segmentInvalidateds.size() ; ++i, ++count ) { + _segmentInvalidateds[i]->revalidate(); if ( not _destroyedSegments.empty() - and (_destroyedSegments.find(_autoSegments[i]) != _destroyedSegments.end()) ) + and (_destroyedSegments.find(_segmentInvalidateds[i]) != _destroyedSegments.end()) ) continue; - _revalidateds.push_back ( _autoSegments[i] ); + _segmentRevalidateds.push_back( _segmentInvalidateds[i] ); } - _autoSegments.clear (); + _segmentInvalidateds.clear(); ltrace(110) << "AutoSegments/AutoContacts queued deletion." << endl; - bool destroySegment = _katabatic->setDestroyBaseSegment ( true ); - bool destroyContact = _katabatic->setDestroyBaseContact ( true ); + unsigned int flags = _katabatic->getFlags( EngineDestroyMask ); + _katabatic->setFlags( EngineDestroyMask ); set::iterator isegment = _destroyedSegments.begin(); for ( ; isegment != _destroyedSegments.end() ; isegment++ ) { AutoContact* source = (*isegment)->getAutoSource(); AutoContact* target = (*isegment)->getAutoTarget(); - (*isegment)->destroy (); - if (source and source->canDestroy(true)) source->destroy (); - if (target and target->canDestroy(true)) target->destroy (); + (*isegment)->destroy(); + if (source and source->canDestroy(true)) source->destroy(); + if (target and target->canDestroy(true)) target->destroy(); } - _katabatic->setDestroyBaseSegment ( destroySegment ); - _katabatic->setDestroyBaseContact ( destroyContact ); - set().swap ( _destroyedSegments ); + _katabatic->setFlags( flags ); + set().swap( _destroyedSegments ); ltraceout(110); @@ -346,40 +284,49 @@ namespace Katabatic { { ltrace(110) << "Session::open()" << endl; - if ( _session ) { - if ( _session->_katabatic != ktbt ) - throw Error ( reopenSession, getString(_session->getKatabatic()).c_str() ); + if (_session) { + if (_session->_katabatic != ktbt) + throw Error( reopenSession, getString(_session->getKatabatic()).c_str() ); return _session; } Session* session = new Session ( ktbt ); - session->_postCreate (); + session->_postCreate(); return session; } - size_t Session::close () + void Session::close () { ltrace(110) << "Session::close()" << endl; ltracein(110); - if ( !_session ) throw Error ( openSessionError, "Session::Close()" ); + if (not _session) throw Error( openSessionError, "Session::Close()" ); - size_t count = _session->_preDestroy (); + _session->_preDestroy(); delete _session; _session = NULL; ltraceout(110); - - return count; } - bool Session::getDemoMode () - { return get("getDemoMode()")->_katabatic->getDemoMode(); } + unsigned int Session::getLayerDirection ( const Layer* layer ) + { + RoutingGauge* rg = get("getDirection()")->_routingGauge; + switch ( rg->getLayerDirection(layer) ) { + case Constant::Horizontal: return KbHorizontal; + case Constant::Vertical: return KbVertical; + } + return 0; + } + + + bool Session::isInDemoMode () + { return get("isInDemoMode()")->_katabatic->isInDemoMode(); } float Session::getSaturateRatio () @@ -390,12 +337,12 @@ namespace Katabatic { { return get("getSaturateRp()")->_katabatic->getSaturateRp(); } - bool Session::getWarnGCellOverload () - { return get("getWarnGCellOverload()")->_katabatic->getWarnGCellOverload(); } + bool Session::doWarnGCellOverload () + { return get("doWarnGCellOverload()")->_katabatic->doWarnOnGCellOverload(); } - void Session::setWarnGCellOverload ( bool state ) - { get("getWarnGCellOverload()")->_katabatic->setWarnGCellOverload(state); } + void Session::setKatabaticFlags ( unsigned int flags ) + { get("setKabaticFlags()")->_katabatic->setFlags(flags); } DbU::Unit Session::getExtensionCap () @@ -411,27 +358,27 @@ namespace Katabatic { void Session::link ( AutoContact* autoContact ) - { return get("link(AutoContact*)")->_katabatic->_link ( autoContact ); } + { return get("link(AutoContact*)")->_katabatic->_link( autoContact ); } void Session::link ( AutoSegment* autoSegment ) - { return get("link(AutoSegment*)")->_katabatic->_link ( autoSegment ); } + { return get("link(AutoSegment*)")->_katabatic->_link( autoSegment ); } void Session::unlink ( AutoContact* autoContact ) - { return get("unlink(AutoContact*)")->_katabatic->_unlink ( autoContact ); } + { return get("unlink(AutoContact*)")->_katabatic->_unlink( autoContact ); } void Session::unlink ( AutoSegment* autoSegment ) - { return get("unlink(AutoSegment*)")->_katabatic->_unlink ( autoSegment ); } + { return get("unlink(AutoSegment*)")->_katabatic->_unlink( autoSegment ); } AutoContact* Session::lookup ( Contact* contact ) - { return get("lookup(Contact*)")->_katabatic->_lookup ( contact ); } + { return get("lookup(Contact*)")->_katabatic->_lookup( contact ); } AutoSegment* Session::lookup ( Segment* segment ) - { return get("lookup(Segment*)")->_katabatic->_lookup ( segment ); } + { return get("lookup(Segment*)")->_katabatic->_lookup( segment ); } string Session::_getString () const @@ -447,7 +394,7 @@ namespace Katabatic { Record* record = new Record ( _getString() ); record->add ( getSlot ( "_katabatic" , _katabatic ) ); record->add ( getSlot ( "_autoContacts", &_autoContacts ) ); - record->add ( getSlot ( "_autoSegments", &_autoSegments ) ); + //record->add ( getSlot ( "_autoSegments", &_autoSegments ) ); return record; } diff --git a/katabatic/src/katabatic/AutoContact.h b/katabatic/src/katabatic/AutoContact.h index baa32f40..c62bf76d 100644 --- a/katabatic/src/katabatic/AutoContact.h +++ b/katabatic/src/katabatic/AutoContact.h @@ -2,41 +2,28 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./AutoContact.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/AutoContact.h" | +// +-----------------------------------------------------------------+ -#ifndef __KATABATIC_AUTOCONTACT__ -#define __KATABATIC_AUTOCONTACT__ +#ifndef KATABATIC_AUTOCONTACT_H +#define KATABATIC_AUTOCONTACT_H #include - +#include #include "hurricane/Contact.h" #include "hurricane/ExtensionGo.h" - -namespace Hurricane { - class RoutingPad; -} - +#include "katabatic/Constants.h" #include "katabatic/AutoSegment.h" -#include "katabatic/AutoContacts.h" #include "katabatic/GCell.h" @@ -47,96 +34,42 @@ namespace Katabatic { using std::endl; using Hurricane::tab; using Hurricane::inltrace; + using Hurricane::ltracein; + using Hurricane::ltraceout; using Hurricane::Name; using Hurricane::Net; using Hurricane::Component; using Hurricane::Components; using Hurricane::Layer; using Hurricane::Contact; - using Hurricane::RoutingPad; using Hurricane::ExtensionGo; class GCell; class KatabaticEngine; + class AutoHorizontal; + class AutoVertical; + class AutoContact; - -// ------------------------------------------------------------------- -// Class : "Katabatic::VirtualContacts". - - - class VirtualContacts { - public: - // Methods. - inline VirtualContacts (); - inline Box getBoundingBox () const; - void merge ( const Point& , const Layer* ); - inline void clear (); - - public: - // Sub-Class. - class VC { - public: - inline VC ( const Point& , const Layer* ); - inline const Point& getPoint () const; - inline const Layer* getLayer () const; - void merge ( const Layer* layer ); - friend bool operator== ( const VC& lhs, const VC& rhs ); - protected: - Point _point; - const Layer* _layer; - }; - - protected: - // Attributes. - Box _boundingBox; - vector _vcs; - }; - - -// Inline Functions. - inline VirtualContacts::VirtualContacts () : _boundingBox(), _vcs() {} - inline Box VirtualContacts::getBoundingBox () const { return _boundingBox; } - inline void VirtualContacts::clear () { _vcs.clear(); _boundingBox.makeEmpty(); } - inline VirtualContacts::VC::VC ( const Point& p, const Layer* l ) : _point(p), _layer(l) {} - inline const Point& VirtualContacts::VC::getPoint () const { return _point; } - inline const Layer* VirtualContacts::VC::getLayer () const { return _layer; } + typedef std::map AutoContactLut; // ------------------------------------------------------------------- // Class : "Katabatic::AutoContact". - + + enum AutoContactFlag { CntFixed = 0x00000001 + , CntTerminal = 0x00000002 + , CntTurn = 0x00000004 + , CntHTee = 0x00000008 + , CntVTee = 0x00000010 + , CntInvalidated = 0x00000020 + , CntInvalidatedCache = 0x00000040 + , CntInCreationStage = 0x00000080 + , CntBadTopology = 0x00000100 + , CntIgnoreAnchor = 0x00000200 + }; class AutoContact : public ExtensionGo { - - public: - static AutoContact* fromRp ( GCell* gcell - , RoutingPad* routingPad - , const Layer* layer - , Point point - , DbU::Unit width - , DbU::Unit height - , bool fixed=false - ); - public: - // Constructor & Destructor. - static AutoContact* create ( GCell* gcell - , Net* net - , const Layer* layer - , bool hAlignate=false - , bool vAlignate=false - ); - static AutoContact* create ( GCell* gcell - , RoutingPad* rp - , const Layer* layer - , const DbU::Unit dx - , const DbU::Unit dy - , const DbU::Unit width - , const DbU::Unit height - , bool hAlignate=false - , bool vAlignate=false - , bool fixed=false - ); public: // Wrapped Contact Accessors. inline Hook* getBodyHook (); @@ -168,34 +101,34 @@ namespace Katabatic { inline void setDy ( DbU::Unit ); inline void setOffset ( DbU::Unit dx, DbU::Unit dy ); virtual void translate ( const DbU::Unit& tx, const DbU::Unit& ty ); + // Predicates. + inline bool isInCreationStage () const; + inline bool isInvalidated () const; + inline bool isInvalidatedCache () const; + inline bool isTerminal () const; + inline bool isTurn () const; + bool isTee ( unsigned int direction ) const; + inline bool isHTee () const; + inline bool isVTee () const; + inline bool isFixed () const; + inline bool hasBadTopology () const; + bool canDestroy ( unsigned int flags=0 ) const; + bool canMoveUp ( const AutoSegment* moved ) const; // Accessors. - static size_t getSegmentEndAllocateds (); + inline Contact* base () const; static size_t getAllocateds (); static const Name& getStaticName (); virtual const Name& getName () const; inline size_t getId () const; - inline Contact* base () const; - inline Contact* getContact () const; virtual Box getBoundingBox () const; inline GCell* getGCell () const; + virtual AutoSegment* getOpposite ( const AutoSegment* ) const = 0; + virtual AutoSegment* getSegment ( unsigned int ) const = 0; unsigned int getMinDepth () const; unsigned int getMaxDepth () const; - bool canDestroy ( bool error=false ) const; - inline bool isInvalidated () const; - inline bool isCorner () const; - inline bool isFixed () const; - inline bool isTerminal () const; - bool isAlignate ( unsigned int direction ) const; - inline bool isHAlignate () const; - inline bool isVAlignate () const; - bool isHExtended (); - bool isVExtended (); - bool canGoOutsideGCell ( const AutoSegment* ); - bool canHDesalignate (); - bool canVDesalignate (); - bool canMoveUp ( AutoSegment* moved ) const; void getLengths ( DbU::Unit* lengths, AutoSegment::DepthLengthSet& ); - Box getNativeConstraintBox () const; + virtual Box getNativeConstraintBox () const; + Interval getNativeUConstraints ( unsigned int direction ) const; Interval getUConstraints ( unsigned int direction ) const; inline DbU::Unit getCBXMin () const; inline DbU::Unit getCBXMax () const; @@ -203,20 +136,19 @@ namespace Katabatic { inline DbU::Unit getCBYMax () const; inline Box getConstraintBox () const; Box& intersectConstraintBox ( Box& box ) const; + // Collections. + AutoSegments getAutoSegments (); // Modifiers. - inline void setInvalidated ( bool state ); - inline void setCorner ( bool state ); - inline void setFixed ( bool state ); - inline void setTerminal ( bool state ); - inline void setHAlignate ( bool state ); - inline void setVAlignate ( bool state ); - void computeAlignate (); - void invalidate (); - void revalidate (); - void updateGeometry (); - inline void setInvalidatedTopology ( bool state ); - void revalidateTopology (); - void checkTopology (); + void invalidate ( unsigned int flags=0 ); + virtual void cacheDetach ( AutoSegment* ) = 0; + virtual void cacheAttach ( AutoSegment* ) = 0; + virtual void updateCache () = 0; + virtual void updateGeometry () = 0; + virtual void updateTopology () = 0; + void showTopologyError ( const std::string& ); + virtual void checkTopology (); + inline void setFlags ( unsigned int ); + inline void unsetFlags ( unsigned int ); void setGCell ( GCell* ); inline void setCBXMin ( DbU::Unit xMin ); inline void setCBXMax ( DbU::Unit xMax ); @@ -225,52 +157,34 @@ namespace Katabatic { void setConstraintBox ( const Box& box ); bool restrictConstraintBox ( DbU::Unit constraintMin , DbU::Unit constraintMax - , unsigned int direction - , bool warnOnError=true ); + , unsigned int flags=KbWarnOnError ); void restoreNativeConstraintBox (); - void breakUp (); - void split (); - bool hDesalignate (); - bool vDesalignate (); - void restoreHConnexity ( DbU::Unit x, bool split=false ); - void restoreVConnexity ( DbU::Unit y, bool split=false ); - // Collections. - AutoContacts getCollapseds ( unsigned int direction ); // Inspector Management. Record* _getRecord () const; virtual string _getString () const; - virtual string _getTypeName () const { return "Katabatic::AutoContact"; }; + virtual string _getTypeName () const; private: // Internal: Attributes. static size_t _maxId; static size_t _allocateds; static const Name _goName; + protected: size_t _id; Contact* _contact; GCell* _gcell; - bool _invalid; - bool _invalidTopology; - bool _isTerminal; - bool _fixed; - bool _hAlignate; - bool _vAlignate; - bool _isCorner; - int _dxMin : 8; - int _dxMax : 8; - int _dyMin : 8; - int _dyMax : 8; - VirtualContacts _subContacts; + unsigned int _flags; + int _dxMin:8; + int _dxMax:8; + int _dyMin:8; + int _dyMax:8; protected: // Constructors & Destructors. - AutoContact ( GCell* gcell - , Contact* contact - , bool hAlignate=false - , bool vAlignate=false - ); + AutoContact ( GCell*, Contact* ); virtual ~AutoContact (); + static void _preCreate ( GCell*, Net*, const Layer* ); virtual void _postCreate (); virtual void _preDestroy (); private: @@ -280,6 +194,8 @@ namespace Katabatic { protected: inline int _getDeltaMin ( DbU::Unit x, DbU::Unit xMin ); inline int _getDeltaMax ( DbU::Unit x, DbU::Unit xMin, DbU::Unit xMax ); + void _getTopology ( Component*& anchor, Horizontal**&, Vertical**&, size_t ); + virtual void _invalidate ( unsigned int flags ) = 0; }; @@ -311,38 +227,105 @@ namespace Katabatic { inline void AutoContact::setDx ( DbU::Unit dx ) { return _contact->setDx(dx); } inline void AutoContact::setDy ( DbU::Unit dy ) { return _contact->setDy(dy); } inline void AutoContact::setOffset ( DbU::Unit dx, DbU::Unit dy ) { return _contact->setOffset(dx,dy); } -// Inline Functions. +// AutoContact Inline Functions. + inline bool AutoContact::isInCreationStage () const { return _flags&CntInCreationStage; } + inline bool AutoContact::isInvalidated () const { return _flags&CntInvalidated; } + inline bool AutoContact::isInvalidatedCache () const { return _flags&CntInvalidatedCache; } + inline bool AutoContact::isTurn () const { return _flags&CntTurn; } + inline bool AutoContact::isFixed () const { return _flags&CntFixed; } + inline bool AutoContact::isTerminal () const { return _flags&CntTerminal; } + inline bool AutoContact::isHTee () const { return _flags&CntHTee; } + inline bool AutoContact::isVTee () const { return _flags&CntVTee; } + inline bool AutoContact::hasBadTopology () const { return _flags&CntBadTopology; } inline size_t AutoContact::getId () const { return _id; } inline Contact* AutoContact::base () const { return _contact; } - inline Contact* AutoContact::getContact () const { return _contact; } inline GCell* AutoContact::getGCell () const { return _gcell; } - inline bool AutoContact::isInvalidated () const { return _invalid; } - inline bool AutoContact::isCorner () const { return _isCorner; } - inline bool AutoContact::isFixed () const { return _fixed; } - inline bool AutoContact::isTerminal () const { return _isTerminal; } - inline bool AutoContact::isHAlignate () const { return _hAlignate; } - inline bool AutoContact::isVAlignate () const { return _vAlignate; } - inline DbU::Unit AutoContact::getCBXMin () const { return DbU::lambda(_dxMin) + _gcell->getX(); } - inline DbU::Unit AutoContact::getCBXMax () const { return DbU::lambda(_dxMax) + _gcell->getX(); } - inline DbU::Unit AutoContact::getCBYMin () const { return DbU::lambda(_dyMin) + _gcell->getY(); } - inline DbU::Unit AutoContact::getCBYMax () const { return DbU::lambda(_dyMax) + _gcell->getY(); } inline Box AutoContact::getConstraintBox () const { return Box(getCBXMin(),getCBYMin(),getCBXMax(),getCBYMax()); } - inline void AutoContact::setInvalidated ( bool state ) { _invalid = state; } - inline void AutoContact::setInvalidatedTopology ( bool state ) { _invalidTopology = state; } - inline void AutoContact::setCorner ( bool state ) { _isCorner = state; } - inline void AutoContact::setFixed ( bool state ) { _fixed = state; } - inline void AutoContact::setTerminal ( bool state ) { _isTerminal = state; } - inline void AutoContact::setHAlignate ( bool state ) { _hAlignate = state; } - inline void AutoContact::setVAlignate ( bool state ) { _vAlignate = state; } inline void AutoContact::setCBXMin ( DbU::Unit xMin ) { _dxMin = _getDeltaMin(xMin,_gcell->getX()); } inline void AutoContact::setCBXMax ( DbU::Unit xMax ) { _dxMax = _getDeltaMax(xMax,_gcell->getX(),_gcell->getXMax()); } inline void AutoContact::setCBYMin ( DbU::Unit yMin ) { _dyMin = _getDeltaMin(yMin,_gcell->getY()); } inline void AutoContact::setCBYMax ( DbU::Unit yMax ) { _dyMax = _getDeltaMax(yMax,_gcell->getY(),_gcell->getYMax()); } - inline int AutoContact::_getDeltaMin ( DbU::Unit x, DbU::Unit xMin ) { if (xxMax) x=xMax; return (int)DbU::getLambda(x-xMin); } + inline void AutoContact::setFlags ( unsigned int flags ) { _flags|= flags; } + inline void AutoContact::unsetFlags ( unsigned int flags ) { _flags&=~flags; } + inline int AutoContact::_getDeltaMin ( DbU::Unit x, DbU::Unit xMin ) { if (xxMax) x=xMax; return (int)DbU::toLambda(x-xMin); } -//templateinline void Swap ( Type& a, Type& b ) { Type swp = a; a = b; b = swp; } - templateinline void order ( Type& a, Type& b ) { if (a>b) swap(a,b); } + inline DbU::Unit AutoContact::getCBXMin () const + { return isFixed() ? _contact->getX() : DbU::fromLambda(_dxMin) + _gcell->getX(); } + + inline DbU::Unit AutoContact::getCBXMax () const + { return isFixed() ? _contact->getX() : DbU::fromLambda(_dxMax) + _gcell->getX(); } + + inline DbU::Unit AutoContact::getCBYMin () const + { return isFixed() ? _contact->getY() : DbU::fromLambda(_dyMin) + _gcell->getY(); } + + inline DbU::Unit AutoContact::getCBYMax () const + { return isFixed() ? _contact->getY() : DbU::fromLambda(_dyMax) + _gcell->getY(); } + +// ------------------------------------------------------------------- +// Class : "Katabatic::LocatorHelper". + + class LocatorHelper { + public: + inline LocatorHelper ( AutoContact*, unsigned int flags=0 ); + inline bool isValid () const; + inline AutoSegment* getSegment () const; + inline void progress (); + private: + inline unsigned int _min () const; + inline unsigned int _max () const; + private: + unsigned int _flags; + unsigned int _index; + AutoContact* _contact; + }; + + + inline LocatorHelper::LocatorHelper ( AutoContact* contact, unsigned int flags ) + : _flags(flags), _index(_min()), _contact(contact) + { + ltracein(80); + ltrace(80) << "CTOR LocatorHelper " << contact->_getString() << endl; + ltrace(80) << "+ _min():" << _min() << endl; + ltrace(80) << "+ _max():" << _max() << endl; + ltrace(80) << "+ getSegment(_min()):" << _contact->getSegment(_min()) << endl; + if (not _contact->getSegment(_index)) progress(); + ltraceout(80); + } + + inline bool LocatorHelper::isValid () const + { return _index < _max(); } + + inline unsigned int LocatorHelper::_min () const + { return (_flags & (KbHorizontal|KbWithPerpands)) ? 0 : 2; } + + inline unsigned int LocatorHelper::_max () const + { return ((_flags & KbHorizontal) and not (_flags & KbWithPerpands)) ? 2 : 4; } + + inline AutoSegment* LocatorHelper::getSegment () const + { + ltrace(80) << "LocatorHelper::getSegment(" << _index << ") - " << _contact->getSegment(_index) << endl; + return (_index < _max()) ? _contact->getSegment(_index) : NULL; + } + + inline void LocatorHelper::progress () + { + ltracein(80); + ltrace(80) << "LocatorHelper::progress() [" << _index << "] " << _contact->getSegment(_index) << endl; + ++_index; + while ((_index < _max()) and (_contact->getSegment(_index) == NULL)) { + ltrace(80) << "LocatorHelper::progress() [" << _index << "] " << _contact->getSegment(_index) << endl; + ++_index; + } + ltraceout(80); + } + + +// ------------------------------------------------------------------- +// Helper Functions. + + + templateinline void order ( Type& a, Type& b ) { if (a>b) std::swap(a,b); } inline DbU::Unit setInBound ( DbU::Unit lower, DbU::Unit upper, DbU::Unit& value ) { @@ -351,12 +334,14 @@ namespace Katabatic { return value; } + + inline size_t abssub ( size_t a, size_t b ) { return (a>b) ? a-b : b-a; } -} // End of Katabatic namespace. +} // Katabatic namespace. INSPECTOR_P_SUPPORT(Katabatic::AutoContact); -#endif // __KATABATIC_AUTOCONTACT__ +#endif // KATABATIC_AUTOCONTACT_H diff --git a/katabatic/src/katabatic/AutoContactHTee.h b/katabatic/src/katabatic/AutoContactHTee.h new file mode 100644 index 00000000..744a58c3 --- /dev/null +++ b/katabatic/src/katabatic/AutoContactHTee.h @@ -0,0 +1,75 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2012-2013, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./katabatic/AutoContactHTee.h" | +// +-----------------------------------------------------------------+ + + +#ifndef KATABATIC_AUTOCONTACT_HTEE_H +#define KATABATIC_AUTOCONTACT_HTEE_H + +#include "katabatic/AutoContact.h" + + +namespace Katabatic { + + class AutoHorizontal; + class AutoVertical; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoContactHTee". + + + class AutoContactHTee : public AutoContact { + public: + static AutoContactHTee* create ( GCell*, Net*, const Layer* ); + protected: + // Constructors & Destructors. + AutoContactHTee ( GCell*, Contact* ); + virtual ~AutoContactHTee (); + virtual void _invalidate ( unsigned int flags ); + public: + inline AutoHorizontal* getHorizontal1 () const; + inline AutoHorizontal* getHorizontal2 () const; + inline AutoVertical* getVertical1 () const; + virtual AutoSegment* getOpposite ( const AutoSegment* ) const; + virtual AutoSegment* getSegment ( unsigned int ) const; + virtual void updateGeometry (); + virtual void updateTopology (); + virtual void cacheDetach ( AutoSegment* ); + virtual void cacheAttach ( AutoSegment* ); + virtual void updateCache (); + virtual string _getTypeName () const; + private: + AutoContactHTee ( const AutoContactHTee& ); + AutoContactHTee& operator= ( const AutoContactHTee& ); + private: + AutoHorizontal* _horizontal1; + AutoHorizontal* _horizontal2; + AutoVertical* _vertical1; + }; + + + inline AutoHorizontal* AutoContactHTee::getHorizontal1 () const { return _horizontal1; }; + inline AutoHorizontal* AutoContactHTee::getHorizontal2 () const { return _horizontal2; }; + inline AutoVertical* AutoContactHTee::getVertical1 () const { return _vertical1; }; + + +} // Katabatic namespace. + + +INSPECTOR_P_SUPPORT(Katabatic::AutoContactHTee); + + +#endif // KATABATIC_AUTOCONTACT_HTEE_H diff --git a/katabatic/src/katabatic/AutoContactTerminal.h b/katabatic/src/katabatic/AutoContactTerminal.h new file mode 100644 index 00000000..cc406e71 --- /dev/null +++ b/katabatic/src/katabatic/AutoContactTerminal.h @@ -0,0 +1,81 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2012-2013, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./katabatic/AutoContactTerminal.h" | +// +-----------------------------------------------------------------+ + + +#ifndef KATABATIC_AUTOCONTACT_TERMINAL_H +#define KATABATIC_AUTOCONTACT_TERMINAL_H + +#include "katabatic/AutoContact.h" + + +namespace Katabatic { + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoContactTerminal". + + + class AutoContactTerminal : public AutoContact { + public: + static AutoContactTerminal* create ( GCell* gcell + , Component* anchor + , const Layer* layer + , Point point + , DbU::Unit width + , DbU::Unit height + ); + static AutoContactTerminal* create ( GCell* gcell + , Component* anchor + , const Layer* layer + , const DbU::Unit dx + , const DbU::Unit dy + , const DbU::Unit width + , const DbU::Unit height + ); + protected: + // Constructors & Destructors. + AutoContactTerminal ( GCell*, Contact* ); + virtual ~AutoContactTerminal (); + virtual void _invalidate ( unsigned int flags ); + public: + virtual Box getNativeConstraintBox () const; + inline AutoSegment* getSegment () const; + virtual AutoSegment* getSegment ( unsigned int ) const; + virtual AutoSegment* getOpposite ( const AutoSegment* ) const; + virtual void updateGeometry (); + virtual void updateTopology (); + virtual void cacheDetach ( AutoSegment* ); + virtual void cacheAttach ( AutoSegment* ); + virtual void updateCache (); + virtual string _getTypeName () const; + private: + AutoContactTerminal ( const AutoContactTerminal& ); + AutoContactTerminal& operator= ( const AutoContactTerminal& ); + protected: + AutoSegment* _segment; + }; + + + inline AutoSegment* AutoContactTerminal::getSegment () const { return _segment; } + + +} // Katabatic namespace. + + +INSPECTOR_P_SUPPORT(Katabatic::AutoContactTerminal); + + +#endif // KATABATIC_AUTOCONTACT_TERMINAL_H diff --git a/katabatic/src/katabatic/AutoContactTurn.h b/katabatic/src/katabatic/AutoContactTurn.h new file mode 100644 index 00000000..393b42e2 --- /dev/null +++ b/katabatic/src/katabatic/AutoContactTurn.h @@ -0,0 +1,73 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2012-2013, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./katabatic/AutoContactTurn.h" | +// +-----------------------------------------------------------------+ + + +#ifndef KATABATIC_AUTOCONTACT_TURN_H +#define KATABATIC_AUTOCONTACT_TURN_H + +#include "katabatic/AutoContact.h" + + +namespace Katabatic { + + class AutoContactTerminal; + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoContactTurn". + + + class AutoContactTurn : public AutoContact { + public: + static AutoContactTurn* create ( GCell*, Net*, const Layer* ); + static void insert ( AutoContactTerminal* ); + protected: + // Constructors & Destructors. + AutoContactTurn ( GCell*, Contact* ); + virtual ~AutoContactTurn (); + virtual void _invalidate ( unsigned int flags ); + public: + inline AutoHorizontal* getHorizontal1 () const; + inline AutoVertical* getVertical1 () const; + virtual AutoSegment* getOpposite ( const AutoSegment* ) const; + virtual AutoSegment* getSegment ( unsigned int ) const; + virtual void updateGeometry (); + virtual void updateTopology (); + virtual void cacheDetach ( AutoSegment* ); + virtual void cacheAttach ( AutoSegment* ); + virtual void updateCache (); + virtual string _getTypeName () const; + private: + AutoContactTurn ( const AutoContactTurn& ); + AutoContactTurn& operator= ( const AutoContactTurn& ); + private: + AutoHorizontal* _horizontal1; + AutoVertical* _vertical1; + }; + + + inline AutoHorizontal* AutoContactTurn::getHorizontal1 () const { return _horizontal1; }; + inline AutoVertical* AutoContactTurn::getVertical1 () const { return _vertical1; }; + + + +} // Katabatic namespace. + + +INSPECTOR_P_SUPPORT(Katabatic::AutoContactTurn); + + +#endif // KATABATIC_AUTOCONTACT_TURN_H diff --git a/katabatic/src/katabatic/AutoContactVTee.h b/katabatic/src/katabatic/AutoContactVTee.h new file mode 100644 index 00000000..f93e1402 --- /dev/null +++ b/katabatic/src/katabatic/AutoContactVTee.h @@ -0,0 +1,72 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2012-2013, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./katabatic/AutoContactVTee.h" | +// +-----------------------------------------------------------------+ + + +#ifndef KATABATIC_AUTOCONTACT_VTEE_H +#define KATABATIC_AUTOCONTACT_VTEE_H + +#include "katabatic/AutoContact.h" + + +namespace Katabatic { + + +// ------------------------------------------------------------------- +// Class : "Katabatic::AutoContactVTee". + + + class AutoContactVTee : public AutoContact { + public: + static AutoContactVTee* create ( GCell*, Net*, const Layer* ); + protected: + // Constructors & Destructors. + AutoContactVTee ( GCell*, Contact* ); + virtual ~AutoContactVTee (); + virtual void _invalidate ( unsigned int flags ); + public: + inline AutoHorizontal* getHorizontal1 () const; + inline AutoVertical* getVertical1 () const; + inline AutoVertical* getVertical2 () const; + virtual AutoSegment* getOpposite ( const AutoSegment* ) const; + virtual AutoSegment* getSegment ( unsigned int ) const; + virtual void updateGeometry (); + virtual void updateTopology (); + virtual void cacheDetach ( AutoSegment* ); + virtual void cacheAttach ( AutoSegment* ); + virtual void updateCache (); + virtual string _getTypeName () const; + private: + AutoContactVTee ( const AutoContactVTee& ); + AutoContactVTee& operator= ( const AutoContactVTee& ); + private: + AutoHorizontal* _horizontal1; + AutoVertical* _vertical1; + AutoVertical* _vertical2; + }; + + + inline AutoHorizontal* AutoContactVTee::getHorizontal1 () const { return _horizontal1; }; + inline AutoVertical* AutoContactVTee::getVertical1 () const { return _vertical1; }; + inline AutoVertical* AutoContactVTee::getVertical2 () const { return _vertical2; }; + + +} // Katabatic namespace. + + +INSPECTOR_P_SUPPORT(Katabatic::AutoContactVTee); + + +#endif // KATABATIC_AUTOCONTACT_VTEE_H diff --git a/katabatic/src/katabatic/AutoContacts.h b/katabatic/src/katabatic/AutoContacts.h deleted file mode 100644 index dd1113f8..00000000 --- a/katabatic/src/katabatic/AutoContacts.h +++ /dev/null @@ -1,165 +0,0 @@ - -// -*- C++ -*- -// -// This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved -// -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | -// | C O R I O L I S | -// | K a t a b a t i c - Routing Toolbox | -// | | -// | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | -// | =============================================================== | -// | C++ Header : "./AutoContacts.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x - - - - -#ifndef __KATABATIC_AUTOCONTACTS__ -#define __KATABATIC_AUTOCONTACTS__ - -#include -#include -#include - -#include "hurricane/Collection.h" - -namespace Hurricane { - class Contact; - class Segment; -} - - -namespace Katabatic { - - - using std::map; - using std::list; - using std::pair; - using std::string; - using Hurricane::Locator; - using Hurricane::Collection; - using Hurricane::GenericLocator; - using Hurricane::GenericCollection; - using Hurricane::GenericFilter; - using Hurricane::Contact; - using Hurricane::Segment; - - class AutoContact; - class AutoSegment; - - -// ------------------------------------------------------------------- -// Collections. - - - typedef Hurricane::Locator AutoContactHL; - typedef Hurricane::Collection AutoContactHC; - typedef GenericCollection AutoContacts; - typedef GenericLocator AutoContactLocator; - typedef GenericFilter AutoContactFilter; - typedef map AutoContactLut; - - -// ------------------------------------------------------------------- -// Class : "Katabatic::AutoContactStack". - - - class AutoContactStack : protected list > { - public: - inline bool isEmpty () const; - inline size_t getSize () const; - void push ( AutoContact*, Segment* ); - inline void pop (); - inline AutoContact* getAutoContact () const; - inline Segment* getSegment () const; - }; - - - inline bool AutoContactStack::isEmpty () const { return empty(); } - inline size_t AutoContactStack::getSize () const { return size(); } - inline void AutoContactStack::pop () { if ( !empty() ) pop_back(); } - inline AutoContact* AutoContactStack::getAutoContact () const { return empty() ? NULL : back().first; } - inline Segment* AutoContactStack::getSegment () const { return empty() ? NULL : back().second; } - - -// ------------------------------------------------------------------- -// Class : "Katabatic::AutoContacts_Collapsed". - - - class AutoContacts_Collapsed : public AutoContactHC { - - public: - // Sub-Class: Locator. - class Locator : public AutoContactHL { - public: - inline Locator ( AutoContact*, unsigned int direction ); - inline Locator ( const Locator& ); - virtual AutoContact* getElement () const; - virtual AutoContactHL* getClone () const; - virtual bool isValid () const; - virtual void progress (); - virtual string _getString () const; - protected: - unsigned int _direction; - AutoContactStack _stack; - }; - - public: - // AutoContacts_Collapsed Methods. - inline AutoContacts_Collapsed ( AutoContact*, unsigned int direction ); - inline AutoContacts_Collapsed ( const AutoContacts_Collapsed& ); - virtual AutoContactHC* getClone () const; - virtual AutoContactHL* getLocator () const; - virtual string _getString () const; - - public: - // AutoContacts_Collapsed Attributes. - AutoContact* _contact; - unsigned int _direction; - }; - - - AutoContacts_Collapsed::Locator::Locator ( AutoContact* contact - , unsigned int direction ) - : AutoContactHL() - , _stack() - { - _stack.push(contact,NULL); - } - - - AutoContacts_Collapsed::Locator::Locator ( const Locator &locator ) - : AutoContactHL() - , _stack(locator._stack) - { } - - - AutoContacts_Collapsed::AutoContacts_Collapsed ( AutoContact* contact, unsigned int direction ) - : AutoContactHC() - , _contact(contact) - , _direction(direction) - { } - - - AutoContacts_Collapsed::AutoContacts_Collapsed ( const AutoContacts_Collapsed& autocontacts ) - : AutoContactHC() - , _contact(autocontacts._contact) - , _direction(autocontacts._direction) - { } - - -} // End of Katabatic namespace. - - -#endif // __KATABATIC_AUTOCONTACTS__ diff --git a/katabatic/src/katabatic/AutoHorizontal.h b/katabatic/src/katabatic/AutoHorizontal.h index 6fbd4bb1..65cab5ff 100644 --- a/katabatic/src/katabatic/AutoHorizontal.h +++ b/katabatic/src/katabatic/AutoHorizontal.h @@ -1,30 +1,21 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./AutoHorizontal.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/AutoHorizontal.h" | +// +-----------------------------------------------------------------+ -#ifndef __KATABATIC_AUTOHORIZONTAL__ -#define __KATABATIC_AUTOHORIZONTAL__ +#ifndef KATABATIC_AUTOHORIZONTAL_H +#define KATABATIC_AUTOHORIZONTAL_H #include "hurricane/Horizontal.h" #include "katabatic/AutoSegment.h" @@ -38,61 +29,46 @@ namespace Katabatic { class AutoHorizontal : public AutoSegment { - using AutoSegment::_computeTerminal; + friend class AutoSegment; public: - // Constructors. - static AutoHorizontal* create ( Horizontal* horizontal - , int type - , bool terminal=false - , bool collapsed=false - ); - static AutoHorizontal* create ( AutoContact* source - , AutoContact* target - , const Layer* layer - , DbU::Unit y - , DbU::Unit width - , int type - , bool terminal=false - , bool collapsed=false - ); // Predicates. - virtual bool canDesalignate ( AutoContact* ) const; virtual bool _canSlacken () const; + virtual bool canMoveULeft ( float reserve=0.0 ) const; + virtual bool canMoveURight ( float reserve=0.0 ) const; // Accessors. - virtual Segment* base () { return _horizontal; }; - virtual Segment* base () const { return _horizontal; }; - virtual Segment* getSegment () { return _horizontal; }; - virtual Segment* getSegment () const { return _horizontal; }; - virtual Horizontal* getHorizontal () { return _horizontal; }; - virtual DbU::Unit getSourceU () const { return _horizontal->getSourceX(); }; - virtual DbU::Unit getTargetU () const { return _horizontal->getTargetX(); }; - virtual DbU::Unit getDuSource () const { return _horizontal->getDxSource(); }; - virtual DbU::Unit getDuTarget () const { return _horizontal->getDxTarget(); }; - virtual Interval getSpanU () const { return Interval(_horizontal->getSourceX(),_horizontal->getTargetX()); }; + virtual Segment* base (); + virtual Segment* base () const; + virtual Horizontal* getHorizontal (); + virtual DbU::Unit getSourceU () const; + virtual DbU::Unit getTargetU () const; + virtual DbU::Unit getDuSource () const; + virtual DbU::Unit getDuTarget () const; + virtual Interval getSpanU () const; virtual bool getConstraints ( DbU::Unit& min , DbU::Unit& max ) const; - virtual Interval getSourceConstraints ( bool native=false ) const; - virtual Interval getTargetConstraints ( bool native=false ) const; + virtual Interval getSourceConstraints ( unsigned int flags=0 ) const; + virtual Interval getTargetConstraints ( unsigned int flags=0 ) const; virtual unsigned int getDirection () const; virtual size_t getGCells ( vector& ) const; // Modifiers. - virtual void setDuSource ( DbU::Unit du ) { _horizontal->setDxSource(du); }; - virtual void setDuTarget ( DbU::Unit du ) { _horizontal->setDxTarget(du); }; - virtual void alignate ( DbU::Unit axis ); - virtual void orient (); - virtual void setPositions (); + virtual void setDuSource ( DbU::Unit ); + virtual void setDuTarget ( DbU::Unit ); + virtual void _setAxis ( DbU::Unit ); + virtual void updateOrient (); + virtual void updatePositions (); virtual bool checkPositions () const; virtual bool checkConstraints () const; - virtual void _computeTerminal (); - virtual void moveURight (); - virtual void moveULeft (); - virtual void _makeDogLeg ( GCell*, bool upLayer ); + virtual unsigned int _makeDogleg ( GCell*, unsigned int flags ); + virtual bool moveULeft (); + virtual bool moveURight (); + virtual bool _slacken ( unsigned int flags ); +#if THIS_IS_DISABLED virtual void desalignate ( AutoContact* ); - virtual void _slacken (); +#endif // Inspector Management. virtual Record* _getRecord () const; virtual string _getString () const; - virtual string _getTypeName () const { return "AutoHorizontal"; }; + virtual string _getTypeName () const; // Internal: Attributes. protected: @@ -100,13 +76,10 @@ namespace Katabatic { // Internal: Constructors. protected: - AutoHorizontal ( Horizontal* horizontal - , int type - , bool terminal - , bool collapsed ); + AutoHorizontal ( Horizontal* ); virtual ~AutoHorizontal (); virtual void _postCreate (); - virtual void _preDestroy (); + virtual void _preDestroy (); private: AutoHorizontal ( const AutoHorizontal& ); AutoHorizontal& operator= ( const AutoHorizontal& ); @@ -116,4 +89,7 @@ namespace Katabatic { } // End of Katabatic namespace. -#endif // __KATABATIC_AUTOHORIZONTAL__ +INSPECTOR_P_SUPPORT(Katabatic::AutoHorizontal); + + +#endif // KATABATIC_AUTOHORIZONTAL_H diff --git a/katabatic/src/katabatic/AutoSegment.h b/katabatic/src/katabatic/AutoSegment.h index 1bdb03f7..bab26d22 100644 --- a/katabatic/src/katabatic/AutoSegment.h +++ b/katabatic/src/katabatic/AutoSegment.h @@ -1,30 +1,21 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./AutoSegment.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/AutoSegment.h" | +// +-----------------------------------------------------------------+ -#ifndef __KATABATIC_AUTOSEGMENT__ -#define __KATABATIC_AUTOSEGMENT__ +#ifndef KATABATIC_AUTOSEGMENT_H +#define KATABATIC_AUTOSEGMENT_H #include #include @@ -42,6 +33,8 @@ namespace Hurricane { class Cell; } +#include "katabatic/Constants.h" +#include "katabatic/Observer.h" #include "katabatic/GCell.h" #include "katabatic/AutoSegments.h" #include "katabatic/Session.h" @@ -63,36 +56,258 @@ namespace Katabatic { using Hurricane::Vertical; using Hurricane::Cell; - - enum AutoSegmentFlags { Realignate=0x1, AxisSet=0x2 }; - + class AutoHorizontal; + class AutoVertical; // ------------------------------------------------------------------- // Class : "AutoSegment". + + enum AutoSegmentFlag { SegHorizontal = 0x00000001 + , SegFixed = 0x00000002 + , SegGlobal = 0x00000004 + , SegWeakGlobal = 0x00000008 + , SegCanonical = 0x00000010 + , SegBipoint = 0x00000020 + , SegDogleg = 0x00000040 + , SegStrap = 0x00000080 + , SegLayerChange = 0x00000100 + , SegStrongTerminal = 0x00000200 // Replace Terminal. + , SegWeakTerminal1 = 0x00000400 // Replace TopologicalEnd. + , SegWeakTerminal2 = 0x00000800 // Replace TopologicalEnd. + , SegNotSourceAligned = 0x00001000 + , SegNotTargetAligned = 0x00002000 + , SegUnbound = 0x00010000 + , SegHalfSlackened = 0x00020000 + , SegSlackened = 0x00040000 + , SegAxisSet = 0x00080000 + , SegInvalidated = 0x00100000 + , SegInvalidatedLayer = 0x00200000 + , SegCreated = 0x00400000 + // Masks. + , SegWeakTerminal = SegStrongTerminal|SegWeakTerminal1|SegWeakTerminal2 + , SegNotAligned = SegNotSourceAligned|SegNotTargetAligned + }; class AutoSegment { + friend class AutoHorizontal; + friend class AutoVertical; public: - // Types. + enum ObserverFlag { Create = 0x000000001 + , Destroy = 0x000000002 + , Invalidate = 0x000000003 + , Revalidate = 0x000000004 + }; + public: typedef std::tr1::function< void(AutoSegment*) > RevalidateCb_t; - // Enumerations. - enum Type { Global = 1 - , Local = 2 - , Guess = 3 - }; - enum PerpandicularState { PerpandicularAny = (1<<0) - , PerpandicularIndirect = (1<<1) - , ParallelOrExpanded = (1<<2) - , ParallelAndLayerChange = (1<<3) - }; - enum Flags { Propagate = (1<<0) - , AllowLocal = (1<<1) - , AllowTerminal = (1<<2) - , IgnoreContact = (1<<3) - , PerpandicularFrag = (1<<4) - }; - + public: + static void setDestroyMode ( bool ); + static AutoSegment* create ( AutoContact* source + , AutoContact* target + , Segment* hurricaneSegment + ); + static AutoSegment* create ( AutoContact* source + , AutoContact* target + , unsigned int dir + ); + void destroy (); + // Wrapped Segment Functions. + virtual Segment* base () const = 0; + virtual Segment* base () = 0; + virtual Horizontal* getHorizontal () { return NULL; }; + virtual Vertical* getVertical () { return NULL; }; + inline Cell* getCell () const; + inline Net* getNet () const; + inline const Layer* getLayer () const; + inline Box getBoundingBox () const; + inline Hook* getSourceHook (); + inline Hook* getTargetHook (); + inline Contact* getSource () const; + inline Contact* getTarget () const; + inline Component* getOppositeAnchor ( Component* ) const; + inline Components getAnchors () const; + virtual DbU::Unit getX () const; + virtual DbU::Unit getY () const; + inline DbU::Unit getWidth () const; + inline DbU::Unit getLength () const; + inline DbU::Unit getSourcePosition () const; + inline DbU::Unit getTargetPosition () const; + inline DbU::Unit getSourceX () const; + inline DbU::Unit getSourceY () const; + inline DbU::Unit getTargetX () const; + inline DbU::Unit getTargetY () const; + inline void invert (); + inline void setLayer ( const Layer* ); + // Predicates. + inline bool isHorizontal () const; + inline bool isVertical () const; + inline bool isGlobal () const; + inline bool isWeakGlobal () const; + inline bool isLocal () const; + inline bool isFixed () const; + inline bool isBipoint () const; + inline bool isWeakTerminal () const; + inline bool isWeakTerminal1 () const; + inline bool isWeakTerminal2 () const; + inline bool isTerminal () const; + inline bool isNotSourceAligned () const; + inline bool isNotTargetAligned () const; + inline bool isNotAligned () const; + bool isStrongTerminal ( unsigned int flags=0 ) const; + inline bool isLayerChange () const; + inline bool isStrap () const; + inline bool isDogleg () const; + inline bool isUnbound () const; + inline bool isInvalidated () const; + inline bool isInvalidatedLayer () const; + inline bool isCreated () const; + inline bool isCanonical () const; + inline bool isUnsetAxis () const; + inline bool isSlackened () const; + virtual bool _canSlacken () const = 0; + unsigned int canDogleg ( Interval ); + virtual bool canMoveULeft ( float reserve=0.0 ) const = 0; + virtual bool canMoveURight ( float reserve=0.0 ) const = 0; + bool canMoveUp ( float reserve=0.0, unsigned int flags=0 ) const; + bool canPivotUp ( float reserve=0.0, unsigned int flags=0 ) const; + bool canPivotDown ( float reserve=0.0, unsigned int flags=0 ) const; + bool canSlacken ( unsigned int flags=0 ) const; + virtual bool checkPositions () const = 0; + virtual bool checkConstraints () const = 0; + // Accessors. + template< typename T > + inline T* getObserver (); + inline unsigned long getId () const; + inline unsigned int getFlags () const; + virtual unsigned int getDirection () const = 0; + inline GCell* getGCell () const; + virtual size_t getGCells ( vector& ) const = 0; + inline AutoContact* getAutoSource () const; + inline AutoContact* getAutoTarget () const; + AutoContact* getOppositeAnchor ( AutoContact* ) const; + size_t getPerpandicularsBound ( set& ); + inline AutoSegment* getParent () const; + inline DbU::Unit getAxis () const; + virtual DbU::Unit getSourceU () const = 0; + virtual DbU::Unit getTargetU () const = 0; + virtual DbU::Unit getDuSource () const = 0; + virtual DbU::Unit getDuTarget () const = 0; + inline DbU::Unit getOrigin () const; + inline DbU::Unit getExtremity () const; + virtual Interval getSpanU () const = 0; + Interval getMinSpanU () const; + virtual Interval getSourceConstraints ( unsigned int flags=0 ) const = 0; + virtual Interval getTargetConstraints ( unsigned int flags=0 ) const = 0; + virtual bool getConstraints ( DbU::Unit& min, DbU::Unit& max ) const = 0; + inline bool getConstraints ( Interval& i ) const; + inline const Interval& getUserConstraints () const; + virtual DbU::Unit getSlack () const; + inline DbU::Unit getOptimalMin () const; + inline DbU::Unit getOptimalMax () const; + Interval& getOptimal ( Interval& i ) const; + virtual DbU::Unit getCost ( DbU::Unit axis ) const; + virtual AutoSegment* getCanonical ( DbU::Unit& min , DbU::Unit& max ); + inline AutoSegment* getCanonical ( Interval& i ); + float getMaxUnderDensity ( unsigned int flags ); + // Modifiers. + inline void addObserver ( BaseObserver* ); + inline void removeObserver ( BaseObserver* ); + inline void unsetFlags ( unsigned int ); + inline void setFlags ( unsigned int ); + void setFlagsOnAligneds ( unsigned int ); + virtual void setDuSource ( DbU::Unit du ) = 0; + virtual void setDuTarget ( DbU::Unit du ) = 0; + void computeTerminal (); + virtual void updateOrient () = 0; + virtual void updatePositions () = 0; + void sourceDetach (); + void targetDetach (); + void sourceAttach ( AutoContact* ); + void targetAttach ( AutoContact* ); + //inline void mergeUserConstraints ( const Interval& ); + void mergeUserConstraints ( const Interval& ); + inline void resetUserConstraints (); + inline void setOptimalMin ( DbU::Unit min ); + inline void setOptimalMax ( DbU::Unit max ); + bool checkNotInvalidated () const; + inline void setParent ( AutoSegment* ); + void revalidate (); + AutoSegment* makeDogleg ( AutoContact* ); + unsigned int makeDogleg ( Interval, unsigned int flags=KbNoFlags ); + unsigned int makeDogleg ( GCell*, unsigned int flags=KbNoFlags ); + virtual unsigned int _makeDogleg ( GCell*, unsigned int flags ) = 0; + virtual bool moveULeft () = 0; + virtual bool moveURight () = 0; + bool slacken ( unsigned int flags ); + virtual bool _slacken ( unsigned int flags ) = 0; + void _changeDepth ( unsigned int depth, unsigned int flags ); + void changeDepth ( unsigned int depth, unsigned int flags ); + bool moveUp ( unsigned int flags=KbNoFlags ); + bool moveDown ( unsigned int flags=KbNoFlags ); + // Canonical Modifiers. + AutoSegment* canonize ( unsigned int flags=KbNoFlags ); + virtual void invalidate ( unsigned int flags=KbPropagate ); + void computeOptimal ( set& processeds ); + void setAxis ( DbU::Unit, unsigned int flags=KbNoFlags ); + bool toConstraintAxis (); + bool toOptimalAxis (); + // Collections & Filters. + AutoSegments getOnSourceContact ( unsigned int direction ); + AutoSegments getOnTargetContact ( unsigned int direction ); + AutoSegments getCachedOnSourceContact ( unsigned int direction ); + AutoSegments getCachedOnTargetContact ( unsigned int direction ); + AutoSegments getAligneds ( unsigned int flags=KbNoFlags ); + AutoSegments getPerpandiculars (); + size_t getAlignedContacts ( map& ) const ; + // Inspector Management. + virtual Record* _getRecord () const = 0; + virtual string _getString () const = 0; + virtual string _getTypeName () const = 0; + // Non-reviewed atomic modifiers. + bool _check () const; +#if THIS_IS_DISABLED + virtual void desalignate ( AutoContact* ) = 0; + bool shearUp ( GCell* + , AutoSegment*& movedUp + , float reserve + , unsigned int flags ); +#endif + + protected: + // Internal: Static Attributes. + static size_t _allocateds; + static size_t _globalsCount; + static bool _destroyBase; + static bool _destroyTool; + static unsigned long _maxId; + // Internal: Attributes. + GCell* _gcell; + const unsigned long _id; + unsigned int _flags; + unsigned int _optimalMin : 8; + unsigned int _optimalMax : 8; + DbU::Unit _sourcePosition; + DbU::Unit _targetPosition; + Interval _userConstraints; + AutoSegment* _parent; + Observable _observers; + + // Internal: Constructors & Destructors. + protected: + AutoSegment ( Segment* segment ); + virtual ~AutoSegment (); + static void _preCreate ( AutoContact* source, AutoContact* target ); + virtual void _postCreate (); + virtual void _preDestroy (); + private: + AutoSegment ( const AutoSegment& ); + AutoSegment& operator= ( const AutoSegment& ); + protected: + void _invalidate (); + inline unsigned int _getFlags () const; + std::string _getStringFlags () const; + virtual void _setAxis ( DbU::Unit ) = 0; public: struct CompareId : public binary_function { @@ -109,12 +324,10 @@ namespace Katabatic { public: typedef std::set DepthLengthSet; + // Static Utilities. public: - // Utilities. - static bool isTopologicalBound ( AutoSegment* seed - , bool superior - , bool isHorizontal - ); + static inline bool areAlignedsAndDiffLayer ( AutoSegment*, AutoSegment* ); + static bool isTopologicalBound ( AutoSegment* seed, unsigned int flags ); static inline bool arePerpandiculars ( AutoSegment* a, AutoSegment* b ); static inline bool arePerpandiculars ( bool isHorizontalA, AutoSegment* b ); static inline bool areAligneds ( AutoSegment* a, AutoSegment* b ); @@ -142,315 +355,77 @@ namespace Katabatic { static inline size_t getGlobalsCount (); static inline size_t getAllocateds (); static inline unsigned long getMaxId (); - // Constructors & Destructor. - static AutoSegment* create ( AutoContact* source - , AutoContact* target - , Segment* hurricaneSegment - ); - static AutoSegment* create ( AutoContact* source - , AutoContact* target - , unsigned int dir - , int type - , bool terminal=false - , bool collapsed=false - ); - void destroy (); - // Wrapped Segment Functions. - virtual Segment* base () = 0; - virtual Segment* base () const = 0; - virtual Segment* getSegment () = 0; - virtual Segment* getSegment () const = 0; - virtual Horizontal* getHorizontal () { return NULL; }; - virtual Vertical* getVertical () { return NULL; }; - inline Cell* getCell () const; - inline Net* getNet () const; - inline const Layer* getLayer () const; - inline Box getBoundingBox () const; - inline Hook* getSourceHook (); - inline Hook* getTargetHook (); - inline Contact* getSource () const; - inline Contact* getTarget () const; - inline Component* getOppositeAnchor ( Component* ) const; - inline Components getAnchors () const; - virtual DbU::Unit getX () const; - virtual DbU::Unit getY () const; - inline DbU::Unit getWidth () const; - inline DbU::Unit getLength () const; - inline DbU::Unit getSourcePosition () const; - inline DbU::Unit getTargetPosition () const; - inline DbU::Unit getSourceX () const; - inline DbU::Unit getSourceY () const; - inline DbU::Unit getTargetX () const; - inline DbU::Unit getTargetY () const; - inline void invert (); - // Predicates. - inline bool isHorizontal () const; - inline bool isVertical () const; - inline bool isBipoint () const; - inline bool isTopologicEnd () const; - inline bool isInvalidated () const; - inline bool isGlobal () const; - inline bool isLocal () const; - inline bool isCanonicalLocal () const; - inline bool isTerminal () const; - inline bool isDogleg () const; - inline bool isCollapsed () const; - inline bool isCanonical () const; - inline bool isFixed () const; - inline bool isStrap () const; - bool isCanonicalStrap () const; - inline bool isLayerChange () const; - inline bool isAccountable () const; - inline bool isUnsetAxis () const; - inline bool isSlackened () const; - inline bool isSlackenStrap () const; - inline bool allowOutsideGCell () const; - bool canDesalignate (); - virtual bool canDesalignate ( AutoContact* ) const = 0; - bool canMoveUp ( float reserve=0.0, unsigned int flags=0 ); - //bool canPivotUp ( bool propagate=false, float reserve=0.0 ); - bool canPivotUp ( float reserve=0.0, unsigned int flags=0 ); - bool canPivotDown ( bool propagate=false, float reserve=0.0 ); - bool canSlacken ( bool propagate=false ); - virtual bool _canSlacken () const = 0; - bool canGoOutsideGCell () const; - float getMaxUnderDensity ( unsigned int flags ); - // Accessors. - inline unsigned long getId () const; - virtual unsigned int getDirection () const = 0; - inline GCell* getGCell () const; - virtual size_t getGCells ( vector& ) const = 0; - inline AutoContact* getAutoSource () const; - inline AutoContact* getAutoTarget () const; - AutoContact* getOppositeAnchor ( AutoContact* ) const; - size_t getAlignedContacts ( map& ); - size_t getPerpandicularsBound ( set& ); - inline AutoSegment* getParent () const; - inline DbU::Unit getAxis () const; - virtual DbU::Unit getSourceU () const = 0; - virtual DbU::Unit getTargetU () const = 0; - virtual DbU::Unit getDuSource () const = 0; - virtual DbU::Unit getDuTarget () const = 0; - inline DbU::Unit getOrigin () const; - inline DbU::Unit getExtremity () const; - virtual Interval getSpanU () const = 0; - Interval getMinSpanU (); - virtual Interval getSourceConstraints ( bool native=false ) const = 0; - virtual Interval getTargetConstraints ( bool native=false ) const = 0; - virtual bool getConstraints ( DbU::Unit& min, DbU::Unit& max ) const = 0; - inline bool getConstraints ( Interval& i ) const; - inline const Interval& getUserConstraints () const; - virtual DbU::Unit getSlack () const; - inline DbU::Unit getOptimalMin () const; - inline DbU::Unit getOptimalMax () const; - Interval& getOptimal ( Interval& i ) const; - virtual DbU::Unit getCost ( DbU::Unit axis ) const; - virtual AutoSegment* getCanonical ( DbU::Unit& min , DbU::Unit& max ); - inline AutoSegment* getCanonical ( Interval& i ); - // Collections & Filters. - AutoSegments getOnSourceContact ( unsigned int direction ); - AutoSegments getOnTargetContact ( unsigned int direction ); - AutoSegments getCollapseds ( bool withPerpand=false ); - AutoSegments getCollapsedPerpandiculars (); - static AutoSegmentFilter getIsAccountable () { return new AutoSegments_IsAccountable(); }; - // Static Modifiers. - static void setDestroyMode ( bool ); - // Modifiers. - inline void setBipoint ( bool ); - inline void setTopologicEnd ( bool ); - inline void setGlobal ( bool ); - inline void setCanonicalLocal ( bool ); - inline void setCanonical ( bool ); - inline void setTerminal ( bool ); - inline void setDogleg ( bool ); - inline void setFixed ( bool ); - inline void setStrap ( bool ); - inline void setLayerChange ( bool ); - inline void setSlackened ( bool ); - inline void setSlackenStrap ( bool ); - void setAllowOutsideGCell ( bool state, bool propagate=false ); - void _setAllowOutsideGCell ( bool ); - inline void setLayer ( const Layer* layer ); - void setAxis ( DbU::Unit axis - , unsigned int flags=AxisSet - , set* processeds=NULL ); - virtual void setDuSource ( DbU::Unit du ) = 0; - virtual void setDuTarget ( DbU::Unit du ) = 0; - virtual void orient () = 0; - virtual void setPositions () = 0; - virtual bool checkPositions () const = 0; - virtual bool checkConstraints () const = 0; - inline void mergeUserConstraints ( const Interval& ); - inline void resetUserConstraints (); - virtual void invalidate (); - void revalidate (); - bool collapse (); - bool expand (); - bool toConstraintAxis ( set* processeds=NULL ); - bool toOptimalAxis ( set* processeds=NULL ); - virtual void alignate ( DbU::Unit axis ) = 0; - inline void setOptimalMin ( DbU::Unit min ); - inline void setOptimalMax ( DbU::Unit max ); - void computeOptimal ( set* processeds=NULL ); - void _computeTerminal ( Segment* ); - virtual void _computeTerminal () = 0; - virtual bool checkInvalidated () const; - inline void setParent ( AutoSegment* ); - AutoSegment* canonize (); - void changeDepth ( unsigned int depth - , bool propagate =false - , bool standAlone=true - ); - void _changeDepth ( unsigned int depth, bool withNeighbors ); - bool moveUp ( unsigned int flags=0 ); - bool moveDown ( unsigned int flags=0 ); - virtual void moveULeft () = 0; - virtual void moveURight () = 0; - void slacken ( bool propagate=false ); - virtual void _slacken () = 0; - bool canDogLeg ( Interval ); - void makeDogLeg ( Interval, bool upLayer, bool& leftDogleg ); - void makeDogLeg ( GCell*, bool upLayer ); - virtual void _makeDogLeg ( GCell*, bool upLayer ) = 0; - virtual void desalignate ( AutoContact* ) = 0; - void desalignate (); - bool shearUp ( GCell* - , AutoSegment*& movedUp - , float reserve - , unsigned int flags ); - bool _check () const; - // Inspector Management. - virtual Record* _getRecord () const = 0; - virtual string _getString () const = 0; - virtual string _getTypeName () const = 0; - - protected: - // Internal: Static Attributes. - static size_t _allocateds; - static size_t _globalsCount; - static bool _destroyBase; - static bool _destroyTool; - static unsigned long _maxId; - // Internal: Attributes. - GCell* _gcell; - bool _isUnsetAxis; - bool _invalidated; - bool _isHorizontal; - bool _isBipoint; - bool _isTopologicEnd; - bool _isGlobal; - bool _isCanonicalLocal; - bool _isTerminal; - bool _isDogleg; - bool _isCollapsed; - bool _isCanonical; - bool _isFixed; - bool _strap; - bool _layerChange; - bool _slackened; - bool _slackenStrap; - bool _allowOutsideGCell; - const unsigned long _id; - unsigned int _optimalMin : 8; - unsigned int _optimalMax : 8; - DbU::Unit _sourcePosition; - DbU::Unit _targetPosition; - Interval _userConstraints; - AutoSegment* _parent; - - // Internal: Constructors & Destructors. - protected: - AutoSegment ( Segment* segment - , bool isHorizontal - , int type - , bool terminal - , bool collapsed - ); - virtual ~AutoSegment (); - static void _preCreate ( Component* source, Component* target ); - static void _preCreate ( AutoContact* source, AutoContact* target ); - virtual void _postCreate (); - virtual void _preDestroy (); - private: - AutoSegment ( const AutoSegment& ); - AutoSegment& operator= ( const AutoSegment& ); - private: - inline void setInvalidated ( bool state ); - void _invalidate (); - }; // Inline Functions. + inline void AutoSegment::addObserver ( BaseObserver* observer ) { _observers.addObserver(observer); } + inline void AutoSegment::removeObserver ( BaseObserver* observer ) { _observers.removeObserver(observer); } inline unsigned long AutoSegment::getId () const { return _id; } - inline Cell* AutoSegment::getCell () const { return getSegment()->getCell(); } - inline Net* AutoSegment::getNet () const { return getSegment()->getNet(); } - inline const Layer* AutoSegment::getLayer () const { return getSegment()->getLayer(); } - inline Box AutoSegment::getBoundingBox () const { return getSegment()->getBoundingBox(); } - inline Hook* AutoSegment::getSourceHook () { return getSegment()->getSourceHook(); } - inline Hook* AutoSegment::getTargetHook () { return getSegment()->getTargetHook(); } - inline Contact* AutoSegment::getSource () const { return static_cast(getSegment()->getSource()); } - inline Contact* AutoSegment::getTarget () const { return static_cast(getSegment()->getTarget()); } - inline Component* AutoSegment::getOppositeAnchor ( Component* anchor ) const { return getSegment()->getOppositeAnchor(anchor); }; + inline Cell* AutoSegment::getCell () const { return base()->getCell(); } + inline Net* AutoSegment::getNet () const { return base()->getNet(); } + inline const Layer* AutoSegment::getLayer () const { return base()->getLayer(); } + inline Box AutoSegment::getBoundingBox () const { return base()->getBoundingBox(); } + inline Hook* AutoSegment::getSourceHook () { return base()->getSourceHook(); } + inline Hook* AutoSegment::getTargetHook () { return base()->getTargetHook(); } + inline Contact* AutoSegment::getSource () const { return static_cast(base()->getSource()); } + inline Contact* AutoSegment::getTarget () const { return static_cast(base()->getTarget()); } + inline Component* AutoSegment::getOppositeAnchor ( Component* anchor ) const { return base()->getOppositeAnchor(anchor); }; inline AutoSegment* AutoSegment::getParent () const { return _parent; } inline DbU::Unit AutoSegment::getSourcePosition () const { return _sourcePosition; } inline DbU::Unit AutoSegment::getTargetPosition () const { return _targetPosition; } - inline DbU::Unit AutoSegment::getSourceX () const { return getSegment()->getSourceX(); } - inline DbU::Unit AutoSegment::getSourceY () const { return getSegment()->getSourceY(); } - inline DbU::Unit AutoSegment::getTargetX () const { return getSegment()->getTargetX(); } - inline DbU::Unit AutoSegment::getTargetY () const { return getSegment()->getTargetY(); } - inline DbU::Unit AutoSegment::getWidth () const { return getSegment()->getWidth(); } - inline DbU::Unit AutoSegment::getLength () const { return getSegment()->getLength(); } - inline void AutoSegment::invert () { getSegment()->invert(); } + inline DbU::Unit AutoSegment::getSourceX () const { return base()->getSourceX(); } + inline DbU::Unit AutoSegment::getSourceY () const { return base()->getSourceY(); } + inline DbU::Unit AutoSegment::getTargetX () const { return base()->getTargetX(); } + inline DbU::Unit AutoSegment::getTargetY () const { return base()->getTargetY(); } + inline DbU::Unit AutoSegment::getWidth () const { return base()->getWidth(); } + inline DbU::Unit AutoSegment::getLength () const { return base()->getLength(); } + inline void AutoSegment::invert () { base()->invert(); } inline GCell* AutoSegment::getGCell () const { return _gcell; } inline AutoContact* AutoSegment::getAutoSource () const { return Session::lookup(getSource()); } inline AutoContact* AutoSegment::getAutoTarget () const { return Session::lookup(getTarget()); } inline bool AutoSegment::getConstraints ( Interval& i ) const { return getConstraints(i.getVMin(),i.getVMax()); } inline AutoSegment* AutoSegment::getCanonical ( Interval& i ) { return getCanonical(i.getVMin(),i.getVMax()); } - inline DbU::Unit AutoSegment::getAxis () const { return _isHorizontal?getSegment()->getY():getSegment()->getX(); } - inline DbU::Unit AutoSegment::getOrigin () const { return _isHorizontal?_gcell->getY():_gcell->getX(); } - inline DbU::Unit AutoSegment::getExtremity () const { return _isHorizontal?_gcell->getYMax():_gcell->getXMax(); } + inline DbU::Unit AutoSegment::getAxis () const { return isHorizontal()?base()->getY():base()->getX(); } + inline DbU::Unit AutoSegment::getOrigin () const { return isHorizontal()?_gcell->getY():_gcell->getX(); } + inline DbU::Unit AutoSegment::getExtremity () const { return isHorizontal()?_gcell->getYMax():_gcell->getXMax(); } inline DbU::Unit AutoSegment::getOptimalMin () const { return DbU::lambda(_optimalMin) + getOrigin(); } inline DbU::Unit AutoSegment::getOptimalMax () const { return DbU::lambda(_optimalMax) + getOrigin(); } inline const Interval& AutoSegment::getUserConstraints () const { return _userConstraints; } - inline bool AutoSegment::isInvalidated () const { return _invalidated; } - inline bool AutoSegment::isHorizontal () const { return _isHorizontal; } - inline bool AutoSegment::isBipoint () const { return _isBipoint; } - inline bool AutoSegment::isTopologicEnd () const { return _isTopologicEnd; } - inline bool AutoSegment::isVertical () const { return !_isHorizontal; } - inline bool AutoSegment::isGlobal () const { return _isGlobal; } - inline bool AutoSegment::isCanonicalLocal () const { return _isCanonicalLocal; } - inline bool AutoSegment::isLocal () const { return !_isGlobal; } - inline bool AutoSegment::isTerminal () const { return _isTerminal; } - inline bool AutoSegment::isDogleg () const { return _isDogleg ; } - inline bool AutoSegment::isCollapsed () const { return _isCollapsed; } - inline bool AutoSegment::isCanonical () const { return _isCanonical; } - inline bool AutoSegment::isFixed () const { return _isFixed; } - inline bool AutoSegment::isStrap () const { return _strap; } - inline bool AutoSegment::isLayerChange () const { return _layerChange; } - inline bool AutoSegment::isAccountable () const { return _isCanonical && !_isCollapsed; } - inline bool AutoSegment::isUnsetAxis () const { return _isUnsetAxis; } - inline bool AutoSegment::isSlackened () const { return _slackened; } - inline bool AutoSegment::isSlackenStrap () const { return _slackenStrap; } - inline bool AutoSegment::allowOutsideGCell () const { return _allowOutsideGCell; } + inline bool AutoSegment::isHorizontal () const { return _flags & SegHorizontal; } + inline bool AutoSegment::isVertical () const { return not (_flags & SegHorizontal); } + inline bool AutoSegment::isFixed () const { return _flags & SegFixed; } + inline bool AutoSegment::isGlobal () const { return _flags & SegGlobal; } + inline bool AutoSegment::isWeakGlobal () const { return _flags & SegWeakGlobal; } + inline bool AutoSegment::isLocal () const { return not (_flags & SegGlobal); } + inline bool AutoSegment::isBipoint () const { return _flags & SegBipoint; } + inline bool AutoSegment::isWeakTerminal () const { return _flags & SegWeakTerminal; } + inline bool AutoSegment::isWeakTerminal1 () const { return _flags & SegWeakTerminal1; } + inline bool AutoSegment::isWeakTerminal2 () const { return _flags & SegWeakTerminal2; } + inline bool AutoSegment::isTerminal () const { return _flags & SegStrongTerminal; } + inline bool AutoSegment::isNotSourceAligned () const { return _flags & SegNotSourceAligned; } + inline bool AutoSegment::isNotTargetAligned () const { return _flags & SegNotTargetAligned; } + inline bool AutoSegment::isNotAligned () const { return (_flags & SegNotAligned) == SegNotAligned; } + inline bool AutoSegment::isDogleg () const { return _flags & SegDogleg ; } + inline bool AutoSegment::isUnbound () const { return _flags & SegUnbound ; } + inline bool AutoSegment::isStrap () const { return _flags & SegStrap; } + inline bool AutoSegment::isLayerChange () const { return _flags & SegLayerChange; } + inline bool AutoSegment::isSlackened () const { return _flags & SegSlackened; } + inline bool AutoSegment::isCanonical () const { return _flags & SegCanonical; } + inline bool AutoSegment::isUnsetAxis () const { return not (_flags & SegAxisSet); } + inline bool AutoSegment::isInvalidated () const { return _flags & SegInvalidated; } + inline bool AutoSegment::isInvalidatedLayer () const { return _flags & SegInvalidatedLayer; } + inline bool AutoSegment::isCreated () const { return _flags & SegCreated; } + inline void AutoSegment::setFlags ( unsigned int flags ) { _flags |= flags; } + inline void AutoSegment::unsetFlags ( unsigned int flags ) { _flags &= ~flags; } - inline void AutoSegment::setLayer ( const Layer* layer ) { invalidate(); getSegment()->setLayer(layer); } - inline void AutoSegment::setInvalidated ( bool state ) { _invalidated = state; } - inline void AutoSegment::setBipoint ( bool state ) { _isBipoint = state; } - inline void AutoSegment::setTopologicEnd ( bool state ) { _isTopologicEnd = state; } - inline void AutoSegment::setGlobal ( bool state ) { _isGlobal = state; } - inline void AutoSegment::setCanonicalLocal ( bool state ) { _isCanonicalLocal = state; } - inline void AutoSegment::setTerminal ( bool state ) { _isTerminal = state; } - inline void AutoSegment::setDogleg ( bool state ) { _isDogleg = state; } - inline void AutoSegment::setFixed ( bool state ) { _isFixed = state; } - inline void AutoSegment::setStrap ( bool state ) { _strap = state; } - inline void AutoSegment::setLayerChange ( bool state ) { _layerChange = state; } - inline void AutoSegment::setSlackened ( bool state ) { _slackened = state; } - inline void AutoSegment::setSlackenStrap ( bool state ) { _slackenStrap = state; } + inline unsigned int AutoSegment::getFlags () const { return _flags; } + inline unsigned int AutoSegment::_getFlags () const { return _flags; } + inline void AutoSegment::setLayer ( const Layer* layer ) { base()->setLayer(layer); } inline void AutoSegment::setOptimalMin ( DbU::Unit min ) { _optimalMin = (unsigned int)DbU::getLambda(min-getOrigin()); } inline void AutoSegment::setOptimalMax ( DbU::Unit max ) { _optimalMax = (unsigned int)DbU::getLambda(max-getOrigin()); } - inline void AutoSegment::mergeUserConstraints ( const Interval& constraints ) { _userConstraints.intersection(constraints); } +//inline void AutoSegment::mergeUserConstraints ( const Interval& constraints ) { _userConstraints.intersection(constraints); } inline void AutoSegment::resetUserConstraints () { _userConstraints = Interval(false); } inline void AutoSegment::setParent ( AutoSegment* parent ) @@ -461,29 +436,29 @@ namespace Katabatic { _parent = parent; } + template< typename T > + inline T* AutoSegment::getObserver () { return _observers.getObserver(); } + inline bool AutoSegment::CompareId::operator() ( const AutoSegment* lhs, const AutoSegment* rhs ) const { return lhs->getId() < rhs->getId(); } - - inline void AutoSegment::setCanonical ( bool state ) - { - if ( _isCanonical != state ) { - //ltrace(159) << "canonical:" << state << " " << (void*)this << " " << _getString() << endl; - _isCanonical = state; - } - } inline unsigned long AutoSegment::getMaxId () { return _maxId; } + inline bool AutoSegment::areAlignedsAndDiffLayer ( AutoSegment* s1, AutoSegment* s2 ) + { return s1 and s2 + and (s1->isHorizontal() == s2->isHorizontal()) + and (s1->getLayer() != s2->getLayer()); } + inline bool AutoSegment::arePerpandiculars ( AutoSegment* a, AutoSegment* b ) - { return a->isHorizontal() != b->isHorizontal(); } + { return a and b and (a->isHorizontal() != b->isHorizontal()); } inline bool AutoSegment::arePerpandiculars ( bool isHorizontalA, AutoSegment* b ) - { return isHorizontalA != b->isHorizontal(); } + { return b and (isHorizontalA != b->isHorizontal()); } inline bool AutoSegment::areAligneds ( AutoSegment* a, AutoSegment* b ) - { return a->isHorizontal() == b->isHorizontal(); } + { return a and b and (a->isHorizontal() == b->isHorizontal()); } inline unsigned int AutoSegment::getPerpandicularState ( AutoContact* contact , AutoSegment* source @@ -524,4 +499,4 @@ namespace Katabatic { INSPECTOR_P_SUPPORT(Katabatic::AutoSegment); -# endif // __KATABATIC_AUTOSEGMENT__ +# endif // KATABATIC_AUTOSEGMENT_H diff --git a/katabatic/src/katabatic/AutoSegments.h b/katabatic/src/katabatic/AutoSegments.h index d8562cbd..2722eb09 100644 --- a/katabatic/src/katabatic/AutoSegments.h +++ b/katabatic/src/katabatic/AutoSegments.h @@ -2,29 +2,21 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./AutoSegments.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/AutoSegments.h" | +// +-----------------------------------------------------------------+ -#ifndef __KATABATIC_AUTOSEGMENTS_H__ -#define __KATABATIC_AUTOSEGMENTS_H__ +#ifndef KATABATIC_AUTOSEGMENTS_H +#define KATABATIC_AUTOSEGMENTS_H #include #include @@ -67,6 +59,7 @@ namespace Katabatic { using Hurricane::GenericLocator; using Hurricane::GenericCollection; + class LocatorHelper; class AutoContact; class AutoSegment; class GCell; @@ -75,7 +68,6 @@ namespace Katabatic { // ------------------------------------------------------------------- // Collections. - typedef Hurricane::Filter AutoSegmentHF; typedef Hurricane::Locator AutoSegmentHL; typedef Hurricane::Collection AutoSegmentHC; @@ -88,7 +80,6 @@ namespace Katabatic { // ------------------------------------------------------------------- // Class : "Katabatic::AutoSegmentStack". - class AutoSegmentStack : protected list > { public: inline bool isEmpty () const; @@ -110,7 +101,6 @@ namespace Katabatic { // ------------------------------------------------------------------- // Class : "Katabatic::AutoSegments_OnContact". - class AutoSegments_OnContact : public AutoSegmentHC { public: @@ -168,16 +158,15 @@ namespace Katabatic { // ------------------------------------------------------------------- -// Class : "AutoSegments_Collapsed". +// Class : "AutoSegments_Aligneds". - - class AutoSegments_Collapsed : public AutoSegmentHC { + class AutoSegments_Aligneds : public AutoSegmentHC { public: // Sub-Class: Locator. class Locator : public AutoSegmentHL { public: - inline Locator ( AutoSegment* segment , bool withPerpand ); + inline Locator ( AutoSegment* segment , unsigned int flags ); inline Locator ( const Locator &locator ); virtual AutoSegment* getElement () const; virtual AutoSegmentHL* getClone () const; @@ -185,59 +174,58 @@ namespace Katabatic { virtual void progress (); virtual string _getString () const; protected: - bool _withPerpand; + unsigned int _flags; AutoSegment* _master; AutoSegmentStack _stack; }; public: - // AutoSegments_Collapsed Methods. - AutoSegments_Collapsed ( AutoSegment*, bool withPerpand=false ); - AutoSegments_Collapsed ( const AutoSegments_Collapsed& ); + // AutoSegments_Aligneds Methods. + AutoSegments_Aligneds ( AutoSegment*, unsigned int flags=KbNoFlags ); + AutoSegments_Aligneds ( const AutoSegments_Aligneds& ); virtual AutoSegmentHC* getClone () const; virtual AutoSegmentHL* getLocator () const; virtual string _getString () const; protected: - // AutoSegments_Collapsed Attributes. - bool _withPerpand; + // AutoSegments_Aligneds Attributes. + unsigned int _flags; AutoSegment* _segment; }; - inline AutoSegments_Collapsed::Locator::Locator ( const Locator &locator ) + inline AutoSegments_Aligneds::Locator::Locator ( const Locator &locator ) : AutoSegmentHL() - , _withPerpand(locator._withPerpand) + , _flags (locator._flags) , _master(locator._master) - , _stack(locator._stack) + , _stack (locator._stack) { } - inline AutoSegments_Collapsed::AutoSegments_Collapsed ( AutoSegment* segment, bool withPerpand ) + inline AutoSegments_Aligneds::AutoSegments_Aligneds ( AutoSegment* segment, unsigned int flags ) : AutoSegmentHC() - , _withPerpand(withPerpand) + , _flags (flags) , _segment(segment) { } - inline AutoSegments_Collapsed::AutoSegments_Collapsed ( const AutoSegments_Collapsed& autosegments ) + inline AutoSegments_Aligneds::AutoSegments_Aligneds ( const AutoSegments_Aligneds& autosegments ) : AutoSegmentHC() - , _withPerpand(autosegments._withPerpand) + , _flags (autosegments._flags) , _segment(autosegments._segment) { } // ------------------------------------------------------------------- -// Class : "AutoSegments_CollapsedPerpandicular". +// Class : "AutoSegments_Perpandiculars". - - class AutoSegments_CollapsedPerpandicular : public AutoSegmentHC { + class AutoSegments_Perpandiculars : public AutoSegmentHC { public: // Sub-Class: Locator. class Locator : public AutoSegmentHL { public: - Locator ( AutoSegment* segment ); + Locator ( AutoSegment* master ); inline Locator ( const Locator& ); virtual AutoSegment* getElement () const; virtual AutoSegmentHL* getClone () const; @@ -245,42 +233,44 @@ namespace Katabatic { virtual void progress (); virtual string _getString () const; protected: + unsigned int _flags; AutoSegment* _master; AutoSegmentStack _stack; vector _perpandiculars; }; public: - // AutoSegments_CollapsedPerpandicular Methods. - inline AutoSegments_CollapsedPerpandicular ( AutoSegment* segment ); - inline AutoSegments_CollapsedPerpandicular ( const AutoSegments_CollapsedPerpandicular& ); - virtual AutoSegmentHC* getClone () const; - virtual AutoSegmentHL* getLocator () const; - virtual string _getString () const; + // AutoSegments_Perpandiculars Methods. + inline AutoSegments_Perpandiculars ( AutoSegment* master ); + inline AutoSegments_Perpandiculars ( const AutoSegments_Perpandiculars& ); + virtual AutoSegmentHC* getClone () const; + virtual AutoSegmentHL* getLocator () const; + virtual string _getString () const; protected: - // AutoSegments_CollapsedPerpandicular Attributes. + // AutoSegments_Perpandiculars Attributes. AutoSegment* _segment; }; - inline AutoSegments_CollapsedPerpandicular::Locator::Locator ( const Locator& locator ) + inline AutoSegments_Perpandiculars::Locator::Locator ( const Locator& locator ) : AutoSegmentHL() - , _master(locator._master) - , _stack(locator._stack) + , _flags (locator._flags) + , _master (locator._master) + , _stack (locator._stack) , _perpandiculars() { } - inline AutoSegments_CollapsedPerpandicular::AutoSegments_CollapsedPerpandicular + inline AutoSegments_Perpandiculars::AutoSegments_Perpandiculars ( AutoSegment* segment ) : AutoSegmentHC() , _segment(segment) { } - inline AutoSegments_CollapsedPerpandicular::AutoSegments_CollapsedPerpandicular - ( const AutoSegments_CollapsedPerpandicular& autosegments ) + inline AutoSegments_Perpandiculars::AutoSegments_Perpandiculars + ( const AutoSegments_Perpandiculars& autosegments ) : AutoSegmentHC() , _segment(autosegments._segment) { } @@ -289,14 +279,13 @@ namespace Katabatic { // ------------------------------------------------------------------- // Class : "AutoSegments_AnchorOnGCell". - class AutoSegments_AnchorOnGCell : public AutoSegmentHC { public: // Sub-Class: Locator. class Locator : public AutoSegmentHL { public: - Locator ( GCell* fcell, bool sourceAnchor, unsigned int direction ); + Locator ( GCell* fcell, unsigned int flags ); inline Locator ( const Locator& ); virtual ~Locator (); virtual AutoSegment* getElement () const; @@ -305,8 +294,7 @@ namespace Katabatic { virtual void progress (); virtual string _getString () const; protected: - bool _sourceAnchor; - unsigned int _direction; + unsigned int _flags; vector::const_iterator _itContact; vector::const_iterator _itEnd; Hurricane::Locator* _hookLocator; @@ -314,38 +302,34 @@ namespace Katabatic { }; public: - // AutoSegments_CollapsedPerpandicular Methods. - inline AutoSegments_AnchorOnGCell ( GCell* fcell, bool sourceAnchor, unsigned int direction ); + // AutoSegments_Perpandiculars Methods. + inline AutoSegments_AnchorOnGCell ( GCell* fcell, unsigned int flags ); inline AutoSegments_AnchorOnGCell ( const AutoSegments_AnchorOnGCell& ); virtual AutoSegmentHC* getClone () const; virtual AutoSegmentHL* getLocator () const; virtual string _getString () const; public: - // AutoSegments_CollapsedPerpandicular Attributes. + // AutoSegments_Perpandiculars Attributes. GCell* _fcell; - unsigned int _direction; - bool _sourceAnchor; + unsigned int _flags; }; inline AutoSegments_AnchorOnGCell::Locator::Locator ( const Locator &locator ) : AutoSegmentHL() - , _sourceAnchor(locator._sourceAnchor) - , _direction(locator._direction) - , _itContact(locator._itContact) - , _itEnd(locator._itEnd) - , _hookLocator(locator._hookLocator->getClone()) - , _element(locator._element) + , _flags (locator._flags) + , _itContact (locator._itContact) + , _itEnd (locator._itEnd) + , _hookLocator (locator._hookLocator->getClone()) + , _element (locator._element) { } - inline AutoSegments_AnchorOnGCell::AutoSegments_AnchorOnGCell - ( GCell* fcell, bool sourceAnchor, unsigned int direction ) + inline AutoSegments_AnchorOnGCell::AutoSegments_AnchorOnGCell ( GCell* fcell, unsigned int flags ) : AutoSegmentHC() , _fcell(fcell) - , _direction(direction) - , _sourceAnchor(sourceAnchor) + , _flags(flags) { } @@ -353,16 +337,14 @@ namespace Katabatic { ( const AutoSegments_AnchorOnGCell& autosegments ) : AutoSegmentHC() , _fcell(autosegments._fcell) - , _direction(autosegments._direction) - , _sourceAnchor(autosegments._sourceAnchor) + , _flags(autosegments._flags) { } // ------------------------------------------------------------------- -// Class : "AutoSegments_AnchoredBySource". +// Class : "AutoSegments_CachedOnContact". - - class AutoSegments_AnchoredBySource : public AutoSegmentHC { + class AutoSegments_CachedOnContact : public AutoSegmentHC { public: // Sub-Class: Locator. @@ -377,50 +359,47 @@ namespace Katabatic { virtual void progress (); virtual string _getString () const; protected: - unsigned int _direction; - Hurricane::Locator* _contactLocator; - Hurricane::Locator* _hookLocator; - AutoSegment* _element; + LocatorHelper* _helper; }; // Constructors. public: - // AutoSegments_AnchoredBySource Methods. - inline AutoSegments_AnchoredBySource ( AutoContact* sourceContact, unsigned int direction ); - inline AutoSegments_AnchoredBySource ( const AutoSegments_AnchoredBySource& ); - virtual AutoSegmentHC* getClone () const; - virtual AutoSegmentHL* getLocator () const; - virtual string _getString () const; + // AutoSegments_CachedOnContact Methods. + inline AutoSegments_CachedOnContact ( AutoContact* sourceContact + , unsigned int direction=KbHorizontal|KbVertical ); + inline AutoSegments_CachedOnContact ( const AutoSegments_CachedOnContact& ); + virtual AutoSegmentHC* getClone () const; + virtual AutoSegmentHL* getLocator () const; + virtual string _getString () const; protected: - // AutoSegments_AnchoredBySource Attributes. + // AutoSegments_CachedOnContact Attributes. unsigned int _direction; AutoContact* _sourceContact; }; - inline AutoSegments_AnchoredBySource::Locator::Locator ( const Locator &locator ) + inline AutoSegments_CachedOnContact::Locator::Locator ( const Locator &locator ) : AutoSegmentHL() - , _direction(locator._direction) - , _contactLocator(locator._contactLocator->getClone()) - , _hookLocator(locator._hookLocator->getClone()) - , _element(locator._element) + , _helper(locator._helper) { } - inline AutoSegments_AnchoredBySource::AutoSegments_AnchoredBySource + inline AutoSegments_CachedOnContact::AutoSegments_CachedOnContact ( AutoContact* sourceContact, unsigned int direction ) : AutoSegmentHC() - , _direction(direction) + , _direction (direction) , _sourceContact(sourceContact) - { } + { + if (_direction & KbVertical) _direction |= KbWithPerpands; + } - inline AutoSegments_AnchoredBySource::AutoSegments_AnchoredBySource - ( const AutoSegments_AnchoredBySource& autosegments ) + inline AutoSegments_CachedOnContact::AutoSegments_CachedOnContact + ( const AutoSegments_CachedOnContact& autosegments ) : AutoSegmentHC() - , _direction(autosegments._direction) + , _direction (autosegments._direction) , _sourceContact(autosegments._sourceContact) { } @@ -428,7 +407,6 @@ namespace Katabatic { // ------------------------------------------------------------------- // Class : "AutoSegments_IsAccountable". - class AutoSegments_IsAccountable : public AutoSegmentHF { public: virtual AutoSegmentHF* getClone () const; @@ -440,7 +418,6 @@ namespace Katabatic { // ------------------------------------------------------------------- // Class : "AutoSegments_InDirection". - class AutoSegments_InDirection : public AutoSegmentHF { public: inline AutoSegments_InDirection ( unsigned int direction ); diff --git a/katabatic/src/katabatic/AutoVertical.h b/katabatic/src/katabatic/AutoVertical.h index 38b9788f..d878313d 100644 --- a/katabatic/src/katabatic/AutoVertical.h +++ b/katabatic/src/katabatic/AutoVertical.h @@ -2,29 +2,21 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./AutoVertical.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/AutoVertical.h" | +// +-----------------------------------------------------------------+ -#ifndef __KATABATIC_AUTOVERTICAL__ -#define __KATABATIC_AUTOVERTICAL__ +#ifndef KATABATIC_AUTOVERTICAL_H +#define KATABATIC_AUTOVERTICAL_H #include "hurricane/Vertical.h" #include "katabatic/AutoSegment.h" @@ -38,61 +30,46 @@ namespace Katabatic { class AutoVertical : public AutoSegment { - using AutoSegment::_computeTerminal; + friend class AutoSegment; public: - // Constructors. - static AutoVertical* create ( Vertical* vertical - , int type - , bool terminal=false - , bool collapsed=false - ); - static AutoVertical* create ( AutoContact* source - , AutoContact* target - , const Layer* layer - , DbU::Unit x - , DbU::Unit width - , int type - , bool terminal=false - , bool collapsed=false - ); // Predicates. virtual bool _canSlacken () const; - virtual bool canDesalignate ( AutoContact* ) const; + virtual bool canMoveULeft ( float reserve=0.0 ) const; + virtual bool canMoveURight ( float reserve=0.0 ) const; // Accessors. - virtual Segment* base () { return _vertical; }; - virtual Segment* base () const { return _vertical; }; - virtual Segment* getSegment () { return _vertical; }; - virtual Segment* getSegment () const { return _vertical; }; - virtual Vertical* getVertical () { return _vertical; }; - virtual DbU::Unit getSourceU () const { return _vertical->getSourceY(); }; - virtual DbU::Unit getTargetU () const { return _vertical->getTargetY(); }; - virtual DbU::Unit getDuSource () const { return _vertical->getDySource(); }; - virtual DbU::Unit getDuTarget () const { return _vertical->getDyTarget(); }; - virtual Interval getSpanU () const { return Interval(_vertical->getSourceY(),_vertical->getTargetY()); }; + virtual Segment* base (); + virtual Segment* base () const; + virtual Vertical* getVertical (); + virtual DbU::Unit getSourceU () const; + virtual DbU::Unit getTargetU () const; + virtual DbU::Unit getDuSource () const; + virtual DbU::Unit getDuTarget () const; + virtual Interval getSpanU () const; virtual bool getConstraints ( DbU::Unit& min, DbU::Unit& max ) const; - virtual Interval getSourceConstraints ( bool native=false ) const; - virtual Interval getTargetConstraints ( bool native=false ) const; + virtual Interval getSourceConstraints ( unsigned int flags=0 ) const; + virtual Interval getTargetConstraints ( unsigned int flags=0 ) const; virtual unsigned int getDirection () const; virtual size_t getGCells ( vector& ) const; // Modifiers. - virtual void setDuSource ( DbU::Unit du ) { _vertical->setDySource(du); }; - virtual void setDuTarget ( DbU::Unit du ) { _vertical->setDyTarget(du); }; - virtual void alignate ( DbU::Unit axis ); - virtual void orient (); - virtual void setPositions (); + virtual void setDuSource ( DbU::Unit ); + virtual void setDuTarget ( DbU::Unit ); + virtual void _setAxis ( DbU::Unit ); + virtual void updateOrient (); + virtual void updatePositions (); virtual bool checkPositions () const; virtual bool checkConstraints () const; - virtual void _computeTerminal (); - virtual void moveURight (); - virtual void moveULeft (); - virtual void _makeDogLeg ( GCell*, bool upLayer ); + virtual unsigned int _makeDogleg ( GCell*, unsigned int flags ); + virtual bool moveULeft (); + virtual bool moveURight (); + virtual bool _slacken ( unsigned int flags ); +#if THIS_IS_DISABLED virtual void desalignate ( AutoContact* ); - virtual void _slacken (); +#endif // Inspector Management. - virtual Record* _getRecord () const; - virtual string _getString () const; - virtual string _getTypeName () const { return "AutoVertical"; }; + virtual Record* _getRecord () const; + virtual string _getString () const; + virtual string _getTypeName () const; protected: // Internal: Attributes. @@ -100,10 +77,7 @@ namespace Katabatic { // Constructors. protected: - AutoVertical ( Vertical* vertical - , int type - , bool terminal - , bool collapsed ); + AutoVertical ( Vertical* ); virtual ~AutoVertical (); virtual void _postCreate (); virtual void _preDestroy (); @@ -116,4 +90,7 @@ namespace Katabatic { } // End of Katabatic namespace. -#endif // __KATABATIC_AUTOHORIZONTAL__ +INSPECTOR_P_SUPPORT(Katabatic::AutoVertical); + + +#endif // KATABATIC_AUTOHORIZONTAL_H diff --git a/katabatic/src/katabatic/ChipDatas.h b/katabatic/src/katabatic/ChipDatas.h new file mode 100644 index 00000000..92f91581 --- /dev/null +++ b/katabatic/src/katabatic/ChipDatas.h @@ -0,0 +1,88 @@ + +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./katabatic/ChipDatas.h" | +// +-----------------------------------------------------------------+ + + +#ifndef __KATABATIC_CHIP_DATAS__ +#define __KATABATIC_CHIP_DATAS__ + +#include + +#include "hurricane/DbU.h" +#include "hurricane/Torus.h" +namespace Hurricane { + class Cell; +} + + +namespace Katabatic { + + using Hurricane::Record; + using Hurricane::DbU; + using Hurricane::Box; + using Hurricane::Torus; + using Hurricane::Cell; + + + class ChipDatas { + public: + ChipDatas ( const Cell* ); + inline bool isChip () const; + inline const Box& getChipBb () const; + inline const Box& getLeftPadsBb () const; + inline const Box& getRightPadsBb () const; + inline const Box& getTopPadsBb () const; + inline const Box& getBottomPadsBb () const; + inline const Torus& getChipCorona () const; + inline bool intersectVPads ( const Box& ) const; + inline bool intersectHPads ( const Box& ) const; + public: + Record* _getRecord () const; + std::string _getString () const; + inline std::string _getTypeName () const; + private: + Cell* _cell; + bool _isChip; + Box _chipBb; + Box _leftPadsBb; + Box _rightPadsBb; + Box _topPadsBb; + Box _bottomPadsBb; + Torus _chipCorona; + }; + + +// Inline Functions. + inline bool ChipDatas::isChip () const { return _isChip; } + inline const Box& ChipDatas::getChipBb () const { return _chipBb; } + inline const Box& ChipDatas::getLeftPadsBb () const { return _leftPadsBb; }; + inline const Box& ChipDatas::getRightPadsBb () const { return _rightPadsBb; }; + inline const Box& ChipDatas::getTopPadsBb () const { return _topPadsBb; }; + inline const Box& ChipDatas::getBottomPadsBb () const { return _bottomPadsBb; }; + inline const Torus& ChipDatas::getChipCorona () const { return _chipCorona; }; + inline std::string ChipDatas::_getTypeName () const { return "ChipDatas"; } + + inline bool ChipDatas::intersectVPads ( const Box& box ) const + { return _leftPadsBb.intersect(box) or _rightPadsBb.intersect(box); } + + inline bool ChipDatas::intersectHPads ( const Box& box ) const; + { return _topPadsBb.intersect(box) or _bottomPadsBb.intersect(box); } + + +} // End of Katabatic namespace. + +INSPECTOR_PV_SUPPORT(Katabatic::ChipDatas); + +#endif // __KATABATIC_CHIP_DATAS__ diff --git a/katabatic/src/katabatic/ChipTools.h b/katabatic/src/katabatic/ChipTools.h index 71dee668..84839e38 100644 --- a/katabatic/src/katabatic/ChipTools.h +++ b/katabatic/src/katabatic/ChipTools.h @@ -2,34 +2,25 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./katabatic/ChipTools.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/ChipTools.h" | +// +-----------------------------------------------------------------+ -#ifndef __KATABATIC_CHIP_TOOLS__ -#define __KATABATIC_CHIP_TOOLS__ +#ifndef KATABATIC_CHIP_TOOLS_H +#define KATABATIC_CHIP_TOOLS_H -#include - -#include "hurricane/DbU.h" -#include "hurricane/Torus.h" +#include +#include "hurricane/DbU.h" +#include "hurricane/Torus.h" namespace Hurricane { class Cell; class Instance; @@ -96,8 +87,8 @@ namespace Katabatic { { return _topPadsBb.intersect(box) or _bottomPadsBb.intersect(box); } -} // End of Katabatic namespace. +} // Katabatic namespace. INSPECTOR_PV_SUPPORT(Katabatic::ChipTools); -#endif // __KATABATIC_CHIP_TOOLS__ +#endif // KATABATIC_CHIP_TOOLS_H diff --git a/katabatic/src/katabatic/Configuration.h b/katabatic/src/katabatic/Configuration.h index 7026417b..829c9e88 100644 --- a/katabatic/src/katabatic/Configuration.h +++ b/katabatic/src/katabatic/Configuration.h @@ -1,30 +1,21 @@ - -// -*- C++ -*- +// -*- mode: C++; explicit-buffer-name: "Configuration.h" -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./Configuration.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/Configuration.h" | +// +-----------------------------------------------------------------+ -#ifndef __KATABATIC_CONFIGURATION__ -#define __KATABATIC_CONFIGURATION__ +#ifndef KATABATIC_CONFIGURATION_H +#define KATABATIC_CONFIGURATION_H #include @@ -63,6 +54,7 @@ namespace Katabatic { virtual Configuration* clone () const = 0; // Methods. virtual bool isGMetal ( const Layer* ) const = 0; + virtual bool isGContact ( const Layer* ) const = 0; virtual size_t getDepth () const = 0; virtual size_t getAllowedDepth () const = 0; virtual size_t getLayerDepth ( const Layer* ) const = 0; @@ -107,6 +99,7 @@ namespace Katabatic { virtual ConfigurationConcrete* clone () const; // Methods. virtual bool isGMetal ( const Layer* ) const; + virtual bool isGContact ( const Layer* ) const; virtual size_t getDepth () const; virtual size_t getAllowedDepth () const; virtual size_t getLayerDepth ( const Layer* ) const; @@ -147,11 +140,11 @@ namespace Katabatic { }; -} // End of Katabatic namespace. +} // Katabatic namespace. INSPECTOR_P_SUPPORT(Katabatic::Configuration); INSPECTOR_P_SUPPORT(Katabatic::ConfigurationConcrete); -#endif // __KATABATIC_CONFIGURATION__ +#endif // KATABATIC_CONFIGURATION_H diff --git a/katabatic/src/katabatic/Constants.h b/katabatic/src/katabatic/Constants.h new file mode 100644 index 00000000..a339e52a --- /dev/null +++ b/katabatic/src/katabatic/Constants.h @@ -0,0 +1,158 @@ +// -*- mode: C++; explicit-buffer-name: "Constants.h" -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2013-2013, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./katabatic/Constants.h" | +// +-----------------------------------------------------------------+ + + +#ifndef KATABATIC_CONSTANTS_H +#define KATABATIC_CONSTANTS_H + +namespace Katabatic { + + enum FunctionFlag { KbNoFlags = 0x00000000 + , KbOpenSession = 0x00000001 + , KbRealignate = 0x00000002 + , KbNativeConstraints = 0x00000004 + , KbForceMove = 0x00000008 + , KbHorizontal = 0x00000010 + , KbVertical = 0x00000020 + , KbWithPerpands = 0x00000040 + , KbBySource = 0x00000080 + , KbByTarget = 0x00000100 + , KbWarnOnError = 0x00000200 + , KbTopology = 0x00000400 + , KbGlobalSegment = 0x00000800 + , KbAllowTerminal = 0x00001000 + , KbAllowLocal = 0x00002000 + , KbIgnoreContacts = 0x00004000 + , KbPropagate = 0x00008000 + , KbSuperior = 0x00010000 + , KbUseAboveLayer = 0x00020000 + , KbUseBelowLayer = 0x00040000 + , KbDoglegOnLeft = 0x00080000 + , KbDoglegOnRight = 0x00100000 + , KbWithNeighbors = 0x00200000 + , KbNoCheckLayer = 0x00400000 + , KbHalfSlacken = 0x00800000 + , KbDirectionMask = KbHorizontal|KbVertical + }; + + enum EngineState { EngineCreation = 1 + , EngineGlobalLoaded = 2 + , EngineActive = 3 + , EngineDriving = 4 + , EnginePreDestroying = 5 + , EngineGutted = 6 + }; + + enum EngineFlag { EngineDemoMode = 0x00000001 + , EngineWarnOnGCellOverload = 0x00000002 + , EngineDestroyBaseContact = 0x00000004 + , EngineDestroyBaseSegment = 0x00000008 + , EngineDestroyMask = EngineDestroyBaseContact|EngineDestroyBaseSegment + }; + + enum EngineAlgorithm { EngineLoadGrByNet = 0x00000001 + , EngineLoadGrByGCell = 0x00000002 + , EngineLayerAssignByLength = 0x00000004 + , EngineLayerAssignByTrunk = 0x00000008 + , EngineNoNetLayerAssign = 0x00000010 + }; + + + inline unsigned int perpandicularTo ( unsigned int direction ) + { + switch ( direction ) { + case KbHorizontal: return KbVertical; + case KbVertical: return KbHorizontal; + } + return 0; + } + + +} // Katabatic namespace. + +#endif // KATABATIC_CONSTANTS_H + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/katabatic/src/katabatic/ContactWrapper.h b/katabatic/src/katabatic/ContactWrapper.h deleted file mode 100644 index e7f25904..00000000 --- a/katabatic/src/katabatic/ContactWrapper.h +++ /dev/null @@ -1,113 +0,0 @@ - -// -*- C++ -*- -// -// This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved -// -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | -// | C O R I O L I S | -// | K a t a b a t i c - Routing Toolbox | -// | | -// | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | -// | =============================================================== | -// | C++ Header : "./ContactWrapper.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x - - -#ifndef __KATABATIC_CONTACT_WRAPPER__ -#define __KATABATIC_CONTACT_WRAPPER__ - - -#include "hurricane/Contact.h" - - -namespace Katabatic { - - using Hurricane::Hook; - using Hurricane::Component; - using Hurricane::DbU; - using Hurricane::Point; - using Hurricane::Layer; - using Hurricane::Contact; - - -// ------------------------------------------------------------------- -// Template Class : "Katabatic::ContactWrapper". - - template - class ContactWrapper { - public: - // Accessors. - inline BaseContact* getBase (); - inline Hook* getBodyHook (); - inline Hook* getAnchorHook (); - inline Component* getAnchor () const; - inline DbU::Unit getDx () const; - inline DbU::Unit getDy () const; - inline DbU::Unit getWidth () const; - inline DbU::Unit getHalfWidth () const; - inline DbU::Unit getHeight () const; - inline DbU::Unit getHalfHeight () const; - public: - // Modifiers. - inline void setLayer ( const Layer* ); - inline void setWidth ( DbU::Unit ); - inline void setHeight ( DbU::Unit ); - inline void setSizes ( DbU::Unit width, Dbu::Unit height ); - inline void setX ( DbU::Unit ); - inline void setY ( DbU::Unit ); - inline void setPosition ( DbU::Unit width, Dbu::Unit height ); - inline void setPosition ( const Point& ); - inline void setDx ( DbU::Unit ); - inline void setDy ( DbU::Unit ); - inline void setOffset ( DbU::Unit dx, Dbu::Unit dy ); - protected: - // Attribute. - BaseContact* _contact; - protected: - // Constructor & Destructors. - inline ContactWrapper ( BaseContact* ); - private: - ContactWrapper& ContactWrapper ( const ContactWrapper& ); - ContactWrapper& operator= ( const ContactWrapper& ); - }; - - -// Inline Functions. - inline BaseContact* ContactWrapper::getBase () { return _contact; } - inline Hook* ContactWrapper::getBodyHook () { return _contact->getBodyHook(); } - inline Hook* ContactWrapper::getAnchorHook () { return _contact->getAnchorHook(); } - inline Component* ContactWrapper::getAnchor () const { return _contact->getAnchor(); } - inline DbU::Unit ContactWrapper::getDx () const { return _contact->getDx(); } - inline DbU::Unit ContactWrapper::getDy () const { return _contact->getDy(); } - inline DbU::Unit ContactWrapper::getWidth () const { return _contact->getWidth(); } - inline DbU::Unit ContactWrapper::getHalfWidth () const { return _contact->getHalfWidth(); } - inline DbU::Unit ContactWrapper::getHeight () const { return _contact->getHeight(); } - inline DbU::Unit ContactWrapper::getHalfHeight () const { return _contact->getHalfHeight(); } - inline void ContactWrapper::setLayer ( const Layer* layer ) { return _contact->setLayer(layer); } - inline void ContactWrapper::setWidth ( DbU::Unit w ) { return _contact->setWidth(w); } - inline void ContactWrapper::setHeight ( DbU::Unit h ) { return _contact->setHeight(h); } - inline void ContactWrapper::setSizes ( DbU::Unit w, Dbu::Unit h ) { return _contact->setSizes(w,h); } - inline void ContactWrapper::setX ( DbU::Unit x ) { return _contact->setX(x); } - inline void ContactWrapper::setY ( DbU::Unit y ) { return _contact->setY(y); } - inline void ContactWrapper::setPosition ( DbU::Unit x, Dbu::Unit y ) { return _contact->setPosition(x,y); } - inline void ContactWrapper::setPosition ( const Point& p ) { return _contact->setPosition(p); } - inline void ContactWrapper::setDx ( DbU::Unit dx ) { return _contact->setDx(dx); } - inline void ContactWrapper::setDy ( DbU::Unit dy ) { return _contact->setDy(dy); } - inline void ContactWrapper::setOffset ( DbU::Unit dx, Dbu::Unit dy ) { return _contact->setOffset(dx,dy); } - inline ContactWrapper::ContactWrapper ( BaseContact* contact ) : _contact(contact) { } - - -} // End of Katabatic namespace. - - -#endif // __KATABATIC_CONTACT_WRAPPER__ diff --git a/katabatic/src/katabatic/GCell.h b/katabatic/src/katabatic/GCell.h index 3c14022d..dff0e8df 100644 --- a/katabatic/src/katabatic/GCell.h +++ b/katabatic/src/katabatic/GCell.h @@ -1,30 +1,21 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./GCell.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/GCell.h" | +// +-----------------------------------------------------------------+ -#ifndef __KATABATIC_GCELL__ -#define __KATABATIC_GCELL__ +#ifndef KATABATIC_GCELL_H +#define KATABATIC_GCELL_H #include #include @@ -42,6 +33,7 @@ namespace Hurricane { } #include "crlcore/RoutingLayerGauge.h" +#include "katabatic/Constants.h" #include "katabatic/AutoSegments.h" @@ -67,14 +59,22 @@ namespace Katabatic { class AutoSegment; + enum GCellFunctionFlags { NoUpdate = 0x00000001 }; + + // ------------------------------------------------------------------- // Class : "Katabatic::GCell". + enum GCellFlag { GCellInvalidated = 0x00000001 + , GCellSaturated = 0x00000002 + , GCellUnderIoPad = 0x00000004 + }; + class GCell : public ExtensionGo { public: - class CompareId : public binary_function { + class CompareByIndex : public binary_function { public: bool operator() ( const GCell* lhs, const GCell* rhs ); }; @@ -85,112 +85,106 @@ namespace Katabatic { private: unsigned int _depth; }; - class CompareByKey { + class CompareByKey : public binary_function { public: bool operator() ( const GCell* lhs, const GCell* rhs ); }; + class Key { private: - float _density; - unsigned int _index; + GCell* _gcell; + float _density; public: - inline Key ( float, unsigned int ); - inline float getDensity () const; - inline unsigned int getIndex () const; - inline void update ( GCell*, unsigned int ); - friend bool operator< ( const Key&, const Key& ); + inline Key ( GCell*, unsigned int depth ); + inline float getDensity () const; + inline GCell* getGCell () const; + inline void update ( unsigned int depth ); + friend bool operator< ( const Key&, const Key& ); }; public: - typedef set SetId; + typedef set SetIndex; public: // Static Utilities. - static bool areDensityConnex ( GCell* a, GCell* b ); - // Static Accessors. - static size_t getAllocateds (); - static DbU::Unit getTopRightShrink (); - static const Name& getStaticName (); - virtual const Name& getName () const; - // Accessors. - inline bool isSaturated () const; - bool isSaturated ( unsigned int depth ) const; - inline bool isValid () const; - bool isAboveDensity ( float threshold ) const; - bool hasFreeTrack ( size_t depth, float reserve ) const; - inline GCellGrid* getGCellGrid () const; - inline unsigned int getDepth () const; - inline unsigned int getIndex () const; - unsigned int getRow () const; - unsigned int getColumn () const; - void getDensities ( float* ) const; - virtual void translate ( const DbU::Unit&, const DbU::Unit& ); - virtual Box getBoundingBox () const; - inline Point getCenter () const; - inline DbU::Unit getX () const; - inline DbU::Unit getY () const; - inline DbU::Unit getXMax () const; - inline DbU::Unit getYMax () const; - Interval getUSide ( unsigned int ) const; - GCell* getLeft () const; - GCell* getRight () const; - GCell* getUp () const; - GCell* getDown () const; - float getHCapacity () const; - float getVCapacity () const; - inline float getCDensity ( bool update=true ) const; - inline float getDensity ( unsigned int depth, bool update=true ) const; - float getDensity ( bool update=true ) const; - inline DbU::Unit getBlockage ( unsigned int depth ) const; - inline float getFragmentation ( unsigned int depth ) const; - inline float getFeedthroughs ( unsigned int depth ) const; - inline float getGlobalsCount ( unsigned int depth ) const; - float getStiffness () const; - inline vector* getVSegments (); - inline vector* getHSegments (); - inline vector* getContacts (); - AutoSegments getHStartSegments (); - AutoSegments getVStartSegments (); - AutoSegments getHStopSegments (); - AutoSegments getVStopSegments (); - inline AutoSegments getStartSegments ( unsigned int direction ); - inline AutoSegments getStopSegments ( unsigned int direction ); - size_t getRoutingPads ( set& ); - inline const Key& getKey () const; - size_t checkDensity () const; - bool checkEdgeSaturation ( float threshold ) const; - // Modifiers. - void addBlockage ( unsigned int depth, DbU::Unit ); - // void addBlockedAxis ( unsigned int depth, DbU::Unit ); - inline void addVSegment ( AutoSegment* ); - inline void addHSegment ( AutoSegment* ); - inline void addContact ( AutoContact* ); - void removeVSegment ( AutoSegment* ); - void removeHSegment ( AutoSegment* ); - void removeContact ( AutoContact* ); - void updateContacts (); - size_t updateDensity (); - inline void updateKey ( unsigned int depth ); - void desaturate ( unsigned int depth, set& ); - bool stepDesaturate ( unsigned int depth, set&, AutoSegment*& moved, bool force=false ); - bool stepNetDesaturate ( unsigned int depth, set&, SetId& invalidateds ); - void rpDesaturate ( set& ); - inline void invalidate (); - // Inspector Management. - Record* _getRecord () const; - string _getString () const; - inline string _getTypeName () const; - void _xmlWrite ( ostream& o ) const; - - private: - class BlockedAxis { - public: - BlockedAxis ( GCell* ); - const set& getAxisSet ( size_t depth ) const; - void addAxis ( size_t depth, DbU::Unit ); - private: - GCell* _gcell; - set** _axisSets; - }; + static bool areDensityConnex ( GCell* a, GCell* b ); + // Static Accessors. + static size_t getAllocateds (); + static DbU::Unit getTopRightShrink (); + static const Name& getStaticName (); + virtual const Name& getName () const; + // Accessors. + inline bool isSaturated () const; + bool isSaturated ( unsigned int depth ) const; + inline bool isValid () const; + inline bool isUnderIoPad () const; + bool isAboveDensity ( float threshold ) const; + bool hasFreeTrack ( size_t depth, float reserve ) const; + inline GCellGrid* getGCellGrid () const; + inline unsigned int getDepth () const; + inline unsigned int getIndex () const; + unsigned int getRow () const; + unsigned int getColumn () const; + GCell* getLeft () const; + GCell* getRight () const; + GCell* getUp () const; + GCell* getDown () const; + void getDensities ( float* ) const; + virtual void translate ( const DbU::Unit&, const DbU::Unit& ); + virtual Box getBoundingBox () const; + inline Point getCenter () const; + inline DbU::Unit getX () const; + inline DbU::Unit getY () const; + inline DbU::Unit getXMax () const; + inline DbU::Unit getYMax () const; + Interval getSide ( unsigned int ) const; + float getHCapacity () const; + float getVCapacity () const; + float getDensity ( unsigned int flags=0 ) const; + inline float getCDensity ( unsigned int flags=0 ) const; + inline float getWDensity ( unsigned int depth, unsigned int flags=0 ) const; + inline DbU::Unit getBlockage ( unsigned int depth ) const; + inline float getFragmentation ( unsigned int depth ) const; + inline float getFeedthroughs ( unsigned int depth ) const; + inline float getGlobalsCount ( unsigned int depth ) const; + inline const vector& getHSegments () const; + inline const vector& getVSegments () const; + inline const vector& getContacts () const; + AutoSegments getHStartSegments (); + AutoSegments getVStartSegments (); + AutoSegments getHStopSegments (); + AutoSegments getVStopSegments (); + inline AutoSegments getStartSegments ( unsigned int direction ); + inline AutoSegments getStopSegments ( unsigned int direction ); + size_t getRoutingPads ( set& ); + inline const Key& getKey () const; + size_t checkDensity () const; + bool checkEdgeSaturation ( float threshold ) const; + // Modifiers. + void addBlockage ( unsigned int depth, DbU::Unit ); + inline void addHSegment ( AutoSegment* ); + inline void addVSegment ( AutoSegment* ); + inline void addContact ( AutoContact* ); + void removeVSegment ( AutoSegment* ); + void removeHSegment ( AutoSegment* ); + void removeContact ( AutoContact* ); + void updateContacts (); + size_t updateDensity (); + inline void updateKey ( unsigned int depth ); + bool stepBalance ( unsigned int depth, SetIndex& invalidateds ); + void rpDesaturate ( set& ); + bool stepDesaturate ( unsigned int depth + , set&, AutoSegment*& moved + , unsigned int flags=0 ); + bool stepNetDesaturate ( unsigned int depth + , set& globalNets + , SetIndex& invalidateds ); + inline void invalidate (); + inline void setUnderIoPad (); + // Inspector Management. + Record* _getRecord () const; + string _getString () const; + inline string _getTypeName () const; + void _xmlWrite ( ostream& o ) const; private: // Static Attributes. @@ -212,10 +206,7 @@ namespace Katabatic { float* _feedthroughs; float* _fragmentations; float* _globalsCount; - //BlockedAxis _blockedAxis; - //float* _saturateDensities; - bool _saturated; - bool _invalid; + unsigned int _flags; Key _key; protected: @@ -240,44 +231,46 @@ namespace Katabatic { // GCell Inline Functions. - inline bool GCell::isSaturated () const { return _saturated; } - inline bool GCell::isValid () const { return !_invalid; } - inline GCellGrid* GCell::getGCellGrid () const { return _gcellGrid; } - inline unsigned int GCell::getDepth () const { return _depth; } - inline unsigned int GCell::getIndex () const { return _index; } - inline Point GCell::getCenter () const { return _box.getCenter(); } - inline DbU::Unit GCell::getX () const { return _box.getXMin(); } - inline DbU::Unit GCell::getY () const { return _box.getYMin(); } - inline DbU::Unit GCell::getXMax () const { return _box.getXMax(); } - inline DbU::Unit GCell::getYMax () const { return _box.getYMax(); } - inline vector* GCell::getVSegments () { return &_vsegments; } - inline vector* GCell::getHSegments () { return &_hsegments; } - inline vector* GCell::getContacts () { return &_contacts; } - inline string GCell::_getTypeName () const { return _TName("GCell"); } - inline void GCell::invalidate () { _invalid = true; } - inline const GCell::Key& GCell::getKey () const { return _key; } - inline void GCell::updateKey ( unsigned int depth ) { _key.update(this,depth); } + inline bool GCell::isSaturated () const { return _flags&GCellSaturated; } + inline bool GCell::isValid () const { return not (_flags&GCellInvalidated); } + inline bool GCell::isUnderIoPad () const { return _flags&GCellUnderIoPad; } + inline GCellGrid* GCell::getGCellGrid () const { return _gcellGrid; } + inline unsigned int GCell::getDepth () const { return _depth; } + inline unsigned int GCell::getIndex () const { return _index; } + inline Point GCell::getCenter () const { return _box.getCenter(); } + inline DbU::Unit GCell::getX () const { return _box.getXMin(); } + inline DbU::Unit GCell::getY () const { return _box.getYMin(); } + inline DbU::Unit GCell::getXMax () const { return _box.getXMax(); } + inline DbU::Unit GCell::getYMax () const { return _box.getYMax(); } + inline const vector& GCell::getVSegments () const { return _vsegments; } + inline const vector& GCell::getHSegments () const { return _hsegments; } + inline const vector& GCell::getContacts () const { return _contacts; } + inline string GCell::_getTypeName () const { return _TName("GCell"); } + inline void GCell::invalidate () { _flags |= GCellInvalidated; } + inline void GCell::setUnderIoPad() { _flags |= GCellUnderIoPad; } + inline const GCell::Key& GCell::getKey () const { return _key; } + inline void GCell::updateKey ( unsigned int depth ) { _key.update(depth); } inline AutoSegments GCell::getStartSegments ( unsigned int direction ) - { return (direction&Constant::Horizontal) ? getHStartSegments() : getVStartSegments(); } + { return (direction&KbHorizontal) ? getHStartSegments() : getVStartSegments(); } inline AutoSegments GCell::getStopSegments ( unsigned int direction ) - { return (direction&Constant::Horizontal) ? getHStopSegments() : getVStopSegments(); } + { return (direction&KbHorizontal) ? getHStopSegments() : getVStopSegments(); } - inline float GCell::getCDensity ( bool update ) const - { if (_invalid and update) const_cast(this)->updateDensity(); return _cDensity; } + inline float GCell::getCDensity ( unsigned int flags ) const + { if (not isValid() and not(flags & NoUpdate)) const_cast(this)->updateDensity(); return _cDensity; } - inline float GCell::getDensity ( unsigned int depth, bool update ) const - { if (_invalid and update) const_cast(this)->updateDensity(); return _densities[depth]; } + inline float GCell::getWDensity ( unsigned int depth, unsigned int flags ) const + { if (not isValid() and not(flags & NoUpdate)) const_cast(this)->updateDensity(); return _densities[depth]; } inline float GCell::getFragmentation ( unsigned int depth ) const - { if (_invalid) const_cast(this)->updateDensity(); return _fragmentations[depth]; } + { if (not isValid()) const_cast(this)->updateDensity(); return _fragmentations[depth]; } inline float GCell::getFeedthroughs ( unsigned int depth ) const - { if (_invalid) const_cast(this)->updateDensity(); return _feedthroughs[depth]; } + { if (not isValid()) const_cast(this)->updateDensity(); return _feedthroughs[depth]; } inline float GCell::getGlobalsCount ( unsigned int depth ) const - { if (_invalid) const_cast(this)->updateDensity(); return _globalsCount[depth]; } + { if (not isValid()) const_cast(this)->updateDensity(); return _globalsCount[depth]; } inline DbU::Unit GCell::getBlockage ( unsigned int depth ) const { return (depth<_depth) ? _blockages[depth] : 0; } @@ -292,48 +285,58 @@ namespace Katabatic { { invalidate(); _contacts.push_back(contact); } -// GCell::CompareId Inline Functions. - inline bool GCell::CompareId::operator() ( const GCell* lhs, const GCell* rhs ) +// GCell::CompareByIndex Inline Functions. + inline bool GCell::CompareByIndex::operator() ( const GCell* lhs, const GCell* rhs ) { return ( lhs->getIndex() < rhs->getIndex() ); } // GCell::Key Inline Functions. - inline GCell::Key::Key ( float density, unsigned int index ) : _density(density), _index(index) {} - inline float GCell::Key::getDensity () const { return _density; } - inline unsigned int GCell::Key::getIndex () const { return _index; } - inline void GCell::Key::update ( GCell* gcell, unsigned int depth ) - { _density=gcell->getDensity(depth); _index=gcell->getIndex(); } + inline GCell::Key::Key ( GCell* owner, unsigned int depth ) : _gcell(owner), _density(owner->getWDensity(depth,NoUpdate)) {} + inline float GCell::Key::getDensity () const { return _density; } + inline GCell* GCell::Key::getGCell () const { return _gcell; } + inline void GCell::Key::update ( unsigned int depth ) { _density=_gcell->getWDensity(depth); } inline bool operator< ( const GCell::Key& lhs, const GCell::Key& rhs ) { - float difference = Hurricane::roundfp ( lhs._density - rhs._density ); - if ( difference != 0.0 ) return (difference > 0.0); + //float difference = Hurricane::roundfp ( lhs._density - rhs._density ); + float difference = lhs._density - rhs._density; + if (difference != 0.0) return (difference > 0.0); - return ( lhs._index < rhs._index ); + return lhs._gcell->getIndex() < rhs._gcell->getIndex(); } // ------------------------------------------------------------------- -// Class : "DyKeyQueue". +// Class : "GCellDensitySet". - - class DyKeyQueue { + class GCellDensitySet { public: - DyKeyQueue ( unsigned int depth ); - DyKeyQueue ( unsigned int depth, const std::vector& ); - ~DyKeyQueue (); - const std::set& getGCells () const; - GCell* pop (); - void push ( GCell* ); - void invalidate ( GCell* ); - void revalidate (); + GCellDensitySet ( unsigned int depth ); + GCellDensitySet ( unsigned int depth, const std::vector& ); + ~GCellDensitySet (); + inline bool empty () const; + inline size_t size () const; + inline const std::set& + getGCells () const; + inline void insert ( GCell* ); + inline void erase ( GCell* ); + inline void unqueue ( GCell* ); + void requeue (); private: unsigned int _depth; - std::set _map; - GCell::SetId _requests; + std::set _set; + std::set _requests; }; + inline bool GCellDensitySet::empty () const { return _set.empty(); } + inline size_t GCellDensitySet::size () const { return _set.size(); } + inline void GCellDensitySet::insert ( GCell* gcell ) { _requests.insert( gcell ); } + inline void GCellDensitySet::erase ( GCell* gcell ) { if (not _set.empty()) _set.erase( gcell ); } + inline void GCellDensitySet::unqueue ( GCell* gcell ) { insert( gcell ); } + inline const std::set& GCellDensitySet::getGCells () const { return _set; } + + // ------------------------------------------------------------------- // Utilities. @@ -350,4 +353,4 @@ namespace Katabatic { INSPECTOR_P_SUPPORT(Katabatic::GCell); -#endif // __KATABATIC_GCELL__ +#endif // KATABATIC_GCELL_H diff --git a/katabatic/src/katabatic/GCellGrid.h b/katabatic/src/katabatic/GCellGrid.h index b45f0df4..25d3151c 100644 --- a/katabatic/src/katabatic/GCellGrid.h +++ b/katabatic/src/katabatic/GCellGrid.h @@ -1,35 +1,27 @@ - // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./GCellGrid.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/GCellGrid.h" | +// +-----------------------------------------------------------------+ -#ifndef __KATABATIC_GCELL_GRID__ -#define __KATABATIC_GCELL_GRID__ +#ifndef KATABATIC_GCELL_GRID_H +#define KATABATIC_GCELL_GRID_H namespace Hurricane { class Cell; } +#include "katabatic/Constants.h" #include "katabatic/Grid.h" #include "katabatic/GCell.h" @@ -49,27 +41,27 @@ namespace Katabatic { class GCellGrid : public Grid { public: - enum Flags { AverageHVDensity=1 // Average between all densities. - , AverageHDensity =2 // Average between all H densities. - , AverageVDensity =3 // Average between all V densities. - , MaxHVDensity =4 // Maximum between average H and average V. - , MaxVDensity =5 // Maximum of V densities. - , MaxHDensity =6 // Maximum of H densities. - , MaxDensity =7 // Maximum of H & V densities. - }; + enum DensityMode { AverageHVDensity=1 // Average between all densities. + , AverageHDensity =2 // Average between all H densities. + , AverageVDensity =3 // Average between all V densities. + , MaxHVDensity =4 // Maximum between average H and average V. + , MaxVDensity =5 // Maximum of V densities. + , MaxHDensity =6 // Maximum of H densities. + , MaxDensity =7 // Maximum of H & V densities. + }; public: Cell* getCell () const; inline KatabaticEngine* getKatabatic () const; - inline int getDensityMode () const; + inline unsigned int getDensityMode () const; inline size_t getHEdgeCapacity () const; inline size_t getVEdgeCapacity () const; Interval getUSide ( unsigned int ) const; - void updateContacts ( bool openSession=true ); size_t checkDensity () const; - size_t updateDensity (); bool checkEdgeSaturation ( float threshold ) const; - inline void setDensityMode ( int ); + size_t updateDensity (); + void updateContacts ( unsigned int flags=KbOpenSession ); + inline void setDensityMode ( unsigned int ); void _xmlWrite ( ostream& ); virtual Record* _getRecord () const; virtual string _getString () const; @@ -99,10 +91,10 @@ namespace Katabatic { inline KatabaticEngine* GCellGrid::getKatabatic () const { return _katabatic; } - inline int GCellGrid::getDensityMode () const { return _densityMode; } + inline unsigned int GCellGrid::getDensityMode () const { return _densityMode; } inline size_t GCellGrid::getHEdgeCapacity () const { return _hEdgeCapacity; } inline size_t GCellGrid::getVEdgeCapacity () const { return _vEdgeCapacity; } - inline void GCellGrid::setDensityMode ( int mode ) { _densityMode=mode; } + inline void GCellGrid::setDensityMode ( unsigned int mode ) { _densityMode=mode; } } // End of Katabatic namespace. diff --git a/katabatic/src/katabatic/GCells.h b/katabatic/src/katabatic/GCells.h index ad6d8bb8..a32d3553 100644 --- a/katabatic/src/katabatic/GCells.h +++ b/katabatic/src/katabatic/GCells.h @@ -2,31 +2,21 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./GCells.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/GCells.h" | +// +-----------------------------------------------------------------+ - - -#ifndef __KATABATIC_GCELLS__ -#define __KATABATIC_GCELLS__ +#ifndef KATABATIC_GCELLS_H +#define KATABATIC_GCELLS_H #include "hurricane/Collections.h" @@ -44,7 +34,6 @@ namespace Katabatic { // ------------------------------------------------------------------- // Forward declarations. - class GCell; @@ -57,7 +46,6 @@ namespace Katabatic { typedef GenericFilter GCellFilter; -} // End of Katabatic namespace. +} // Katabatic namespace. - -#endif // __KATABATIC_GCELLS__ +#endif // KATABATIC_GCELLS_H diff --git a/katabatic/src/katabatic/GraphicKatabaticEngine.h b/katabatic/src/katabatic/GraphicKatabaticEngine.h index 79356620..c1f54d17 100644 --- a/katabatic/src/katabatic/GraphicKatabaticEngine.h +++ b/katabatic/src/katabatic/GraphicKatabaticEngine.h @@ -2,25 +2,17 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2012, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul Chaput | // | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./GraphicKatabaticEngine.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/GraphicKatabaticEngine.h" | +// +-----------------------------------------------------------------+ diff --git a/katabatic/src/katabatic/Grid.h b/katabatic/src/katabatic/Grid.h index 4a70bec8..a2e781cc 100644 --- a/katabatic/src/katabatic/Grid.h +++ b/katabatic/src/katabatic/Grid.h @@ -2,29 +2,21 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./Grid.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/Grid.h" | +// +-----------------------------------------------------------------+ -#ifndef __KATABATIC_GRID__ -#define __KATABATIC_GRID__ +#ifndef KATABATIC_GRID_H +#define KATABATIC_GRID_H #include #include @@ -51,45 +43,46 @@ namespace Katabatic { // ------------------------------------------------------------------- // Class : "Katabatic::BaseGrid". - class BaseGrid { public: class Axis; public: - inline void destroy (); + inline void destroy (); // Accessors. - inline const Box& getBoundingBox () const; - inline unsigned int getColumns () const; - inline unsigned int getRows () const; - inline unsigned int getRawSize () const; - inline unsigned int getIndex ( unsigned int c, unsigned int r ) const; - inline unsigned int getRow ( unsigned int ) const; - inline unsigned int getColumn ( unsigned int ) const; - inline const Axis& getXGrads () const; - inline const Axis& getYGrads () const; - // Inspector Managment. - virtual Record* _getRecord () const; - virtual string _getString () const = 0; + inline bool isOnTopBorder ( unsigned int ) const; + inline bool isOnRightBorder ( unsigned int ) const; + inline const Box& getBoundingBox () const; + inline unsigned int getColumns () const; + inline unsigned int getRows () const; + inline unsigned int getRawSize () const; + inline unsigned int getIndex ( unsigned int c, unsigned int r ) const; + inline unsigned int getRow ( unsigned int ) const; + inline unsigned int getColumn ( unsigned int ) const; + inline const Axis& getXGrads () const; + inline const Axis& getYGrads () const; + // Inspector Managment. + virtual Record* _getRecord () const; + virtual string _getString () const = 0; public: // Sub-Class Grid::Axis. class Axis { public: // Modifiers. - inline void addGraduation ( DbU::Unit ); - void sort (); + inline void addGraduation ( DbU::Unit ); + void sort (); // Accessors. - inline unsigned int getSize () const; - unsigned int getGraduationNumber ( DbU::Unit pos, bool& onGraduation ) const; + inline unsigned int getSize () const; + unsigned int getGraduationNumber ( DbU::Unit pos, bool& onGraduation ) const; // Operators. - inline DbU::Unit& operator[] ( unsigned int i ); + inline const DbU::Unit& operator[] ( unsigned int i ) const; // Inspector Management. - Record* _getRecord () const; - string _getString () const; - inline string _getTypeName () const; - string _print () const; + Record* _getRecord () const; + string _getString () const; + inline string _getTypeName () const; + string _print () const; protected: // Attributes. vector _graduations; @@ -117,24 +110,27 @@ namespace Katabatic { // Inline Functions. - inline void BaseGrid::Axis::addGraduation ( DbU::Unit graduation ) { _graduations.push_back(graduation); } - inline unsigned int BaseGrid::Axis::getSize () const { return _graduations.size(); } - inline DbU::Unit& BaseGrid::Axis::operator[] ( unsigned int i ) { return _graduations[i]; } - inline string BaseGrid::Axis::_getTypeName () const { return _TName("BaseGrid::Axis"); } + inline void BaseGrid::Axis::addGraduation ( DbU::Unit graduation ) { _graduations.push_back(graduation); } + inline unsigned int BaseGrid::Axis::getSize () const { return _graduations.size(); } + inline const DbU::Unit& BaseGrid::Axis::operator[] ( unsigned int i ) const { return _graduations[i]; } + inline string BaseGrid::Axis::_getTypeName () const { return _TName("BaseGrid::Axis"); } - inline void BaseGrid::destroy () { _preDestroy(); delete this; } - inline const Box& BaseGrid::getBoundingBox () const { return _boundingBox; }; - inline unsigned int BaseGrid::getColumns () const { return _columns; }; - inline unsigned int BaseGrid::getRows () const { return _rows; }; - inline unsigned int BaseGrid::getRawSize () const { return getColumns() * getRows(); } - inline unsigned int BaseGrid::getIndex ( unsigned int c, unsigned int r ) const { return c+(r*getColumns()); } - inline unsigned int BaseGrid::getRow ( unsigned int i ) const { return i / getColumns(); } - inline unsigned int BaseGrid::getColumn ( unsigned int i ) const { return i % getColumns(); } + inline void BaseGrid::destroy () { _preDestroy(); delete this; } + inline const Box& BaseGrid::getBoundingBox () const { return _boundingBox; }; + inline unsigned int BaseGrid::getColumns () const { return _columns; }; + inline unsigned int BaseGrid::getRows () const { return _rows; }; + inline unsigned int BaseGrid::getRawSize () const { return getColumns() * getRows(); } + inline unsigned int BaseGrid::getIndex ( unsigned int c, unsigned int r ) const { return c+(r*getColumns()); } + inline unsigned int BaseGrid::getRow ( unsigned int i ) const { return i / getColumns(); } + inline unsigned int BaseGrid::getColumn ( unsigned int i ) const { return i % getColumns(); } + inline bool BaseGrid::isOnTopBorder ( unsigned int i ) const { return getRow (i)+1 == getRows(); } + inline bool BaseGrid::isOnRightBorder ( unsigned int i ) const { return getColumn(i)+1 == getColumns(); } inline const BaseGrid::Axis& BaseGrid::getXGrads () const { return _xGraduations; } inline const BaseGrid::Axis& BaseGrid::getYGrads () const { return _yGraduations; } + // ------------------------------------------------------------------- // Template Class : "Katabatic::Grid". @@ -341,4 +337,4 @@ namespace Katabatic { INSPECTOR_P_SUPPORT(Katabatic::BaseGrid::Axis); -#endif // __KATABATIC_GRID__ +#endif // KATABATIC_GRID_H diff --git a/katabatic/src/katabatic/GridBox.h b/katabatic/src/katabatic/GridBox.h index 370281a1..3296284a 100644 --- a/katabatic/src/katabatic/GridBox.h +++ b/katabatic/src/katabatic/GridBox.h @@ -2,31 +2,23 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2009, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./GridBox.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/GridBox.h" | +// +-----------------------------------------------------------------+ -#ifndef __KATABATIC_GRID_BOX__ -#define __KATABATIC_GRID_BOX__ +#ifndef KATABATIC_GRID_BOX_H +#define KATABATIC_GRID_BOX_H -#ifndef __KATABATIC_GRID__ +#ifndef KATABATIC_GRID_H #error "GridBox.h must be included only through Grid.h." #endif @@ -234,7 +226,6 @@ namespace Katabatic { } -} // End of Katabatic namespace. +} // Katabatic namespace. - -#endif // __KATABATIC_GRID_BOX__ +#endif // KATABATIC_GRID_BOX_H diff --git a/katabatic/src/katabatic/GridCollections.h b/katabatic/src/katabatic/GridCollections.h index 2be7daa7..fa5f322f 100644 --- a/katabatic/src/katabatic/GridCollections.h +++ b/katabatic/src/katabatic/GridCollections.h @@ -2,33 +2,25 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./GridCollections.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/GridCollections.h" | +// +-----------------------------------------------------------------+ -#ifndef __KATABATIC_GRID_COLLECTIONS__ -#define __KATABATIC_GRID_COLLECTIONS__ +#ifndef KATABATIC_GRID_COLLECTIONS_H +#define KATABATIC_GRID_COLLECTIONS_H -#ifndef __KATABATIC_GRID__ +#ifndef KATABATIC_GRID_H #error "GridCollections.h must be included only through Grid.h." #endif @@ -596,7 +588,6 @@ namespace Katabatic { } -} // End of Katabatic namespace. +} // Katabatic namespace. - -#endif // __KATABATIC_GRID_COLLECTIONS__ +#endif // KATABATIC_GRID_COLLECTIONS_H diff --git a/katabatic/src/katabatic/KatabaticEngine.h b/katabatic/src/katabatic/KatabaticEngine.h index a8b9e76b..df47ba4b 100644 --- a/katabatic/src/katabatic/KatabaticEngine.h +++ b/katabatic/src/katabatic/KatabaticEngine.h @@ -2,35 +2,26 @@ // -*- C++ -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC/LIP6 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./KatabaticEngine.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/KatabaticEngine.h" | +// +-----------------------------------------------------------------+ -#ifndef __KATABATIC_KATABATIC_ENGINE__ -#define __KATABATIC_KATABATIC_ENGINE__ +#ifndef KATABATIC_KATABATIC_ENGINE_H +#define KATABATIC_KATABATIC_ENGINE_H #include #include #include #include - #include "hurricane/Timer.h" #include "hurricane/DbU.h" #include "hurricane/Torus.h" @@ -50,16 +41,16 @@ namespace CRL { class RoutingLayerGauge; } +#include "katabatic/Constants.h" #include "katabatic/Configuration.h" #include "katabatic/GCell.h" -#include "katabatic/AutoContacts.h" #include "katabatic/AutoSegments.h" +#include "katabatic/AutoContact.h" #include "katabatic/ChipTools.h" namespace Katabatic { - using std::ostream; using std::string; using std::vector; @@ -79,32 +70,9 @@ namespace Katabatic { class GCellGrid; -// ------------------------------------------------------------------- -// Enumerations - - - enum LoadGRMethod { LoadGrByNet = 1 - , LoadGrByGCell = 2 - }; - - enum LayerAssignMethod { LayerAssignByLength = 1 - , LayerAssignByTrunk = 2 - , NoNetLayerAssign = 3 - }; - - enum EngineState { StateCreation = 1 - , StateGlobalLoaded - , StateActive - , StateDriving - , StatePreDestroying - , StateGutted - }; - - // ------------------------------------------------------------------- // Functors. - struct NetCompareByName { inline bool operator() ( const Net* lhs, const Net* rhs ) const; }; @@ -115,7 +83,6 @@ namespace Katabatic { // ------------------------------------------------------------------- // Class : "KatabaticEngine". - class KatabaticEngine : public ToolEngine { public: @@ -123,105 +90,101 @@ namespace Katabatic { public: // Constructor. - static KatabaticEngine* create ( Cell* ); - // Accessors. - static KatabaticEngine* get ( const Cell* ); - static const Name& staticGetName (); - inline bool doDestroyBaseContact () const; - inline bool doDestroyBaseSegment () const; - inline bool doDestroyTool () const; - virtual const Name& getName () const; - inline EngineState getState () const; - inline bool getDemoMode (); - inline bool getWarnGCellOverload (); - inline Configuration* getKatabaticConfiguration (); - virtual Configuration* getConfiguration (); - inline RoutingGauge* getRoutingGauge () const; - inline RoutingLayerGauge* getLayerGauge ( size_t depth ) const; - inline const Layer* getRoutingLayer ( size_t depth ) const ; - inline Layer* getContactLayer ( size_t depth ) const ; - inline GCellGrid* getGCellGrid () const; - inline const NetSet& getRoutingNets () const; - inline DbU::Unit getGlobalThreshold () const; - inline float getSaturateRatio () const; - inline size_t getSaturateRp () const; - inline DbU::Unit getExtensionCap () const; - void xmlWriteGCellGrid ( ostream& ); - void xmlWriteGCellGrid ( const string& ); - inline bool isGMetal ( const Layer* ) const; - inline bool isChip () const; - inline const ChipTools& getChipTools () const; - // Modifiers. - inline void setState ( EngineState state ); - inline void setDemoMode ( bool ); - inline bool setDestroyBaseContact ( bool ); - inline bool setDestroyBaseSegment ( bool ); - inline void setWarnGCellOverload ( bool ); - inline void setGlobalThreshold ( DbU::Unit ); - inline void setSaturateRatio ( float ); - inline void setSaturateRp ( size_t ); - void startMeasures (); - void stopMeasures (); - void printMeasures ( const string& ) const; - void refresh ( bool openSession=true ); - void makePowerRails (); - virtual void createDetailedGrid (); - virtual void loadGlobalRouting ( unsigned int method, NetSet& ); - void layerAssign ( unsigned int method ); - void slackenBorder ( Box bb, Layer::Mask, unsigned int flags ); - void slackenBlockIos ( Instance* core ); - void chipPrep (); - // void computeNetConstraints (); - // void computeNetOptimals (); - virtual void finalizeLayout (); - // Internal Modifiers. - void _computeNetConstraints ( Net*, set& faileds ); - void _computeNetOptimals ( Net* ); - void _computeNetTerminals ( Net* ); - bool _check ( const char* message=NULL ) const; - void _check ( Net* ) const; - void _gutKatabatic (); - void _link ( AutoContact* ); - void _link ( AutoSegment* ); - void _unlink ( AutoContact* ); - void _unlink ( AutoSegment* ); - AutoContact* _lookup ( Contact* ) const; - AutoSegment* _lookup ( Segment* ) const; - void _destroyAutoSegments (); - void _destroyAutoContacts (); - void _loadGrByNet (); - void _loadNetGlobalRouting ( Net* ); - void _alignate ( Net* ); - void _desaturate ( unsigned int depth, set&, unsigned long& total, unsigned long& globals ); - void _layerAssignByLength ( unsigned long& total, unsigned long& global, set& ); - void _layerAssignByLength ( Net*, unsigned long& total, unsigned long& global, set& ); - void _layerAssignByTrunk ( unsigned long& total, unsigned long& global, set& ); - void _layerAssignByTrunk ( Net*, set&, unsigned long& total, unsigned long& global ); - bool _moveUpNetTrunk ( AutoSegment*, set& globalNets, GCell::SetId& invalidateds ); - void _splitContactsOfNet ( Net* ); - void _collapseNet ( const Name& , unsigned int depth=1 ); - void _collapseNet ( Net* , unsigned int depth=1 ); - void _collapseNets ( Nets , unsigned int depth=1 ); - void _toOptimals ( Net*, bool onlyNew=false ); - void _saveNet ( Net* ); - void _print () const; - void _print ( Net* ) const; - inline AutoContactLut& _getAutoContactLut (); - inline AutoSegmentLut& _getAutoSegmentLut (); + static KatabaticEngine* create ( Cell* ); + // Accessors. + static KatabaticEngine* get ( const Cell* ); + static const Name& staticGetName (); + inline bool isGMetal ( const Layer* ) const; + inline bool isGContact ( const Layer* ) const; + inline bool isChip () const; + inline bool isInDemoMode () const; + inline bool doWarnOnGCellOverload () const; + inline bool doDestroyBaseContact () const; + inline bool doDestroyBaseSegment () const; + inline bool doDestroyTool () const; + virtual const Name& getName () const; + inline EngineState getState () const; + inline unsigned int getFlags ( unsigned int mask ) const; + inline Configuration* getKatabaticConfiguration (); + virtual Configuration* getConfiguration (); + inline RoutingGauge* getRoutingGauge () const; + inline RoutingLayerGauge* getLayerGauge ( size_t depth ) const; + inline const Layer* getRoutingLayer ( size_t depth ) const ; + inline Layer* getContactLayer ( size_t depth ) const ; + inline GCellGrid* getGCellGrid () const; + inline const NetSet& getRoutingNets () const; + inline DbU::Unit getGlobalThreshold () const; + inline float getSaturateRatio () const; + inline size_t getSaturateRp () const; + inline DbU::Unit getExtensionCap () const; + inline const ChipTools& getChipTools () const; + void xmlWriteGCellGrid ( ostream& ); + void xmlWriteGCellGrid ( const string& ); + // Modifiers. + inline void setState ( EngineState state ); + inline void setFlags ( unsigned int ); + inline void unsetFlags ( unsigned int ); + inline void setGlobalThreshold ( DbU::Unit ); + inline void setSaturateRatio ( float ); + inline void setSaturateRp ( size_t ); + void startMeasures (); + void stopMeasures (); + void printMeasures ( const string& ) const; + void refresh ( unsigned int flags=KbOpenSession ); + virtual void createDetailedGrid (); + void chipPrep (); + void makePowerRails (); + virtual void loadGlobalRouting ( unsigned int method, NetSet& ); + void slackenBorder ( Box bb, Layer::Mask, unsigned int flags ); + void slackenBlockIos ( Instance* core ); + bool moveUpNetTrunk ( AutoSegment*, set& globalNets, GCell::SetIndex& invalidateds ); + void moveULeft ( AutoSegment*, set& globalNets, GCell::SetIndex& invalidateds ); + void moveURight ( AutoSegment*, set& globalNets, GCell::SetIndex& invalidateds ); + void balanceGlobalDensity (); + void layerAssign ( unsigned int method ); + void updateNetTopology ( Net* ); + void computeNetConstraints ( Net* ); + void toOptimals ( Net* ); + virtual void finalizeLayout (); + // Internal Modifiers. + void _computeNetOptimals ( Net* ); + void _computeNetTerminals ( Net* ); + bool _check ( const char* message=NULL ) const; + void _check ( Net* ) const; + void _gutKatabatic (); + void _link ( AutoContact* ); + void _link ( AutoSegment* ); + void _unlink ( AutoContact* ); + void _unlink ( AutoSegment* ); + AutoContact* _lookup ( Contact* ) const; + AutoSegment* _lookup ( Segment* ) const; + void _destroyAutoSegments (); + void _destroyAutoContacts (); + void _loadGrByNet (); + void _loadNetGlobalRouting ( Net* ); + void _alignate ( Net* ); + void _balanceGlobalDensity ( unsigned int depth ); + void _desaturate ( unsigned int depth, set&, unsigned long& total, unsigned long& globals ); + void _layerAssignByLength ( unsigned long& total, unsigned long& global, set& ); + void _layerAssignByLength ( Net*, unsigned long& total, unsigned long& global, set& ); + void _layerAssignByTrunk ( unsigned long& total, unsigned long& global, set& ); + void _layerAssignByTrunk ( Net*, set&, unsigned long& total, unsigned long& global ); + void _saveNet ( Net* ); + void _print () const; + void _print ( Net* ) const; + inline const AutoContactLut& _getAutoContactLut () const; + inline const AutoSegmentLut& _getAutoSegmentLut () const; // Inspector Management. - virtual Record* _getRecord () const; - virtual string _getString () const; - virtual string _getTypeName () const; + virtual Record* _getRecord () const; + virtual string _getString () const; + virtual string _getTypeName () const; protected: // Attributes. static Name _toolName; Timer _timer; EngineState _state; - bool _destroyBaseContact; - bool _destroyBaseSegment; - bool _demoMode; - bool _warnGCellOverload; + unsigned int _flags; Configuration* _configuration; GCellGrid* _gcellGrid; ChipTools _chipTools; @@ -242,20 +205,20 @@ namespace Katabatic { // Inline Functions. - inline bool KatabaticEngine::doDestroyBaseContact () const { return _destroyBaseContact; } - inline bool KatabaticEngine::doDestroyBaseSegment () const { return _destroyBaseSegment; } - inline bool KatabaticEngine::doDestroyTool () const { return _state >= StateGutted; } - inline bool KatabaticEngine::setDestroyBaseContact ( bool state ) { bool p=_destroyBaseContact; _destroyBaseContact = state; return p; } - inline bool KatabaticEngine::setDestroyBaseSegment ( bool state ) { bool p=_destroyBaseSegment; _destroyBaseSegment = state; return p; } + inline bool KatabaticEngine::doDestroyBaseContact () const { return _flags & EngineDestroyBaseContact; } + inline bool KatabaticEngine::doDestroyBaseSegment () const { return _flags & EngineDestroyBaseSegment; } + inline bool KatabaticEngine::doDestroyTool () const { return _state >= EngineGutted; } + inline bool KatabaticEngine::doWarnOnGCellOverload () const { return _flags & EngineWarnOnGCellOverload; } + inline bool KatabaticEngine::isInDemoMode () const { return _flags & EngineDemoMode; } inline Configuration* KatabaticEngine::getKatabaticConfiguration () { return _configuration; } inline bool KatabaticEngine::isGMetal ( const Layer* layer ) const { return _configuration->isGMetal(layer); } - inline void KatabaticEngine::setDemoMode ( bool mode ) { _demoMode = mode; } - inline void KatabaticEngine::setWarnGCellOverload ( bool mode ) { _warnGCellOverload = mode; } + inline bool KatabaticEngine::isGContact ( const Layer* layer ) const { return _configuration->isGContact(layer); } + inline void KatabaticEngine::setFlags ( unsigned int flags ) { _flags |= flags; } + inline void KatabaticEngine::unsetFlags ( unsigned int flags ) { _flags &= ~flags; } inline void KatabaticEngine::setSaturateRatio ( float ratio ) { _configuration->setSaturateRatio(ratio); } inline void KatabaticEngine::setSaturateRp ( size_t threshold ) { _configuration->setSaturateRp(threshold); } inline void KatabaticEngine::setGlobalThreshold ( DbU::Unit threshold ) { _configuration->setGlobalThreshold(threshold); } - inline bool KatabaticEngine::getDemoMode () { return _demoMode; } - inline bool KatabaticEngine::getWarnGCellOverload () { return _warnGCellOverload; } + inline unsigned int KatabaticEngine::getFlags ( unsigned int mask ) const { return _flags & mask; } inline EngineState KatabaticEngine::getState () const { return _state; } inline RoutingGauge* KatabaticEngine::getRoutingGauge () const { return _configuration->getRoutingGauge(); } inline RoutingLayerGauge* KatabaticEngine::getLayerGauge ( size_t depth ) const { return _configuration->getLayerGauge(depth); } @@ -267,8 +230,8 @@ namespace Katabatic { inline float KatabaticEngine::getSaturateRatio () const { return _configuration->getSaturateRatio(); } inline size_t KatabaticEngine::getSaturateRp () const { return _configuration->getSaturateRp(); } inline DbU::Unit KatabaticEngine::getExtensionCap () const { return _configuration->getExtensionCap(); } - inline AutoContactLut& KatabaticEngine::_getAutoContactLut () { return _autoContactLut; } - inline AutoSegmentLut& KatabaticEngine::_getAutoSegmentLut () { return _autoSegmentLut; } + inline const AutoContactLut& KatabaticEngine::_getAutoContactLut () const { return _autoContactLut; } + inline const AutoSegmentLut& KatabaticEngine::_getAutoSegmentLut () const { return _autoSegmentLut; } inline void KatabaticEngine::setState ( EngineState state ) { _state = state; } inline bool KatabaticEngine::isChip () const { return _chipTools.isChip(); } inline const ChipTools& KatabaticEngine::getChipTools () const { return _chipTools; } @@ -282,7 +245,6 @@ namespace Katabatic { extern const char* badMethod; -} // End of Katabatic namespace. +} // Katabatic namespace. - -#endif // __KATABATIC_KATABATIC_ENGINE__ +#endif // KATABATIC_KATABATIC_ENGINE_H diff --git a/katabatic/src/katabatic/Observer.h b/katabatic/src/katabatic/Observer.h new file mode 100644 index 00000000..9b942b29 --- /dev/null +++ b/katabatic/src/katabatic/Observer.h @@ -0,0 +1,119 @@ +// -*- C++ -*- +// +// This file is part of the Coriolis Software. +// Copyright (c) UPMC 2008-2013, All Rights Reserved +// +// +-----------------------------------------------------------------+ +// | C O R I O L I S | +// | K a t a b a t i c - Routing Toolbox | +// | | +// | Author : Jean-Paul CHAPUT | +// | E-mail : Jean-Paul.Chaput@lip6.fr | +// | =============================================================== | +// | C++ Header : "./katabatic/Observer.h" | +// +-----------------------------------------------------------------+ + + +#ifndef KATABATIC_OBSERVER_H +#define KATABATIC_OBSERVER_H + +#include "hurricane/Error.h" + + +namespace Katabatic { + + +// ------------------------------------------------------------------- +// Classes : "BaseObserver" & "Observer". + + class BaseObserver { + public: + virtual void notify ( unsigned int flags ); + }; + + + template< typename T> + class Observer : public BaseObserver { + public: + inline Observer ( const T* owner ); + inline T* getOwner () const; + private: + Observer ( const Observer& ); + private: + static int _ownerOffset; + }; + + + template< typename T> + int Observer::_ownerOffset = -1; + + template< typename T> + inline Observer::Observer ( const T* owner ) + : BaseObserver() + { + if (owner == NULL) + throw Hurricane::Error( "Observer::Observer(), attempt to create with NULL owner." ); + + if (_ownerOffset < 0) + _ownerOffset = (unsigned long)this - (unsigned long)owner; + } + + + template< typename T> + inline T* Observer::getOwner () const { return reinterpret_cast((unsigned long)this - _ownerOffset); } + + +// ------------------------------------------------------------------- +// Class : "Observable". + + class Observable { + public: + inline Observable (); + template< typename T > + inline T* getObserver (); + inline void addObserver ( BaseObserver* ); + inline void removeObserver ( BaseObserver* ); + inline void notify ( unsigned int flags ); + private: + Observable ( const Observable& ); + private: + BaseObserver* _observer; + }; + + + inline Observable::Observable () + : _observer(NULL) + { } + + + template< typename T > + T* Observable::getObserver () + { + if (_observer) return (dynamic_cast< Observer* >( _observer ))->getOwner(); + return NULL; + } + + inline void Observable::addObserver ( BaseObserver* observer ) + { + if (_observer) + throw Hurricane::Error( "Observable::addObserver(), trying to add a second observer which is unsupported." ); + _observer = observer; + } + + inline void Observable::removeObserver ( BaseObserver* observer ) + { + if (_observer != observer) + throw Hurricane::Error( "Observable::removeObserver(), trying to remove wrong observer." ); + _observer = NULL; + } + + + inline void Observable::notify ( unsigned int flags ) + { + if (_observer) _observer->notify( flags ); + } + + +} // Katabatic namespace. + +#endif diff --git a/katabatic/src/katabatic/SegmentWrapper.h b/katabatic/src/katabatic/SegmentWrapper.h deleted file mode 100644 index 767e492f..00000000 --- a/katabatic/src/katabatic/SegmentWrapper.h +++ /dev/null @@ -1,110 +0,0 @@ - -// -*- C++ -*- -// -// This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2008, All Rights Reserved -// -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | -// | C O R I O L I S | -// | K a t a b a t i c - Routing Toolbox | -// | | -// | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | -// | =============================================================== | -// | C++ Header : "./SegmentWrapper.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x - - -#ifndef __KATABATIC_SEGMENT_WRAPPER__ -#define __KATABATIC_SEGMENT_WRAPPER__ - - -#include "hurricane/Segment.h" - - -namespace Katabatic { - - using Hurricane::Hook; - using Hurricane::Component; - using Hurricane::DbU; - using Hurricane::Point; - using Hurricane::Layer; - using Hurricane::Segment; - - -// ------------------------------------------------------------------- -// Class : "Katabatic::SegmentWrapper". - - class SegmentWrapper { - public: - // Accessors. - virtual Segment* getBase () = 0; - inline Hook* getSourceHook (); - inline Hook* getTargetHook (); - inline Hook* getOppositeHook ( const Hook* ); - inline Component* getSource () const; - inline Component* getTarget () const; - inline Component* getOppositeAnchor ( const Component* ); - inline Components getAnchors () const; - virtual DbU::Unit getX () const = 0; - virtual DbU::Unit getY () const = 0; - inline DbU::Unit getWidth () const; - inline DbU::Unit getHalfWidth () const; - inline DbU::Unit getLength () const; - virtual DbU::Unit getSourceX () const = 0; - virtual DbU::Unit getSourceY () const = 0; - virtual Point getSourcePosition () const = 0; - virtual DbU::Unit getTargetX () const = 0; - virtual DbU::Unit getTargetY () const = 0; - virtual Point getTargetPosition () const = 0; - public: - // Modifiers. - inline void setLayer ( const Layer* ); - inline void setWidth ( DbU::Unit ); - inline void invert (); - - protected: - // Constructor & Destructors. - inline SegmentWrapper ( Segment* ); - private: - SegmentWrapper& SegmentWrapper ( const SegmentWrapper& ); - SegmentWrapper& operator= ( const SegmentWrapper& ); - }; - - -// Inline Functions. - inline Hook* SegmentWrapper::getBodyHook () { return getBase()->getBodyHook(); } - inline Hook* SegmentWrapper::getAnchorHook () { return getBase()->getAnchorHook(); } - inline Component* SegmentWrapper::getAnchor () const { return getBase()->getAnchor(); } - inline DbU::Unit SegmentWrapper::getDx () const { return getBase()->getDx(); } - inline DbU::Unit SegmentWrapper::getDy () const { return getBase()->getDy(); } - inline DbU::Unit SegmentWrapper::getWidth () const { return getBase()->getWidth(); } - inline DbU::Unit SegmentWrapper::getHalfWidth () const { return getBase()->getHalfWidth(); } - inline DbU::Unit SegmentWrapper::getHeight () const { return getBase()->getHeight(); } - inline DbU::Unit SegmentWrapper::getHalfHeight () const { return getBase()->getHalfHeight(); } - inline void SegmentWrapper::setLayer ( const Layer* layer ) { return getBase()->setLayer(layer); } - inline void SegmentWrapper::setWidth ( DbU::Unit w ) { return getBase()->setWidth(w); } - inline void SegmentWrapper::setHeight ( DbU::Unit h ) { return getBase()->setHeight(h); } - inline void SegmentWrapper::setSizes ( DbU::Unit w, Dbu::Unit h ) { return getBase()->setSizes(w,h); } - inline void SegmentWrapper::setX ( DbU::Unit x ) { return getBase()->setX(x); } - inline void SegmentWrapper::setY ( DbU::Unit y ) { return getBase()->setY(y); } - inline void SegmentWrapper::setPosition ( DbU::Unit x, Dbu::Unit y ) { return getBase()->setPosition(x,y); } - inline void SegmentWrapper::setPosition ( const Point& p ) { return getBase()->setPosition(p); } - inline void SegmentWrapper::setDx ( DbU::Unit dx ) { return getBase()->setDx(dx); } - inline void SegmentWrapper::setDy ( DbU::Unit dy ) { return getBase()->setDy(dy); } - inline void SegmentWrapper::setOffset ( DbU::Unit dx, Dbu::Unit dy ) { return getBase()->setOffset(dx,dy); } - inline SegmentWrapper::SegmentWrapper ( BaseSegment* contact ) : getBase()(contact) { } - - -} // End of Katabatic namespace. - - -#endif // __KATABATIC_SEGMENT_WRAPPER__ diff --git a/katabatic/src/katabatic/Session.h b/katabatic/src/katabatic/Session.h index 56506014..6a8c358d 100644 --- a/katabatic/src/katabatic/Session.h +++ b/katabatic/src/katabatic/Session.h @@ -1,32 +1,21 @@ - -// -*- C++ -*- +// -*- mode: C++; explicit-buffer-name: "Session.h" -*- // // This file is part of the Coriolis Software. -// Copyright (c) UPMC/LIP6 2008-2010, All Rights Reserved +// Copyright (c) UPMC 2008-2013, All Rights Reserved // -// =================================================================== -// -// $Id$ -// -// x-----------------------------------------------------------------x -// | | +// +-----------------------------------------------------------------+ // | C O R I O L I S | // | K a t a b a t i c - Routing Toolbox | // | | // | Author : Jean-Paul CHAPUT | -// | E-mail : Jean-Paul.Chaput@asim.lip6.fr | +// | E-mail : Jean-Paul.Chaput@lip6.fr | // | =============================================================== | -// | C++ Header : "./Session.h" | -// | *************************************************************** | -// | U p d a t e s | -// | | -// x-----------------------------------------------------------------x +// | C++ Header : "./katabatic/Session.h" | +// +-----------------------------------------------------------------+ - - -#ifndef __KATABATIC_SESSION__ -#define __KATABATIC_SESSION__ +#ifndef KATABATIC_SESSION_H +#define KATABATIC_SESSION_H #include #include @@ -35,6 +24,7 @@ #include #include "hurricane/Commons.h" #include "hurricane/DbU.h" +#include "katabatic/Constants.h" namespace Hurricane { class Layer; @@ -79,30 +69,23 @@ namespace Katabatic { // ------------------------------------------------------------------- // Class : "Katabatic::Session". - class Session { - public: - enum InvalidateType { NetSplitContacts = (1<<0) - , NetCanonize = (1<<1) - , RestoreHCon = (1<<2) - , RestoreVCon = (1<<3) - }; - public: // Static Methods. static inline bool doDestroyBaseContact (); static inline bool doDestroyBaseSegment (); static inline bool doDestroyTool (); + static bool isInDemoMode (); + static bool doWarnGCellOverload (); static Session* get ( const char* message=NULL ); static inline Technology* getTechnology (); + static inline KatabaticEngine* getKatabatic (); static inline const Configuration* getConfiguration (); static inline RoutingGauge* getRoutingGauge (); - static inline KatabaticEngine* getKatabatic (); - static bool getDemoMode (); + static unsigned int getLayerDirection ( const Layer* ); static float getSaturateRatio (); static size_t getSaturateRp (); - static bool getWarnGCellOverload (); static DbU::Unit getExtensionCap (); static const Layer* getRoutingLayer ( size_t ); static const Layer* getContactLayer ( size_t ); @@ -111,13 +94,13 @@ namespace Katabatic { static inline const vector& getInvalidateds (); static inline const vector& getRevalidateds (); static inline const set& getDestroyeds (); - static inline const vector& getDogLegs (); + static inline const vector& getDoglegs (); static inline const set& getNetsModificateds (); static Session* open ( KatabaticEngine* ); - static size_t close (); - static void setWarnGCellOverload ( bool ); - static inline void dogLeg ( AutoSegment* ); - static inline void dogLegReset (); + static void close (); + static void setKatabaticFlags ( unsigned int ); + static inline void dogleg ( AutoSegment* ); + static inline void doglegReset (); static inline void revalidateTopology (); static inline void setInvalidateMask ( unsigned int ); static inline void invalidate ( Net* ); @@ -136,16 +119,12 @@ namespace Katabatic { bool _doDestroyBaseSegment (); bool _doDestroyTool (); virtual Configuration* _getConfiguration (); - inline void _dogLeg ( AutoSegment* ); - inline void _dogLegReset (); - inline void _setInvalidateMask ( unsigned int ); - inline void _invalidate ( Net* ); + inline void _dogleg ( AutoSegment* ); + inline void _doglegReset (); + void _invalidate ( Net* ); inline void _invalidate ( AutoContact* ); inline void _invalidate ( AutoSegment* ); inline void _destroyRequest ( AutoSegment* ); - void _splitContacts (); - void _restoreHCon (); - void _restoreVCon (); void _canonize (); void _revalidateTopology (); size_t _revalidate (); @@ -159,20 +138,19 @@ namespace Katabatic { Technology* _technology; RoutingGauge* _routingGauge; vector _autoContacts; - vector _autoSegments; - vector _revalidateds; - vector _dogLegs; + vector _doglegs; + vector _segmentInvalidateds; + vector _segmentRevalidateds; set _netInvalidateds; set _netRevalidateds; set _destroyedSegments; - unsigned int _invalidateMask; // Constructors. protected: Session ( KatabaticEngine* ); virtual ~Session (); virtual void _postCreate (); - virtual size_t _preDestroy (); + virtual void _preDestroy (); private: Session ( const Session& ); Session& operator= ( const Session& ); @@ -189,40 +167,32 @@ namespace Katabatic { inline KatabaticEngine* Session::getKatabatic () { return get("getKatabatic()")->_katabatic; } inline void Session::revalidateTopology () { return get("revalidateTopology()")->_revalidateTopology(); } inline size_t Session::revalidate () { return get("revalidate()")->_revalidate(); } - inline size_t Session::getSegmentStackSize () { return get("getSegmentStackSize()")->_autoSegments.size(); } + inline size_t Session::getSegmentStackSize () { return get("getSegmentStackSize()")->_segmentInvalidateds.size(); } inline size_t Session::getContactStackSize () { return get("getContactStackSize()")->_autoContacts.size(); } - inline const vector& Session::getInvalidateds () { return get("getInvalidateds()")->_autoSegments; } - inline const vector& Session::getRevalidateds () { return get("getRevalidateds()")->_revalidateds; } + inline const vector& Session::getInvalidateds () { return get("getInvalidateds()")->_segmentInvalidateds; } + inline const vector& Session::getRevalidateds () { return get("getRevalidateds()")->_segmentRevalidateds; } inline const set& Session::getDestroyeds () { return get("getDestroyeds()")->_destroyedSegments; } - inline const vector& Session::getDogLegs () { return get("getDogLegs()")->_dogLegs; } + inline const vector& Session::getDoglegs () { return get("getDoglegs()")->_doglegs; } inline const set& Session::getNetsModificateds () { return get("getNetsModificateds()")->_netRevalidateds; } - inline void Session::dogLegReset () { return get("dogLegReset()")->_dogLegReset (); } - inline void Session::setInvalidateMask ( unsigned int mask ) { return get("setInvalidateMask()")->_setInvalidateMask ( mask ); } - inline void Session::invalidate ( Net* net ) { return get("invalidate(Net*)")->_invalidate ( net ); } - inline void Session::invalidate ( AutoContact* autoContact ) { return get("invalidate(AutoContact*)")->_invalidate ( autoContact ); } - inline void Session::invalidate ( AutoSegment* autoSegment ) { return get("invalidate(AutoSegment*)")->_invalidate ( autoSegment ); } - inline void Session::dogLeg ( AutoSegment* autoSegment ) { return get("dogLeg(AutoSegment*)")->_dogLeg ( autoSegment ); } - inline void Session::destroyRequest ( AutoSegment* autoSegment ) { return get("destroyRequest(AutoSegment*)")->_destroyRequest ( autoSegment ); } + inline void Session::doglegReset () { return get("doglegReset()")->_doglegReset (); } + inline void Session::invalidate ( Net* net ) { return get("invalidate(Net*)")->_invalidate(net); } + inline void Session::invalidate ( AutoContact* autoContact ) { return get("invalidate(AutoContact*)")->_invalidate(autoContact); } + inline void Session::invalidate ( AutoSegment* autoSegment ) { return get("invalidate(AutoSegment*)")->_invalidate(autoSegment); } + inline void Session::dogleg ( AutoSegment* autoSegment ) { return get("dogleg(AutoSegment*)")->_dogleg(autoSegment); } + inline void Session::destroyRequest ( AutoSegment* autoSegment ) { return get("destroyRequest(AutoSegment*)")->_destroyRequest(autoSegment); } - inline void Session::_dogLeg ( AutoSegment* segment ) { _dogLegs.push_back(segment); } - inline void Session::_dogLegReset () { _dogLegs.clear(); } - inline void Session::_setInvalidateMask ( unsigned int mask ) { _invalidateMask |= mask; } + inline void Session::_dogleg ( AutoSegment* segment ) { _doglegs.push_back(segment); } + inline void Session::_doglegReset () { _doglegs.clear(); } inline void Session::_invalidate ( AutoContact* contact ) { _autoContacts.push_back(contact); } - inline void Session::_invalidate ( AutoSegment* segment ) { _autoSegments.push_back(segment); } + inline void Session::_invalidate ( AutoSegment* segment ) { _segmentInvalidateds.push_back(segment); } inline void Session::_destroyRequest ( AutoSegment* segment ) { _destroyedSegments.insert(segment); } inline string Session::_getTypeName () const { return _TName("Session"); } - inline void Session::_invalidate ( Net* net ) { - ltrace(200) << "Session::invalidate(Net*) - " << net << endl; - _netInvalidateds.insert(net); - _invalidateMask |= NetCanonize; - } - -} // End of Katabatic namespace. +} // Katabatic namespace. INSPECTOR_P_SUPPORT(Katabatic::Session); -#endif // __KATABATIC_SESSION__ +#endif // KATABATIC_SESSION_H