From 0e6316880233eac1ccb1c61269678b2dbc96c262 Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Fri, 1 Oct 2021 21:36:45 +0200 Subject: [PATCH] Regenerated whole doc (by mistake)... --- .../doc/crlcore/html/AcmSigda_8h_source.html | 2 +- .../html/AllianceFramework_8h_source.html | 4 +- .../html/AllianceLibrary_8h_source.html | 2 +- .../doc/crlcore/html/Banner_8h_source.html | 2 +- .../doc/crlcore/html/Catalog_8h_source.html | 102 +++++----- .../crlcore/html/Environment_8h_source.html | 2 +- .../html/GraphicToolEngine_8h_source.html | 2 +- .../crlcore/html/RoutingGauge_8h_source.html | 22 +-- .../html/RoutingLayerGauge_8h_source.html | 56 +++--- .../crlcore/html/SearchPath_8h_source.html | 2 +- .../crlcore/html/ToolEngine_8h_source.html | 2 +- .../crlcore/html/ToolEngines_8h_source.html | 2 +- crlcore/doc/crlcore/html/annotated.html | 2 +- .../html/classCRL_1_1AcmSigda-members.html | 2 +- .../crlcore/html/classCRL_1_1AcmSigda.html | 2 +- ...classCRL_1_1AllianceFramework-members.html | 2 +- .../html/classCRL_1_1AllianceFramework.html | 2 +- .../classCRL_1_1AllianceLibrary-members.html | 2 +- .../html/classCRL_1_1AllianceLibrary.html | 2 +- .../html/classCRL_1_1Banner-members.html | 2 +- .../doc/crlcore/html/classCRL_1_1Banner.html | 2 +- .../html/classCRL_1_1Catalog-members.html | 2 +- .../doc/crlcore/html/classCRL_1_1Catalog.html | 2 +- .../classCRL_1_1CatalogExtension-members.html | 2 +- .../html/classCRL_1_1CatalogExtension.html | 2 +- .../classCRL_1_1Catalog_1_1State-members.html | 2 +- .../html/classCRL_1_1Catalog_1_1State.html | 2 +- .../html/classCRL_1_1Environment-members.html | 2 +- .../crlcore/html/classCRL_1_1Environment.html | 2 +- .../html/classCRL_1_1GraphicTool-members.html | 2 +- .../crlcore/html/classCRL_1_1GraphicTool.html | 2 +- .../classCRL_1_1RoutingGauge-members.html | 2 +- .../html/classCRL_1_1RoutingGauge.html | 2 +- ...classCRL_1_1RoutingLayerGauge-members.html | 4 +- .../html/classCRL_1_1RoutingLayerGauge.html | 16 +- .../html/classCRL_1_1SearchPath-members.html | 2 +- .../crlcore/html/classCRL_1_1SearchPath.html | 2 +- ...sCRL_1_1SearchPath_1_1Element-members.html | 2 +- .../classCRL_1_1SearchPath_1_1Element.html | 2 +- .../html/classCRL_1_1ToolEngine-members.html | 2 +- .../crlcore/html/classCRL_1_1ToolEngine.html | 2 +- crlcore/doc/crlcore/html/classes.html | 2 +- crlcore/doc/crlcore/html/crlcore.tag | 4 +- .../dir_1d3beb215ce2defdb52d6dee9d41bc7a.html | 2 +- .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 2 +- .../dir_d23e13494685c82fafa9ef5abb5746af.html | 2 +- crlcore/doc/crlcore/html/files.html | 2 +- crlcore/doc/crlcore/html/functions.html | 2 +- crlcore/doc/crlcore/html/functions_0x7e.html | 2 +- crlcore/doc/crlcore/html/functions_b.html | 2 +- crlcore/doc/crlcore/html/functions_c.html | 4 +- crlcore/doc/crlcore/html/functions_d.html | 2 +- crlcore/doc/crlcore/html/functions_e.html | 2 +- crlcore/doc/crlcore/html/functions_enum.html | 2 +- crlcore/doc/crlcore/html/functions_eval.html | 2 +- crlcore/doc/crlcore/html/functions_f.html | 2 +- crlcore/doc/crlcore/html/functions_func.html | 4 +- crlcore/doc/crlcore/html/functions_g.html | 2 +- crlcore/doc/crlcore/html/functions_h.html | 2 +- crlcore/doc/crlcore/html/functions_i.html | 2 +- crlcore/doc/crlcore/html/functions_l.html | 2 +- crlcore/doc/crlcore/html/functions_m.html | 2 +- crlcore/doc/crlcore/html/functions_o.html | 2 +- crlcore/doc/crlcore/html/functions_p.html | 2 +- crlcore/doc/crlcore/html/functions_r.html | 2 +- crlcore/doc/crlcore/html/functions_s.html | 2 +- crlcore/doc/crlcore/html/functions_v.html | 2 +- crlcore/doc/crlcore/html/hierarchy.html | 2 +- crlcore/doc/crlcore/html/index.html | 2 +- crlcore/doc/crlcore/html/namespaceCRL.html | 2 +- .../doc/crlcore/html/namespaceConstant.html | 2 +- .../doc/crlcore/html/namespacemembers.html | 2 +- .../crlcore/html/namespacemembers_enum.html | 2 +- .../crlcore/html/namespacemembers_eval.html | 2 +- .../crlcore/html/namespacemembers_type.html | 2 +- crlcore/doc/crlcore/html/namespaces.html | 2 +- .../latex/classCRL_1_1RoutingLayerGauge.tex | 6 +- crlcore/doc/crlcore/latex/refman.tex | 2 +- documentation/output/pdfs/CheckToolkit.pdf | Bin 241150 -> 241062 bytes documentation/output/pdfs/PythonCpp.pdf | Bin 174246 -> 174120 bytes documentation/output/pdfs/PythonTutorial.pdf | Bin 298213 -> 298101 bytes documentation/output/pdfs/RDS.pdf | Bin 117030 -> 116990 bytes documentation/output/pdfs/Stratus.pdf | Bin 537784 -> 537439 bytes documentation/output/pdfs/UsersGuide.pdf | Bin 673209 -> 673068 bytes hurricane/doc/analog/html/graph_legend.html | 2 +- hurricane/doc/analog/html/index.html | 2 +- hurricane/doc/analog/latex/refman.tex | 2 +- hurricane/doc/hurricane/doxygen.warn.log | 2 +- .../hurricane/html/BasicLayer_8h_source.html | 10 +- .../doc/hurricane/html/Box_8h_source.html | 4 +- .../doc/hurricane/html/Boxes_8h_source.html | 2 +- .../doc/hurricane/html/Cell_8h_source.html | 38 ++-- .../doc/hurricane/html/Cells_8h_source.html | 4 +- .../hurricane/html/Collection_8h_source.html | 2 +- .../doc/hurricane/html/Commons_8h_source.html | 4 +- .../hurricane/html/Component_8h_source.html | 10 +- .../hurricane/html/Components_8h_source.html | 2 +- .../html/ContactLayer_8h_source.html | 6 +- .../doc/hurricane/html/Contact_8h_source.html | 48 ++--- .../hurricane/html/Contacts_8h_source.html | 4 +- .../doc/hurricane/html/DBo_8h_source.html | 11 +- .../doc/hurricane/html/DBos_8h_source.html | 4 +- .../hurricane/html/DataBase_8h_source.html | 6 +- .../doc/hurricane/html/DbU_8h_source.html | 70 +++---- .../html/DebugSession_8h_source.html | 4 +- .../hurricane/html/Diagonal_8h_source.html | 4 +- .../html/DiffusionLayer_8h_source.html | 6 +- .../hurricane/html/Entities_8h_source.html | 2 +- .../doc/hurricane/html/Entity_8h_source.html | 11 +- .../doc/hurricane/html/Error_8h_source.html | 2 +- .../hurricane/html/Exception_8h_source.html | 2 +- .../doc/hurricane/html/Filter_8h_source.html | 2 +- .../doc/hurricane/html/Go_8h_source.html | 11 +- .../doc/hurricane/html/Gos_8h_source.html | 4 +- .../doc/hurricane/html/Hook_8h_source.html | 7 +- .../doc/hurricane/html/Hooks_8h_source.html | 4 +- .../hurricane/html/Horizontal_8h_source.html | 4 +- .../hurricane/html/Horizontals_8h_source.html | 2 +- .../hurricane/html/HyperNet_8h_source.html | 4 +- .../hurricane/html/Initializer_8h_source.html | 2 +- .../hurricane/html/Instance_8h_source.html | 36 ++-- .../hurricane/html/Instances_8h_source.html | 4 +- .../html/Interruption_8h_source.html | 2 +- .../hurricane/html/Interval_8h_source.html | 4 +- .../hurricane/html/Intervals_8h_source.html | 2 +- .../hurricane/html/JsonObject_8h_source.html | 6 +- .../hurricane/html/JsonReader_8h_source.html | 2 +- .../doc/hurricane/html/Layer_8h_source.html | 24 +-- .../doc/hurricane/html/Layers_8h_source.html | 2 +- .../hurricane/html/Libraries_8h_source.html | 2 +- .../doc/hurricane/html/Library_8h_source.html | 6 +- .../html/ListCollection_8h_source.html | 2 +- .../doc/hurricane/html/Locator_8h_source.html | 2 +- .../html/MapCollection_8h_source.html | 2 +- .../doc/hurricane/html/Name_8h_source.html | 2 +- .../doc/hurricane/html/Names_8h_source.html | 2 +- .../doc/hurricane/html/Net_8h_source.html | 8 +- .../doc/hurricane/html/Nets_8h_source.html | 2 +- .../hurricane/html/Occurrence_8h_source.html | 8 +- .../hurricane/html/Occurrences_8h_source.html | 4 +- .../doc/hurricane/html/Pad_8h_source.html | 4 +- .../doc/hurricane/html/Pads_8h_source.html | 2 +- .../doc/hurricane/html/Path_8h_source.html | 8 +- .../doc/hurricane/html/Pathes_8h_source.html | 2 +- .../html/PhysicalRule_8h_source.html | 6 +- .../doc/hurricane/html/Pin_8h_source.html | 10 +- .../doc/hurricane/html/Pins_8h_source.html | 2 +- .../doc/hurricane/html/Plug_8h_source.html | 8 +- .../doc/hurricane/html/Plugs_8h_source.html | 2 +- .../doc/hurricane/html/Point_8h_source.html | 10 +- .../doc/hurricane/html/Points_8h_source.html | 2 +- .../doc/hurricane/html/Polygon_8h_source.html | 4 +- .../hurricane/html/Properties_8h_source.html | 4 +- .../hurricane/html/Property_8h_source.html | 16 +- .../hurricane/html/QuadTree_8h_source.html | 6 +- .../doc/hurricane/html/Quark_8h_source.html | 4 +- .../doc/hurricane/html/Quarks_8h_source.html | 2 +- .../doc/hurricane/html/Query_8h_source.html | 62 +++--- .../html/RegularLayer_8h_source.html | 6 +- .../hurricane/html/Relation_8h_source.html | 6 +- .../hurricane/html/RoutingPad_8h_source.html | 6 +- .../doc/hurricane/html/Rubber_8h_source.html | 10 +- .../doc/hurricane/html/Rubbers_8h_source.html | 2 +- .../doc/hurricane/html/Segment_8h_source.html | 6 +- .../hurricane/html/Segments_8h_source.html | 2 +- .../html/SetCollection_8h_source.html | 2 +- .../doc/hurricane/html/Slice_8h_source.html | 6 +- .../doc/hurricane/html/Slices_8h_source.html | 2 +- .../hurricane/html/Tabulation_8h_source.html | 2 +- .../hurricane/html/Technology_8h_source.html | 6 +- .../html/Transformation_8h_source.html | 4 +- .../html/TransistorLayer_8h_source.html | 6 +- .../html/UpdateSession_8h_source.html | 6 +- .../html/VectorCollection_8h_source.html | 2 +- .../hurricane/html/Vertical_8h_source.html | 4 +- .../hurricane/html/Verticals_8h_source.html | 2 +- .../hurricane/html/ViaLayer_8h_source.html | 6 +- .../doc/hurricane/html/Warning_8h_source.html | 2 +- hurricane/doc/hurricane/html/annotated.html | 2 +- .../html/classEntity_1_1CompareById.html | 2 +- .../classHurricane_1_1BasicLayer-members.html | 4 +- .../html/classHurricane_1_1BasicLayer.html | 14 +- ...ane_1_1BasicLayer_1_1Material-members.html | 2 +- ...ssHurricane_1_1BasicLayer_1_1Material.html | 2 +- .../html/classHurricane_1_1Box-members.html | 2 +- .../hurricane/html/classHurricane_1_1Box.html | 2 +- .../html/classHurricane_1_1Cell-members.html | 8 +- .../html/classHurricane_1_1Cell.html | 52 +++-- .../classHurricane_1_1Collection-members.html | 2 +- .../html/classHurricane_1_1Collection.html | 2 +- .../classHurricane_1_1Component-members.html | 2 +- .../html/classHurricane_1_1Component.html | 2 +- ...cane_1_1Component_1_1BodyHook-members.html | 2 +- ...assHurricane_1_1Component_1_1BodyHook.html | 2 +- .../classHurricane_1_1Contact-members.html | 36 ++-- .../html/classHurricane_1_1Contact.html | 186 +++++++++--------- ...lassHurricane_1_1ContactLayer-members.html | 2 +- .../html/classHurricane_1_1ContactLayer.html | 2 +- ...cane_1_1Contact_1_1AnchorHook-members.html | 2 +- ...assHurricane_1_1Contact_1_1AnchorHook.html | 2 +- .../html/classHurricane_1_1DBo-members.html | 2 +- .../hurricane/html/classHurricane_1_1DBo.html | 2 +- .../classHurricane_1_1DataBase-members.html | 2 +- .../html/classHurricane_1_1DataBase.html | 2 +- .../html/classHurricane_1_1DbU-members.html | 2 +- .../hurricane/html/classHurricane_1_1DbU.html | 2 +- ...lassHurricane_1_1DebugSession-members.html | 2 +- .../html/classHurricane_1_1DebugSession.html | 2 +- .../classHurricane_1_1Diagonal-members.html | 2 +- .../html/classHurricane_1_1Diagonal.html | 2 +- ...ssHurricane_1_1DiffusionLayer-members.html | 2 +- .../classHurricane_1_1DiffusionLayer.html | 2 +- .../classHurricane_1_1Entity-members.html | 2 +- .../html/classHurricane_1_1Entity.html | 2 +- .../html/classHurricane_1_1Error-members.html | 2 +- .../html/classHurricane_1_1Error.html | 2 +- .../classHurricane_1_1Exception-members.html | 2 +- .../html/classHurricane_1_1Exception.html | 2 +- .../classHurricane_1_1Filter-members.html | 2 +- .../html/classHurricane_1_1Filter.html | 2 +- ...urricane_1_1GenericCollection-members.html | 2 +- .../classHurricane_1_1GenericCollection.html | 2 +- ...assHurricane_1_1GenericFilter-members.html | 2 +- .../html/classHurricane_1_1GenericFilter.html | 2 +- ...ssHurricane_1_1GenericLocator-members.html | 2 +- .../classHurricane_1_1GenericLocator.html | 2 +- .../html/classHurricane_1_1Go-members.html | 2 +- .../hurricane/html/classHurricane_1_1Go.html | 4 +- .../html/classHurricane_1_1Hook-members.html | 2 +- .../html/classHurricane_1_1Hook.html | 2 +- .../classHurricane_1_1Horizontal-members.html | 2 +- .../html/classHurricane_1_1Horizontal.html | 2 +- .../classHurricane_1_1HyperNet-members.html | 2 +- .../html/classHurricane_1_1HyperNet.html | 2 +- ...classHurricane_1_1Initializer-members.html | 2 +- .../html/classHurricane_1_1Initializer.html | 2 +- .../classHurricane_1_1Instance-members.html | 2 +- .../html/classHurricane_1_1Instance.html | 2 +- ..._1Instance_1_1PlacementStatus-members.html | 2 +- ...ricane_1_1Instance_1_1PlacementStatus.html | 2 +- ...lassHurricane_1_1Interruption-members.html | 2 +- .../html/classHurricane_1_1Interruption.html | 2 +- .../classHurricane_1_1Interval-members.html | 2 +- .../html/classHurricane_1_1Interval.html | 2 +- .../classHurricane_1_1JsonObject-members.html | 2 +- .../html/classHurricane_1_1JsonObject.html | 2 +- .../classHurricane_1_1JsonStack-members.html | 2 +- .../html/classHurricane_1_1JsonStack.html | 2 +- .../html/classHurricane_1_1Layer-members.html | 2 +- .../html/classHurricane_1_1Layer.html | 2 +- .../classHurricane_1_1Library-members.html | 2 +- .../html/classHurricane_1_1Library.html | 2 +- ...ssHurricane_1_1ListCollection-members.html | 2 +- .../classHurricane_1_1ListCollection.html | 2 +- .../classHurricane_1_1Locator-members.html | 2 +- .../html/classHurricane_1_1Locator.html | 2 +- ...assHurricane_1_1MapCollection-members.html | 2 +- .../html/classHurricane_1_1MapCollection.html | 2 +- .../html/classHurricane_1_1Name-members.html | 2 +- .../html/classHurricane_1_1Name.html | 2 +- .../html/classHurricane_1_1Net-members.html | 2 +- .../hurricane/html/classHurricane_1_1Net.html | 2 +- ...Hurricane_1_1Net_1_1Direction-members.html | 2 +- .../classHurricane_1_1Net_1_1Direction.html | 2 +- ...classHurricane_1_1Net_1_1Type-members.html | 2 +- .../html/classHurricane_1_1Net_1_1Type.html | 2 +- .../classHurricane_1_1NotFilter-members.html | 2 +- .../html/classHurricane_1_1NotFilter.html | 2 +- .../classHurricane_1_1Occurrence-members.html | 2 +- .../html/classHurricane_1_1Occurrence.html | 2 +- .../html/classHurricane_1_1Pad-members.html | 2 +- .../hurricane/html/classHurricane_1_1Pad.html | 2 +- .../html/classHurricane_1_1Path-members.html | 2 +- .../html/classHurricane_1_1Path.html | 2 +- ...lassHurricane_1_1PhysicalRule-members.html | 2 +- .../html/classHurricane_1_1PhysicalRule.html | 2 +- .../html/classHurricane_1_1Pin-members.html | 36 ++-- .../hurricane/html/classHurricane_1_1Pin.html | 70 +++---- .../html/classHurricane_1_1Plug-members.html | 2 +- .../html/classHurricane_1_1Plug.html | 2 +- .../html/classHurricane_1_1Point-members.html | 6 +- .../html/classHurricane_1_1Point.html | 22 +-- .../classHurricane_1_1Polygon-members.html | 2 +- .../html/classHurricane_1_1Polygon.html | 2 +- ...sHurricane_1_1PrivateProperty-members.html | 2 +- .../classHurricane_1_1PrivateProperty.html | 2 +- .../classHurricane_1_1Property-members.html | 2 +- .../html/classHurricane_1_1Property.html | 2 +- .../classHurricane_1_1QuadTree-members.html | 2 +- .../html/classHurricane_1_1QuadTree.html | 2 +- .../html/classHurricane_1_1Quark-members.html | 2 +- .../html/classHurricane_1_1Quark.html | 2 +- .../html/classHurricane_1_1Query-members.html | 2 +- .../html/classHurricane_1_1Query.html | 2 +- ...lassHurricane_1_1RegularLayer-members.html | 2 +- .../html/classHurricane_1_1RegularLayer.html | 2 +- .../classHurricane_1_1Relation-members.html | 2 +- .../html/classHurricane_1_1Relation.html | 2 +- .../classHurricane_1_1RoutingPad-members.html | 2 +- .../html/classHurricane_1_1RoutingPad.html | 2 +- .../classHurricane_1_1Rubber-members.html | 2 +- .../html/classHurricane_1_1Rubber.html | 2 +- .../classHurricane_1_1Segment-members.html | 2 +- .../html/classHurricane_1_1Segment.html | 2 +- ...cane_1_1Segment_1_1SourceHook-members.html | 2 +- ...assHurricane_1_1Segment_1_1SourceHook.html | 2 +- ...cane_1_1Segment_1_1TargetHook-members.html | 2 +- ...assHurricane_1_1Segment_1_1TargetHook.html | 2 +- ...assHurricane_1_1SetCollection-members.html | 2 +- .../html/classHurricane_1_1SetCollection.html | 2 +- ...ssHurricane_1_1SharedProperty-members.html | 2 +- .../classHurricane_1_1SharedProperty.html | 2 +- .../html/classHurricane_1_1Slice-members.html | 2 +- .../html/classHurricane_1_1Slice.html | 2 +- ...ne_1_1StandardPrivateProperty-members.html | 2 +- ...sHurricane_1_1StandardPrivateProperty.html | 2 +- ...Hurricane_1_1StandardRelation-members.html | 2 +- .../classHurricane_1_1StandardRelation.html | 2 +- ...ane_1_1StandardSharedProperty-members.html | 2 +- ...ssHurricane_1_1StandardSharedProperty.html | 2 +- ...Hurricane_1_1SubSetCollection-members.html | 2 +- .../classHurricane_1_1SubSetCollection.html | 2 +- ...urricane_1_1SubTypeCollection-members.html | 2 +- .../classHurricane_1_1SubTypeCollection.html | 2 +- .../classHurricane_1_1Tabulation-members.html | 2 +- .../html/classHurricane_1_1Tabulation.html | 2 +- .../classHurricane_1_1Technology-members.html | 2 +- .../html/classHurricane_1_1Technology.html | 2 +- ...ssHurricane_1_1Transformation-members.html | 2 +- .../classHurricane_1_1Transformation.html | 2 +- ...Transformation_1_1Orientation-members.html | 2 +- ...cane_1_1Transformation_1_1Orientation.html | 2 +- ...sHurricane_1_1TransistorLayer-members.html | 2 +- .../classHurricane_1_1TransistorLayer.html | 2 +- ...assHurricane_1_1UpdateSession-members.html | 2 +- .../html/classHurricane_1_1UpdateSession.html | 2 +- ...Hurricane_1_1VectorCollection-members.html | 2 +- .../classHurricane_1_1VectorCollection.html | 2 +- .../classHurricane_1_1Vertical-members.html | 2 +- .../html/classHurricane_1_1Vertical.html | 2 +- .../classHurricane_1_1ViaLayer-members.html | 2 +- .../html/classHurricane_1_1ViaLayer.html | 2 +- .../classHurricane_1_1Warning-members.html | 2 +- .../html/classHurricane_1_1Warning.html | 2 +- hurricane/doc/hurricane/html/classes.html | 2 +- .../hurricane/html/clasststream-members.html | 2 +- .../doc/hurricane/html/clasststream.html | 2 +- .../dir_2450e9a649c497a3424377400b95054f.html | 2 +- .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 2 +- .../dir_84a91669594ac5e20f6d730a15331f7a.html | 2 +- hurricane/doc/hurricane/html/files.html | 2 +- hurricane/doc/hurricane/html/functions.html | 2 +- .../doc/hurricane/html/functions_0x7e.html | 2 +- hurricane/doc/hurricane/html/functions_b.html | 2 +- hurricane/doc/hurricane/html/functions_c.html | 6 +- hurricane/doc/hurricane/html/functions_d.html | 2 +- hurricane/doc/hurricane/html/functions_e.html | 2 +- .../doc/hurricane/html/functions_enum.html | 2 +- .../doc/hurricane/html/functions_eval.html | 2 +- hurricane/doc/hurricane/html/functions_f.html | 2 +- .../doc/hurricane/html/functions_func.html | 2 +- .../hurricane/html/functions_func_0x7e.html | 2 +- .../doc/hurricane/html/functions_func_b.html | 2 +- .../doc/hurricane/html/functions_func_c.html | 6 +- .../doc/hurricane/html/functions_func_d.html | 2 +- .../doc/hurricane/html/functions_func_e.html | 2 +- .../doc/hurricane/html/functions_func_f.html | 2 +- .../doc/hurricane/html/functions_func_g.html | 14 +- .../doc/hurricane/html/functions_func_h.html | 2 +- .../doc/hurricane/html/functions_func_i.html | 2 +- .../doc/hurricane/html/functions_func_j.html | 2 +- .../doc/hurricane/html/functions_func_l.html | 2 +- .../doc/hurricane/html/functions_func_m.html | 2 +- .../doc/hurricane/html/functions_func_n.html | 2 +- .../doc/hurricane/html/functions_func_o.html | 2 +- .../doc/hurricane/html/functions_func_p.html | 2 +- .../doc/hurricane/html/functions_func_q.html | 2 +- .../doc/hurricane/html/functions_func_r.html | 2 +- .../doc/hurricane/html/functions_func_s.html | 28 +-- .../doc/hurricane/html/functions_func_t.html | 2 +- .../doc/hurricane/html/functions_func_u.html | 2 +- .../doc/hurricane/html/functions_func_v.html | 2 +- .../doc/hurricane/html/functions_func_w.html | 2 +- hurricane/doc/hurricane/html/functions_g.html | 14 +- hurricane/doc/hurricane/html/functions_h.html | 2 +- hurricane/doc/hurricane/html/functions_i.html | 2 +- hurricane/doc/hurricane/html/functions_j.html | 2 +- hurricane/doc/hurricane/html/functions_k.html | 2 +- hurricane/doc/hurricane/html/functions_l.html | 2 +- hurricane/doc/hurricane/html/functions_m.html | 2 +- hurricane/doc/hurricane/html/functions_n.html | 2 +- hurricane/doc/hurricane/html/functions_o.html | 2 +- hurricane/doc/hurricane/html/functions_p.html | 2 +- hurricane/doc/hurricane/html/functions_q.html | 2 +- hurricane/doc/hurricane/html/functions_r.html | 2 +- hurricane/doc/hurricane/html/functions_s.html | 28 +-- hurricane/doc/hurricane/html/functions_t.html | 2 +- .../doc/hurricane/html/functions_type.html | 2 +- hurricane/doc/hurricane/html/functions_u.html | 2 +- hurricane/doc/hurricane/html/functions_v.html | 2 +- hurricane/doc/hurricane/html/functions_w.html | 2 +- .../doc/hurricane/html/graph_legend.html | 2 +- .../doc/hurricane/html/group__DbUGroup.html | 2 +- .../hurricane/html/group__Generalities.html | 2 +- .../hurricane/html/group__JsonSupport.html | 2 +- .../html/group__grpSynthHierarchy.html | 2 +- hurricane/doc/hurricane/html/hierarchy.html | 2 +- hurricane/doc/hurricane/html/hurricane.tag | 92 ++++----- hurricane/doc/hurricane/html/index.html | 2 +- hurricane/doc/hurricane/html/modules.html | 2 +- .../hurricane/html/namespaceHurricane.html | 2 +- .../doc/hurricane/html/namespacemembers.html | 2 +- .../hurricane/html/namespacemembers_func.html | 2 +- .../hurricane/html/namespacemembers_type.html | 2 +- hurricane/doc/hurricane/html/namespaces.html | 2 +- .../latex/classHurricane_1_1BasicLayer.tex | 6 +- .../latex/classHurricane_1_1Cell.tex | 28 +-- .../latex/classHurricane_1_1Contact.tex | 98 ++++----- .../hurricane/latex/classHurricane_1_1Go.tex | 2 +- .../latex/classHurricane_1_1Point.tex | 12 +- hurricane/doc/hurricane/latex/refman.tex | 2 +- .../doc/viewer/html/CellImage_8h_source.html | 2 +- .../viewer/html/CellPrinter_8h_source.html | 2 +- .../doc/viewer/html/CellViewer_8h_source.html | 2 +- .../doc/viewer/html/CellWidget_8h_source.html | 4 +- .../viewer/html/DisplayStyle_8h_source.html | 2 +- .../doc/viewer/html/Graphics_8h_source.html | 2 +- .../html/InspectorWidget_8h_source.html | 2 +- hurricane/doc/viewer/html/annotated.html | 2 +- .../classHurricane_1_1CellImage-members.html | 2 +- .../html/classHurricane_1_1CellImage.html | 2 +- ...classHurricane_1_1CellPrinter-members.html | 2 +- .../html/classHurricane_1_1CellPrinter.html | 2 +- .../classHurricane_1_1CellViewer-members.html | 2 +- .../html/classHurricane_1_1CellViewer.html | 2 +- .../classHurricane_1_1CellWidget-members.html | 2 +- .../html/classHurricane_1_1CellWidget.html | 2 +- ...lassHurricane_1_1DisplayStyle-members.html | 2 +- .../html/classHurricane_1_1DisplayStyle.html | 2 +- .../classHurricane_1_1Graphics-members.html | 2 +- .../html/classHurricane_1_1Graphics.html | 2 +- ...sHurricane_1_1InspectorWidget-members.html | 2 +- .../classHurricane_1_1InspectorWidget.html | 2 +- hurricane/doc/viewer/html/classes.html | 2 +- .../dir_0afc25342c548a63e1813d8fbde8101d.html | 2 +- .../dir_22af1943967c75aa4d199e6ffd8de9d2.html | 2 +- .../dir_53ec41d7bc61ef1f85d867f95df84d28.html | 2 +- .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 2 +- hurricane/doc/viewer/html/files.html | 2 +- hurricane/doc/viewer/html/functions.html | 2 +- hurricane/doc/viewer/html/functions_enum.html | 2 +- hurricane/doc/viewer/html/functions_eval.html | 2 +- hurricane/doc/viewer/html/functions_func.html | 2 +- hurricane/doc/viewer/html/graph_legend.html | 2 +- .../doc/viewer/html/group__graphicsGroup.html | 2 +- hurricane/doc/viewer/html/index.html | 2 +- hurricane/doc/viewer/html/modules.html | 2 +- hurricane/doc/viewer/latex/refman.tex | 2 +- .../doc/html/AutoContactHTee_8h_source.html | 2 +- .../html/AutoContactTerminal_8h_source.html | 2 +- .../doc/html/AutoContactTurn_8h_source.html | 2 +- .../doc/html/AutoContactVTee_8h_source.html | 2 +- katabatic/doc/html/AutoContact_8h_source.html | 32 +-- .../doc/html/AutoHorizontal_8h_source.html | 2 +- katabatic/doc/html/AutoSegment_8h_source.html | 2 +- .../doc/html/AutoSegments_8h_source.html | 2 +- .../doc/html/AutoVertical_8h_source.html | 2 +- katabatic/doc/html/ChipTools_8h_source.html | 2 +- katabatic/doc/html/Constants_8h_source.html | 2 +- katabatic/doc/html/GCellGrid_8h_source.html | 2 +- katabatic/doc/html/GCell_8h_source.html | 2 +- katabatic/doc/html/GCells_8h_source.html | 2 +- katabatic/doc/html/Grid_8h_source.html | 2 +- .../doc/html/KatabaticEngine_8h_source.html | 2 +- katabatic/doc/html/Observer_8h_source.html | 2 +- katabatic/doc/html/Session_8h_source.html | 2 +- katabatic/doc/html/annotated.html | 2 +- ...classKatabatic_1_1AutoContact-members.html | 2 +- .../html/classKatabatic_1_1AutoContact.html | 32 +-- ...sKatabatic_1_1AutoContactHTee-members.html | 2 +- .../classKatabatic_1_1AutoContactHTee.html | 4 +- ...abatic_1_1AutoContactTerminal-members.html | 2 +- ...classKatabatic_1_1AutoContactTerminal.html | 4 +- ...sKatabatic_1_1AutoContactTurn-members.html | 2 +- .../classKatabatic_1_1AutoContactTurn.html | 4 +- ...sKatabatic_1_1AutoContactVTee-members.html | 2 +- .../classKatabatic_1_1AutoContactVTee.html | 4 +- ...ssKatabatic_1_1AutoHorizontal-members.html | 2 +- .../classKatabatic_1_1AutoHorizontal.html | 2 +- ...classKatabatic_1_1AutoSegment-members.html | 2 +- .../html/classKatabatic_1_1AutoSegment.html | 2 +- ...tic_1_1AutoSegments__Aligneds-members.html | 2 +- ...ssKatabatic_1_1AutoSegments__Aligneds.html | 2 +- ..._1AutoSegments__AnchorOnGCell-members.html | 2 +- ...abatic_1_1AutoSegments__AnchorOnGCell.html | 2 +- ..._1_1AutoSegments__InDirection-members.html | 2 +- ...atabatic_1_1AutoSegments__InDirection.html | 2 +- ..._1AutoSegments__IsAccountable-members.html | 2 +- ...abatic_1_1AutoSegments__IsAccountable.html | 2 +- ...ic_1_1AutoSegments__OnContact-members.html | 2 +- ...sKatabatic_1_1AutoSegments__OnContact.html | 2 +- ...1AutoSegments__Perpandiculars-members.html | 2 +- ...batic_1_1AutoSegments__Perpandiculars.html | 2 +- ...lassKatabatic_1_1AutoVertical-members.html | 2 +- .../html/classKatabatic_1_1AutoVertical.html | 2 +- .../classKatabatic_1_1BaseGrid-members.html | 2 +- .../doc/html/classKatabatic_1_1BaseGrid.html | 2 +- ...Katabatic_1_1BaseGrid_1_1Axis-members.html | 2 +- .../classKatabatic_1_1BaseGrid_1_1Axis.html | 2 +- ...lassKatabatic_1_1BaseObserver-members.html | 2 +- .../html/classKatabatic_1_1BaseObserver.html | 2 +- .../classKatabatic_1_1ChipTools-members.html | 2 +- .../doc/html/classKatabatic_1_1ChipTools.html | 4 +- .../html/classKatabatic_1_1GCell-members.html | 2 +- .../doc/html/classKatabatic_1_1GCell.html | 2 +- ...sKatabatic_1_1GCellDensitySet-members.html | 2 +- .../classKatabatic_1_1GCellDensitySet.html | 2 +- .../classKatabatic_1_1GCellGrid-members.html | 2 +- .../doc/html/classKatabatic_1_1GCellGrid.html | 2 +- ..._1_1GCell_1_1CompareByDensity-members.html | 2 +- ...atabatic_1_1GCell_1_1CompareByDensity.html | 2 +- ...ic_1_1GCell_1_1CompareByIndex-members.html | 2 +- ...sKatabatic_1_1GCell_1_1CompareByIndex.html | 2 +- ...lassKatabatic_1_1GCell_1_1Key-members.html | 2 +- .../html/classKatabatic_1_1GCell_1_1Key.html | 2 +- .../html/classKatabatic_1_1Grid-members.html | 2 +- .../doc/html/classKatabatic_1_1Grid.html | 2 +- ...sKatabatic_1_1KatabaticEngine-members.html | 2 +- .../classKatabatic_1_1KatabaticEngine.html | 2 +- ...assKatabatic_1_1LocatorHelper-members.html | 2 +- .../html/classKatabatic_1_1LocatorHelper.html | 2 +- .../classKatabatic_1_1Observable-members.html | 2 +- .../html/classKatabatic_1_1Observable.html | 2 +- .../classKatabatic_1_1Observer-members.html | 2 +- .../doc/html/classKatabatic_1_1Observer.html | 2 +- .../classKatabatic_1_1Session-members.html | 2 +- .../doc/html/classKatabatic_1_1Session.html | 2 +- ...yNet_8cpp_03_1_1GCellTopology-members.html | 2 +- ...2LoadGrByNet_8cpp_03_1_1GCellTopology.html | 2 +- katabatic/doc/html/classes.html | 2 +- .../dir_46a5d811a0c60e95b7acaa92d73c003a.html | 2 +- .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 2 +- katabatic/doc/html/files.html | 2 +- katabatic/doc/html/functions.html | 2 +- katabatic/doc/html/functions_0x7e.html | 2 +- katabatic/doc/html/functions_a.html | 2 +- katabatic/doc/html/functions_b.html | 2 +- katabatic/doc/html/functions_c.html | 2 +- katabatic/doc/html/functions_d.html | 2 +- katabatic/doc/html/functions_e.html | 2 +- katabatic/doc/html/functions_enum.html | 2 +- katabatic/doc/html/functions_eval.html | 2 +- katabatic/doc/html/functions_f.html | 2 +- katabatic/doc/html/functions_func.html | 2 +- katabatic/doc/html/functions_func_0x7e.html | 2 +- katabatic/doc/html/functions_func_a.html | 2 +- katabatic/doc/html/functions_func_b.html | 2 +- katabatic/doc/html/functions_func_c.html | 2 +- katabatic/doc/html/functions_func_d.html | 2 +- katabatic/doc/html/functions_func_e.html | 2 +- katabatic/doc/html/functions_func_f.html | 2 +- katabatic/doc/html/functions_func_g.html | 2 +- katabatic/doc/html/functions_func_h.html | 2 +- katabatic/doc/html/functions_func_i.html | 2 +- katabatic/doc/html/functions_func_k.html | 2 +- katabatic/doc/html/functions_func_l.html | 2 +- katabatic/doc/html/functions_func_m.html | 2 +- katabatic/doc/html/functions_func_n.html | 2 +- katabatic/doc/html/functions_func_o.html | 2 +- katabatic/doc/html/functions_func_p.html | 2 +- katabatic/doc/html/functions_func_r.html | 2 +- katabatic/doc/html/functions_func_s.html | 2 +- katabatic/doc/html/functions_func_t.html | 2 +- katabatic/doc/html/functions_func_u.html | 2 +- katabatic/doc/html/functions_func_x.html | 2 +- katabatic/doc/html/functions_g.html | 2 +- katabatic/doc/html/functions_h.html | 2 +- katabatic/doc/html/functions_i.html | 2 +- katabatic/doc/html/functions_k.html | 2 +- katabatic/doc/html/functions_l.html | 2 +- katabatic/doc/html/functions_m.html | 2 +- katabatic/doc/html/functions_n.html | 2 +- katabatic/doc/html/functions_o.html | 2 +- katabatic/doc/html/functions_p.html | 2 +- katabatic/doc/html/functions_r.html | 2 +- katabatic/doc/html/functions_s.html | 2 +- katabatic/doc/html/functions_t.html | 2 +- katabatic/doc/html/functions_type.html | 2 +- katabatic/doc/html/functions_u.html | 2 +- katabatic/doc/html/functions_x.html | 2 +- katabatic/doc/html/graph_legend.html | 2 +- .../doc/html/group__LoadGlobalRouting.html | 4 +- .../doc/html/group__grpSynthHierarchy.html | 2 +- katabatic/doc/html/hierarchy.html | 2 +- katabatic/doc/html/index.html | 2 +- katabatic/doc/html/modules.html | 2 +- katabatic/doc/html/namespaceKatabatic.html | 2 +- ...mous__namespace_02AutoSegment_8cpp_03.html | 2 +- ...nymous__namespace_02ChipTools_8cpp_03.html | 2 +- ...eanonymous__namespace_02GCell_8cpp_03.html | 2 +- ...__namespace_02KatabaticEngine_8cpp_03.html | 2 +- ...mous__namespace_02LoadGrByNet_8cpp_03.html | 2 +- ...nonymous__namespace_02Session_8cpp_03.html | 2 +- katabatic/doc/html/namespacemembers.html | 2 +- katabatic/doc/html/namespacemembers_enum.html | 2 +- katabatic/doc/html/namespacemembers_eval.html | 2 +- katabatic/doc/html/namespacemembers_func.html | 2 +- katabatic/doc/html/namespacemembers_type.html | 2 +- katabatic/doc/html/namespaces.html | 2 +- katabatic/doc/latex/refman.tex | 2 +- katabatic/doc/man/man3/Katabatic.3 | 2 +- .../doc/man/man3/Katabatic_AutoContact.3 | 2 +- .../doc/man/man3/Katabatic_AutoContactHTee.3 | 2 +- .../man/man3/Katabatic_AutoContactTerminal.3 | 2 +- .../doc/man/man3/Katabatic_AutoContactTurn.3 | 2 +- .../doc/man/man3/Katabatic_AutoContactVTee.3 | 2 +- .../doc/man/man3/Katabatic_AutoHorizontal.3 | 2 +- .../doc/man/man3/Katabatic_AutoSegment.3 | 2 +- .../man3/Katabatic_AutoSegments_Aligneds.3 | 2 +- .../Katabatic_AutoSegments_AnchorOnGCell.3 | 2 +- .../man3/Katabatic_AutoSegments_InDirection.3 | 2 +- .../Katabatic_AutoSegments_IsAccountable.3 | 2 +- .../man3/Katabatic_AutoSegments_OnContact.3 | 2 +- .../Katabatic_AutoSegments_Perpandiculars.3 | 2 +- .../doc/man/man3/Katabatic_AutoVertical.3 | 2 +- katabatic/doc/man/man3/Katabatic_BaseGrid.3 | 2 +- .../doc/man/man3/Katabatic_BaseGrid_Axis.3 | 2 +- .../doc/man/man3/Katabatic_BaseObserver.3 | 2 +- katabatic/doc/man/man3/Katabatic_ChipTools.3 | 2 +- katabatic/doc/man/man3/Katabatic_GCell.3 | 2 +- .../doc/man/man3/Katabatic_GCellDensitySet.3 | 2 +- katabatic/doc/man/man3/Katabatic_GCellGrid.3 | 2 +- .../man3/Katabatic_GCell_CompareByDensity.3 | 2 +- .../man/man3/Katabatic_GCell_CompareByIndex.3 | 2 +- katabatic/doc/man/man3/Katabatic_GCell_Key.3 | 2 +- katabatic/doc/man/man3/Katabatic_Grid.3 | 2 +- .../doc/man/man3/Katabatic_KatabaticEngine.3 | 2 +- .../doc/man/man3/Katabatic_LocatorHelper.3 | 2 +- katabatic/doc/man/man3/Katabatic_Observable.3 | 2 +- katabatic/doc/man/man3/Katabatic_Observer.3 | 2 +- katabatic/doc/man/man3/Katabatic_Session.3 | 2 +- katabatic/doc/man/man3/LoadGlobalRouting.3 | 2 +- .../anonymous_namespace{AutoSegment.cpp}.3 | 2 +- .../man3/anonymous_namespace{ChipTools.cpp}.3 | 2 +- .../man/man3/anonymous_namespace{GCell.cpp}.3 | 2 +- ...anonymous_namespace{KatabaticEngine.cpp}.3 | 2 +- .../anonymous_namespace{LoadGrByNet.cpp}.3 | 2 +- ...namespace{LoadGrByNet.cpp}_GCellTopology.3 | 2 +- .../man3/anonymous_namespace{Session.cpp}.3 | 2 +- katabatic/doc/man/man3/grpSynthHierarchy.3 | 2 +- katabatic/doc/rtf/refman.rtf | 4 +- kite/doc/html/Constants_8h_source.html | 2 +- kite/doc/html/DataNegociate_8h_source.html | 2 +- kite/doc/html/HorizontalTrack_8h_source.html | 2 +- kite/doc/html/KiteEngine_8h_source.html | 2 +- kite/doc/html/Manipulator_8h_source.html | 2 +- kite/doc/html/NegociateWindow_8h_source.html | 2 +- .../html/RoutingEventHistory_8h_source.html | 2 +- kite/doc/html/RoutingEventLoop_8h_source.html | 2 +- .../doc/html/RoutingEventQueue_8h_source.html | 2 +- kite/doc/html/RoutingEvent_8h_source.html | 2 +- kite/doc/html/RoutingPlane_8h_source.html | 2 +- kite/doc/html/SegmentFsm_8h_source.html | 2 +- kite/doc/html/Session_8h_source.html | 2 +- kite/doc/html/TrackElement_8h_source.html | 2 +- .../doc/html/TrackFixedSegment_8h_source.html | 2 +- kite/doc/html/TrackMarker_8h_source.html | 2 +- kite/doc/html/TrackSegment_8h_source.html | 2 +- kite/doc/html/Track_8h_source.html | 2 +- kite/doc/html/VerticalTrack_8h_source.html | 2 +- kite/doc/html/annotated.html | 2 +- .../classKite_1_1DataNegociate-members.html | 2 +- kite/doc/html/classKite_1_1DataNegociate.html | 2 +- .../classKite_1_1HorizontalTrack-members.html | 2 +- .../html/classKite_1_1HorizontalTrack.html | 2 +- .../html/classKite_1_1KiteEngine-members.html | 2 +- kite/doc/html/classKite_1_1KiteEngine.html | 2 +- .../classKite_1_1Manipulator-members.html | 2 +- kite/doc/html/classKite_1_1Manipulator.html | 2 +- .../classKite_1_1NegociateWindow-members.html | 2 +- .../html/classKite_1_1NegociateWindow.html | 2 +- .../classKite_1_1RoutingEvent-members.html | 2 +- kite/doc/html/classKite_1_1RoutingEvent.html | 2 +- ...ssKite_1_1RoutingEventHistory-members.html | 2 +- .../classKite_1_1RoutingEventHistory.html | 2 +- ...classKite_1_1RoutingEventLoop-members.html | 2 +- .../html/classKite_1_1RoutingEventLoop.html | 2 +- ...lassKite_1_1RoutingEventQueue-members.html | 2 +- .../html/classKite_1_1RoutingEventQueue.html | 2 +- ...ssKite_1_1RoutingEvent_1_1Key-members.html | 2 +- .../classKite_1_1RoutingEvent_1_1Key.html | 2 +- .../classKite_1_1RoutingPlane-members.html | 2 +- kite/doc/html/classKite_1_1RoutingPlane.html | 2 +- .../classKite_1_1SegmentAction-members.html | 2 +- kite/doc/html/classKite_1_1SegmentAction.html | 2 +- .../html/classKite_1_1SegmentFsm-members.html | 2 +- kite/doc/html/classKite_1_1SegmentFsm.html | 2 +- .../classKite_1_1SegmentObserver-members.html | 2 +- .../html/classKite_1_1SegmentObserver.html | 2 +- .../html/classKite_1_1Session-members.html | 2 +- kite/doc/html/classKite_1_1Session.html | 2 +- kite/doc/html/classKite_1_1Track-members.html | 2 +- kite/doc/html/classKite_1_1Track.html | 2 +- .../classKite_1_1TrackElement-members.html | 2 +- kite/doc/html/classKite_1_1TrackElement.html | 2 +- ...lassKite_1_1TrackFixedSegment-members.html | 2 +- .../html/classKite_1_1TrackFixedSegment.html | 2 +- .../classKite_1_1TrackMarker-members.html | 2 +- kite/doc/html/classKite_1_1TrackMarker.html | 2 +- .../classKite_1_1TrackSegment-members.html | 2 +- kite/doc/html/classKite_1_1TrackSegment.html | 2 +- .../classKite_1_1VerticalTrack-members.html | 2 +- kite/doc/html/classKite_1_1VerticalTrack.html | 2 +- kite/doc/html/classes.html | 2 +- .../dir_2916ee297f5e79ec495d393dfe8ba769.html | 2 +- .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 2 +- kite/doc/html/files.html | 2 +- kite/doc/html/functions.html | 2 +- kite/doc/html/functions_0x7e.html | 2 +- kite/doc/html/functions_a.html | 2 +- kite/doc/html/functions_b.html | 2 +- kite/doc/html/functions_c.html | 2 +- kite/doc/html/functions_d.html | 2 +- kite/doc/html/functions_e.html | 2 +- kite/doc/html/functions_enum.html | 2 +- kite/doc/html/functions_eval.html | 2 +- kite/doc/html/functions_f.html | 2 +- kite/doc/html/functions_func.html | 2 +- kite/doc/html/functions_func_0x7e.html | 2 +- kite/doc/html/functions_func_a.html | 2 +- kite/doc/html/functions_func_b.html | 2 +- kite/doc/html/functions_func_c.html | 2 +- kite/doc/html/functions_func_d.html | 2 +- kite/doc/html/functions_func_e.html | 2 +- kite/doc/html/functions_func_f.html | 2 +- kite/doc/html/functions_func_g.html | 2 +- kite/doc/html/functions_func_h.html | 2 +- kite/doc/html/functions_func_i.html | 2 +- kite/doc/html/functions_func_l.html | 2 +- kite/doc/html/functions_func_m.html | 2 +- kite/doc/html/functions_func_n.html | 2 +- kite/doc/html/functions_func_o.html | 2 +- kite/doc/html/functions_func_p.html | 2 +- kite/doc/html/functions_func_r.html | 2 +- kite/doc/html/functions_func_s.html | 2 +- kite/doc/html/functions_func_u.html | 2 +- kite/doc/html/functions_g.html | 2 +- kite/doc/html/functions_h.html | 2 +- kite/doc/html/functions_i.html | 2 +- kite/doc/html/functions_l.html | 2 +- kite/doc/html/functions_m.html | 2 +- kite/doc/html/functions_n.html | 2 +- kite/doc/html/functions_o.html | 2 +- kite/doc/html/functions_p.html | 2 +- kite/doc/html/functions_r.html | 2 +- kite/doc/html/functions_s.html | 2 +- kite/doc/html/functions_t.html | 2 +- kite/doc/html/functions_u.html | 2 +- kite/doc/html/functions_vars.html | 2 +- kite/doc/html/graph_legend.html | 2 +- kite/doc/html/group__AlgorithmOverview.html | 2 +- kite/doc/html/group__grpSynthHierarchy.html | 2 +- kite/doc/html/hierarchy.html | 2 +- kite/doc/html/index.html | 2 +- kite/doc/html/modules.html | 2 +- kite/doc/html/namespaceKite.html | 2 +- ...mous__namespace_02AutoSegment_8cpp_03.html | 2 +- ...nymous__namespace_02ChipTools_8cpp_03.html | 2 +- ...eanonymous__namespace_02GCell_8cpp_03.html | 2 +- ...__namespace_02KatabaticEngine_8cpp_03.html | 2 +- ...mous__namespace_02LoadGrByNet_8cpp_03.html | 2 +- ...mous__namespace_02Manipulator_8cpp_03.html | 2 +- ...__namespace_02NegociateWindow_8cpp_03.html | 2 +- ...ous__namespace_02RoutingPlane_8cpp_03.html | 2 +- ...ymous__namespace_02SegmentFsm_8cpp_03.html | 2 +- ...nonymous__namespace_02Session_8cpp_03.html | 2 +- ...ous__namespace_02TrackElement_8cpp_03.html | 2 +- ...eanonymous__namespace_02Track_8cpp_03.html | 2 +- kite/doc/html/namespacemembers.html | 2 +- kite/doc/html/namespacemembers_enum.html | 2 +- kite/doc/html/namespacemembers_eval.html | 2 +- kite/doc/html/namespacemembers_type.html | 2 +- kite/doc/html/namespaces.html | 2 +- kite/doc/html/pageNotes.html | 2 +- kite/doc/html/pages.html | 2 +- kite/doc/latex/refman.tex | 2 +- kite/doc/man/man3/AlgorithmOverview.3 | 2 +- kite/doc/man/man3/Kite.3 | 2 +- kite/doc/man/man3/Kite_DataNegociate.3 | 2 +- kite/doc/man/man3/Kite_HorizontalTrack.3 | 2 +- kite/doc/man/man3/Kite_KiteEngine.3 | 2 +- kite/doc/man/man3/Kite_Manipulator.3 | 2 +- kite/doc/man/man3/Kite_NegociateWindow.3 | 2 +- kite/doc/man/man3/Kite_RoutingEvent.3 | 2 +- kite/doc/man/man3/Kite_RoutingEventHistory.3 | 2 +- kite/doc/man/man3/Kite_RoutingEventLoop.3 | 2 +- kite/doc/man/man3/Kite_RoutingEventQueue.3 | 2 +- kite/doc/man/man3/Kite_RoutingEvent_Key.3 | 2 +- kite/doc/man/man3/Kite_RoutingPlane.3 | 2 +- kite/doc/man/man3/Kite_SegmentAction.3 | 2 +- kite/doc/man/man3/Kite_SegmentFsm.3 | 2 +- kite/doc/man/man3/Kite_SegmentObserver.3 | 2 +- kite/doc/man/man3/Kite_Session.3 | 2 +- kite/doc/man/man3/Kite_Track.3 | 2 +- kite/doc/man/man3/Kite_TrackElement.3 | 2 +- kite/doc/man/man3/Kite_TrackFixedSegment.3 | 2 +- kite/doc/man/man3/Kite_TrackMarker.3 | 2 +- kite/doc/man/man3/Kite_TrackSegment.3 | 2 +- kite/doc/man/man3/Kite_VerticalTrack.3 | 2 +- .../anonymous_namespace{AutoSegment.cpp}.3 | 2 +- .../man3/anonymous_namespace{ChipTools.cpp}.3 | 2 +- .../man/man3/anonymous_namespace{GCell.cpp}.3 | 2 +- ...anonymous_namespace{KatabaticEngine.cpp}.3 | 2 +- .../anonymous_namespace{LoadGrByNet.cpp}.3 | 2 +- .../anonymous_namespace{Manipulator.cpp}.3 | 2 +- ...anonymous_namespace{NegociateWindow.cpp}.3 | 2 +- .../anonymous_namespace{RoutingPlane.cpp}.3 | 2 +- .../anonymous_namespace{SegmentFsm.cpp}.3 | 2 +- .../man3/anonymous_namespace{Session.cpp}.3 | 2 +- .../man/man3/anonymous_namespace{Track.cpp}.3 | 2 +- .../anonymous_namespace{TrackElement.cpp}.3 | 2 +- kite/doc/man/man3/grpSynthHierarchy.3 | 2 +- kite/doc/man/man3/pageNotes.3 | 2 +- kite/doc/rtf/refman.rtf | 4 +- oroshi/doc/html/annotated.html | 2 +- oroshi/doc/html/classes.html | 2 +- ...citormatrix_1_1CapacitorStack-members.html | 2 +- ..._1_1capacitormatrix_1_1CapacitorStack.html | 2 +- ...outed_1_1RoutMatchedCapacitor-members.html | 2 +- ...pacitorrouted_1_1RoutMatchedCapacitor.html | 2 +- ...apacitorunit_1_1CapacitorUnit-members.html | 2 +- ...hon_1_1capacitorunit_1_1CapacitorUnit.html | 2 +- ...acks_1_1VerticalRoutingTracks-members.html | 2 +- ...itorvrtracks_1_1VerticalRoutingTracks.html | 2 +- ...classpython_1_1stack_1_1Stack-members.html | 2 +- .../html/classpython_1_1stack_1_1Stack.html | 2 +- .../dir_7837fde3ab9c1fb2fc5be7b717af8d79.html | 2 +- oroshi/doc/html/functions.html | 2 +- oroshi/doc/html/functions_func.html | 2 +- oroshi/doc/html/graph_legend.html | 2 +- oroshi/doc/html/hierarchy.html | 2 +- oroshi/doc/html/index.html | 2 +- oroshi/doc/latex/refman.tex | 2 +- .../python_capacitormatrix_CapacitorStack.3 | 2 +- ...hon_capacitorrouted_RoutMatchedCapacitor.3 | 2 +- .../man3/python_capacitorunit_CapacitorUnit.3 | 2 +- ..._capacitorvrtracks_VerticalRoutingTracks.3 | 2 +- oroshi/doc/man/man3/python_stack_Stack.3 | 2 +- oroshi/doc/rtf/refman.rtf | 4 +- .../unicorn/html/UnicornGui_8h_source.html | 2 +- unicorn/doc/unicorn/html/annotated.html | 2 +- .../classUnicorn_1_1UnicornGui-members.html | 2 +- .../html/classUnicorn_1_1UnicornGui.html | 2 +- unicorn/doc/unicorn/html/classes.html | 2 +- .../dir_4aa09a10ca668c28f3c8e57fb374580b.html | 2 +- .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 2 +- unicorn/doc/unicorn/html/files.html | 2 +- unicorn/doc/unicorn/html/functions.html | 2 +- unicorn/doc/unicorn/html/functions_func.html | 2 +- unicorn/doc/unicorn/html/hierarchy.html | 2 +- unicorn/doc/unicorn/html/index.html | 2 +- .../doc/unicorn/html/namespaceUnicorn.html | 2 +- unicorn/doc/unicorn/html/namespaces.html | 2 +- unicorn/doc/unicorn/html/pages.html | 2 +- unicorn/doc/unicorn/latex/refman.tex | 2 +- 865 files changed, 1606 insertions(+), 1600 deletions(-) diff --git a/crlcore/doc/crlcore/html/AcmSigda_8h_source.html b/crlcore/doc/crlcore/html/AcmSigda_8h_source.html index 97b1056c..e6efbf9f 100644 --- a/crlcore/doc/crlcore/html/AcmSigda_8h_source.html +++ b/crlcore/doc/crlcore/html/AcmSigda_8h_source.html @@ -54,7 +54,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/AllianceFramework_8h_source.html b/crlcore/doc/crlcore/html/AllianceFramework_8h_source.html index 9e12dc08..3db51c68 100644 --- a/crlcore/doc/crlcore/html/AllianceFramework_8h_source.html +++ b/crlcore/doc/crlcore/html/AllianceFramework_8h_source.html @@ -77,7 +77,7 @@ $(function() {
Catalog * getCatalog()
Definition: AllianceFramework.h:176
Definition: AllianceFramework.h:49
RoutingGauge * getRoutingGauge(const Name &name="")
-
A Registry to store Alliance Cell metadatas.
Definition: Catalog.h:56
+
A Registry to store Alliance Cell metadatas.
Definition: Catalog.h:54
AllianceLibrary * getAllianceLibrary(unsigned int index)
Definition: AllianceFramework.h:53
Holds all the Alliance environment variables.
Definition: Environment.h:33
@@ -92,7 +92,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/AllianceLibrary_8h_source.html b/crlcore/doc/crlcore/html/AllianceLibrary_8h_source.html index 814eb1b3..00fa5721 100644 --- a/crlcore/doc/crlcore/html/AllianceLibrary_8h_source.html +++ b/crlcore/doc/crlcore/html/AllianceLibrary_8h_source.html @@ -59,7 +59,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/Banner_8h_source.html b/crlcore/doc/crlcore/html/Banner_8h_source.html index 40487b5c..87df2349 100644 --- a/crlcore/doc/crlcore/html/Banner_8h_source.html +++ b/crlcore/doc/crlcore/html/Banner_8h_source.html @@ -66,7 +66,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/Catalog_8h_source.html b/crlcore/doc/crlcore/html/Catalog_8h_source.html index 90a7547b..bee2619d 100644 --- a/crlcore/doc/crlcore/html/Catalog_8h_source.html +++ b/crlcore/doc/crlcore/html/Catalog_8h_source.html @@ -44,81 +44,81 @@ $(function() {
Catalog.h
-
1 // -*- C++ -*-
2 //
3 // This file is part of the Coriolis Software.
4 // Copyright (c) UPMC 2008-2018, All Rights Reserved
5 //
6 // +-----------------------------------------------------------------+
7 // | C O R I O L I S |
8 // | Alliance / Hurricane Interface |
9 // | |
10 // | Author : Jean-Paul CHAPUT |
11 // | E-mail : Jean-Paul.Chaput@lip6.fr |
12 // | =============================================================== |
13 // | C++ Header : "./crlcore/Catalog.h" |
14 // +-----------------------------------------------------------------+
15 
16 
17 #ifndef CRL_CATALOG_H
18 #define CRL_CATALOG_H
19 
20 #include <string>
21 #include <map>
22 #include "hurricane/Name.h"
23 #include "hurricane/Property.h"
24 #include "hurricane/Slot.h"
25 
26 namespace Hurricane {
27  class Cell;
28  class Library;
29 }
30 
31 
32 namespace CRL {
33 
34 
35  using std::string;
36  using std::map;
39  using Hurricane::_TName;
40  using Hurricane::Name;
41  using Hurricane::Record;
43  using Hurricane::DBo;
44  using Hurricane::Cell;
45  using Hurricane::Library;
46  using Hurricane::Property;
47 
48 
49  extern const char* MissingStateProperty;
50 
51 
52 // -------------------------------------------------------------------
53 // Class : "CRL::Catalog".
54 
55 
56  class Catalog {
57 
58  public:
59  class State;
60  public:
61  inline Catalog ();
62  ~Catalog ();
63  State* getState ( const Name& name, bool add=false );
64  void mergeState ( const Name& name, const State& other );
65  bool deleteState ( const Name& name );
66  void clear ();
67  bool loadFromFile ( const string& path, Library* library );
68  void saveToFile ( const string& path, Library* library );
69  inline map<Name,State*>* getStates ();
70  string _getPrint () const;
71  inline string _getTypeName () const;
72  string _getString () const;
73  Record* _getRecord () const;
74 
75  public:
76  // Sub-Class: State.
77  class State {
78  public:
79  // Flags Constants.
80  enum Flags { TerminalNetlist = 1 << 0
81  , Feed = 1 << 1
82  , Pad = 1 << 2
83  , GDS = 1 << 3
84  , Delete = 1 << 4
85  , Logical = 1 << 5
86  , Physical = 1 << 6
87  , InMemory = 1 << 7
88  , Foreign = 1 << 8
89  , VstUseConcat = 1 << 9
90  , VstNoLowerCase = 1 << 10
91  , VstNoLinkage = 1 << 11
93  };
94  // Constructors.
95  inline State ();
96  ~State ();
97  // Predicates.
98  inline bool isTerminalNetlist () const;
99  inline bool isFeed () const;
100  inline bool isPad () const;
101  inline bool isGds () const;
102  inline bool isDelete () const;
103  inline bool isPhysical () const;
104  inline bool isLogical () const;
105  inline bool isInMemory () const;
106  // Flags management.
107  inline unsigned int getFlags ( unsigned int mask=(unsigned int)-1 ) const;
108  inline bool setFlags ( unsigned int mask, bool value );
109  inline bool setTerminalNetlist ( bool value );
110  inline bool setFeed ( bool value );
111  inline bool setPad ( bool value );
112  inline bool setGds ( bool value );
113  inline bool setDelete ( bool value );
114  inline bool setPhysical ( bool value );
115  inline bool setLogical ( bool value );
116  inline bool setInMemory ( bool value );
117  // Accessors.
118  inline Cell* getCell () const;
119  inline Library* getLibrary () const;
120  inline unsigned int getDepth () const;
121  // Modifiers.
122  inline void merge ( const State& other );
123  Cell* setCell ( Cell* cell );
124  inline Library* setLibrary ( Library* library );
125  inline void setDepth ( unsigned int depth );
126  // Hurricane Management.
127  void toJson ( JsonWriter* w ) const;
128  inline string _getTypeName () const;
129  string _getString () const;
130  Record* _getRecord () const;
131 
132  private:
133  // Internal - Attributes.
134  unsigned int _flags;
135  unsigned int _depth;
136  Cell* _cell;
137  Library* _library;
138 
139  // Json Property.
140  public:
141  class JsonState : public JsonObject {
142  public:
143  static void initialize ();
144  JsonState ( unsigned long flags );
145  virtual string getTypeName () const;
146  virtual JsonState* clone ( unsigned long ) const;
147  virtual void toData ( JsonStack& );
148  };
149  };
150 
151  private:
152  // Attributes.
153  map<Name,State*> _states;
154 
155  private:
156  Catalog ( const Catalog& );
157  static bool readLine ( const string& s, string& name, State* state );
158 
159  };
160 
161 
162 // -------------------------------------------------------------------
163 // Class : "CRL::CatalogProperty".
164 
165  class CatalogProperty : public PrivateProperty {
166 
167  public:
168  static Name _name;
169  public:
170  static CatalogProperty* create ( Catalog::State* state );
171  static Name getPropertyName ();
172  virtual Name getName () const;
173  inline Catalog::State* getState () const;
174  inline void setState ( Catalog::State* state );
175  virtual void onReleasedBy ( DBo* owner );
176  virtual bool hasJson () const;
177  virtual void toJson ( JsonWriter* w, const DBo* ) const;
178  virtual string _getTypeName () const;
179  virtual string _getString () const;
180  virtual Record* _getRecord () const;
181 
182  protected:
183  // Attributes.
184  Catalog::State* _state;
185 
186  protected:
187  // Constructor.
188  inline CatalogProperty ( Catalog::State* state );
189  };
190 
191 
192 // -------------------------------------------------------------------
193 // Class : "CRL::JsonCatalogProperty".
194 
195  class JsonCatalogProperty : public JsonObject {
196  public:
197  static void initialize ();
198  JsonCatalogProperty ( unsigned long );
199  virtual string getTypeName () const;
200  virtual JsonCatalogProperty* clone ( unsigned long ) const;
201  virtual void toData ( JsonStack& );
202  };
203 
204 
205 // -------------------------------------------------------------------
206 // Inline Functions.
207 
208  inline Catalog::State::State () : _flags(0), _depth(1), _cell(NULL), _library(NULL) { }
209  inline bool Catalog::State::isTerminalNetlist () const { return (_flags&TerminalNetlist)?1:0; }
210  inline bool Catalog::State::isFeed () const { return (_flags&Feed )?1:0; }
211  inline bool Catalog::State::isPad () const { return (_flags&Pad )?1:0; }
212  inline bool Catalog::State::isGds () const { return (_flags&GDS )?1:0; }
213  inline bool Catalog::State::isDelete () const { return (_flags&Delete )?1:0; }
214  inline bool Catalog::State::isPhysical () const { return (_flags&Physical )?1:0; }
215  inline bool Catalog::State::isLogical () const { return (_flags&Logical )?1:0; }
216  inline bool Catalog::State::isInMemory () const { return (_flags&InMemory )?1:0; }
217  inline unsigned int Catalog::State::getFlags ( unsigned int mask ) const { return ( _flags & mask ); }
218  inline bool Catalog::State::setFlags ( unsigned int mask, bool value ) {
219  if (value) { _flags |= mask; }
220  else { _flags &= ~mask; }
221  return ((_flags&mask) ? true : false);
222  }
223  inline bool Catalog::State::setTerminalNetlist ( bool value ) { return setFlags(TerminalNetlist,value); }
224  inline bool Catalog::State::setFeed ( bool value ) { return setFlags(Feed ,value); }
225  inline bool Catalog::State::setPad ( bool value ) { return setFlags(Pad ,value); }
226  inline bool Catalog::State::setGds ( bool value ) { return setFlags(GDS ,value); }
227  inline bool Catalog::State::setDelete ( bool value ) { return setFlags(Delete ,value); }
228  inline bool Catalog::State::setPhysical ( bool value ) { return setFlags(Physical ,value); }
229  inline bool Catalog::State::setLogical ( bool value ) { return setFlags(Logical ,value); }
230  inline bool Catalog::State::setInMemory ( bool value ) { return setFlags(InMemory ,value); }
231  inline Library* Catalog::State::setLibrary ( Library* library ) { return _library = library; }
232  inline void Catalog::State::setDepth ( unsigned int depth ) { _depth = depth; }
233  inline Cell* Catalog::State::getCell () const { return _cell; }
234  inline Library* Catalog::State::getLibrary () const { return _library; }
235  inline unsigned int Catalog::State::getDepth () const { return _depth; }
236  inline string Catalog::State::_getTypeName () const { return _TName("Catalog::State"); }
237 
238  inline Catalog::Catalog () : _states() { }
239  inline map<Name,Catalog::State*>*
240  Catalog::getStates () { return &_states; }
241  inline string Catalog::_getTypeName () const { return _TName("Catalog"); }
242 
243  inline CatalogProperty::CatalogProperty ( Catalog::State* state ) : PrivateProperty(), _state(state) {}
244  inline Catalog::State* CatalogProperty::getState () const { return _state; }
245  inline void CatalogProperty::setState ( Catalog::State* state ) { _state = state; }
246 
247 
248 // -------------------------------------------------------------------
249 // Class : "CRL::CatalogExtension".
250 
251 
253  public:
254  static Catalog::State* get ( const Cell* );
255  public:
256  static inline bool isTerminalNetlist ( const Cell* );
257  static inline bool isFeed ( const Cell* );
258  static inline bool isPad ( const Cell* );
259  static inline bool isGds ( const Cell* );
260  static inline bool isDelete ( const Cell* );
261  static inline bool isPhysical ( const Cell* );
262  static inline bool isLogical ( const Cell* );
263  // Flags management.
264  static inline unsigned int getFlags ( const Cell*, unsigned int mask=(unsigned int)-1 );
265  static inline bool setFlags ( const Cell*, unsigned int mask, bool value );
266  static inline bool setTerminalNetlist ( const Cell*, bool value );
267  static inline bool setFeed ( const Cell*, bool value );
268  static inline bool setPad ( const Cell*, bool value );
269  static inline bool setGds ( const Cell*, bool value );
270  static inline bool setDelete ( const Cell*, bool value );
271  static inline bool setPhysical ( const Cell*, bool value );
272  static inline bool setLogical ( const Cell*, bool value );
273  // Accessors.
274  static inline Library* getLibrary ( const Cell* );
275  static inline unsigned int getDepth ( const Cell* );
276  // Modifiers.
277  static inline Library* setLibrary ( const Cell*, Library* library );
278  static inline void setDepth ( const Cell*, unsigned int depth );
279  private:
280  static const Cell* _owner;
281  static Catalog::State* _cache;
282  };
283 
284 
285  inline bool CatalogExtension::isTerminalNetlist ( const Cell* cell )
286  {
287  Catalog::State* state = get(cell);
288  return (state == NULL) ? false : state->isTerminalNetlist();
289  }
290 
291 
292  inline bool CatalogExtension::isFeed ( const Cell* cell )
293  {
294  Catalog::State* state = get(cell);
295  return (state == NULL) ? false : state->isFeed();
296  }
297 
298 
299  inline bool CatalogExtension::isGds ( const Cell* cell )
300  {
301  Catalog::State* state = get(cell);
302  return (state == NULL) ? false : state->isGds();
303  }
304 
305 
306  inline bool CatalogExtension::isPad ( const Cell* cell )
307  {
308  Catalog::State* state = get(cell);
309  return (state == NULL) ? false : state->isPad();
310  }
311 
312 
313  inline bool CatalogExtension::isDelete ( const Cell* cell )
314  {
315  Catalog::State* state = get(cell);
316  return (state == NULL) ? false : state->isDelete();
317  }
318 
319 
320  inline bool CatalogExtension::isPhysical ( const Cell* cell )
321  {
322  Catalog::State* state = get(cell);
323  return (state == NULL) ? false : state->isPhysical();
324  }
325 
326 
327  inline bool CatalogExtension::isLogical ( const Cell* cell )
328  {
329  Catalog::State* state = get(cell);
330  return (state == NULL) ? false : state->isLogical();
331  }
332 
333 
334  inline unsigned int CatalogExtension::getFlags ( const Cell* cell, unsigned int mask )
335  {
336  Catalog::State* state = get(cell);
337  return (state == NULL) ? 0 : state->getFlags();
338  }
339 
340 
341  inline bool CatalogExtension::setFlags ( const Cell* cell, unsigned int mask, bool value )
342  {
343  Catalog::State* state = get(cell);
344  return (state == NULL) ? false : state->setFlags(mask,value);
345  }
346 
347 
348  inline bool CatalogExtension::setTerminalNetlist ( const Cell* cell, bool value )
349  {
350  Catalog::State* state = get(cell);
351  return (state == NULL) ? false : state->setTerminalNetlist(value);
352  }
353 
354 
355  inline bool CatalogExtension::setFeed ( const Cell* cell, bool value )
356  {
357  Catalog::State* state = get(cell);
358  return (state == NULL) ? false : state->setFeed(value);
359  }
360 
361 
362  inline bool CatalogExtension::setPad ( const Cell* cell, bool value )
363  {
364  Catalog::State* state = get(cell);
365  return (state == NULL) ? false : state->setPad(value);
366  }
367 
368 
369  inline bool CatalogExtension::setGds ( const Cell* cell, bool value )
370  {
371  Catalog::State* state = get(cell);
372  return (state == NULL) ? false : state->setGds(value);
373  }
374 
375 
376  inline bool CatalogExtension::setDelete ( const Cell* cell, bool value )
377  {
378  Catalog::State* state = get(cell);
379  return (state == NULL) ? false : state->setDelete(value);
380  }
381 
382 
383  inline bool CatalogExtension::setPhysical ( const Cell* cell, bool value )
384  {
385  Catalog::State* state = get(cell);
386  return (state == NULL) ? false : state->setPhysical(value);
387  }
388 
389 
390  inline bool CatalogExtension::setLogical ( const Cell* cell, bool value )
391  {
392  Catalog::State* state = get(cell);
393  return (state == NULL) ? false : state->setLogical(value);
394  }
395 
396 
397  inline Library* CatalogExtension::getLibrary ( const Cell* cell )
398  {
399  Catalog::State* state = get(cell);
400  return (state == NULL) ? NULL : state->getLibrary();
401  }
402 
403 
404  inline unsigned int CatalogExtension::getDepth ( const Cell* cell )
405  {
406  Catalog::State* state = get(cell);
407  return (state == NULL) ? 0 : state->getDepth();
408  }
409 
410 
411  inline Library* CatalogExtension::setLibrary ( const Cell* cell, Library* library )
412  {
413  Catalog::State* state = get(cell);
414  return (state == NULL) ? NULL : state->setLibrary(library);
415  }
416 
417 
418  inline void CatalogExtension::setDepth ( const Cell* cell, unsigned int depth )
419  {
420  Catalog::State* state = get(cell);
421  if ( state == NULL ) state->setDepth(depth);
422  }
423 
424 
425 } // End of CRL namespace.
426 
427 
428 
429 
430 // x-----------------------------------------------------------------x
431 // | Functions Overload for Hurricane Management |
432 // x-----------------------------------------------------------------x
433 
434 
435 inline std::string getPrint ( const CRL::Catalog &CATAL ) { return CATAL._getPrint(); }
436 
437 INSPECTOR_P_SUPPORT(CRL::Catalog);
438 INSPECTOR_P_SUPPORT(CRL::Catalog::State);
439 
440 
441 #endif // CRL_CATALOG_H
unsigned int getFlags(unsigned int mask=(unsigned int) -1) const
Definition: Catalog.h:217
+
1 // -*- C++ -*-
2 //
3 // This file is part of the Coriolis Software.
4 // Copyright (c) UPMC 2008-2018, All Rights Reserved
5 //
6 // +-----------------------------------------------------------------+
7 // | C O R I O L I S |
8 // | Alliance / Hurricane Interface |
9 // | |
10 // | Author : Jean-Paul CHAPUT |
11 // | E-mail : Jean-Paul.Chaput@lip6.fr |
12 // | =============================================================== |
13 // | C++ Header : "./crlcore/Catalog.h" |
14 // +-----------------------------------------------------------------+
15 
16 
17 #pragma once
18 #include <string>
19 #include <map>
20 #include "hurricane/Name.h"
21 #include "hurricane/Property.h"
22 #include "hurricane/Slot.h"
23 
24 namespace Hurricane {
25  class Cell;
26  class Library;
27 }
28 
29 
30 namespace CRL {
31 
32 
33  using std::string;
34  using std::map;
37  using Hurricane::_TName;
38  using Hurricane::Name;
39  using Hurricane::Record;
41  using Hurricane::DBo;
42  using Hurricane::Cell;
43  using Hurricane::Library;
44  using Hurricane::Property;
45 
46 
47  extern const char* MissingStateProperty;
48 
49 
50 // -------------------------------------------------------------------
51 // Class : "CRL::Catalog".
52 
53 
54  class Catalog {
55 
56  public:
57  class State;
58  public:
59  inline Catalog ();
60  ~Catalog ();
61  State* getState ( const Name& name, bool add=false );
62  void mergeState ( const Name& name, const State& other );
63  bool deleteState ( const Name& name );
64  void clear ();
65  bool loadFromFile ( const string& path, Library* library );
66  void saveToFile ( const string& path, Library* library );
67  inline map<Name,State*>* getStates ();
68  string _getPrint () const;
69  inline string _getTypeName () const;
70  string _getString () const;
71  Record* _getRecord () const;
72 
73  public:
74  // Sub-Class: State.
75  class State {
76  public:
77  // Flags Constants.
78  enum Flags { TerminalNetlist = 1 << 0
79  , Feed = 1 << 1
80  , Pad = 1 << 2
81  , GDS = 1 << 3
82  , Delete = 1 << 4
83  , Logical = 1 << 5
84  , Physical = 1 << 6
85  , InMemory = 1 << 7
86  , Foreign = 1 << 8
87  , VstUseConcat = 1 << 9
88  , VstNoLowerCase = 1 << 10
89  , VstUniquifyUpperCase = 1 << 11
90  , VstNoLinkage = 1 << 12
92  };
93  // Constructors.
94  inline State ();
95  ~State ();
96  // Predicates.
97  inline bool isTerminalNetlist () const;
98  inline bool isFeed () const;
99  inline bool isPad () const;
100  inline bool isGds () const;
101  inline bool isDelete () const;
102  inline bool isPhysical () const;
103  inline bool isLogical () const;
104  inline bool isInMemory () const;
105  // Flags management.
106  inline unsigned int getFlags ( unsigned int mask=(unsigned int)-1 ) const;
107  inline bool setFlags ( unsigned int mask, bool value );
108  inline bool setTerminalNetlist ( bool value );
109  inline bool setFeed ( bool value );
110  inline bool setPad ( bool value );
111  inline bool setGds ( bool value );
112  inline bool setDelete ( bool value );
113  inline bool setPhysical ( bool value );
114  inline bool setLogical ( bool value );
115  inline bool setInMemory ( bool value );
116  // Accessors.
117  inline Cell* getCell () const;
118  inline Library* getLibrary () const;
119  inline unsigned int getDepth () const;
120  // Modifiers.
121  inline void merge ( const State& other );
122  Cell* setCell ( Cell* cell );
123  inline Library* setLibrary ( Library* library );
124  inline void setDepth ( unsigned int depth );
125  // Hurricane Management.
126  void toJson ( JsonWriter* w ) const;
127  inline string _getTypeName () const;
128  string _getString () const;
129  Record* _getRecord () const;
130 
131  private:
132  // Internal - Attributes.
133  unsigned int _flags;
134  unsigned int _depth;
135  Cell* _cell;
136  Library* _library;
137 
138  // Json Property.
139  public:
140  class JsonState : public JsonObject {
141  public:
142  static void initialize ();
143  JsonState ( unsigned long flags );
144  virtual string getTypeName () const;
145  virtual JsonState* clone ( unsigned long ) const;
146  virtual void toData ( JsonStack& );
147  };
148  };
149 
150  private:
151  // Attributes.
152  map<Name,State*> _states;
153 
154  private:
155  Catalog ( const Catalog& );
156  static bool readLine ( const string& s, string& name, State* state );
157 
158  };
159 
160 
161 // -------------------------------------------------------------------
162 // Class : "CRL::CatalogProperty".
163 
164  class CatalogProperty : public PrivateProperty {
165 
166  public:
167  static Name _name;
168  public:
169  static CatalogProperty* create ( Catalog::State* state );
170  static Name getPropertyName ();
171  virtual Name getName () const;
172  inline Catalog::State* getState () const;
173  inline void setState ( Catalog::State* state );
174  virtual void onReleasedBy ( DBo* owner );
175  virtual bool hasJson () const;
176  virtual void toJson ( JsonWriter* w, const DBo* ) const;
177  virtual string _getTypeName () const;
178  virtual string _getString () const;
179  virtual Record* _getRecord () const;
180 
181  protected:
182  // Attributes.
183  Catalog::State* _state;
184 
185  protected:
186  // Constructor.
187  inline CatalogProperty ( Catalog::State* state );
188  };
189 
190 
191 // -------------------------------------------------------------------
192 // Class : "CRL::JsonCatalogProperty".
193 
194  class JsonCatalogProperty : public JsonObject {
195  public:
196  static void initialize ();
197  JsonCatalogProperty ( unsigned long );
198  virtual string getTypeName () const;
199  virtual JsonCatalogProperty* clone ( unsigned long ) const;
200  virtual void toData ( JsonStack& );
201  };
202 
203 
204 // -------------------------------------------------------------------
205 // Inline Functions.
206 
207  inline Catalog::State::State () : _flags(0), _depth(1), _cell(NULL), _library(NULL) { }
208  inline bool Catalog::State::isTerminalNetlist () const { return (_flags&TerminalNetlist)?1:0; }
209  inline bool Catalog::State::isFeed () const { return (_flags&Feed )?1:0; }
210  inline bool Catalog::State::isPad () const { return (_flags&Pad )?1:0; }
211  inline bool Catalog::State::isGds () const { return (_flags&GDS )?1:0; }
212  inline bool Catalog::State::isDelete () const { return (_flags&Delete )?1:0; }
213  inline bool Catalog::State::isPhysical () const { return (_flags&Physical )?1:0; }
214  inline bool Catalog::State::isLogical () const { return (_flags&Logical )?1:0; }
215  inline bool Catalog::State::isInMemory () const { return (_flags&InMemory )?1:0; }
216  inline unsigned int Catalog::State::getFlags ( unsigned int mask ) const { return ( _flags & mask ); }
217  inline bool Catalog::State::setFlags ( unsigned int mask, bool value ) {
218  if (value) { _flags |= mask; }
219  else { _flags &= ~mask; }
220  return ((_flags&mask) ? true : false);
221  }
222  inline bool Catalog::State::setTerminalNetlist ( bool value ) { return setFlags(TerminalNetlist,value); }
223  inline bool Catalog::State::setFeed ( bool value ) { return setFlags(Feed ,value); }
224  inline bool Catalog::State::setPad ( bool value ) { return setFlags(Pad ,value); }
225  inline bool Catalog::State::setGds ( bool value ) { return setFlags(GDS ,value); }
226  inline bool Catalog::State::setDelete ( bool value ) { return setFlags(Delete ,value); }
227  inline bool Catalog::State::setPhysical ( bool value ) { return setFlags(Physical ,value); }
228  inline bool Catalog::State::setLogical ( bool value ) { return setFlags(Logical ,value); }
229  inline bool Catalog::State::setInMemory ( bool value ) { return setFlags(InMemory ,value); }
230  inline Library* Catalog::State::setLibrary ( Library* library ) { return _library = library; }
231  inline void Catalog::State::setDepth ( unsigned int depth ) { _depth = depth; }
232  inline Cell* Catalog::State::getCell () const { return _cell; }
233  inline Library* Catalog::State::getLibrary () const { return _library; }
234  inline unsigned int Catalog::State::getDepth () const { return _depth; }
235  inline string Catalog::State::_getTypeName () const { return _TName("Catalog::State"); }
236 
237  inline Catalog::Catalog () : _states() { }
238  inline map<Name,Catalog::State*>*
239  Catalog::getStates () { return &_states; }
240  inline string Catalog::_getTypeName () const { return _TName("Catalog"); }
241 
242  inline CatalogProperty::CatalogProperty ( Catalog::State* state ) : PrivateProperty(), _state(state) {}
243  inline Catalog::State* CatalogProperty::getState () const { return _state; }
244  inline void CatalogProperty::setState ( Catalog::State* state ) { _state = state; }
245 
246 
247 // -------------------------------------------------------------------
248 // Class : "CRL::CatalogExtension".
249 
250 
252  public:
253  static Catalog::State* get ( const Cell* );
254  public:
255  static inline bool isTerminalNetlist ( const Cell* );
256  static inline bool isFeed ( const Cell* );
257  static inline bool isPad ( const Cell* );
258  static inline bool isGds ( const Cell* );
259  static inline bool isDelete ( const Cell* );
260  static inline bool isPhysical ( const Cell* );
261  static inline bool isLogical ( const Cell* );
262  // Flags management.
263  static inline unsigned int getFlags ( const Cell*, unsigned int mask=(unsigned int)-1 );
264  static inline bool setFlags ( const Cell*, unsigned int mask, bool value );
265  static inline bool setTerminalNetlist ( const Cell*, bool value );
266  static inline bool setFeed ( const Cell*, bool value );
267  static inline bool setPad ( const Cell*, bool value );
268  static inline bool setGds ( const Cell*, bool value );
269  static inline bool setDelete ( const Cell*, bool value );
270  static inline bool setPhysical ( const Cell*, bool value );
271  static inline bool setLogical ( const Cell*, bool value );
272  // Accessors.
273  static inline Library* getLibrary ( const Cell* );
274  static inline unsigned int getDepth ( const Cell* );
275  // Modifiers.
276  static inline Library* setLibrary ( const Cell*, Library* library );
277  static inline void setDepth ( const Cell*, unsigned int depth );
278  private:
279  static const Cell* _owner;
280  static Catalog::State* _cache;
281  };
282 
283 
284  inline bool CatalogExtension::isTerminalNetlist ( const Cell* cell )
285  {
286  Catalog::State* state = get(cell);
287  return (state == NULL) ? false : state->isTerminalNetlist();
288  }
289 
290 
291  inline bool CatalogExtension::isFeed ( const Cell* cell )
292  {
293  Catalog::State* state = get(cell);
294  return (state == NULL) ? false : state->isFeed();
295  }
296 
297 
298  inline bool CatalogExtension::isGds ( const Cell* cell )
299  {
300  Catalog::State* state = get(cell);
301  return (state == NULL) ? false : state->isGds();
302  }
303 
304 
305  inline bool CatalogExtension::isPad ( const Cell* cell )
306  {
307  Catalog::State* state = get(cell);
308  return (state == NULL) ? false : state->isPad();
309  }
310 
311 
312  inline bool CatalogExtension::isDelete ( const Cell* cell )
313  {
314  Catalog::State* state = get(cell);
315  return (state == NULL) ? false : state->isDelete();
316  }
317 
318 
319  inline bool CatalogExtension::isPhysical ( const Cell* cell )
320  {
321  Catalog::State* state = get(cell);
322  return (state == NULL) ? false : state->isPhysical();
323  }
324 
325 
326  inline bool CatalogExtension::isLogical ( const Cell* cell )
327  {
328  Catalog::State* state = get(cell);
329  return (state == NULL) ? false : state->isLogical();
330  }
331 
332 
333  inline unsigned int CatalogExtension::getFlags ( const Cell* cell, unsigned int mask )
334  {
335  Catalog::State* state = get(cell);
336  return (state == NULL) ? 0 : state->getFlags();
337  }
338 
339 
340  inline bool CatalogExtension::setFlags ( const Cell* cell, unsigned int mask, bool value )
341  {
342  Catalog::State* state = get(cell);
343  return (state == NULL) ? false : state->setFlags(mask,value);
344  }
345 
346 
347  inline bool CatalogExtension::setTerminalNetlist ( const Cell* cell, bool value )
348  {
349  Catalog::State* state = get(cell);
350  return (state == NULL) ? false : state->setTerminalNetlist(value);
351  }
352 
353 
354  inline bool CatalogExtension::setFeed ( const Cell* cell, bool value )
355  {
356  Catalog::State* state = get(cell);
357  return (state == NULL) ? false : state->setFeed(value);
358  }
359 
360 
361  inline bool CatalogExtension::setPad ( const Cell* cell, bool value )
362  {
363  Catalog::State* state = get(cell);
364  return (state == NULL) ? false : state->setPad(value);
365  }
366 
367 
368  inline bool CatalogExtension::setGds ( const Cell* cell, bool value )
369  {
370  Catalog::State* state = get(cell);
371  return (state == NULL) ? false : state->setGds(value);
372  }
373 
374 
375  inline bool CatalogExtension::setDelete ( const Cell* cell, bool value )
376  {
377  Catalog::State* state = get(cell);
378  return (state == NULL) ? false : state->setDelete(value);
379  }
380 
381 
382  inline bool CatalogExtension::setPhysical ( const Cell* cell, bool value )
383  {
384  Catalog::State* state = get(cell);
385  return (state == NULL) ? false : state->setPhysical(value);
386  }
387 
388 
389  inline bool CatalogExtension::setLogical ( const Cell* cell, bool value )
390  {
391  Catalog::State* state = get(cell);
392  return (state == NULL) ? false : state->setLogical(value);
393  }
394 
395 
396  inline Library* CatalogExtension::getLibrary ( const Cell* cell )
397  {
398  Catalog::State* state = get(cell);
399  return (state == NULL) ? NULL : state->getLibrary();
400  }
401 
402 
403  inline unsigned int CatalogExtension::getDepth ( const Cell* cell )
404  {
405  Catalog::State* state = get(cell);
406  return (state == NULL) ? 0 : state->getDepth();
407  }
408 
409 
410  inline Library* CatalogExtension::setLibrary ( const Cell* cell, Library* library )
411  {
412  Catalog::State* state = get(cell);
413  return (state == NULL) ? NULL : state->setLibrary(library);
414  }
415 
416 
417  inline void CatalogExtension::setDepth ( const Cell* cell, unsigned int depth )
418  {
419  Catalog::State* state = get(cell);
420  if ( state == NULL ) state->setDepth(depth);
421  }
422 
423 
424 } // End of CRL namespace.
425 
426 
427 
428 
429 // x-----------------------------------------------------------------x
430 // | Functions Overload for Hurricane Management |
431 // x-----------------------------------------------------------------x
432 
433 
434 inline std::string getPrint ( const CRL::Catalog &CATAL ) { return CATAL._getPrint(); }
435 
436 INSPECTOR_P_SUPPORT(CRL::Catalog);
437 INSPECTOR_P_SUPPORT(CRL::Catalog::State);
unsigned int getFlags(unsigned int mask=(unsigned int) -1) const
Definition: Catalog.h:216
-
static bool setPad(const Cell *, bool value)
Definition: Catalog.h:362
+
static bool setPad(const Cell *, bool value)
Definition: Catalog.h:361
-
An entry to store the Cell State in the Catalog.
Definition: Catalog.h:77
-
Definition: Catalog.h:87
-
static bool setLogical(const Cell *, bool value)
Definition: Catalog.h:390
+
An entry to store the Cell State in the Catalog.
Definition: Catalog.h:75
+
Definition: Catalog.h:85
+
static bool setLogical(const Cell *, bool value)
Definition: Catalog.h:389
-
bool setPad(bool value)
Definition: Catalog.h:225
-
static bool isGds(const Cell *)
Definition: Catalog.h:299
-
bool setGds(bool value)
Definition: Catalog.h:226
+
bool setPad(bool value)
Definition: Catalog.h:224
+
static bool isGds(const Cell *)
Definition: Catalog.h:298
+
bool setGds(bool value)
Definition: Catalog.h:225
Cell * setCell(Cell *cell)
-
Catalog()
Definition: Catalog.h:238
-
static bool isDelete(const Cell *)
Definition: Catalog.h:313
-
static bool isLogical(const Cell *)
Definition: Catalog.h:327
-
static bool setFeed(const Cell *, bool value)
Definition: Catalog.h:355
+
Catalog()
Definition: Catalog.h:237
+
static bool isDelete(const Cell *)
Definition: Catalog.h:312
+
static bool isLogical(const Cell *)
Definition: Catalog.h:326
+
static bool setFeed(const Cell *, bool value)
Definition: Catalog.h:354
-
bool isLogical() const
Definition: Catalog.h:215
+
bool isLogical() const
Definition: Catalog.h:214
void merge(const State &other)
-
bool isPhysical() const
Definition: Catalog.h:214
-
bool isDelete() const
Definition: Catalog.h:213
+
bool isPhysical() const
Definition: Catalog.h:213
+
bool isDelete() const
Definition: Catalog.h:212
-
static unsigned int getFlags(const Cell *, unsigned int mask=(unsigned int) -1)
Definition: Catalog.h:334
-
Library * setLibrary(Library *library)
Definition: Catalog.h:231
-
Definition: Catalog.h:86
-
Definition: Catalog.h:92
-
bool setLogical(bool value)
Definition: Catalog.h:229
-
static bool setGds(const Cell *, bool value)
Definition: Catalog.h:369
-
Definition: Catalog.h:84
+
static unsigned int getFlags(const Cell *, unsigned int mask=(unsigned int) -1)
Definition: Catalog.h:333
+
Library * setLibrary(Library *library)
Definition: Catalog.h:230
+
Definition: Catalog.h:84
+
Definition: Catalog.h:91
+
bool setLogical(bool value)
Definition: Catalog.h:228
+
static bool setGds(const Cell *, bool value)
Definition: Catalog.h:368
+
Definition: Catalog.h:82
bool deleteState(const Name &name)
void mergeState(const Name &name, const State &other)
-
bool setFeed(bool value)
Definition: Catalog.h:224
-
Library * getLibrary() const
Definition: Catalog.h:234
+
bool setFeed(bool value)
Definition: Catalog.h:223
+
Library * getLibrary() const
Definition: Catalog.h:233
-
Definition: Catalog.h:81
-
Cell * getCell() const
Definition: Catalog.h:233
-
bool setFlags(unsigned int mask, bool value)
Definition: Catalog.h:218
+
Definition: Catalog.h:79
+
Cell * getCell() const
Definition: Catalog.h:232
+
bool setFlags(unsigned int mask, bool value)
Definition: Catalog.h:217
-
map< Name, State * > * getStates()
Definition: Catalog.h:240
-
static bool isFeed(const Cell *)
Definition: Catalog.h:292
-
Definition: Catalog.h:82
-
static Library * getLibrary(const Cell *)
Definition: Catalog.h:397
+
map< Name, State * > * getStates()
Definition: Catalog.h:239
+
static bool isFeed(const Cell *)
Definition: Catalog.h:291
+
Definition: Catalog.h:80
+
static Library * getLibrary(const Cell *)
Definition: Catalog.h:396
State * getState(const Name &name, bool add=false)
-
State()
Definition: Catalog.h:208
-
static bool isPad(const Cell *)
Definition: Catalog.h:306
+
State()
Definition: Catalog.h:207
+
static bool isPad(const Cell *)
Definition: Catalog.h:305
bool loadFromFile(const string &path, Library *library)
-
bool isFeed() const
Definition: Catalog.h:210
-
bool setDelete(bool value)
Definition: Catalog.h:227
-
static Library * setLibrary(const Cell *, Library *library)
Definition: Catalog.h:411
-
static bool setPhysical(const Cell *, bool value)
Definition: Catalog.h:383
+
bool isFeed() const
Definition: Catalog.h:209
+
bool setDelete(bool value)
Definition: Catalog.h:226
+
static Library * setLibrary(const Cell *, Library *library)
Definition: Catalog.h:410
+
static bool setPhysical(const Cell *, bool value)
Definition: Catalog.h:382
-
Definition: Catalog.h:85
-
bool isPad() const
Definition: Catalog.h:211
-
A Registry to store Alliance Cell metadatas.
Definition: Catalog.h:56
-
Definition: Catalog.h:83
-
static bool setDelete(const Cell *, bool value)
Definition: Catalog.h:376
-
Wrapper to access a Hurricane::Cell Catalog::State.
Definition: Catalog.h:252
-
bool setPhysical(bool value)
Definition: Catalog.h:228
-
bool isGds() const
Definition: Catalog.h:212
-
static bool isPhysical(const Cell *)
Definition: Catalog.h:320
-
static unsigned int getDepth(const Cell *)
Definition: Catalog.h:404
-
Flags
Definition: Catalog.h:80
+
Definition: Catalog.h:83
+
bool isPad() const
Definition: Catalog.h:210
+
A Registry to store Alliance Cell metadatas.
Definition: Catalog.h:54
+
Definition: Catalog.h:81
+
static bool setDelete(const Cell *, bool value)
Definition: Catalog.h:375
+
Wrapper to access a Hurricane::Cell Catalog::State.
Definition: Catalog.h:251
+
bool setPhysical(bool value)
Definition: Catalog.h:227
+
bool isGds() const
Definition: Catalog.h:211
+
static bool isPhysical(const Cell *)
Definition: Catalog.h:319
+
static unsigned int getDepth(const Cell *)
Definition: Catalog.h:403
+
Flags
Definition: Catalog.h:78
The namespace of Coriolis Core.
Definition: Environment.h:24
-
unsigned int getDepth() const
Definition: Catalog.h:235
-
static bool setFlags(const Cell *, unsigned int mask, bool value)
Definition: Catalog.h:341
+
unsigned int getDepth() const
Definition: Catalog.h:234
+
static bool setFlags(const Cell *, unsigned int mask, bool value)
Definition: Catalog.h:340


- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/Environment_8h_source.html b/crlcore/doc/crlcore/html/Environment_8h_source.html index 58955f04..d1ec24c8 100644 --- a/crlcore/doc/crlcore/html/Environment_8h_source.html +++ b/crlcore/doc/crlcore/html/Environment_8h_source.html @@ -98,7 +98,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/GraphicToolEngine_8h_source.html b/crlcore/doc/crlcore/html/GraphicToolEngine_8h_source.html index 944aeaac..5540ffe6 100644 --- a/crlcore/doc/crlcore/html/GraphicToolEngine_8h_source.html +++ b/crlcore/doc/crlcore/html/GraphicToolEngine_8h_source.html @@ -60,7 +60,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/RoutingGauge_8h_source.html b/crlcore/doc/crlcore/html/RoutingGauge_8h_source.html index db96d034..70509aa3 100644 --- a/crlcore/doc/crlcore/html/RoutingGauge_8h_source.html +++ b/crlcore/doc/crlcore/html/RoutingGauge_8h_source.html @@ -44,22 +44,22 @@ $(function() {
RoutingGauge.h
-
1 // -*- C++ -*-
2 //
3 // This file is part of the Coriolis Software.
4 // Copyright (c) UPMC 2008-2018, All Rights Reserved
5 //
6 // +-----------------------------------------------------------------+
7 // | C O R I O L I S |
8 // | Alliance / Hurricane Interface |
9 // | |
10 // | Author : Jean-Paul CHAPUT |
11 // | E-mail : Jean-Paul.Chaput@lip6.fr |
12 // | =============================================================== |
13 // | C++ Header : "./crlcore/RoutingGauge.h" |
14 // +-----------------------------------------------------------------+
15 
16 
17 #ifndef CRL_ROUTING_GAUGE_H
18 #define CRL_ROUTING_GAUGE_H
19 
20 #include <string>
21 #include <vector>
22 #include "hurricane/Name.h"
23 #include "hurricane/Slot.h"
24 
25 namespace Hurricane {
26  class Layer;
27  class Technology;
28 }
29 
30 #include "crlcore/RoutingLayerGauge.h"
31 
32 namespace CRL {
33 
34  using std::string;
35  using std::vector;
39  using Hurricane::Name;
40  using Hurricane::Record;
41  using Hurricane::Layer;
43 
44 
45 // -------------------------------------------------------------------
46 // Class : "RoutingGauge".
47 
48  class RoutingGauge {
49 
50  public:
51  // Constants.
52  static const size_t nlayerdepth;
53  // Constructors & Destructors.
54  static RoutingGauge* create ( const char* name );
55  virtual void destroy ();
56  // Predicates.
57  inline bool isSymbolic () const;
58  inline bool isTwoMetals () const;
59  inline bool isHV () const;
60  inline bool isVH () const;
61  bool hasLayer ( const Layer* ) const;
62  // Accessors.
63  RoutingGauge* getClone () const;
64  inline const Name getName () const;
65  inline Technology* getTechnology () const;
66  inline size_t getDepth () const;
67  inline DbU::Unit getHorizontalPitch () const;
68  inline DbU::Unit getVerticalPitch () const;
69  RoutingLayerGauge* getHorizontalGauge () const;
70  RoutingLayerGauge* getVerticalGauge () const;
71  RoutingLayerGauge* getLayerGauge ( const Layer* ) const;
72  size_t getViaDepth ( const Layer* ) const;
73  size_t getLayerDepth ( const Layer* ) const;
74  unsigned int getLayerType ( const Layer* ) const;
75  unsigned int getLayerDirection ( const Layer* ) const;
76  DbU::Unit getPitch ( const Layer* ) const;
77  DbU::Unit getOffset ( const Layer* ) const;
78  DbU::Unit getWireWidth ( const Layer* ) const;
79  DbU::Unit getViaWidth ( const Layer* ) const;
80  RoutingLayerGauge* getLayerGauge ( size_t depth ) const;
81  inline unsigned int getLayerDirection ( size_t depth ) const;
82  inline unsigned int getLayerType ( size_t depth ) const;
83  inline DbU::Unit getLayerPitch ( size_t depth ) const;
84  inline DbU::Unit getLayerOffset ( size_t depth ) const;
85  inline DbU::Unit getLayerWireWidth ( size_t depth ) const;
86  inline DbU::Unit getViaWidth ( size_t depth ) const;
87  const Layer* getRoutingLayer ( size_t depth ) const;
88  Layer* getContactLayer ( size_t depth ) const;
89  const vector<RoutingLayerGauge*>&
90  getLayerGauges () const;
91  // Methods.
92  void addLayerGauge ( RoutingLayerGauge* layerGauge );
93  void checkConnexity () const;
94  inline void setSymbolic ( bool );
95  // Hurricane Managment.
96  void toJson ( JsonWriter* ) const;
97  virtual Record* _getRecord ( Record* record=NULL ) const;
98  virtual string _getString () const;
99  virtual string _getTypeName () const;
100 
101  protected:
102  // Internal - Attributes.
103  Name _name;
104  vector<RoutingLayerGauge*> _layerGauges;
105  vector<Layer*> _viaLayers;
106  Technology* _technology;
107  bool _isSymbolic;
108 
109  // Internal - Constructors & Destructors.
110  RoutingGauge ( const char* name );
111  RoutingGauge ( const RoutingGauge& );
112  virtual ~RoutingGauge ();
113  virtual void _preDestroy ();
114  RoutingGauge& operator= ( const RoutingGauge& );
115  };
116 
117 
118  inline bool RoutingGauge::isSymbolic () const { return _isSymbolic; }
119  inline bool RoutingGauge::isTwoMetals () const { return (getDepth() < 3); }
120  inline bool RoutingGauge::isHV () const { return not isTwoMetals() and (getLayerGauge(1)->isHorizontal()); }
121  inline bool RoutingGauge::isVH () const { return not isTwoMetals() and (getLayerGauge(1)->isVertical()); }
122  inline const Name RoutingGauge::getName () const { return _name; }
123  inline size_t RoutingGauge::getDepth () const { return _layerGauges.size(); }
124  inline Technology* RoutingGauge::getTechnology () const { return _technology; }
125  inline DbU::Unit RoutingGauge::getHorizontalPitch () const { return getHorizontalGauge()->getPitch(); }
126  inline DbU::Unit RoutingGauge::getVerticalPitch () const { return getVerticalGauge ()->getPitch(); }
127  inline unsigned int RoutingGauge::getLayerType ( size_t depth ) const { return getLayerGauge(depth)->getType(); }
128  inline unsigned int RoutingGauge::getLayerDirection ( size_t depth ) const { return getLayerGauge(depth)->getDirection(); }
129  inline DbU::Unit RoutingGauge::getLayerPitch ( size_t depth ) const { return getLayerGauge(depth)->getPitch(); }
130  inline DbU::Unit RoutingGauge::getLayerOffset ( size_t depth ) const { return getLayerGauge(depth)->getOffset(); }
131  inline DbU::Unit RoutingGauge::getLayerWireWidth ( size_t depth ) const { return getLayerGauge(depth)->getWireWidth(); }
132  inline DbU::Unit RoutingGauge::getViaWidth ( size_t depth ) const { return getLayerGauge(depth)->getViaWidth(); }
133  inline void RoutingGauge::setSymbolic ( bool state ) { _isSymbolic=state; }
134 
135 
136 // -------------------------------------------------------------------
137 // Class : "JsonRoutingGauge".
138 
139  class JsonRoutingGauge : public JsonObject {
140  public:
141  static void initialize ();
142  JsonRoutingGauge ( unsigned long flags );
143  virtual string getTypeName () const;
144  virtual JsonRoutingGauge* clone ( unsigned long flags ) const;
145  virtual void toData ( JsonStack& );
146  };
147 
148 
149 } // CRL namespace.
150 
151 INSPECTOR_P_SUPPORT(CRL::RoutingGauge);
152 
153 #endif
DbU::Unit getViaWidth() const
Definition: RoutingLayerGauge.h:182
-
DbU::Unit getPitch() const
Definition: RoutingLayerGauge.h:178
+
1 // -*- C++ -*-
2 //
3 // This file is part of the Coriolis Software.
4 // Copyright (c) UPMC 2008-2018, All Rights Reserved
5 //
6 // +-----------------------------------------------------------------+
7 // | C O R I O L I S |
8 // | Alliance / Hurricane Interface |
9 // | |
10 // | Author : Jean-Paul CHAPUT |
11 // | E-mail : Jean-Paul.Chaput@lip6.fr |
12 // | =============================================================== |
13 // | C++ Header : "./crlcore/RoutingGauge.h" |
14 // +-----------------------------------------------------------------+
15 
16 
17 #ifndef CRL_ROUTING_GAUGE_H
18 #define CRL_ROUTING_GAUGE_H
19 
20 #include <string>
21 #include <vector>
22 #include "hurricane/Name.h"
23 #include "hurricane/Slot.h"
24 
25 namespace Hurricane {
26  class Layer;
27  class Technology;
28 }
29 
30 #include "crlcore/RoutingLayerGauge.h"
31 
32 namespace CRL {
33 
34  using std::string;
35  using std::vector;
39  using Hurricane::Name;
40  using Hurricane::Record;
41  using Hurricane::Layer;
43 
44 
45 // -------------------------------------------------------------------
46 // Class : "RoutingGauge".
47 
48  class RoutingGauge {
49 
50  public:
51  // Constants.
52  static const size_t nlayerdepth;
53  // Constructors & Destructors.
54  static RoutingGauge* create ( const char* name );
55  virtual void destroy ();
56  // Predicates.
57  inline bool isSymbolic () const;
58  inline bool isTwoMetals () const;
59  inline bool isHV () const;
60  inline bool isVH () const;
61  inline bool hasPowerSupply () const;
62  bool hasLayer ( const Layer* ) const;
63  // Accessors.
64  RoutingGauge* getClone () const;
65  inline const Name getName () const;
66  inline Technology* getTechnology () const;
67  inline size_t getDepth () const;
68  inline DbU::Unit getHorizontalPitch () const;
69  inline DbU::Unit getVerticalPitch () const;
70  RoutingLayerGauge* getHorizontalGauge () const;
71  RoutingLayerGauge* getVerticalGauge () const;
72  RoutingLayerGauge* getPowerSupplyGauge () const;
73  RoutingLayerGauge* getLayerGauge ( const Layer* ) const;
74  size_t getViaDepth ( const Layer* ) const;
75  size_t getLayerDepth ( const Layer* ) const;
76  unsigned int getLayerType ( const Layer* ) const;
77  unsigned int getLayerDirection ( const Layer* ) const;
78  DbU::Unit getPitch ( const Layer* ) const;
79  DbU::Unit getOffset ( const Layer* ) const;
80  DbU::Unit getWireWidth ( const Layer* ) const;
81  DbU::Unit getPWireWidth ( const Layer* ) const;
82  DbU::Unit getViaWidth ( const Layer* ) const;
83  RoutingLayerGauge* getLayerGauge ( size_t depth ) const;
84  inline unsigned int getLayerDirection ( size_t depth ) const;
85  inline unsigned int getLayerType ( size_t depth ) const;
86  inline DbU::Unit getLayerPitch ( size_t depth ) const;
87  inline DbU::Unit getLayerOffset ( size_t depth ) const;
88  inline DbU::Unit getLayerWireWidth ( size_t depth ) const;
89  inline DbU::Unit getLayerPWireWidth ( size_t depth ) const;
90  inline DbU::Unit getViaWidth ( size_t depth ) const;
91  const Layer* getRoutingLayer ( size_t depth ) const;
92  Layer* getContactLayer ( size_t depth ) const;
93  const vector<RoutingLayerGauge*>&
94  getLayerGauges () const;
95  // Methods.
96  void addLayerGauge ( RoutingLayerGauge* layerGauge );
97  void checkConnexity () const;
98  inline void setSymbolic ( bool );
99  // Hurricane Managment.
100  void toJson ( JsonWriter* ) const;
101  virtual Record* _getRecord ( Record* record=NULL ) const;
102  virtual string _getString () const;
103  virtual string _getTypeName () const;
104 
105  protected:
106  // Internal - Attributes.
107  Name _name;
108  vector<RoutingLayerGauge*> _layerGauges;
109  vector<Layer*> _viaLayers;
110  Technology* _technology;
111  bool _isSymbolic;
112 
113  // Internal - Constructors & Destructors.
114  RoutingGauge ( const char* name );
115  RoutingGauge ( const RoutingGauge& );
116  virtual ~RoutingGauge ();
117  virtual void _preDestroy ();
118  RoutingGauge& operator= ( const RoutingGauge& );
119  };
120 
121 
122  inline bool RoutingGauge::isSymbolic () const { return _isSymbolic; }
123  inline bool RoutingGauge::isTwoMetals () const { return (getDepth() < 3); }
124  inline bool RoutingGauge::isHV () const { return not isTwoMetals() and (getLayerGauge(1)->isHorizontal()); }
125  inline bool RoutingGauge::isVH () const { return not isTwoMetals() and (getLayerGauge(1)->isVertical()); }
126  inline bool RoutingGauge::hasPowerSupply () const { return (getPowerSupplyGauge() != NULL); }
127  inline const Name RoutingGauge::getName () const { return _name; }
128  inline size_t RoutingGauge::getDepth () const { return _layerGauges.size(); }
129  inline Technology* RoutingGauge::getTechnology () const { return _technology; }
130  inline DbU::Unit RoutingGauge::getHorizontalPitch () const { return getHorizontalGauge()->getPitch(); }
131  inline DbU::Unit RoutingGauge::getVerticalPitch () const { return getVerticalGauge ()->getPitch(); }
132  inline unsigned int RoutingGauge::getLayerType ( size_t depth ) const { return getLayerGauge(depth)->getType(); }
133  inline unsigned int RoutingGauge::getLayerDirection ( size_t depth ) const { return getLayerGauge(depth)->getDirection(); }
134  inline DbU::Unit RoutingGauge::getLayerPitch ( size_t depth ) const { return getLayerGauge(depth)->getPitch(); }
135  inline DbU::Unit RoutingGauge::getLayerOffset ( size_t depth ) const { return getLayerGauge(depth)->getOffset(); }
136  inline DbU::Unit RoutingGauge::getLayerWireWidth ( size_t depth ) const { return getLayerGauge(depth)->getWireWidth(); }
137  inline DbU::Unit RoutingGauge::getLayerPWireWidth ( size_t depth ) const { return getLayerGauge(depth)->getPWireWidth(); }
138  inline DbU::Unit RoutingGauge::getViaWidth ( size_t depth ) const { return getLayerGauge(depth)->getViaWidth(); }
139  inline void RoutingGauge::setSymbolic ( bool state ) { _isSymbolic=state; }
140 
141 
142 // -------------------------------------------------------------------
143 // Class : "JsonRoutingGauge".
144 
145  class JsonRoutingGauge : public JsonObject {
146  public:
147  static void initialize ();
148  JsonRoutingGauge ( unsigned long flags );
149  virtual string getTypeName () const;
150  virtual JsonRoutingGauge* clone ( unsigned long flags ) const;
151  virtual void toData ( JsonStack& );
152  };
153 
154 
155 } // CRL namespace.
156 
157 INSPECTOR_P_SUPPORT(CRL::RoutingGauge);
158 
159 #endif
DbU::Unit getViaWidth() const
Definition: RoutingLayerGauge.h:188
+
DbU::Unit getPitch() const
Definition: RoutingLayerGauge.h:183
-
DbU::Unit getWireWidth() const
Definition: RoutingLayerGauge.h:180
+
DbU::Unit getWireWidth() const
Definition: RoutingLayerGauge.h:185
std::int64_t Unit
virtual void destroy()
Gauge for the detailed routing.
Definition: RoutingGauge.h:48
RoutingGauge * getClone() const
-
Constant::Direction getDirection() const
Definition: RoutingLayerGauge.h:173
-
Technology * getTechnology() const
Definition: RoutingGauge.h:124
+
Constant::Direction getDirection() const
Definition: RoutingLayerGauge.h:178
+
Technology * getTechnology() const
Definition: RoutingGauge.h:129
-
const Name getName() const
Definition: RoutingGauge.h:122
-
DbU::Unit getOffset() const
Definition: RoutingLayerGauge.h:177
-
size_t getDepth() const
Definition: RoutingGauge.h:123
-
Constant::LayerGaugeType getType() const
Definition: RoutingLayerGauge.h:174
+
const Name getName() const
Definition: RoutingGauge.h:127
+
DbU::Unit getOffset() const
Definition: RoutingLayerGauge.h:182
+
size_t getDepth() const
Definition: RoutingGauge.h:128
+
Constant::LayerGaugeType getType() const
Definition: RoutingLayerGauge.h:179
RoutingLayerGauge * getLayerGauge(const Layer *) const
void addLayerGauge(RoutingLayerGauge *layerGauge)
static RoutingGauge * create(const char *name)
@@ -71,7 +71,7 @@ $(function() {
void checkConnexity() const
size_t getLayerDepth(const Layer *) const
-
Gauge of a Layer for the detailed routing.
Definition: RoutingLayerGauge.h:77
+
Gauge of a Layer for the detailed routing.
Definition: RoutingLayerGauge.h:75
unsigned int getLayerDirection(const Layer *) const
The namespace of Coriolis Core.
Definition: Environment.h:24
@@ -80,7 +80,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/RoutingLayerGauge_8h_source.html b/crlcore/doc/crlcore/html/RoutingLayerGauge_8h_source.html index 1b2fbca3..74090284 100644 --- a/crlcore/doc/crlcore/html/RoutingLayerGauge_8h_source.html +++ b/crlcore/doc/crlcore/html/RoutingLayerGauge_8h_source.html @@ -44,56 +44,56 @@ $(function() {
RoutingLayerGauge.h
-
1 // -*- C++ -*-
2 //
3 // This file is part of the Coriolis Software.
4 // Copyright (c) UPMC 2008-2018, All Rights Reserved
5 //
6 // +-----------------------------------------------------------------+
7 // | C O R I O L I S |
8 // | C o r e L i b r a r y |
9 // | |
10 // | Author : Jean-Paul CHAPUT |
11 // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
12 // | =============================================================== |
13 // | C++ Header : "./RoutingLayerGauge.h" |
14 // +-----------------------------------------------------------------+
15 
16 
17 #ifndef CRL_ROUTING_LAYER_GAUGE_H
18 #define CRL_ROUTING_LAYER_GAUGE_H
19 
20 
21 #include <map>
22 #include "hurricane/Commons.h"
23 #include "hurricane/Error.h"
24 #include "hurricane/DbU.h"
25 #include "hurricane/Collection.h"
26 #include "hurricane/Slot.h"
27 #include "crlcore/Utilities.h"
28 
29 namespace Hurricane {
30  class Layer;
31 }
32 
33 
34 namespace Constant {
35 
36  enum Direction { Horizontal = (1<<0)
37  , Vertical = (1<<1)
38  };
39 
40  enum LayerGaugeType { Default = (1<<0)
41  , PinOnly = (1<<1)
42  };
43 
44  enum Round { Superior = (1<<2)
45  , Inferior = (1<<3)
46  , Nearest = (1<<4)
47  , Exact = (1<<5)
48  };
49 
50  Direction perpandicular ( unsigned int );
51 
52 }
53 
54 
55 
56 namespace CRL {
57 
58  using std::map;
65  using Hurricane::Record;
66  using Hurricane::DbU;
67  using Hurricane::Layer;
68 
69 
70  class RoutingGauge;
71 
72 
73 // -------------------------------------------------------------------
74 // Class : "RoutingLayerGauge".
75 
76 
78 
79  public:
80  // Constructors & Destructors.
81  static RoutingLayerGauge* create ( const Layer* layer
82  , Constant::Direction direction
84  , unsigned int depth
85  , double density
86  , DbU::Unit offset
87  , DbU::Unit pitch
88  , DbU::Unit wireWidth
89  , DbU::Unit viaWidth
90  , DbU::Unit obsDw );
91  virtual void destroy ();
92  // Accessors.
93  inline bool isHorizontal () const;
94  inline bool isVertical () const;
95  inline const Layer* getLayer () const;
96  inline const Layer* getBlockageLayer () const;
97  inline unsigned int getDepth () const;
98  inline Constant::Direction getDirection () const;
99  inline Constant::LayerGaugeType getType () const;
100  inline double getDensity () const;
101  inline DbU::Unit getOffset () const;
102  inline DbU::Unit getPitch () const;
103  inline DbU::Unit getHalfPitch () const;
104  inline DbU::Unit getWireWidth () const;
105  inline DbU::Unit getHalfWireWidth () const;
106  inline DbU::Unit getViaWidth () const;
107  inline DbU::Unit getHalfViaWidth () const;
108  inline DbU::Unit getObstacleDw () const;
109  void divide ( DbU::Unit dividend, long& quotient, long& modulo ) const;
110  unsigned int getTrackNumber ( DbU::Unit start, DbU::Unit stop ) const;
111  long getTrackIndex ( DbU::Unit start, DbU::Unit stop, DbU::Unit position, unsigned mode ) const;
112  inline DbU::Unit getTrackPosition ( DbU::Unit start, DbU::Unit stop, DbU::Unit position, unsigned mode ) const;
113  DbU::Unit getTrackPosition ( DbU::Unit start, long index ) const;
114  // Hurricane Managment.
115  void toJson ( JsonWriter* ) const;
116  virtual string _getTypeName () const;
117  virtual string _getString () const;
118  virtual Record* _getRecord () const;
119 
120  protected:
121  // Internal - Attributes.
122  const Layer* _layer;
123  const Layer* _blockageLayer;
124  Constant::Direction _direction;
126  unsigned int _depth;
127  double _density;
128  DbU::Unit _offset;
129  DbU::Unit _pitch;
130  DbU::Unit _wireWidth;
131  DbU::Unit _viaWidth;
132  DbU::Unit _obstacleDw;
133 
134  // Internal - Constructors & Destructors.
135  RoutingLayerGauge ( const Layer* layer
136  , Constant::Direction direction
138  , unsigned int depth
139  , double density
140  , DbU::Unit offset
141  , DbU::Unit pitch
142  , DbU::Unit wireWidth
143  , DbU::Unit viaWidth
144  , DbU::Unit obsDw );
145  virtual ~RoutingLayerGauge ();
146  virtual void _preDestroy();
147  RoutingLayerGauge& operator= ( const RoutingLayerGauge& );
148 
149  // Friends.
150  friend class RoutingGauge;
151  };
152 
153 
154  // New Types.
155  typedef map<Layer*,RoutingLayerGauge*> RoutingLayerGaugeMap;
156 
157 
158 // -------------------------------------------------------------------
159 // Collection : "RoutingLayerGauges".
160 
164 
165 
166 // -------------------------------------------------------------------
167 // Inline Functions.
168 
169  inline bool RoutingLayerGauge::isHorizontal () const { return (_direction == Constant::Direction::Horizontal); }
170  inline bool RoutingLayerGauge::isVertical () const { return (_direction == Constant::Direction::Vertical); }
171  inline const Layer* RoutingLayerGauge::getLayer () const { return _layer; }
172  inline const Layer* RoutingLayerGauge::getBlockageLayer () const { return _blockageLayer; }
173  inline Constant::Direction RoutingLayerGauge::getDirection () const { return _direction; }
174  inline Constant::LayerGaugeType RoutingLayerGauge::getType () const { return _type; }
175  inline unsigned int RoutingLayerGauge::getDepth () const { return _depth; }
176  inline double RoutingLayerGauge::getDensity () const { return _density; }
177  inline DbU::Unit RoutingLayerGauge::getOffset () const { return _offset; }
178  inline DbU::Unit RoutingLayerGauge::getPitch () const { return _pitch; }
179  inline DbU::Unit RoutingLayerGauge::getHalfPitch () const { return _pitch>>1; }
180  inline DbU::Unit RoutingLayerGauge::getWireWidth () const { return _wireWidth; }
181  inline DbU::Unit RoutingLayerGauge::getHalfWireWidth () const { return _wireWidth>>1; }
182  inline DbU::Unit RoutingLayerGauge::getViaWidth () const { return _viaWidth; }
183  inline DbU::Unit RoutingLayerGauge::getHalfViaWidth () const { return _viaWidth>>1; }
184  inline DbU::Unit RoutingLayerGauge::getObstacleDw () const { return _obstacleDw; }
185  inline DbU::Unit RoutingLayerGauge::getTrackPosition ( DbU::Unit start, DbU::Unit stop, DbU::Unit position, unsigned mode ) const
186  { return getTrackPosition( start, getTrackIndex(start,stop,position,mode) ); }
187 
188 
189 // -------------------------------------------------------------------
190 // Class : "JsonRoutingLayerGauge".
191 
192  class JsonRoutingLayerGauge : public JsonObject {
193  public:
194  static void initialize ();
195  JsonRoutingLayerGauge ( unsigned long flags );
196  virtual string getTypeName () const;
197  virtual JsonRoutingLayerGauge* clone ( unsigned long flags ) const;
198  virtual void toData ( JsonStack& );
199  };
200 
201 
202 } // CRL namespace.
203 
204 
205 INSPECTOR_P_SUPPORT(CRL::RoutingLayerGauge);
206 
207 
208 // -------------------------------------------------------------------
209 // Inspector Support for : "const ::Constant::Direction*".
210 
211 
212 inline void from ( Constant::Direction& direction, const std::string& s )
213 {
214  if (s == "Vertical") direction = Constant::Vertical;
215  else {
216  if (s != "Horizontal")
217  std::cerr << Hurricane::Error( "::from(Direction&,string&): Unknown value \"%s\"."
218  , s.c_str() ) << std::endl;
219  direction = Constant::Horizontal;
220  }
221 }
222 
223 
224 template<>
225 inline std::string getString<const Constant::Direction*>
226  ( const Constant::Direction* direction )
227 {
228  switch ( *direction ) {
229  case Constant::Horizontal: return "Horizontal";
230  case Constant::Vertical: return "Vertical";
231  }
232  return "Unknown Constant::Direction";
233 }
234 
235 
236 template<>
237 inline std::string getString<Constant::Direction>
238  ( Constant::Direction direction )
239 {
240  switch ( direction ) {
241  case Constant::Horizontal: return "Horizontal";
242  case Constant::Vertical: return "Vertical";
243  }
244  return "Unknown Constant::Direction";
245 }
246 
247 
248 IOSTREAM_POINTER_SUPPORT(Constant::Direction);
249 
250 
251 // -------------------------------------------------------------------
252 // Inspector Support for : "const Constant::LayerGaugeType*".
253 
254 
255 inline void from ( Constant::LayerGaugeType& type, const std::string& s )
256 {
257  if (s == "PinOnly") type = Constant::PinOnly;
258  else {
259  if (s != "Default")
260  std::cerr << Hurricane::Error( "::from(LayerGaugeType&,string&): Unknown value \"%s\"."
261  , s.c_str() ) << std::endl;
262  type = Constant::Default;
263  }
264 }
265 
266 
267 template<>
268 inline std::string getString<const Constant::LayerGaugeType*>
269  ( const Constant::LayerGaugeType* layerGaugeType )
270 {
271  switch ( *layerGaugeType ) {
272  case Constant::Default: return "Default";
273  case Constant::PinOnly: return "PinOnly";
274  }
275  return "Unknown Constant::LayerGaugeType";
276 }
277 
278 
279 template<>
280 inline std::string getString<Constant::LayerGaugeType*>
281  ( Constant::LayerGaugeType* layerGaugeType )
282 { return getString<const Constant::LayerGaugeType*>(layerGaugeType); }
283 
284 
285 template<>
286 inline std::string getString<const Constant::LayerGaugeType>
287  ( const Constant::LayerGaugeType layerGaugeType )
288 {
289  switch ( layerGaugeType ) {
290  case Constant::Default: return "Default";
291  case Constant::PinOnly: return "PinOnly";
292  }
293  return "Unknown Constant::LayerGaugeType";
294 }
295 
296 
297 template<>
298 inline std::string getString<Constant::LayerGaugeType>
299  ( Constant::LayerGaugeType layerGaugeType )
300 { return getString<const Constant::LayerGaugeType>(layerGaugeType); }
301 
302 
303 IOSTREAM_POINTER_SUPPORT(Constant::LayerGaugeType);
304 
305 
306 #endif // CRL_ROUTING_LAYER_GAUGE_H
Store various constants.
Definition: RoutingLayerGauge.h:34
-
DbU::Unit getViaWidth() const
Definition: RoutingLayerGauge.h:182
+
1 // -*- C++ -*-
2 //
3 // This file is part of the Coriolis Software.
4 // Copyright (c) UPMC 2008-2018, All Rights Reserved
5 //
6 // +-----------------------------------------------------------------+
7 // | C O R I O L I S |
8 // | C o r e L i b r a r y |
9 // | |
10 // | Author : Jean-Paul CHAPUT |
11 // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
12 // | =============================================================== |
13 // | C++ Header : "./RoutingLayerGauge.h" |
14 // +-----------------------------------------------------------------+
15 
16 
17 #pragma once
18 #include <map>
19 #include "hurricane/Commons.h"
20 #include "hurricane/Error.h"
21 #include "hurricane/DbU.h"
22 #include "hurricane/Collection.h"
23 #include "hurricane/Slot.h"
24 #include "crlcore/Utilities.h"
25 
26 namespace Hurricane {
27  class Layer;
28 }
29 
30 
31 namespace Constant {
32 
33  enum Direction { Horizontal = (1<<0)
34  , Vertical = (1<<1)
35  };
36 
37  enum LayerGaugeType { Default = (1<<0)
38  , PinOnly = (1<<1)
39  , PowerSupply = (1<<2)
40  };
41 
42  enum Round { Superior = (1<<2)
43  , Inferior = (1<<3)
44  , Nearest = (1<<4)
45  , Exact = (1<<5)
46  };
47 
48  Direction perpandicular ( unsigned int );
49 
50 }
51 
52 
53 
54 namespace CRL {
55 
56  using std::map;
63  using Hurricane::Record;
64  using Hurricane::DbU;
65  using Hurricane::Layer;
66 
67 
68  class RoutingGauge;
69 
70 
71 // -------------------------------------------------------------------
72 // Class : "RoutingLayerGauge".
73 
74 
76 
77  public:
78  // Constructors & Destructors.
79  static RoutingLayerGauge* create ( const Layer* layer
80  , Constant::Direction direction
82  , unsigned int depth
83  , double density
84  , DbU::Unit offset
85  , DbU::Unit pitch
86  , DbU::Unit wireWidth
87  , DbU::Unit pwireWidth
88  , DbU::Unit viaWidth
89  , DbU::Unit obsDw );
90  virtual void destroy ();
91  // Accessors.
92  inline bool isHorizontal () const;
93  inline bool isVertical () const;
94  inline const Layer* getLayer () const;
95  inline const Layer* getBlockageLayer () const;
96  inline unsigned int getDepth () const;
97  inline Constant::Direction getDirection () const;
98  inline Constant::LayerGaugeType getType () const;
99  inline double getDensity () const;
100  inline DbU::Unit getOffset () const;
101  inline DbU::Unit getPitch () const;
102  inline DbU::Unit getHalfPitch () const;
103  inline DbU::Unit getWireWidth () const;
104  inline DbU::Unit getPWireWidth () const;
105  inline DbU::Unit getHalfWireWidth () const;
106  inline DbU::Unit getViaWidth () const;
107  inline DbU::Unit getHalfViaWidth () const;
108  inline DbU::Unit getObstacleDw () const;
109  void divide ( DbU::Unit dividend, long& quotient, long& modulo ) const;
110  unsigned int getTrackNumber ( DbU::Unit start, DbU::Unit stop ) const;
111  long getTrackIndex ( DbU::Unit start, DbU::Unit stop, DbU::Unit position, unsigned mode ) const;
112  inline DbU::Unit getTrackPosition ( DbU::Unit start, DbU::Unit stop, DbU::Unit position, unsigned mode ) const;
113  DbU::Unit getTrackPosition ( DbU::Unit start, long index ) const;
114  inline void setPWireWidth ( DbU::Unit );
115  inline void setType ( uint32_t );
116  // Hurricane Managment.
117  void toJson ( JsonWriter* ) const;
118  virtual string _getTypeName () const;
119  virtual string _getString () const;
120  virtual Record* _getRecord () const;
121 
122  protected:
123  // Internal - Attributes.
124  const Layer* _layer;
125  const Layer* _blockageLayer;
126  Constant::Direction _direction;
128  unsigned int _depth;
129  double _density;
130  DbU::Unit _offset;
131  DbU::Unit _pitch;
132  DbU::Unit _wireWidth;
133  DbU::Unit _pwireWidth;
134  DbU::Unit _viaWidth;
135  DbU::Unit _obstacleDw;
136 
137  // Internal - Constructors & Destructors.
138  RoutingLayerGauge ( const Layer* layer
139  , Constant::Direction direction
141  , unsigned int depth
142  , double density
143  , DbU::Unit offset
144  , DbU::Unit pitch
145  , DbU::Unit wireWidth
146  , DbU::Unit pwireWidth
147  , DbU::Unit viaWidth
148  , DbU::Unit obsDw );
149  RoutingLayerGauge ( const RoutingLayerGauge& ) = delete;
150  virtual ~RoutingLayerGauge ();
151  virtual void _preDestroy();
152  RoutingLayerGauge& operator= ( const RoutingLayerGauge& ) = delete;
153 
154  // Friends.
155  friend class RoutingGauge;
156  };
157 
158 
159  // New Types.
160  typedef map<Layer*,RoutingLayerGauge*> RoutingLayerGaugeMap;
161 
162 
163 // -------------------------------------------------------------------
164 // Collection : "RoutingLayerGauges".
165 
169 
170 
171 // -------------------------------------------------------------------
172 // Inline Functions.
173 
174  inline bool RoutingLayerGauge::isHorizontal () const { return (_direction == Constant::Direction::Horizontal); }
175  inline bool RoutingLayerGauge::isVertical () const { return (_direction == Constant::Direction::Vertical); }
176  inline const Layer* RoutingLayerGauge::getLayer () const { return _layer; }
177  inline const Layer* RoutingLayerGauge::getBlockageLayer () const { return _blockageLayer; }
178  inline Constant::Direction RoutingLayerGauge::getDirection () const { return _direction; }
179  inline Constant::LayerGaugeType RoutingLayerGauge::getType () const { return _type; }
180  inline unsigned int RoutingLayerGauge::getDepth () const { return _depth; }
181  inline double RoutingLayerGauge::getDensity () const { return _density; }
182  inline DbU::Unit RoutingLayerGauge::getOffset () const { return _offset; }
183  inline DbU::Unit RoutingLayerGauge::getPitch () const { return _pitch; }
184  inline DbU::Unit RoutingLayerGauge::getHalfPitch () const { return _pitch>>1; }
185  inline DbU::Unit RoutingLayerGauge::getWireWidth () const { return _wireWidth; }
186  inline DbU::Unit RoutingLayerGauge::getPWireWidth () const { return (_pwireWidth) ? _pwireWidth : _wireWidth; }
187  inline DbU::Unit RoutingLayerGauge::getHalfWireWidth () const { return _wireWidth>>1; }
188  inline DbU::Unit RoutingLayerGauge::getViaWidth () const { return _viaWidth; }
189  inline DbU::Unit RoutingLayerGauge::getHalfViaWidth () const { return _viaWidth>>1; }
190  inline DbU::Unit RoutingLayerGauge::getObstacleDw () const { return _obstacleDw; }
191  inline DbU::Unit RoutingLayerGauge::getTrackPosition ( DbU::Unit start, DbU::Unit stop, DbU::Unit position, unsigned mode ) const
192  { return getTrackPosition( start, getTrackIndex(start,stop,position,mode) ); }
193  inline void RoutingLayerGauge::setPWireWidth ( DbU::Unit pwidth ) { _pwireWidth = pwidth; }
194  inline void RoutingLayerGauge::setType ( uint32_t type ) { _type = (Constant::LayerGaugeType)type; }
195 
196 
197 // -------------------------------------------------------------------
198 // Class : "JsonRoutingLayerGauge".
199 
200  class JsonRoutingLayerGauge : public JsonObject {
201  public:
202  static void initialize ();
203  JsonRoutingLayerGauge ( unsigned long flags );
204  virtual string getTypeName () const;
205  virtual JsonRoutingLayerGauge* clone ( unsigned long flags ) const;
206  virtual void toData ( JsonStack& );
207  };
208 
209 
210 } // CRL namespace.
211 
212 
213 INSPECTOR_P_SUPPORT(CRL::RoutingLayerGauge);
214 
215 
216 // -------------------------------------------------------------------
217 // Inspector Support for : "const ::Constant::Direction*".
218 
219 
220 inline void from ( Constant::Direction& direction, const std::string& s )
221 {
222  if (s == "Vertical") direction = Constant::Vertical;
223  else {
224  if (s != "Horizontal")
225  std::cerr << Hurricane::Error( "::from(Direction&,string&): Unknown value \"%s\"."
226  , s.c_str() ) << std::endl;
227  direction = Constant::Horizontal;
228  }
229 }
230 
231 
232 template<>
233 inline std::string getString<const Constant::Direction*>
234  ( const Constant::Direction* direction )
235 {
236  switch ( *direction ) {
237  case Constant::Horizontal: return "Horizontal";
238  case Constant::Vertical: return "Vertical";
239  }
240  return "Unknown Constant::Direction";
241 }
242 
243 
244 template<>
245 inline std::string getString<Constant::Direction>
246  ( Constant::Direction direction )
247 {
248  switch ( direction ) {
249  case Constant::Horizontal: return "Horizontal";
250  case Constant::Vertical: return "Vertical";
251  }
252  return "Unknown Constant::Direction";
253 }
254 
255 
256 IOSTREAM_POINTER_SUPPORT(Constant::Direction);
257 
258 
259 // -------------------------------------------------------------------
260 // Inspector Support for : "const Constant::LayerGaugeType*".
261 
262 
263 inline void from ( Constant::LayerGaugeType& type, const std::string& s )
264 {
265  if (s == "PinOnly") type = Constant::PinOnly;
266  else {
267  if (s != "Default")
268  std::cerr << Hurricane::Error( "::from(LayerGaugeType&,string&): Unknown value \"%s\"."
269  , s.c_str() ) << std::endl;
270  type = Constant::Default;
271  }
272 }
273 
274 
275 template<>
276 inline std::string getString<const Constant::LayerGaugeType*>
277  ( const Constant::LayerGaugeType* layerGaugeType )
278 {
279  switch ( *layerGaugeType ) {
280  case Constant::Default: return "Default";
281  case Constant::PinOnly: return "PinOnly";
282  case Constant::PowerSupply: return "PowerSupply";
283  }
284  return "Unknown Constant::LayerGaugeType";
285 }
286 
287 
288 template<>
289 inline std::string getString<Constant::LayerGaugeType*>
290  ( Constant::LayerGaugeType* layerGaugeType )
291 { return getString<const Constant::LayerGaugeType*>(layerGaugeType); }
292 
293 
294 template<>
295 inline std::string getString<const Constant::LayerGaugeType>
296  ( const Constant::LayerGaugeType layerGaugeType )
297 {
298  switch ( layerGaugeType ) {
299  case Constant::Default: return "Default";
300  case Constant::PinOnly: return "PinOnly";
301  case Constant::PowerSupply: return "PowerSupply";
302  }
303  return "Unknown Constant::LayerGaugeType";
304 }
305 
306 
307 template<>
308 inline std::string getString<Constant::LayerGaugeType>
309  ( Constant::LayerGaugeType layerGaugeType )
310 { return getString<const Constant::LayerGaugeType>(layerGaugeType); }
311 
312 
313 IOSTREAM_POINTER_SUPPORT(Constant::LayerGaugeType);
Store various constants.
Definition: RoutingLayerGauge.h:31
+
DbU::Unit getViaWidth() const
Definition: RoutingLayerGauge.h:188
virtual void destroy()
-
const Layer * getLayer() const
Definition: RoutingLayerGauge.h:171
-
Round
Definition: RoutingLayerGauge.h:44
-
DbU::Unit getPitch() const
Definition: RoutingLayerGauge.h:178
+
const Layer * getLayer() const
Definition: RoutingLayerGauge.h:176
+
Round
Definition: RoutingLayerGauge.h:42
+
DbU::Unit getPitch() const
Definition: RoutingLayerGauge.h:183
long getTrackIndex(DbU::Unit start, DbU::Unit stop, DbU::Unit position, unsigned mode) const
-
DbU::Unit getWireWidth() const
Definition: RoutingLayerGauge.h:180
+
DbU::Unit getWireWidth() const
Definition: RoutingLayerGauge.h:185
std::int64_t Unit
unsigned int getTrackNumber(DbU::Unit start, DbU::Unit stop) const
-
Direction
Definition: RoutingLayerGauge.h:36
+
Direction
Definition: RoutingLayerGauge.h:33
Gauge for the detailed routing.
Definition: RoutingGauge.h:48
-
Constant::Direction getDirection() const
Definition: RoutingLayerGauge.h:173
-
Definition: RoutingLayerGauge.h:41
-
Definition: RoutingLayerGauge.h:46
-
Definition: RoutingLayerGauge.h:40
-
static RoutingLayerGauge * create(const Layer *layer, Constant::Direction direction, Constant::LayerGaugeType type, unsigned int depth, double density, DbU::Unit offset, DbU::Unit pitch, DbU::Unit wireWidth, DbU::Unit viaWidth, DbU::Unit obsDw)
+
Constant::Direction getDirection() const
Definition: RoutingLayerGauge.h:178
+
Definition: RoutingLayerGauge.h:38
+
Definition: RoutingLayerGauge.h:44
+
Definition: RoutingLayerGauge.h:37
-
unsigned int getDepth() const
Definition: RoutingLayerGauge.h:175
+
unsigned int getDepth() const
Definition: RoutingLayerGauge.h:180
-
DbU::Unit getOffset() const
Definition: RoutingLayerGauge.h:177
-
Constant::LayerGaugeType getType() const
Definition: RoutingLayerGauge.h:174
-
const Layer * getBlockageLayer() const
Definition: RoutingLayerGauge.h:172
+
DbU::Unit getOffset() const
Definition: RoutingLayerGauge.h:182
+
Constant::LayerGaugeType getType() const
Definition: RoutingLayerGauge.h:179
+
const Layer * getBlockageLayer() const
Definition: RoutingLayerGauge.h:177
-
Definition: RoutingLayerGauge.h:45
-
LayerGaugeType
Definition: RoutingLayerGauge.h:40
+
Definition: RoutingLayerGauge.h:43
+
LayerGaugeType
Definition: RoutingLayerGauge.h:37
-
DbU::Unit getHalfViaWidth() const
Definition: RoutingLayerGauge.h:183
-
DbU::Unit getHalfWireWidth() const
Definition: RoutingLayerGauge.h:181
+
DbU::Unit getHalfViaWidth() const
Definition: RoutingLayerGauge.h:189
+
DbU::Unit getHalfWireWidth() const
Definition: RoutingLayerGauge.h:187
void divide(DbU::Unit dividend, long &quotient, long &modulo) const
-
double getDensity() const
Definition: RoutingLayerGauge.h:176
+
double getDensity() const
Definition: RoutingLayerGauge.h:181
-
DbU::Unit getHalfPitch() const
Definition: RoutingLayerGauge.h:179
-
Definition: RoutingLayerGauge.h:44
-
Definition: RoutingLayerGauge.h:37
-
Definition: RoutingLayerGauge.h:36
-
Gauge of a Layer for the detailed routing.
Definition: RoutingLayerGauge.h:77
+
static RoutingLayerGauge * create(const Layer *layer, Constant::Direction direction, Constant::LayerGaugeType type, unsigned int depth, double density, DbU::Unit offset, DbU::Unit pitch, DbU::Unit wireWidth, DbU::Unit pwireWidth, DbU::Unit viaWidth, DbU::Unit obsDw)
+
DbU::Unit getHalfPitch() const
Definition: RoutingLayerGauge.h:184
+
Definition: RoutingLayerGauge.h:42
+
Definition: RoutingLayerGauge.h:34
+
Definition: RoutingLayerGauge.h:33
+
Gauge of a Layer for the detailed routing.
Definition: RoutingLayerGauge.h:75
-
Definition: RoutingLayerGauge.h:47
+
Definition: RoutingLayerGauge.h:45
The namespace of Coriolis Core.
Definition: Environment.h:24


- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/SearchPath_8h_source.html b/crlcore/doc/crlcore/html/SearchPath_8h_source.html index c94f5eff..7b9a0dd6 100644 --- a/crlcore/doc/crlcore/html/SearchPath_8h_source.html +++ b/crlcore/doc/crlcore/html/SearchPath_8h_source.html @@ -68,7 +68,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/ToolEngine_8h_source.html b/crlcore/doc/crlcore/html/ToolEngine_8h_source.html index 68cf6236..bd85b548 100644 --- a/crlcore/doc/crlcore/html/ToolEngine_8h_source.html +++ b/crlcore/doc/crlcore/html/ToolEngine_8h_source.html @@ -58,7 +58,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/ToolEngines_8h_source.html b/crlcore/doc/crlcore/html/ToolEngines_8h_source.html index 1c3de58c..cd9e6f12 100644 --- a/crlcore/doc/crlcore/html/ToolEngines_8h_source.html +++ b/crlcore/doc/crlcore/html/ToolEngines_8h_source.html @@ -57,7 +57,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/annotated.html b/crlcore/doc/crlcore/html/annotated.html index aa0bf82f..57b7283c 100644 --- a/crlcore/doc/crlcore/html/annotated.html +++ b/crlcore/doc/crlcore/html/annotated.html @@ -64,7 +64,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1AcmSigda-members.html b/crlcore/doc/crlcore/html/classCRL_1_1AcmSigda-members.html index 0e62c366..3b4c67d6 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1AcmSigda-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1AcmSigda-members.html @@ -53,7 +53,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1AcmSigda.html b/crlcore/doc/crlcore/html/classCRL_1_1AcmSigda.html index d44a0e6c..dd960da1 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1AcmSigda.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1AcmSigda.html @@ -118,7 +118,7 @@ Static Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1AllianceFramework-members.html b/crlcore/doc/crlcore/html/classCRL_1_1AllianceFramework-members.html index 388baa2b..1e5d18ba 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1AllianceFramework-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1AllianceFramework-members.html @@ -94,7 +94,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1AllianceFramework.html b/crlcore/doc/crlcore/html/classCRL_1_1AllianceFramework.html index ce11ee0c..c9ae276a 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1AllianceFramework.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1AllianceFramework.html @@ -905,7 +905,7 @@ Static Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1AllianceLibrary-members.html b/crlcore/doc/crlcore/html/classCRL_1_1AllianceLibrary-members.html index f5c164a4..a3ca0df1 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1AllianceLibrary-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1AllianceLibrary-members.html @@ -56,7 +56,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1AllianceLibrary.html b/crlcore/doc/crlcore/html/classCRL_1_1AllianceLibrary.html index 1e7c6b95..a6797531 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1AllianceLibrary.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1AllianceLibrary.html @@ -175,7 +175,7 @@ Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1Banner-members.html b/crlcore/doc/crlcore/html/classCRL_1_1Banner-members.html index 396c9221..8563afaf 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1Banner-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1Banner-members.html @@ -67,7 +67,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1Banner.html b/crlcore/doc/crlcore/html/classCRL_1_1Banner.html index c4ea84c1..54dd11e1 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1Banner.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1Banner.html @@ -495,7 +495,7 @@ Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1Catalog-members.html b/crlcore/doc/crlcore/html/classCRL_1_1Catalog-members.html index 004154c5..79939076 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1Catalog-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1Catalog-members.html @@ -60,7 +60,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1Catalog.html b/crlcore/doc/crlcore/html/classCRL_1_1Catalog.html index 37b7fbee..c45156ca 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1Catalog.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1Catalog.html @@ -292,7 +292,7 @@ Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1CatalogExtension-members.html b/crlcore/doc/crlcore/html/classCRL_1_1CatalogExtension-members.html index ea59206f..49dfdf2b 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1CatalogExtension-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1CatalogExtension-members.html @@ -69,7 +69,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1CatalogExtension.html b/crlcore/doc/crlcore/html/classCRL_1_1CatalogExtension.html index 6c0bb979..49c779d5 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1CatalogExtension.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1CatalogExtension.html @@ -691,7 +691,7 @@ Static Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1Catalog_1_1State-members.html b/crlcore/doc/crlcore/html/classCRL_1_1Catalog_1_1State-members.html index e129d8aa..99ca3f8b 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1Catalog_1_1State-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1Catalog_1_1State-members.html @@ -83,7 +83,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1Catalog_1_1State.html b/crlcore/doc/crlcore/html/classCRL_1_1Catalog_1_1State.html index 05af363e..76562332 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1Catalog_1_1State.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1Catalog_1_1State.html @@ -781,7 +781,7 @@ Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1Environment-members.html b/crlcore/doc/crlcore/html/classCRL_1_1Environment-members.html index c414b319..347edc59 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1Environment-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1Environment-members.html @@ -96,7 +96,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1Environment.html b/crlcore/doc/crlcore/html/classCRL_1_1Environment.html index 1657da55..26692d4c 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1Environment.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1Environment.html @@ -1136,7 +1136,7 @@ Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1GraphicTool-members.html b/crlcore/doc/crlcore/html/classCRL_1_1GraphicTool-members.html index 0ba3caf0..4212b7da 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1GraphicTool-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1GraphicTool-members.html @@ -54,7 +54,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1GraphicTool.html b/crlcore/doc/crlcore/html/classCRL_1_1GraphicTool.html index 82a58bbd..252c68d5 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1GraphicTool.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1GraphicTool.html @@ -127,7 +127,7 @@ Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1RoutingGauge-members.html b/crlcore/doc/crlcore/html/classCRL_1_1RoutingGauge-members.html index b9759fe8..50a8dd7c 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1RoutingGauge-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1RoutingGauge-members.html @@ -68,7 +68,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1RoutingGauge.html b/crlcore/doc/crlcore/html/classCRL_1_1RoutingGauge.html index 789e7f94..58c0a040 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1RoutingGauge.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1RoutingGauge.html @@ -451,7 +451,7 @@ Static Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1RoutingLayerGauge-members.html b/crlcore/doc/crlcore/html/classCRL_1_1RoutingLayerGauge-members.html index 667c77b0..ae6b4d7f 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1RoutingLayerGauge-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1RoutingLayerGauge-members.html @@ -47,7 +47,7 @@ $(function() {

This is the complete list of members for CRL::RoutingLayerGauge, including all inherited members.

- + @@ -70,7 +70,7 @@ $(function() {
create(const Layer *layer, Constant::Direction direction, Constant::LayerGaugeType type, unsigned int depth, double density, DbU::Unit offset, DbU::Unit pitch, DbU::Unit wireWidth, DbU::Unit viaWidth, DbU::Unit obsDw)CRL::RoutingLayerGaugestatic
create(const Layer *layer, Constant::Direction direction, Constant::LayerGaugeType type, unsigned int depth, double density, DbU::Unit offset, DbU::Unit pitch, DbU::Unit wireWidth, DbU::Unit pwireWidth, DbU::Unit viaWidth, DbU::Unit obsDw)CRL::RoutingLayerGaugestatic
destroy()CRL::RoutingLayerGaugevirtual
divide(DbU::Unit dividend, long &quotient, long &modulo) constCRL::RoutingLayerGauge
getBlockageLayer() constCRL::RoutingLayerGaugeinline
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1RoutingLayerGauge.html b/crlcore/doc/crlcore/html/classCRL_1_1RoutingLayerGauge.html index 15a4e48f..a9a55e12 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1RoutingLayerGauge.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1RoutingLayerGauge.html @@ -91,14 +91,14 @@ Public Member Functions - - + +

Static Public Member Functions

static RoutingLayerGaugecreate (const Layer *layer, Constant::Direction direction, Constant::LayerGaugeType type, unsigned int depth, double density, DbU::Unit offset, DbU::Unit pitch, DbU::Unit wireWidth, DbU::Unit viaWidth, DbU::Unit obsDw)
 
static RoutingLayerGaugecreate (const Layer *layer, Constant::Direction direction, Constant::LayerGaugeType type, unsigned int depth, double density, DbU::Unit offset, DbU::Unit pitch, DbU::Unit wireWidth, DbU::Unit pwireWidth, DbU::Unit viaWidth, DbU::Unit obsDw)
 

Detailed Description

Gauge of a Layer for the detailed routing.

Member Function Documentation

- -

◆ create()

+ +

◆ create()

@@ -154,6 +154,12 @@ Static Public Member Functions DbU::Unit  wireWidth, + + + + DbU::Unit  + pwireWidth, + @@ -682,7 +688,7 @@ Static Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1SearchPath-members.html b/crlcore/doc/crlcore/html/classCRL_1_1SearchPath-members.html index 1dbac10e..635d36f3 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1SearchPath-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1SearchPath-members.html @@ -64,7 +64,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1SearchPath.html b/crlcore/doc/crlcore/html/classCRL_1_1SearchPath.html index 81f0ca82..78c614bb 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1SearchPath.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1SearchPath.html @@ -452,7 +452,7 @@ Static Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1SearchPath_1_1Element-members.html b/crlcore/doc/crlcore/html/classCRL_1_1SearchPath_1_1Element-members.html index fdc3b248..3993c61e 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1SearchPath_1_1Element-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1SearchPath_1_1Element-members.html @@ -56,7 +56,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1SearchPath_1_1Element.html b/crlcore/doc/crlcore/html/classCRL_1_1SearchPath_1_1Element.html index e2ef89ac..f5d699bf 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1SearchPath_1_1Element.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1SearchPath_1_1Element.html @@ -190,7 +190,7 @@ Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1ToolEngine-members.html b/crlcore/doc/crlcore/html/classCRL_1_1ToolEngine-members.html index f35bca54..1c71affe 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1ToolEngine-members.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1ToolEngine-members.html @@ -64,7 +64,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classCRL_1_1ToolEngine.html b/crlcore/doc/crlcore/html/classCRL_1_1ToolEngine.html index 9efa7e69..bd9bb651 100644 --- a/crlcore/doc/crlcore/html/classCRL_1_1ToolEngine.html +++ b/crlcore/doc/crlcore/html/classCRL_1_1ToolEngine.html @@ -198,7 +198,7 @@ Static Public Member Functions
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/classes.html b/crlcore/doc/crlcore/html/classes.html index e850bc29..f89e68c0 100644 --- a/crlcore/doc/crlcore/html/classes.html +++ b/crlcore/doc/crlcore/html/classes.html @@ -73,7 +73,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/crlcore.tag b/crlcore/doc/crlcore/html/crlcore.tag index 7bfee306..f582984f 100644 --- a/crlcore/doc/crlcore/html/crlcore.tag +++ b/crlcore/doc/crlcore/html/crlcore.tag @@ -1218,8 +1218,8 @@ static RoutingLayerGauge * create classCRL_1_1RoutingLayerGauge.html - afe17db013bf6a933c2af4e847bfd7918 - (const Layer *layer, Constant::Direction direction, Constant::LayerGaugeType type, unsigned int depth, double density, DbU::Unit offset, DbU::Unit pitch, DbU::Unit wireWidth, DbU::Unit viaWidth, DbU::Unit obsDw) + afb41e7be2a6d258a691aacbe7a78154f + (const Layer *layer, Constant::Direction direction, Constant::LayerGaugeType type, unsigned int depth, double density, DbU::Unit offset, DbU::Unit pitch, DbU::Unit wireWidth, DbU::Unit pwireWidth, DbU::Unit viaWidth, DbU::Unit obsDw) diff --git a/crlcore/doc/crlcore/html/dir_1d3beb215ce2defdb52d6dee9d41bc7a.html b/crlcore/doc/crlcore/html/dir_1d3beb215ce2defdb52d6dee9d41bc7a.html index 26f3e6b1..7d5b6eba 100644 --- a/crlcore/doc/crlcore/html/dir_1d3beb215ce2defdb52d6dee9d41bc7a.html +++ b/crlcore/doc/crlcore/html/dir_1d3beb215ce2defdb52d6dee9d41bc7a.html @@ -53,7 +53,7 @@ Directories
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/crlcore/doc/crlcore/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html index fd176d64..4d2dbfb3 100644 --- a/crlcore/doc/crlcore/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ b/crlcore/doc/crlcore/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -49,7 +49,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/dir_d23e13494685c82fafa9ef5abb5746af.html b/crlcore/doc/crlcore/html/dir_d23e13494685c82fafa9ef5abb5746af.html index 851c484a..7ce94844 100644 --- a/crlcore/doc/crlcore/html/dir_d23e13494685c82fafa9ef5abb5746af.html +++ b/crlcore/doc/crlcore/html/dir_d23e13494685c82fafa9ef5abb5746af.html @@ -49,7 +49,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/files.html b/crlcore/doc/crlcore/html/files.html index a2e42eb1..a3896dc8 100644 --- a/crlcore/doc/crlcore/html/files.html +++ b/crlcore/doc/crlcore/html/files.html @@ -61,7 +61,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/functions.html b/crlcore/doc/crlcore/html/functions.html index c18d113c..cfe71a93 100644 --- a/crlcore/doc/crlcore/html/functions.html +++ b/crlcore/doc/crlcore/html/functions.html @@ -72,7 +72,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/functions_0x7e.html b/crlcore/doc/crlcore/html/functions_0x7e.html index f078a7cc..07cdfc66 100644 --- a/crlcore/doc/crlcore/html/functions_0x7e.html +++ b/crlcore/doc/crlcore/html/functions_0x7e.html @@ -54,7 +54,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/functions_b.html b/crlcore/doc/crlcore/html/functions_b.html index 2388de51..f29e2a5a 100644 --- a/crlcore/doc/crlcore/html/functions_b.html +++ b/crlcore/doc/crlcore/html/functions_b.html @@ -48,7 +48,7 @@ $(function() {
- +
Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
diff --git a/crlcore/doc/crlcore/html/functions_c.html b/crlcore/doc/crlcore/html/functions_c.html index 34168bae..331bfcbc 100644 --- a/crlcore/doc/crlcore/html/functions_c.html +++ b/crlcore/doc/crlcore/html/functions_c.html @@ -51,7 +51,7 @@ $(function() {
  • create() : CRL::AllianceFramework , CRL::RoutingGauge -, CRL::RoutingLayerGauge +, CRL::RoutingLayerGauge
  • createCell() : CRL::AllianceFramework @@ -68,7 +68,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_d.html b/crlcore/doc/crlcore/html/functions_d.html index fa6bc00b..f47a61d4 100644 --- a/crlcore/doc/crlcore/html/functions_d.html +++ b/crlcore/doc/crlcore/html/functions_d.html @@ -61,7 +61,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_e.html b/crlcore/doc/crlcore/html/functions_e.html index 7dd3d5f1..28d9af34 100644 --- a/crlcore/doc/crlcore/html/functions_e.html +++ b/crlcore/doc/crlcore/html/functions_e.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_enum.html b/crlcore/doc/crlcore/html/functions_enum.html index ce396a57..613d7a6e 100644 --- a/crlcore/doc/crlcore/html/functions_enum.html +++ b/crlcore/doc/crlcore/html/functions_enum.html @@ -55,7 +55,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_eval.html b/crlcore/doc/crlcore/html/functions_eval.html index c30c6a70..5bf738d6 100644 --- a/crlcore/doc/crlcore/html/functions_eval.html +++ b/crlcore/doc/crlcore/html/functions_eval.html @@ -88,7 +88,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_f.html b/crlcore/doc/crlcore/html/functions_f.html index 5e992c02..126ee156 100644 --- a/crlcore/doc/crlcore/html/functions_f.html +++ b/crlcore/doc/crlcore/html/functions_f.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_func.html b/crlcore/doc/crlcore/html/functions_func.html index cf5b7e95..2f2d2491 100644 --- a/crlcore/doc/crlcore/html/functions_func.html +++ b/crlcore/doc/crlcore/html/functions_func.html @@ -83,7 +83,7 @@ $(function() {
  • create() : CRL::AllianceFramework , CRL::RoutingGauge -, CRL::RoutingLayerGauge +, CRL::RoutingLayerGauge
  • createCell() : CRL::AllianceFramework @@ -579,7 +579,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_g.html b/crlcore/doc/crlcore/html/functions_g.html index 639afa9d..76390704 100644 --- a/crlcore/doc/crlcore/html/functions_g.html +++ b/crlcore/doc/crlcore/html/functions_g.html @@ -258,7 +258,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_h.html b/crlcore/doc/crlcore/html/functions_h.html index f632b3bc..5adccd24 100644 --- a/crlcore/doc/crlcore/html/functions_h.html +++ b/crlcore/doc/crlcore/html/functions_h.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_i.html b/crlcore/doc/crlcore/html/functions_i.html index 28174fae..3a3a8662 100644 --- a/crlcore/doc/crlcore/html/functions_i.html +++ b/crlcore/doc/crlcore/html/functions_i.html @@ -96,7 +96,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_l.html b/crlcore/doc/crlcore/html/functions_l.html index 5741e136..09e8b27a 100644 --- a/crlcore/doc/crlcore/html/functions_l.html +++ b/crlcore/doc/crlcore/html/functions_l.html @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_m.html b/crlcore/doc/crlcore/html/functions_m.html index 50bb02e3..45efb2d8 100644 --- a/crlcore/doc/crlcore/html/functions_m.html +++ b/crlcore/doc/crlcore/html/functions_m.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_o.html b/crlcore/doc/crlcore/html/functions_o.html index 23252088..f38ee2fd 100644 --- a/crlcore/doc/crlcore/html/functions_o.html +++ b/crlcore/doc/crlcore/html/functions_o.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_p.html b/crlcore/doc/crlcore/html/functions_p.html index 6dd016c2..bb6bf25a 100644 --- a/crlcore/doc/crlcore/html/functions_p.html +++ b/crlcore/doc/crlcore/html/functions_p.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_r.html b/crlcore/doc/crlcore/html/functions_r.html index 2955e40e..41e0dfe1 100644 --- a/crlcore/doc/crlcore/html/functions_r.html +++ b/crlcore/doc/crlcore/html/functions_r.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_s.html b/crlcore/doc/crlcore/html/functions_s.html index 23beeda3..217219ef 100644 --- a/crlcore/doc/crlcore/html/functions_s.html +++ b/crlcore/doc/crlcore/html/functions_s.html @@ -150,7 +150,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/functions_v.html b/crlcore/doc/crlcore/html/functions_v.html index a24a2c94..86484be0 100644 --- a/crlcore/doc/crlcore/html/functions_v.html +++ b/crlcore/doc/crlcore/html/functions_v.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/hierarchy.html b/crlcore/doc/crlcore/html/hierarchy.html index 6023b2f3..dd75c156 100644 --- a/crlcore/doc/crlcore/html/hierarchy.html +++ b/crlcore/doc/crlcore/html/hierarchy.html @@ -64,7 +64,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/index.html b/crlcore/doc/crlcore/html/index.html index 3ac8813c..736b5e52 100644 --- a/crlcore/doc/crlcore/html/index.html +++ b/crlcore/doc/crlcore/html/index.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/namespaceCRL.html b/crlcore/doc/crlcore/html/namespaceCRL.html index e4c02ec2..bcfd0ff6 100644 --- a/crlcore/doc/crlcore/html/namespaceCRL.html +++ b/crlcore/doc/crlcore/html/namespaceCRL.html @@ -149,7 +149,7 @@ Typedefs
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/namespaceConstant.html b/crlcore/doc/crlcore/html/namespaceConstant.html index 775fe923..17b32515 100644 --- a/crlcore/doc/crlcore/html/namespaceConstant.html +++ b/crlcore/doc/crlcore/html/namespaceConstant.html @@ -149,7 +149,7 @@ Enumerations
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/namespacemembers.html b/crlcore/doc/crlcore/html/namespacemembers.html index f6ed6928..dff1eebf 100644 --- a/crlcore/doc/crlcore/html/namespacemembers.html +++ b/crlcore/doc/crlcore/html/namespacemembers.html @@ -85,7 +85,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/namespacemembers_enum.html b/crlcore/doc/crlcore/html/namespacemembers_enum.html index f8d10431..28f83268 100644 --- a/crlcore/doc/crlcore/html/namespacemembers_enum.html +++ b/crlcore/doc/crlcore/html/namespacemembers_enum.html @@ -52,7 +52,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/namespacemembers_eval.html b/crlcore/doc/crlcore/html/namespacemembers_eval.html index fd43598c..83b57559 100644 --- a/crlcore/doc/crlcore/html/namespacemembers_eval.html +++ b/crlcore/doc/crlcore/html/namespacemembers_eval.html @@ -67,7 +67,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/namespacemembers_type.html b/crlcore/doc/crlcore/html/namespacemembers_type.html index 96d35000..d7f0a280 100644 --- a/crlcore/doc/crlcore/html/namespacemembers_type.html +++ b/crlcore/doc/crlcore/html/namespacemembers_type.html @@ -52,7 +52,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/html/namespaces.html b/crlcore/doc/crlcore/html/namespaces.html index eb5af43b..152fdb8b 100644 --- a/crlcore/doc/crlcore/html/namespaces.html +++ b/crlcore/doc/crlcore/html/namespaces.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/crlcore/doc/crlcore/latex/classCRL_1_1RoutingLayerGauge.tex b/crlcore/doc/crlcore/latex/classCRL_1_1RoutingLayerGauge.tex index 4e53d24f..fc3406f6 100644 --- a/crlcore/doc/crlcore/latex/classCRL_1_1RoutingLayerGauge.tex +++ b/crlcore/doc/crlcore/latex/classCRL_1_1RoutingLayerGauge.tex @@ -45,7 +45,7 @@ long \mbox{\hyperlink{classCRL_1_1RoutingLayerGauge_ad61cdf130c8b739bb44a01cfd59 \subsection*{Static Public Member Functions} \begin{DoxyCompactItemize} \item -static \mbox{\hyperlink{classCRL_1_1RoutingLayerGauge}{Routing\+Layer\+Gauge}} $\ast$ \mbox{\hyperlink{classCRL_1_1RoutingLayerGauge_afe17db013bf6a933c2af4e847bfd7918}{create}} (const \textbf{ Layer} $\ast$layer, \mbox{\hyperlink{namespaceConstant_ac081a99f2b64361919ed5d9f37c0f9af}{Constant\+::\+Direction}} direction, \mbox{\hyperlink{namespaceConstant_ab2e46a17cc373a268c5c24fa0e2067e5}{Constant\+::\+Layer\+Gauge\+Type}} type, unsigned int depth, double density, \textbf{ Db\+U\+::\+Unit} offset, \textbf{ Db\+U\+::\+Unit} pitch, \textbf{ Db\+U\+::\+Unit} wire\+Width, \textbf{ Db\+U\+::\+Unit} via\+Width, \textbf{ Db\+U\+::\+Unit} obs\+Dw) +static \mbox{\hyperlink{classCRL_1_1RoutingLayerGauge}{Routing\+Layer\+Gauge}} $\ast$ \mbox{\hyperlink{classCRL_1_1RoutingLayerGauge_afb41e7be2a6d258a691aacbe7a78154f}{create}} (const \textbf{ Layer} $\ast$layer, \mbox{\hyperlink{namespaceConstant_ac081a99f2b64361919ed5d9f37c0f9af}{Constant\+::\+Direction}} direction, \mbox{\hyperlink{namespaceConstant_ab2e46a17cc373a268c5c24fa0e2067e5}{Constant\+::\+Layer\+Gauge\+Type}} type, unsigned int depth, double density, \textbf{ Db\+U\+::\+Unit} offset, \textbf{ Db\+U\+::\+Unit} pitch, \textbf{ Db\+U\+::\+Unit} wire\+Width, \textbf{ Db\+U\+::\+Unit} pwire\+Width, \textbf{ Db\+U\+::\+Unit} via\+Width, \textbf{ Db\+U\+::\+Unit} obs\+Dw) \end{DoxyCompactItemize} @@ -53,11 +53,11 @@ static \mbox{\hyperlink{classCRL_1_1RoutingLayerGauge}{Routing\+Layer\+Gauge}} $ Gauge of a Layer for the detailed routing. \subsection{Member Function Documentation} -\mbox{\Hypertarget{classCRL_1_1RoutingLayerGauge_afe17db013bf6a933c2af4e847bfd7918}\label{classCRL_1_1RoutingLayerGauge_afe17db013bf6a933c2af4e847bfd7918}} +\mbox{\Hypertarget{classCRL_1_1RoutingLayerGauge_afb41e7be2a6d258a691aacbe7a78154f}\label{classCRL_1_1RoutingLayerGauge_afb41e7be2a6d258a691aacbe7a78154f}} \index{C\+R\+L\+::\+Routing\+Layer\+Gauge@{C\+R\+L\+::\+Routing\+Layer\+Gauge}!create@{create}} \index{create@{create}!C\+R\+L\+::\+Routing\+Layer\+Gauge@{C\+R\+L\+::\+Routing\+Layer\+Gauge}} \subsubsection{\texorpdfstring{create()}{create()}} -{\footnotesize\ttfamily \mbox{\hyperlink{classCRL_1_1RoutingLayerGauge}{Routing\+Layer\+Gauge}} $\ast$ C\+R\+L\+::\+Routing\+Layer\+Gauge\+::create (\begin{DoxyParamCaption}\item[{const \textbf{ Layer} $\ast$}]{layer, }\item[{\mbox{\hyperlink{namespaceConstant_ac081a99f2b64361919ed5d9f37c0f9af}{Constant\+::\+Direction}}}]{direction, }\item[{\mbox{\hyperlink{namespaceConstant_ab2e46a17cc373a268c5c24fa0e2067e5}{Constant\+::\+Layer\+Gauge\+Type}}}]{type, }\item[{unsigned int}]{depth, }\item[{double}]{density, }\item[{\textbf{ Db\+U\+::\+Unit}}]{offset, }\item[{\textbf{ Db\+U\+::\+Unit}}]{pitch, }\item[{\textbf{ Db\+U\+::\+Unit}}]{wire\+Width, }\item[{\textbf{ Db\+U\+::\+Unit}}]{via\+Width, }\item[{\textbf{ Db\+U\+::\+Unit}}]{obs\+Dw }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} +{\footnotesize\ttfamily \mbox{\hyperlink{classCRL_1_1RoutingLayerGauge}{Routing\+Layer\+Gauge}} $\ast$ C\+R\+L\+::\+Routing\+Layer\+Gauge\+::create (\begin{DoxyParamCaption}\item[{const \textbf{ Layer} $\ast$}]{layer, }\item[{\mbox{\hyperlink{namespaceConstant_ac081a99f2b64361919ed5d9f37c0f9af}{Constant\+::\+Direction}}}]{direction, }\item[{\mbox{\hyperlink{namespaceConstant_ab2e46a17cc373a268c5c24fa0e2067e5}{Constant\+::\+Layer\+Gauge\+Type}}}]{type, }\item[{unsigned int}]{depth, }\item[{double}]{density, }\item[{\textbf{ Db\+U\+::\+Unit}}]{offset, }\item[{\textbf{ Db\+U\+::\+Unit}}]{pitch, }\item[{\textbf{ Db\+U\+::\+Unit}}]{wire\+Width, }\item[{\textbf{ Db\+U\+::\+Unit}}]{pwire\+Width, }\item[{\textbf{ Db\+U\+::\+Unit}}]{via\+Width, }\item[{\textbf{ Db\+U\+::\+Unit}}]{obs\+Dw }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} \begin{DoxyParams}{Parameters} diff --git a/crlcore/doc/crlcore/latex/refman.tex b/crlcore/doc/crlcore/latex/refman.tex index ba6eccc9..393116cc 100644 --- a/crlcore/doc/crlcore/latex/refman.tex +++ b/crlcore/doc/crlcore/latex/refman.tex @@ -34,7 +34,7 @@ \vspace*{1cm} {\large Generated by Doxygen 1.8.14}\\ \vspace*{0.5cm} - {\small Thu Nov 12 2020 13:59:16}\\ + {\small Fri Oct 1 2021 19:23:11}\\ \end{center} \end{titlepage} diff --git a/documentation/output/pdfs/CheckToolkit.pdf b/documentation/output/pdfs/CheckToolkit.pdf index 699a491339c1f57bd61f7df0213933825e54a6dc..a8a5ad4a726f9ca7f0e0b1f3912d7899e524a090 100644 GIT binary patch delta 40155 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

    Ur0hi=%xEjW}^A9VOk8 z^2V_sMQJ1SKV#3<@6B}HE3I-|E)i#&w8k~>Xsy0Q>s{}@_3r~{zPF!r4~39ebsRvsEuTQBfi*QLiv%WS6+?s|wLDLG5uNd=gdx$8KR|}DjG%~y zOBI}i!$^q4pdBQl9E>(=`GT?}QPl=T*egGP=x=!W+uiRnciO%;ymq{{ohC0XF>O_C z!!;~zn;2~9m}bryA)#BPT*0ITf!(t%7@OhI0<4Syp|!;FxX2Ns2+Xv=8)MX?mcOom zij3b!EwNJkvy9)z5EyA8(TyoapIA1*T@$lNH%4kvE{ME>E7J|oSEXHJ;H26582WkB z=;vf#?F{^*Ito1rvstx?7cL)}J55?;hEWTt!O&r9;!o$42j4g+l|i%le#2moHYc7o z#rW?7jF*f%Jv>2fG}F%V6IcV3jKxPwH9fIeQQN>rS2$f0t`Uy7aeZS{GhZY$PzAnDb4jk_TJ!sD)YHf*Dy<#Vp-{ zXzjltZUs{pPBYaoSQD+4%zA8)y`esr%4*qFeM%))H~ocriXLS<>0IGLf0Q8b9Wrlka?;-?kv(S8mDaE zrj3S|x;ZfI;p|1TVr3Kp6z%IQf;wQ)0LZzuYHOCv448(ewqBUy1h^{~@gb0i5e8zb z`nz}sArP4np}6<&M#c;)4={Nj++Xm@1jfs!6NR69dx<5LDW%0SY2+As)bbc*R0*ROoeQ>Wzg4}LGZ)2hg$RxwC!m*=Ux`9ruYrB z`q1FnBCcnyiepalZ@`RVtA8hb_G%TbafPkzw?`$kP3Zc0V|-Jajf(jm+zCim?!u)- zJb8Pc$1G%uAU_sRpguaBKRSRBPOO&_3v^!}#Qw=RQGfh0=lG3a;fgNSnB^+k>ZZpjJj5)_nPU&)LmFsZO zX`tg%=Oy*aDOj%V;Sk9wT~4iX9TPf3+W@7@sa3ACLWcvD%sWAsC*RbWC*L>P1^=RY V848zur~)4fI5aT|B_%~qMheBDSGNEF delta 49806 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

    Tssv# zG;~AH%m@JP--bdA65vXsHg`9-hg_VK{ftZ0Vg7FO@NIYJR&~G5<$tmPO{sJZ2>*2; zj5|&PG$oxZqcgXMmsIR)$qxs`-8)Ut-Dwff(fRz&`x?>6$cW!xdh zU-C`1`39DfW6vqV?F=-q`BNiO?J4F!bXA+dR@nGd83eM*x{eU1aS?|}oZFTa^H`%c zqDJ}5bbku$FdXaQ+sF)Ox?bq<;W&!Q4U^?+Jk~i8j8x%DJtMPgxvo=1LVX0`dpAol zEeS4%X;zpQlPe|$M40MX&*ayNqxJ19GGg_$zO>>b!_{ds^sD!D%(D0-hU{2q){}@%i7dxS=Jz<1zd~KR<_jX z9};CdWn1>j-eI>yyH{~&!X3OH2`Y!bgR=>wb~<0A#J4RZ+kxEuGB7Voy+N(S>qdX= z&oAQi4PJ9yR$Zu650_P&=0R$oE`S02S(d#qXPV3urmEtQnglTBt(5WHEQ-@ZyA(hujm~2b@}(&>$g(yeNy&AXvXxT% z(WS5u>Uot|*NIuXksuLRw00%d_5q}7secwTSGWOY*OQ%W?Fs6`dN1(XB|S#DZA`sr5Hz(IU2N>j0VrnRAga~bmt?lk4VHy@$vpGyT81PV8chxmBrEON~1-yV^ zD$F-qOjDDlvt`Q9@EB)V5{2gf4@NK*gh-33T771}%*uWBen%D5C)!CI(=%%LHGgYC z6;yo(u3ATj^^{St!-3dSRPK~Y=8J=hI-MGU^gT;NUzP$1Z&eu|J}Z^#ab%wKzN-P+ zNLIjJ>XWSKH_@D3PjqP9x$|9fftePGzg4`iDW=KF#BK zJh8?r$pGTI(**0(>+^M5gzxtJR)3?)*Gx1hphEmM_qLzE-0vP7v7t&2dn(E*T+<(0 zKK6F|u_rr}!SUJqQ>8sndY>Jv`FO`Q^^dO|UF!zm!6^TzjN!&bBklfpCtLV&cYpuz zW0fhi{krRqN|3QJLB8jIO67mJAo1}?S>zBjQ1k)4D$yzbNL4T6;Bo4z27jfsSE|=g zB-I_GP+qW4B&h zT&Ms(&nC(eB=N#=Z}99v>pyMBTwI+ZL(v^G-PCs<|0VGRD=lwkA90^AsBOIOV99BCA z$DBn8;*yJ~`Vhqlq6v+Zq=>~Vs;;BggS~Q=my>+HKcpfV{H`3Gon}RqR(V;#C5{t3 zV1L=P%1#fn+5X$=1+bJJOW=bjks#1;dqXjWKj|oa;RGW}NkfPU53u7%sU9!vjzp91 zWYx~!cQh9qk;WboBSBbnb-VNWEsn0?-irt$AyxDbLwOrx|9)8+nSRA|hBcqy)tzwvth)g`8U^=b1aEMP<(_Co9ubf0>rE`uftP0cJls(}O^_i~HGh;nmau}dwQou;#wbufF$$SG2c*7B-x4Po`M zEG8~HQhS)Dvno#~_Qz2+AI!qy8{gX45m*&8OM;b`?ZwFqn3k~L>#(`el*RBsU%)+d>wwkO?ce8V9;X-qH$Y}94k!6bUtVD!P(I)=jF^f&P-9M+xHFFk zMc2`>!$=QPVjUd2AwyU+*m!tW)q2e-^31dxejq}lXf5>^_m7M);(3SJJ z1`IPbywczpNE8YYBrFVbohZWCf@KrxBRBN~{2&l%Q^I12)$7>kQ=VGow3dOIqlqw% z?8Is#_A+P+jq+uYxv>!1`;WTUkVLteDLtJ|G6zTm5AtJsGk>fE!5l%5Yrd^?ZCtE} z0)iCh_U`Y4nHs}ykLU!PRalYf+#P58$>78+3id+oZsd;8HZemQ44gzTCDl6i1|N~Y z4j`Y^6IvXs3La4ntWYvaAt8F$2kt8RlP45fI{>(T0B1J$sjKVZrU5Ied-A$7Azpgc{Z34QB}sVmpYAnUY+jEAihE_NWryM@HA<2#MkQ#0 zac_M!BCM4jUUOj1c`x})E-_cN=A<+D^zce=5SVR&SAQ@y#67&SFrt_k{BV-yg;kU@ zYH)*X#0`Kh>`!?fa5&3NDznY03}wq?S5bd5A(yKt#wxFcu0h4 z50p1m{wSTh^)z?Kbp8Ye0M-&Ax4^Nk4V_rWh{M+85gDLbw-r`yf*VPzU;Zbznk zhJ$sWdkQS}UENh;`R;b{@a5eV@PMI(4{{?rn14|*Odw5H`FDWxFag{nN!Krnf36ny z%g|Z@L~#R>yQ5ueMUXKJ#26L;U-8xBmxT?HQiF%p{nvWI>0$>)oRKG$hM8W_u3x8* z<@>)bu2z?0Jpu=U-2^5e5_YPXHE{LQPXU>Z6<#01I-Hn9F{Yv14{`ITF7J%`VW;aE z%701zlf@wt!?cQfec`uf_3llz9WgOdLUqKfxg8@#XeXpDRUi=wZ(D%4SwJu!F zyX)}uv4R2(y`2yQ`m6Mvyit5j+bPaomVan5E>kpuVRvbxD*@zSHRDg_W=*r%?CIm_ zV)g0n`bZ-Xi2;Hd>+Ow)kZ1}J+79Ng-`2vr4N0$r41~M<4Rn`>TA23UH#3Cl?;+Tx ztf6V{41c+Mf2qOJUjO-Ld;GEEruq@`Y-gKZ*pB8&W^zq(XGo(2cGrZhXK!dx5`VO9Bjg#Cds$&fhd%YO4%ax zg#UlRj(vsVQMEf-Xx0Px7VNuF_K9ZTuK?c#jn|9&n{SKjjf`Uk8;o3oNL`n3$9!tC z3)+_1&=})Jtf3U#8@~c=&Q4SADSs5g3c{#)tKAtZ7t8CL53M>+45ZCa9Qt%A00Ra2 zo-dd6S6zjKBGP?`)E{1;*%0XUM!i2apH^Ekj(GcC=nbW;neba0ibOko;_&y`_9elF z54{2e`CpV&KoEnuq$b%5C@Tuc+(F{)tM2o2 zy}r*&{nk}Z@@c?sXctN6EB7{r%j20gKhsONsvz+B zCjAFlY>Y6I0htt&;E5FiHZha&4Jd!jSzB-8xD|fSuh1sN!YN{g7m*aP*aD8NBwoaq z+D?PP%)szC%8Xl&Jhhd!>0j3_1LKuki9xDZKMlZEXs z(Zf&T$;m%Yv=khW(jFcmPFOJidh-4w4j$qEehV<-LI(fNM}7@LB9Kse-ZB`U{PhI8 z81X0|1Tii{7bMD%qOw%QYRi9#J650&9=0Y~yQ=~LAXYKTCkY@Rycl%a8pp;TXLqf! zb4^XWmTL`;=PUB&Izz2-x{*llbKH?O_>@x(k`*)M&cHiU$T zZPgjR#A&w3UZz^9R}_DNNDv~dM{Lk!5}=|0DM5;JtL6Q~cn>r*51qn^+~pDn(@I5r zi*m$Oxn{qs^N{7q;MxZ?LvpKQX<0vhc+D_@$TlQf{f-Yag&2;CF-B~Aw#j@dE67@W zFLUaYq>>^E(V{8ILs^fRis%qUL>}Vg&x4V1z87*9=6UP@c|lQCBS))MHu&`SWS(`Br$xHR7OQmQ3ts_QUGd$p2>}i8 zpp6@0Q$yV8wzq$|50Xj#dsS9|woa7sc*pl!c1iANj)7koDOptaMLJ(TKPKl*fpO#X z%kz4@n9tJWa&AD4^O^btr!1YrP*vpgm|lnza{GoKK*eW z+IszYX6FMOq6P=labkp}v#-hK+iafLkrkKgATFue&82_)@{O)^CG~#yEZJ1h=-^s< zeBLb5&&Gz=lu#Uru#|pV80%vwLlG;}(=R?f2o#}EDvN-HAo)+0tW%$11Vv$)1y0+i zM%%(dmt##>T&k!7?b+hVOnB76k>vGlIvwT_KkW@V_jmDhTBPHeTh7cJ2ud-4;0UMEOGWdPJ-j#8CfUum+H4onevK=+w zBToSnN@o3f5Y+xX6lsr`5JA1FXCzt4NZ>*RdxA=dxSfpNX?rq4(@LwX|AQb)_OXyb6ykEz(frFnN&DlY8l;8Iem{h;A5f}l z>MgV(?OT5hb;qrf?765QyII0%#kHRK7Q^p3BFS4~xh%=AxuTNpeld}!`>=?xs`B4G z%iwAm7`~Vt8gzNU7b&;7$$a1Va+8Rl=9houfB(@i?N_S_7Z4g@Jqg(QY8Y$%dU{cE z6z}T~r~~n}t#UqyIf@kX)PddfhToios|s8kq^pkKX@Aff-HbibbT5u-xL5#AM>)+l z<}LeT8$cUK`LiYjvN8SLAT1@5Sa}5&K-(Jp{{i&=hCo5t*p~Yr0Ca>H6Mm>|*JFR) zW}D4wzL;gnqj@hoZu7dzOaDd9E#F=sGE#Shd0r=9XNz?6nwLb)OCCcdQj8r{eJ*}X z5wl8RpSWrXc$2vAo?g0Y++_}s>GXCw6HnW;(eaQbOEb-OSJk0O*th^Sf% z^4(uQY_r0E`GPy$^D-&Uw|tbwh+uzuOyeBCt!(Zq=!8+z$CF6bq8n8y50xibt&w+Uu z-PA8i^%>7L^*=m3fR=nbXzNqhyYA3qH>Z$5#gT@K>yb7;?(2UiajP4rmuYuf{nzdf z^ofFU#86C%>q(bM{{!8oJD8IJOB1s-lJ*9Z(WWVrRGAh6Axe{MnIV5I^5Hwz@9f#d z&IboOFI&%o*5M1z9F4f-!U--NS0k#aqa;PlWlk`4-tO=D!>-@!o*uNR(EH!{owF0K z9~=c;zYniC)_9+JgTOm^<_!jZ&|tK5+5{<{2lYuN zRt6?W3*i`2SNEYxft29uSp1X&%DaHM#B@0uUq_SCWV}c$a0-9)vLgCFTI>@@D|anW z@36S*a1LR-{`nmixH=ZOvT&9}$0{-=gHqaH~?d zA&L}gshu)}WWs;1!#Ig1R#dK#3%p-d3vWb^Th@hldAk z3D483aU6e6vvn`Jh{y3V`_h?D!)!Ge$4RzI4JWBeWHD?VAX1K@sI2$33E`I{gfd*M zA9o(3EHAlin+YIOPNKck{8a4GG>vySO${2225*96zdt(hpP%)-(a4BNbpnq+$1$|y zS!nOaE-NVa^l5E1*ClKFu_Qz6*gNN)5vrbVgJpkKr583MuEPe|L zH6gcjT)r5l?tA_8Z{QuBq-r|dqkgF@Ht(vTf4Z(PR1x@y%}V+gQRS683T19&b99pj znGKT-o)!W%Fq82OD3c$G1%JpDe)q57I>kaRs`1QlE+pCwKv8tWtR$)yUBgHM!LgN% zwi`LMmE9V}{`a1_a5$t!jH-i_|d09=%<;jrpbnvGtznB&CI;+cS4v!d4@qZvL7IiTj73U}K z>eoP0cqD-iqC@~gP3?;);Q@^D&4$&krA}!H*U7XK~ahcVH+4f?ZEv>WO zVvdV!?EK;OYabH<|`+YerLP18rdwE+Cj;&hPB$A$g_)OVQ%V4Y1uZ{WnE6EW|__Hb+oLtRkFM`PjY2+ zOPgSzQW&dsNq^0&fFhJabhW{~c+BrUeZJeSx4YGJv;C*?8T>+49L5;pTv?o;lv|6R zUCeU@JbPB%^A`jb*>@KWnGhvJe$8EMqOuDX<0h!M?{SH6(vS!#!x2wom$9YAPRa+> znIQ`{4OowJL<6R?c_h3q1;jz(w0PLvf4SL(LQ|qNO@EuuG^T?P<1zrWL;`HLkwrDm52nUIPluW#6uipQ>zS*rNkj+8h0stl=wUHs5<8TS_ z3Q?n(#h48;bBnL)3D|odSOfrX;@kqrQU0R{ag1Z+yxZggF{(1oOl&Ad)qHvthz>~* zkJGP(hkt{lVmj`sp<+bc*A1Uhwk*u6+`yrJd$kCK5TP6q!kz&o9NPkDfN`!Z0ci-& zF+fZ=4=aVTLJTytsKsSjPt3~e7vOG|<)(}*+k(#h3P7kt0=pWZe5m(bEbEXf1d5q+ z*~l`VXS2p}9pwQX33j@#-d{hgO>BiiIYG2ju7B{nsxAF`lGV+sQ4Fs85hY_JiHj8= z5Ck?JBg}dh%}mu=RHZ8D=4NzJn}vOOIjN?$$XBD+MP9o&^bxCtM9Do{U`QO`N195% z`LMlRe>fQmj6s)bl%1~@SF605Evh;6cdLnZKkiET0=8_n>u2mz%@Ju>ZEt@0a%*=T ze}DXPf4{l8-mXtK4|ngc?@ybUL?4fXJP&PmcxX5FAh8j`O0m8Ew0`(}eY3Wob^wSY z$z4>HTC7kwscyxE$bSMnhpB+xEbS_={`YQuzYWnN(AhY)$N8~QF-VxE0Pso2uDi$2 zYv)2A@;gibEQMfwq5Ut0T7A~VQwJ1KN`F(fpF2H}fkGf$kN;PL90ZUfmc0u8dq4pD z{!pP4d#+*~PJL5Ji6l-trt)1NdkEq6Pm9MIY--g6#lf!T(Nhu;NcxyRDG`h{5EkTc zSUf4yY`yzU77x4Y-R5R>bN#UUTYpcw1cRN0k&cC>vyWeD?E(fEzVsjht?u;ISD_aN zLn;~Ebkp?rKome9n#K+!Pfv|PO^E7}kRPKU2Md`#tUaHDtpa-OY6r5&W_EOn+Cn)251qSG9jKNfBqcd#!S^No|&s2A=F}AoMjhN+g`Rkda$-LB-)-f%kyHnT$%ne zWI~ME!#+Di>{TWd<32$%$?VgE;Yr5ipv6wlV7BpcK8CoLdxJkFvhP8khuZI=#!UK2 z;<)P@*5u@=&6HBDrMy;F21Z5MVMCmq|iZCf4N zcE|P;+qP}n=_DQ7wr%fx@4xr>5BF(}I;v5l)~a=_drlW0Jz)s~>^TeA=8kNCTF;Ov zYHqwjt8X|^zN9`h2(WSAB3w^XljcwuXn!DNO$6jg)=_)z8}FG*WkZakX};*Q7w8P8 z0$FU%{ebp{;QHEOv?iQ6@ZLxbl9$7x2@11v+WZ=qmJh{JhLyl_fC$a|DNWjKHIseB z$rfhG(9H4L@Ug?14B)2dF~5f{6MEV5r}>U0}&G zZbdR{brs*c&(cl@D;47TuEQVNiN3(@4qX{o`AJM!);!^h0Wwwom~Gbp9jg+&i5hag zgC;U}Nk0$^lZNyWF!{F(mv&r}E0{UY?rdfjEmg9K=sSuqg+BHHD}vbCHTlP|7#n~o zo=DDA4gmT?j1dK-+I!B9Q@l~+=Vmp-r36JCFQ{6u-DjEKtH&A0AM_Cq(8~Z67oGje zKvEN=bUq}fBX1O1vn!Jh;U^joMJWC+_M9(8}1yq&mo^%2SrkvGcV_L zpSR4oqSa*_xP2rDkZrpmg_K>q2qP2#{XztwQ8>vyp(J~Sv_hZ!v;l(Ug#Ux3M*aJ@ zvCl&?3>$r^S2Thkcy_ioh7{UWk_-QcL|n)G%l_e&#ufeMDliaff8doa)!UwT014s1 z?Ro0pd`8@KaE!ORaYO0vNo2cP=pRltlU*z+AEZ5&||p>hn6)?UHVAXX^T5%Q4S> zA(u*|)hsz@NHctCoRwt)YdKfnYnE~Vx;lSYtERljVwEDqo>lmC9dNiN7#ei#WlIlA z@L;yzF<+Sc*Y0=O*B<+cn{+;C1C z)2%Hc7sua`b0`6rP8LX~wG(F$z0eniu2;SKVL1#iV`6o5P*X{>x9!kxr4o%dID6Ks z)JDBihRsJkJ@~YzZ zi2|^)yKz@jR2r;P08)?okz;0kNJv79rI{`XTh#CR%)|y^USyuFm}NuoN5lY}bb+-C zLVVE%*1raXU-Ia+b9h4oG@*bEezjqAP}a|Nuub9{wi*cERw;~IxWBCk`ps*X_RQ(< z(*i-4WqXP(+FHQ{vhGBQXkGFrEEnXdYI3#a=Ne?}8T9wtfIxp|3l?4FlY{NwOyoZPCt5zku z_d9*NqMR~1t>b!WVONYiLuhvFr#<(kT8H!w6(&k`VwFJ>hQpG6NozH&HraCK1bTQw z4a;=e8)ge7z<_dP>P&o0{zqVn0YgoSRA}m*dnHH#-}}qcN7d3Vk0Bk1wi5XDEN{2~$n#h4q=RsZ(=Nw8w@x8*ihMfz zV4g!;WJmgSFo>Kl6?fwddCLKlBlk=Xjd&;?tm!mzXUi1_=0^&m847VM()!Rq*_#U&}{ncN0ASz+Jx< zcHVv!5(j(o2MpuD-)i`JoalRDWxT|=N&>)9H=OBx;BWQ&<8A{UCotm4;}0$Z$1XL% zLA04o#@WDK*=DobLCFU76uX$nn^8ZIcIhYSXX&IrX1rfFb*cVMXu6j`#X%zIgQiXT z(_{gddgk8jylK`Z9R}X&xg!xZn{>Cc2tPpeslf`izKpdO zP?EiL*V^z&X>auy}m;!)7A4$-Da0US4lmgDHj)!YQ9-pybaJ5K_#>F zuH~Q4)SvEIcYVppKhg|ypQ&0{ySIC)k>+SH6NzVFzTT%*n+&w^fxk)XG4pvHSswK8 zBK2Nx>C`$J?UCK=o#Y?7W=>x`Crf^u+YpGnULNY%Tup}_i;s6q9UnUC$?Ax>Jejpl z&gbK?I;cy8!r=lIqJK~PX#c@#i9mf!sB!7Wc*{K3UnrHwE^5eOI2JYt-yhhvP)i#M zwChc($urzc*qrN%1XqKojBDqs+l8JVZZTEh+O5Q3r9)m3)^eHB${B!9JO`blXo!P) zBnTP^*?A7^hhR1ht;(W2+1l_`XCFp?RB?5#Lap#Xks87_{X6SA&ad&_S5~16c!x zG;QqGIg!6|^z&umgPk~8NQW>SFgpE+Y3iZZ$5zK6gtWmd_gZ?^xx4>vt{c^Ve})i~ zB{Ji6>e60`7>E-e`{bnO+duFR%)a(py4X7o?@1DoW5!mvDHb5AvL*x+aE2G2@p~@v zP?w5vQJanUjHzDRnYwaKQK)L69fASynX2p=rWh)`y))!vw^bPYi|i#q@P1aBLfD#@ ze<(;OuBGEy2BK7!97Y2m2bc*BA~5Uv1+4@Ji~Rt2Ry5prHG&*MxxJIC{r*Z0&W<0f z8c9@J+$`Wcn}9?d3|Tt&oh$?I;~uD!J-`Q=N=S^3+%Sw1O$wVttQhGKfdo)-a3vnD zg3B?GlZE>XKHR-`x_fz9sL5a_FqO-{xiuNjHHDHFV?>|Mzip06Mti0lo)FYZtzBuq zcZC+#Z)C%bL<|)Zrn`TONXE#vJ4x0%z^`5%QWJ_ZP9)8)*z2c zY!JdPMVNs6+a_&rRP>?2Q3)UfYsvlVI@$clk}ZgkrKn9r+VHQIzoZ|AgidouEN$cf zvb@B;quQ!DsDYMAGj)c(CS+82^2l?%rpz<~H<1LRNIgy;Ev0DIjVz>l5G9!5-b{Ej zZY@>x;3=W;qBUfo?8s}LBu%BkKGe*tlPFHREc|16gjeIk@rE@&O(`I{ovt|Ylxe8j z8=~_(%r6Y|+OVWsB5sfU;Z6zy5)-|75HqEFLGscRGLY5CW=7w86hEbMy>oHWqW+^b z1?5YaU!_iFZH2cp%LH5Bisz{~%h$x|#BS(xY;0ub`r(I(BFS?2)9Hvj!Z_g7F_<6MQ|1*OnjQ0k zNkNm7`dz7M#=@i*U2clpyV4-H}p}Jz7=#uLS166+_3nyst!U zl;2;jkAICG5lP_`6`)28WJZ}3ZWr1uhCQuLfPV$KHcJ{m=P!7FL`A9!;_%NxB2M2j~7VJ4DG8Z0(Tmmkm;x=?^i)l%aQ^vzRfx#B0r znUT;&_Wb$G6K)d=`X^ggT3g57mCu^3(A-Y!g&fY#hM!%o1F}0xiOSwosDFu^rhR_X7jdDik6J%Uf%DZNxXuzb1&MIb3RRhEpWD$l;d9}r8k zqlodbpdKDtJNr!7vj`(?bdF8-81hM#ywsOz-;uV6Br`|U!xQ^a2W)m+2zofZy_KJ`)Zjd$=W#?N+cRA5u9ZWa+dRQK-> zb%+}KL)WnaUMhVfeC!)_L5Tq6M9ajMQ$JvET$70l0kc}UiJjYS+QI-QVtoNef5{DH zstyX}>?qFN5#q>MAst4veG+IkL*I4EUHEKqD?h=Ysi!`$y&d0Um&XzISWv#2UG^XZe|5eT1H>H7PlAY|5-hxx65FEuuE`DsiSmyC`3|ZaQ zd3zqUjLC#KN&sK75DD&274;PRDhUGa)L0{bO=frYb81Y?)$8iQIk|IRc1X5OV#w1$zrOW~l;YI|$ zgpALF?Ydxlrj~l?umuzn$p{(P!!Fpgf79*Yr+R$%uJhv5=jNi1KWG0UB@Eh=WW0M! zMHFyHhxhT?gN^##b2P7fuPFxtlyIb^F#Tl!B3x$p5sPlWw4SD&#+#*i?O)@|_quZf z+42~@nZn?*>75EJ9w%K*D*>!(_!EY@jJg`GL+tY07;T8GmlD>t`%Ss){;8>{c^HY- zOg}BcM8g2?<_fk)(=Tu1%(QxR%C>G8o3A%ZL_0m;GKsD)qgY_0xx;3x$N9-XL&Bjq z|7$W>S~31R2s){0O{YVY z!EE{E_3TVR6poVick)1_Kt%8I>hiqNO(WA%qq8hK+N!h`PS+`}A66M>)3PP7OoS~` zv1q-6J;UlcM(+XQQm>Sc*H&Sk>#csdqsOtc@ThF_956rw%JU-W_D=GAHi3r=!0ZN2 zp&j`-;wOy>CDYdZ12YjIr@9~bUu+tMh$7NIC77bR7krp#f0w~i@u|A6Qzzc=na0i> zUL%Wdbu2PDBbB6MkyvANG2v=i+KCEh{i4o#a~pvJ zS?9HC(Ymtdyvpu&&?cDzT49G0im_BvZsnfbtrMIeWr~ByXLz7$ux0$R^**Qj+`1(A zA{7sQB=(?2Q@D{qb&r+h_0@razX^m&$c4TJ;Pk45$?&gGT#e!BK243J+TLe5b!!JF za%uz#W7hlc4P15vy8h8Au%;VW$^1)!@=EJXReYq2yz$Fl_=RJWDp(qQ6pd~mDXBM*1Ps+^~$BRkU7x*gd9~5P~n($ zLMXKyN#2eNw?*BTup#LG@SwtabbdJ2i7{@<2-EG3CKZJ^{i#sZr&$Rp5S6-jT!=vz zXdjYfMJ1}+l2N!+Of2ymitJ9v{Uzu_#;F`72tZwBjuU2ZABW7&mABJ_iX>%?LOe$q zvSuEfM@)EDTl?YOla}LjGD=GWXvMjOR8>QSaWyfYyxD}@4OLe{!4xd(NybIyrikq* z<8}$Z{IT3tAP3T!aKA3SYX$HITTO_zG}aQSHr<^mX;=%t!=OTz?{8-W9_<*F?U*Z? zU}|!IcFGS1t;fmR(1ABXxE!3sx3;occ9T7k&WZC1e-~=}^C96{@|a8-FzT&>Suh69t3a?JoX^@88A8IeiGvW#kq(NpupGrZe%WI%5ER6cTQ3nJzJaMm<|X{=(d&8sWVn=poW0JgY;$9fod)_vScNt)4TYU>*8qb6XRRdCx*x zg3I}OA6WUuuYzaP0tC7QK7@6KVCmvywXm21pOOJthlcV>9q~)k;^`MfL z>rX-#{FRIm+)Y8I@8`2`iaC}Jc@(|^(+&dw3`!kN?;;I}q)vXo z!r?Z9&uYH1{pPewO68EV%XO)w0kyghL&Pi!Lhls%20VzNif8Pzo=i{mJLW3BSWxHM z?nW$##mGSH@dqm7PO{oBC%gdXdw`-3Als4-A0LCL=#&T&J~(fNh`}a1Ie<6|!mYRr zbE=yXoHBcd{jLD;7*l6Z@ybqsAz!AZRLAR{D%l*faKcWN3a+mvooD*%@^Eh{lJx2k z|KqTb!{doH=D{2^Ug60RsYTd}$Gs2>-VU&1<2Xr$jyR*&q}sBYKJHW`ha=!J7KrSu%H8-ey7*SJ{do1mq5-;@GH> zf{QX_e6a|?nZRB#RnG|Is~IXWHI3YbRZ<*8mPDThE`@|8&YuHYslr@60S7x{q*22M z@07FsU2?ITd;*R$_cTQqF;`V70R!4pR@6zhQfrk~-q(+CE;a!%fj!17Lj#t6Y`KTm zfQ1tQ1r94TKO8LGxd^OzXk;v48)!T>Sr%6MVr*ApMmVjNy-o8!e%w3rNh!6loNh zqO1ws={yRTQW{$V*mWOzpC|i`%M7iJ16!bQW5n&Y*se>wuhplYw_M*mjt`QM8HAIR zj}F!KF!KqadHX>{h4&8sT#H;&W|ppU>UQzMYb{D3x0GDbWyWDO(V0P))-qqOqm zpC(^-#$WIXci7T>fglt9c>_;QJCHXca3nQw^RG9v&r3I(Jkt_UFxLdocf*BgB>1CF%UcEa$|JSsP?F-5d%)_} z5V(foeEv)kqIsI>*~iC?024O(z1{YsjOFPtpkUvj)@g4z6A}pTC^W%Q+ulup%T56> zvLPHAdzl7avLMng=)At>B7JX|r@GCrxc z{>#bZ^-Z%@Hv?m^a7t>z?~f5wGUCt@+WdZYq@i7a*vaPC-knz%;6wINjF1hWU?nVQ zMUFu^paEK|mii1Ig*M+s|_Ol5o#K&Xo*?H#9U(`~Qd z&p9xtRJW=wRs48GLU1dcn=$bR?i0ddS7FxiWOXEL|BkwbzUErD01I^qTm#=l)pWnfW@jBHAbn4bk9KF$`(d+>8VrppTy7r~ zpQj@7UCw8WXTGn*#vJq)54vfI~&{#4{A8^4bgFcx;x^_buZ zag1lJ2twWfxKEu9J$W`RdA)0YZUn?zGt{(xuboUE2A{=h+5KySB;-wkfYy*?H)U#F zt*+G`P_zV@I;TL@nLyvMZTxm@bvka1bArKJk>7P@gZ*}8yjWKaen>hs$oU!lp+TpN z!*?GH1)AL%)HMnlYlpyNiu;OWY59!T z2uIlS)ZL52gqxkYtCW#7EByKBZJ|s4_=y_7d>F3s=PKGbY`1aX^ZOmr?MEbb=w?ua zQ=z^^kUImvYTG#gFq4EZ#iBt%g+QIzot7*)#xx3tq>X)jEJ9nugqCW^onLBsxsF79H+1%LSA1*na*QU6D z?*xd2bGUW90@SF!wq`@# zgfQWhFo!N>-{=8IJDsM?Kn{^UoeK1-QoRwdZlf5j6(vM7Le+95_H+0*m@*1Gxo!5( zbNd2KjOU<9PLF)Z4bhDkXz@buEBX9S(zA>cd1#$7ISEOJ?!75b)?>&G_(hQ5k7|n@ z%Qi!pDU&kqoF~c-u^-B3#7J>#Pz3yW?+qrcXl-04xwgZ7-V3?_gmasNeJEN5S!D(Y zWSv60uLGnUk#x_AgG7?#Ngd?!=hs{CQ}*+5JN7$JH2bI25~ZF z5|qH_6A5pvpzRJ!dvdXs?VizrtVTJT?trt=u5_)5+$x~4%&D25RC+#j&ac`Q8 z@%!Rt|9vaBq*;;$e&}h-BWfT6DJ#10h=R&n*Jn2>T{eRT$Wd5iVTU7UF1$1#anl`; zZ4NMHb!PuE8cu)}GqAN*Q9VFW!1^HFBPJ>@Mx#>1#v)V;MUsdK3UTnRQHmKTPzED$ z!1Lg5dm4wtOtIf1B$0{-QOf<%Hg{M#!=#8!`S8s11Za!g9L@!t9gjeNua&1PRFYl- zFDno#N9nTS-|Cc-6V!NJBu0n$i&k^cQ$Ja*Bm1d{i#W+)azfRTxkmIiNr?aBduoR6)cQ zIrlucyv3kdhmycwwTj?+|8~whRd_2P&lE97%Yem0WV9^+qm9C~cQ%lXj}>gW6IBDV_GVA$(Q6LK=Wn_sEc#iK^StshXdW4p zx@H4R6?da`fb%*F%b8*#)nvk*DrzAqI=t9NX~-O@EbO^)G1$faf+#Yv8(S~-H9{!G zzB(E31~?>gQ9PSk*YnBbtDrftrP$-j)mLfDM4}Ni!1!9$i7$1;MdIb>B?E>VMe``y z+d{MC9V8=VBu6MV3v6cS=FsHP*Zt7p@T`+#IzXC38cq31U6hpe+<#lwI5CWb7Q1=r zDEB?u$(FcOw~2He&-s!lIhZpn4;zLq{AmU&6~nE!_kE6kr1-};BfcDFN7Z$5t4?yd z0Z&rKDXu)lp+ZEp`LtLWdR(ZwVHFdWyfEn?{C=<`SZ%9KftoTmSqBXhAo*}pSHZPt zv%fA>P$g?*w=$bQjya zB7uSmKYmGZLiuMWb>VWQna+U5OE79@T(X2=iuMLEbN9S2O3g>U3XuREW_iOH#N=dW zk0xNQp{EB9pH2{Q1isC`fsYu29hWvpBZgPKfiIvm=$Xyn$Y#n$JQ^eA5?v8|^c7l4 zeFN`UkS6`t_U-;d|7rV(=%@jzHu67g-=836x1Y6n-f`u)RRcw`7@9VWT{E*>7*+f*r=QEc>Mu}$Jj>uV}&-2E9=e@FY%`dXhE#I?CTqrqMC^Ay1T1f*SIOJ+X z_dY3ZlG5x;chsSg*|zgS*6e48?{z}ll5Wa-y4jg*_t-PPjdPX}>^--#T%i;qShFBaJDDY6P=8jzW&OW9W z&wFT1na6Y-Y9W{qS`GpDJ>*jEhxQ-bdtTCcOQ&1YBNcI&R08+T&lIIDNBC238jj8i z_XNpWL&%25jwTx_Uy0A(#_l5U$FjI4lw*`xhh(RWYPd&orYH4zsZu8aT(=GMWoooh?pWHSIWhxe>i{xY8Jub)e{<@g#Lsl zBiN+k7+ZPHmuSzCBeSi}(S>uKM2x$_X#S#nq4_tKJk9f?bftPzU3&S-;52q#Npcw$ z3YT^#{~-}jjW}%6pK(fSUD3_D>UH1lof#zQ3*a90TCU*W99X_7+O;vEPkuvI+6xI}FTxS4*zu8?KqF+B} zu5(@k6ZHpM36&21k2(b$#j^KD0w#Zw{yOx(iJmhtd5ch1bP?_7z+2+qd4!Lfo!CGP z=oU#U1UE#AiHr@rj}Mxbnw{2Gba5TYb7kiHsfKXDf#~bb<`75$yq&JtHe;j!%v9Gc zsU)J*F%`6$rbAMIfI1-#M7q@4Re_*AA`PZ#0vJ7^H{WU5KAekS%sSro&IGpuQa%Vj z9#nCm-5-x`j-H-dZ+l?}x|51bve8Xi>$cP*RwJtfd+7L`1YWjkLP|N3uZ4yH+;B!y zh(SHrP@%%hU|*-g{FrFQ@ufamO_J#CaVMieYjr;cyS_f82{|LJkFPYHgBqL1f z$O0MAY@%y|ldvwN6lPA^>O;JdF_jvbp9{{31uFumU4BR)WL-r2;I|&~AslVX(bII2Ofgo{xqrG5)qT7-7w43-SNr8=wfHW3J&)xr4BUJABL0D)hDA?zr3c9atK+O;MKI2K?+C)||WoPD5#lm~xRal+0OClsruMoQ#cI;0Y>%O%!u>53+*Dwogr z%mq;!OBVw{pYxJblx{Hw5jQ&6*hCa+p{1d=Ab%tEZ8o<0lBlR_pXbUVk$`!&7+)uT zO+y3dH`^sYW01%_2C5#j7C$Y}eV8Rdirj+!J#*OD*J|2uk%ZZ|P=JBPC!`Bc*Js(Z zbWM>ez_tcG?)XztS|D1Y9IR9wfP|9CvV5t?vfz`29j;VRP+(|z#?=!mlLUQGaJdD? zJ}chra+C$6MVDW9pUk6wBl#(F?B7absQCl#QMo2IS7V32bj{(#g&T-{k2M?Tyc5S1 zDzfJ9o=EAIsw~JD7%6=S7D#}$Jl9#XWo-#+3KBc|+FW054eQh7h8s@~ow>dl^|}@^ z@?%3iVMrZ`nf?Vt6Dt;&?RQ#u2;_)*npq|inrb0linjbx*q2p}u*`+~y`;M$Wvm5o z-X3)1?o>p#RvI{zGznYP%CuUWXAEm<%y})8LNF2$Ez-UbeArfPN=v_>MjbTVSD@-- zuR|o)(C&yysRSp`6;_#g&Xu>I+n;=an zeIETD&}FKp9KN>VUOcq3AYYJ)-~=87{zOVBi5*$L<<;u*t|7Y}&DFOHf2aBYaN< zD&DG3n)>R_z@!XjMlZfG4^E5zO^!Vx%&P?xWl`Yas>6InNN-Kn;@ir4K>7R~I-M(> zR-~7rajSH!BlMn@#b&Tgfp9<#*%sP>aVSGwQP78|^} zM%hf51H@r09?0XGk&LP8vhc5s{L5L-nU-6IdaKu-j3OGPkz#pssnUegGiPd)Zr>w^ zEHJA>D#a!?Vb`?*{%Q8EQjqa11TDP?iHkq#zGHF*!C>Oux&~v_Ss8Ocj9saEh9v)n z50C`;eml9y^FH{@@0)8SpWdAFUlmSdgHk16Yigbuap)O`#9Dk+Tn7*}O+4acqd^|! z1K(@X$I+O1aUKXzFT^`;DAg*p7W(NyQa7;lgc2zUwfg6P9egv~V1sZ{8r9|FYVdl3 zOvGfzISGgc@+9ve^Bn$0 z^CYJ^P4}%+{j78NzP$HomV7k%bBy=kY4=S=&}qYjfst_7Rx$RQ0k$FtB<#0Z*(3qX z^olG+{T?1V#XIg_Edr&)TL+T-X?=&Y;pzTg`N1{-f(wX7OZEmQI&!bT91Jm}=@@gv zdk2=~NjwAOVGL~csodLykYLQQDQP^cq{BYi75K4|dS75BlL~}C1Pr#cY?!VJIi@w1mt#2Vx^lLE0a{H@hkK84)_EgalYP?QXxId(W#bA-FmNlmb>1B=wT~| zEIv(8SyBMd*Tu}I|9T&!MGRn$|Aw=NT9;01oY>z}`n$4MuKy+rwCqwAv$vu^<%C05 zaMNU2HswOd<;LiP@#D^!dER@kNk(6S!+=(smfPQFv?%ZH@4WQLR$Z=em$|C(D4H=S zqPUTnVjU>jUA)7?NMmlG3iw?TaE@(08Lyi6my?_tJgI)JKfpJQ&0o7Ux+$To_sY0pE6P(uU{rEU(_w`RcN2D7-Z z6d~W9B@-|%h6Qp2DUx`?Y&8H04Jrj4nv{y_VYfz;bS#oHVL-q7wdq1mA~84^9pxWG zoyX&taQPTLwlg<6cMwsXkrcW2!i`SrmzQ{5RhbgvF|Xa6Lx&`tHJ0$SchhQq!N}sn zC&TF@Jo%=yrGN>Iw9ypOps(s^qgfp5^n#;%YdqFF@YDI)@7$~X*-g`rvM)kpWZH4o z@0o$L=il>dzc0Q2!pAGur-eYKd15+@Rrq}vI*g$)n+R5kRaBo1)adj+Ky?6HhgFsYUw~xRhiEelM@F|8fb#=r( z+eiFuI_mq`CB%;QqZdG~dg2_;L+ww982Rj>g7a))eF@X~?PPx3o2_3%_+LzjC)AcCHA&t(ZlAVKj?8y0Q|LL|Y`4*af0DT+T6S0CA-tv4I=KW&9 z-7Y=JTR`QEu3B%3rz7%xjVAJK2X>IZGZ)Kpcw_y`@Qn=EySJMdd7nPr7Xa_x%-X0F z_T}%!+NAGIN}TRxqPP|)O|wA`WOqLC2cAD#e^xN$oM{Et$B5eW=cXMd=m5z3W1@0?%A)iy-NGAX%APF6Emvc7D+g%9^3 zfw;7kYbc>U>!x~08A?HmhQj4yJTfCrVcIf%L;79+K-_<&j9X!dzI<}RTpT@^q3sQ> zf~@Wdq13eafs@Zb!~p&J7qm1L3;mbt-P7KH3Q<%SFyxOg|I4I_jrWZpr14=mil^|o zao744iZF+4I|*r(2-w7XejEL?B9zktpYTr~wrVv+!a7&e@%-~(I+lD0!Tf9Ku1m)4 zZcjpvV?QeigclBFmne`xj(*XNH64BJBO(eJkI}SvoN%UodqTZpLf9^^AUuzdK&RYW z&*m>WfVz-@(*Dkh1ggSpZ9R$n(taU?su?z^px~G%4-?8rwosBYeQeqv+Zb%r&c_4V z3p}J&{0z1?c$lqlX5#9W!+>9vD@J0BC^EDlAk0I0e8$LZ>fXeIkSm$Lo|(CnTTQLJ z@mnGC8ujdvpC?QV@IOhzw1g;PgtckggpK2w05*8?bdE?EzZe)4WkH*c5SwAA`&4Ys zgjR?DnDRuB0L5yj2U4}(m+)8K=)KCwh97d$52$>~dz-r+^QN6=FX4OAR0ZHy0UydZ z#`C1NW_Avkp)Y^qvjy4$W_~5OI%jMe;X9G2xsJD9`GzP33fcfgvGO^jbXuWd5xk1= z0&+H|%?i(VNqt@$9(@gfN7W5eQ#lUfqZCa6!x}MIZ48NPJ~r7U(ynt;H;3awdifP@ zm2s_LiRa$?P{QJk@YZNaDc#<{r{Cn=&4}jsj+(xwNRa(xF0QDsWo3i`K_TAY zbWgK%DvJQA$a9K;|E+6OqV6FP-S5$?%RMyoriHLia&?dFiIW}fH3M0TuGf?gP+!80 z5xKvhsFw;$U$~SBu%+I644n#8LFyb@|}mv3|G?oCNr-k@F4RWq6jQ2?lOFr0WqU(9i{Lg~^*PZdfuY>is&|C1*Lbe~==_nVjOz zpvQ}?EgSE4)LJsO$B5eIeguezQ#8FCQ}L+ie+>{uMHd6MN77?)tOM_DDOmkZm*pq! ziD?J4KH{>ENuD&)iyr=!bGXd3F#tDHn zwwRg7d(Ptq z9K#b8kS4GSbr#ja6e7xyPp~B1X3M`nhxI^P8tD~^39je~`WRq;WM*4l73big&x+!3#l#c*_*9wH`#qm(&IT--Z#IW(3 z`2P4$_1<@9Lr>t^lE71UAQg!X`zF@CBB;DgY&CKJxAd)vV>Cc_#i{f&-#AuJ$l&-W zyOkh$48Uv1iM5X>oWR;<-SX+1l6bj{4vdc*du3_ta^Q@YJbM5v%k|!BgDxM18N^T~ z#uUI>R>)AEh3$!K7o9L;Is@b;F4GCRN21L9t9ff`rsY++ndr)8HcQ+lESUpzmS1$p z3r*PBx%{N;WVluYB|XqR-TD`gM>&~78cfRKV6beEi#R!!dNn?f0-6xz`YYU)wI_~7 z?YX3UTVGV;^4pX-^fvkZ z)e6B)reVPuG#a+B5xE`-N5{SA5>`j*C;(Y4Lq?3aB=BihX#Q4ghL!`8*l*J-*`<;t zAa_oDI-9K`LFp>Rk3X`b%gGyVIj_Aiwfc*|szj3~+$XvQi{8y>>VtUmX#+dKWXUtX zpc2wjD)}0RQe^#XGyySYpF4biJ{sut&v!clOr2piE(72eo90sd6JF;$~4y9G;ER*Vc?rI)7! zD){Rh@*gnkj_~OpxSwx&+&Zt|42?@UzaM%U-OI6BkG)ribofA@X|4#teFg5nBMSTj zcw6E8x+5;5hXpiu%au!z79?HXnICwB#V3Ozz+ z7EiT|c~}T3l3C-su;b}Mahd;YO+xn_)cG=|A%%Br4G>?I{Uu;hO*_7J9dJlHj z>On=}RXz&2Kr*lU_)mKFaJ4joa3DRHlY=qfg9m`wpS6R-X$b3F@J26l3SI{N!h_N` z#?mt#Kdhj5X4W}#W+IsW0!D=`g2t}HZ(N>7GfD&vTkQc-tMSGZdkO|&xMJ&}D^SdH z3h9Btg?HCUSG!E$JRv0+|4TJJ8LL@}Xk0Y2{xu$K%MQ0&@3yiIPt5lj-=ihl0!o35 zu^GSz&#DHA^&=BE@m)!Tc9ugTY7(XKQ?{D`GIyVkrZoL?*H)h|X?+)QIl``mF=bP?7-PP25gaY9=GvDR@qe0-iU+ZO^H?G)Af=b}Jnt7c)B(2NOFR7Y!pb1tTK`6*Pmaor$QSvne5^C^s`BGt>XQ zrS&NjBmq)Mn3YYGS&V~`g;ktUNK}MNgp*xZh?AXBh?SY0MVOJ1pOE+e_ZD4f1{qUZ zb7u=eCPrrF|9*VQl2`3g#88K)J+_r7oegQgwep%w&xLJvi{E=@d|uZYoQ2}k>*^{^Rk>==yq=3Q zRW*!KGPGs07p#nO2*kN0`%JsERG=gJ&fP;5G6k910^9(I%~;mqP?@*zGqk|kw=MgN zGaC@nw@-Vj^R%Fc?(a8G^Ho6Ww=uhyh3%jhe|chBQ;+EDaIVq1s56oc5VkaVRVv_n zpq$*X3#49K8DmFi%hCTz4}$Z`)=t)q+atxI6+wd`LD%kDT0$G?TAM`xSIVCYfo`es z+MGjiMyLaVN2cbD{cKDlB8446Soaq9keZu*vF_vbD|2f1N%4|ThP$spLrE<~loncm zUb>gwa#lZ}=B1mua}UF2^`8&VOS$>U%^arq+TA{H{m$4_)J;4KKl3TyDy#YZDCQzk zAy9!(1X1v&V8vJwTO3l*LB)ogV$BCqSj@Di9t`JVWS%Y>->y_UvZH|2@L0YEF#_I_yMyHo(88eE2 zJmLV5TfH)<6-tE2G!K?;%Daqu@~l`U-LT}*DiUZN{**6r-cgs4s%o3sRxd9Kfj~C! zl_8eL<|!%Tsdl*7TIeLNH-R9j$RsIPKrGsVepiT~xrCWk75wi?87Qip1yIs&PH4)o z8K?}Xv`#b#wnZsH>QMC7VtNl1LBc~39spsvhydqh%bTFc6c95{+-g3Ib0Gc<%v&EJ zCNQY2-ACciw4D(XG|^z;(kjt&q#rB|g2j*am$L2kNAIU*9T2(@Fs;9n0bW(x=8IyW zRBj$)b-fe)si0mkjltlhTIVp8lXHbMA|zGV^Jl6Z4)yK96->Eo9_n8(kCzf&GQdA{ z1&|hh$2!ozye~C+`_w?oo-HsJ5XpHE7tZhHI{QyRHILQ;We|}4hW34zsioKw_y<~+ zd^>Z~XB)nB%C+<}D1L#{F`b{Tig+D(+J09ZX0690XEQEkopKnOnd{fBiw@BLPXMm~ zQ2%s-9?;?T=SS-30?VKm6hI&72LoUQ41y&ve*}iX2p9!pU>xxFWD{W0?Zs97$CP_( zpVYMb>NTku_s<)pX5D}OTWZezkGG`eJt=)Iwctr%S!$736?yW&Y33Yb&a;yfx|~?$ zdK~l`==s!pN&IpGmaBSrL~=rx6RTX$gx=6LK%0Vsd%U0ZY8wi15Vub|^5m8TJcJBUY`qAeyg zsftwGOp>Rh%{eno&*^DqI_KXPBq)lKc+oYHoqez*ixdcc#D2S2>@KkL$-&O;;5r+; zxS_725tm#z*>8@k5!KXDk|O3ZC;RBU9bP80Fp0wSYD9$|{*d_dyCBZIEKFkal_Y;c z3}5(JavjXB-e)gg+%Q~gkeL>>`G{>>?>{L`+YVkf8i&wA560}@1Qdx#6?Qx???+_JC@v3omWUGB5mi9#C(6zcX>6E zboku7vLUM;VeM=KoOYKFk+KFn%yV`tG{!+1-o|MOuo-^o+@IJ_UTS|V>w`qG;@OtJ zj)TmM+pOUtR3NfB-elW&i#&sKOFNp;9a;+GH1iD9Y15q(M09oQUOcupIthc~Y1$|3 zPeQ*K6Xu9TXECk@IDcklben(iZeC5(|1%?b{kz$%9oFW_F`;;V-4VqCDXPr}*F0~v z5c@bYa-Q0zOQEphW!kkLY-6f+57;zfq?xdFd0&wvj-*gE)JnNnX~}eniOsRH(hf8C z#j2;B6#ymUxnFQoz2A#>=j}*wF9 zS~Ir__HCyBx~dy-qgSX_tENMT)yEpNK)pd~%s16zJsKU%D;tDgNj(f^cVV1F$?cmq z6pV4$jgpdQeq259{sTUM58(Hpj&EoQjTmQVs3mAaI|@-*O|E_n;&M_Ig;^M+Z7?ta z!w|$6@Bw@Pzx~yOi!gt2&rnUUMm6CIxpZh2ez!20m)`H6!gySMOm6J^WfG^^Z0={t ztW}M0m%=awF$Vm;YZ_FDGg6};-a>=z#77%^-~ur%R)}xJC>gRK%fk59a@2fk-|cdb z`S3J;9a?XBoG<3J`pUHgUmf@|0iW;K7tFCh8q+O!tJ{2&owI*)j@+7wcqCtNHwR)b zo3vVNN^;QXpz#48!0!P~toeZx>tiunY0ZWrI^ zSEcZi80mZx*i(NLF{fxrZK$Y=l&<`+Uw-}YuRs2S{`>!?#w1#*gD$?N0>(4QJKzWS zoRH5kL(-*>n9qAn`wl*@+WG6(FJJ!s$EUxV8C|-FE|UtnC|xiGA_bHL_y9hwluR{7 z9B)I(?S2uq{kq%8dsVrdJ^RKoFCN?Moie58GKk6)9`k=gk^kBMo>zHBO?OKqhSd;Q zEdqQV)oPkNa5arJPO!~&PBBq0Sn48*!aRrZnRS=m1^L^3GJ91~8os2@7mit*iE6$i zt&UUzN*at9!0%B7H^~E+qK-vtz4KKTq^T`sVCZTT_!BP<)4L^=y~6^}XS2}v;!YN0 zRKYL=F$I789yQHLM6f(Vn(GZ^zbq?)Wb3oj*qUz*6Vu(SI3h5NUyyIW@4MzlVR%WO zAwTkFeq?H6cKgG%SlEJIY9oSzB1XRWQp91qe@-(P!64yq9PsOANamg)LyA5NvOAjo z;(DGfY4S;u^X4yYNJ&Ouq=F;^eqbxs7)YH76Uu)+CcGGrDq1~1sgAuyJ-?{ z)K08hiWug~Aisbg@ZUcCXF~f@F73Cl67Nu8(z}VEFCR|+?h9!tC;0O3T zT-sL(3BeDheQ~z5-@D@8x)fz>>DJYCCSd4+XaatK&jY4@i72gE`~*KT>fb*Kq4JqL zT$g__2ngT<_qOBTNFk8#moQgulyvrg5e9|4aWh$BhX_zA@Y{AbKaD89*5I; zRGV1mq5QRtGxv&9;Fv&0GGuIj=Na1=xo&?w=ZEB54{vMhV43f_y1rD;8%-VN9({?u zp1rt``X~x~TjR2I_6Ws~LH_|hfX_MGR}^u^_oQWGLlsqoTP&`<`&pm6FepK20lyP3Pzb5kNQ-Q3ODe>adsNceDR6)1 zdE$*X7H+GI@%u2F^c4td!;WZ>4d52Q=fnmR#oKaEJKKm|oKmlfmC6;uNc~wjEe({} zJdVBVh08sg*e%KCx09v{vO*!bEHU)q)0ajx)_O*B!d>Sv8xncaDLd~WMnv*a)^L2v;d!0(LXn<>&n9fjEC*%EuN;}A!lzqV$y z)+ASGD|aAmS|4h9I1hg784y0e5AZo_a;F3-ca7V{BQx52y|T+Cpw)kHB%AA!lpDw5 zXnvcnR`a6CJoivwZ```3!=wNy1StgkPHLhOgt2&pH0EyMH0`A^8r;q!Z??$jo8@L~ z>xS1*WDwW{@B#b|WMj(rWaAU8Jh@x!h$x_rAV@gi1NeNqwRzc{p0mk`swF!|Y-Z=E zVj??Rrs#xmnXPTt*~@=r^1Ec*?v5lBk|Q8_1n>iV&MWzdki$$%btKcWx31S(sh!2y z3JFDuav0oPmM<&wT#Y0hJ~gjw_{^To>r_t!lFNXL=BtZks%F%|>;y~#Fqr@!!0!<+ zbV-DdqB!Ky6-Qg_fxD;Tcv7g0=hc;$=V_#rYz$FYo@08aDxiOw^o}%IMed?@8eG!4 z>B1Z>p?gs%KUTcz@^f=(sMYuihLqr2)rJD01bhHLz^5zMOfe*-+)`__O)wUF*KFgb z;a5@*lcaRVJdJO|I7s*0FHA5A6J~HI06u`smN&?VV>S2lLz%K za&cD;)TddHhF*Vb;s)Uwv^Q8cfFI!V9j{^%B-MlE{ycWKnfrh8GB5Vppm7i0hZlwx z-~;#pK0xg!@|Rz9Mew!2LV;F5YydyN=get&CHjT-?Do>=jwai?qc6s<^9<#(ETVNz zPeZ@GfFY&eas!tn-~;$QYL~ab>$Wl5!8X>IuE&xP^0j~59xr@r01!hXsB! z4Q54ck+zg~m%uOuF$a7AAHe4TH9@F2Q#H|BdTJD=eh@`okjxh)@)kv~^SGM!oj`Bq zv7cASZdHFSL=zAm5FWtiP;%kCkz5u(39`YTCDRbc)re~92#%N_&WF!~x9_p@(Hwf| zU?ik+{w_}Z>~JEH)cMbTchbSngX?UtmepsP5>z{!B4VuIGO>L#Gm#rsB3oo8RyTp0 zDlj9Zb?q*E=ps4{Wmx^!!5Pv(GdjR63X?%=G5`=jz#$OMiwt1Q}3_;TAhuKT%BF zTfJ!+;xKFd4kkQ6i6f;tWGMW@{%T2{>FVs?X9Qls6VeDGA|wc#yn2837t7w+b&NHYK0Pnglc)P%#-v82*W zO*l9Q2M%D!jCdWWee9aA8(m;4r7poC)BMU!x-87twSVWzGqo+XyTLcr(mF2Om-9`! zuFC$K^P<+Bm-%tyunGx9EaTMZ3^?~}JUPFRbV?hqZC?cY2po@1*QbVz3465u9-?L3 zj~qjb1=bpel}(2Zx644FfCyo%yotmEOmvZaZ*Ang#a(7ena;gS4PDi}H!HTaV=Z;< zO#%lbCVw(Qqzy5`+hV6hz;fyki!>A;TUw9ce>O$-{;vVO!eSQ?9sD{ zmbCUZ@UpoE->VG(nx+t!Sk%|FTBaG$U>JiM%;IC1be5zUuSfloG(%=dn(KP7I_$?w zPj81dDOQNF=&Ng!ceTk5(Pk{8p*C%5xL|}#7k`D5A}_qGms)2|!Yo~-RjrDd(ZG#+ zkX9XSOMwW6s0Rx)7GB%&Igh8s7T#85I!|(QgI(w_BRez(lxQUW?+W8cvS!g0vuAp4 ze9iEklunSOsy69tTWLRDT)Jy;Q4xlSYT`s}=jHZ)s|Lf2i&Q9-&k3S54l+}023ifx zu74POFTcvbp^X)gDr?t zjX`^3>Vlz2G;*w$H|35Am_)cYL6$%k>Ck_k+BI}t`swPFWqw>jR#~{5Wnj{ya$vSq zQb%P936QA)0y29yc#&fZ4k)X?gn3^N%H}yaT@jx%qq_Wxo z!3T&39yngOqOe)ZEm)2nI5gMo#@{q34t^|?=O*J5u#wI#;d^0S@&~Ydo&bpQMDk>% zy^$HE)7iFihcqV-7B{l)|H>WJ`D*p43q>kzlR3A4O=cAc@nOw)wKzMeW{A%giByc_{{Ox;JvZ< z6hnf8T=+HSrC=sS2Y>Tk=p;8=+R@BB0#-yEu_ADt`G3{qxs(B@Let+<#h$rv*MDu~mVDR42lhQ)z%_u-KHw={NEW z7IR2K9$4UPdv(8S9M8~h*XT{}U8BxmgNQJU7dvf#Jb!;9yBQLUorZo+reSQaBqEXc zR<>7gRUUv)*p|Us#L40S4>+2wJs!|y!h1kdA841qg$vCAnJEkeAV#dL#_N4>nuqpH zkjr}|4AMUVJ;Kk9*236F6o417#7Ta3JdNF__KZh}VEGN|cQix^%tD&_>fdy(ZB|IK zv`TduFn^vY+|fb(&LL+-dR0*P`3Q&lD9rI93)bAaSeL{NS4&gpH}qy&=kCt$_F*$@ zQxc4%{z-GbZVsIMck`?$U7f_AMw#onD9dz~`QihpquJEi$L0v7E*tY{Y3mJ!=A}76 zvUJ>~%+jl6<&d}#Hj?&$_K3M&M_~x*}_dV^L*%}Of%1&J10-_5_I6(FAQ&P*@}J%+{w}wnZQNb zk{Ik+Fh)wKKz)luu&XlHcv`OYJPquXxIkDmj!kxKmD(dCM|Cl19D)g2CBt)PSQ7c# z3x7Ngs+&s`%lM(EL?-Gt>(z#5@SfY_qKuRE9 zcc49e8sJ(I*tZ=&tbG@m%W^Aw<3Bk-!sXZ>=Uw>(X zm8fiqXDEXqpyC5HuOO>OJ2lTJ#HVPWc@*H80df-b_$kL?->>+-++)ofW|(EB!}R^F zVT?k$m9}wE#q{(bHOq?m_hk!jXS%v}h{HT|Yj3VYNP>NskNCg;5r1G?DBDDM^qc|7fdmueq~!NGH@c814)0Jq+9PqC-!w6>A-?MwZHDM)$N85fJAp$&)Jw zZW&~HU#q!V`d8g$p%<`8t8}Q-fD(b)lkoiI``Zwc5`w4fHP>`@6S&{tLVq|tM&`=# z=+Qg(#c~*_VLThbc-FK>!99fg9nBWOrWuN&wr%j(mMz?EHXGtHn9<=fd*oJ^#M}|& zu*Y|72Li!OwJj-kw%sGd1EfqT4{wZx_l2U~Zyyr;3U{=)Nb{uHhs!(`DeI+H@976p z!ZxJsLR|c^4Y>zIgs8#g?ti$uH|>}%=iTO^cOQeQ121N>F`qxFZ%f#AA5oVwN)0Qk zs+)gJm@jqH-^-NyN63yn>r{8{g_x4q&5v@1<(-1)?L@#9BeR=r>$X!T`r~mo*_H{t6etXx) zPq!g)OivExZE$eSVt?NS#e!6AQu1khyn6TX?l!E37>ghyFe8I_Ob2_-Kfc>t&GaQN z!9(C--yg};@S%hs|nW zsJ5|e%&Y)-#*XRitozc8!pCLkaT!+fri^lZeQnxk%3^LpUoMue19Ah@kBK}|aCvDu zh?F)>n5xo=>1Y-ZkMn&1ixEf_y}!3&LofOtsbAx6moK{mxz7=5`WNW zq+H#DYzfe=ED=jyhipG+#-o|;p6==HU$?OH z$-&Oa!Js@iI;Or8AlGxbQ(ilMfM`G+;ZekV=9Dw%WAAM~PVzJ<4*Qe`y)X0OWE5v* zSSEP}Qy$^GcQh>XK|DVEseE^I%zto$AOng446&y5BgI6oYO!U=1+LW^Ok4{k7YWfI zL*Wmbry_X}mj}Nd5Lkj8QXho-h!f^q-5q@V2|F`*_s+qHd&2o$t-Nzw;vp}P`)-}$ z;JX9dRF2>vLEuqONIsJsjYBj=^NfKP%d6YR z+5E8YVcdIj^SE9wt}d4IqhkK>uvjh8%^Q74K^lax)29r9;uMX?hsE-fCa}D?n?KxN zT+PiUugRSw&n1-^Pb*GlWq(uIoFSk2)yjWa1n3hNR4#&+9KWp=GYenFk?+;FaJDK| zck|7S6nU4kpvdLH_BL`1f9i?>OY9>?T^PU>;KsCnS{R!5dY#epO17*CTl)uTcDoI|(VAYc&UXxpW)*Q+~=hCz3}??2^!O{yGL zlG+xFyZhC8V=;zHz<;VzjYzmAUHrr9s$duHf?X&@1cI-2!}+yMM&-==d+N?ruwAXb zS^5{Qtjz~FE#%w1oKXrQ{z|lY@pR9+qp%;33F*^}3s;{HPz47m zDRB0A7Z5PsT+9*o8+R%+kn1kzYy zHt8ob;z}x7RG2!>6a#J?D`ZJBv?L#bLAhS-L09WJ#Km@?YTYPK z5GHl(8Gps)X>Qocdu(_nW6gD#hDD)gwe?{T#SlNF#0tEhS3*yd^0c|%mL{QGaedN0 z{cQfQS+71nCowqvHpOU(D_3y(<}DD1N=z^LB8#>GsPfKXJ{cErJ1}V*nR+G5%L<%S zJI<0gs-hRcbtr=u&8^#jswYmvq9PQVIwneraDR}-QY^CL#SP@sLJFWHFjOC~h3^~u zznt4(N()o``$g!PS&0yV0><`FnChNc=s+zJwDI}NSa^PW`_i$#(Lmwr&E5UidiVs+ z@Hi6OZH9kXJG=l6YP7jAh2X>HVzao?W6%idIF6dXeq3H{WQnM+8V0Cig)h_9`WHR= zeSfjJsTeIDOvMP)ZGLYy+aV7m2Z3k@>Mx(R9NpV;#^G#mmm=Zs0p%3j#oo(0o_&UD zxl(f1(bc4ceXALIK3_6Gw`?a}QcI|C0oIGX(6vpy(J?l{+?{Z)CZ3B zU{XxNR1fPArkh^EHBq+MhFJpI=k43r%yJU^6%tZlU$=bZlu69KwZim0zyzdOVbWJs zn4Vi-c|fOw@We13=4l%1U@TdW;^AqSCB?`{sj?W%N4cI*QC|(>*t{yutAU}YPJj75 zsDf9j5CB;_Z3O@`!=y}2PEg<{j-Ctk#1iV8<@z4w5DxU-z3vR4{8%&UT`uQ>jMGBb10egC~lj@;0nTf zp_b+}PGz~S)~Ziw@I2cViGLrGXqyZ>@D7#&tR~i;PGeOwZIqgUX(vmC#idfd)W%px z4hFTR=z7{HkF;7TRchV!P&Yt~)WG5l3~28b1%&K=&}&mdTY!>AKc~rH9FEU_eu88` z!2g=K5$CoNngCT%la0<_CQKlP2wDp}$s%PZP{5ZKPzJ@D$7(;(U4Jv(jT5$RoM`sj z_vywV>-7s*(>2Kx3WajWudnIZIpEW*I&&Q&Y#&Lv3%*NU^NqCnaNGc^f%1ANkO-lz zG}KZESO=3m^idxd+rI<{jTR^NtU7aXQ)j|vOC-oPb?geuAqKJ67_Vxg+AERny^}r8 zI+#wUQ;DC8d?=$pnk}4J&dn)!mG{bnd&gsW{8)CJMHz=9$!3^@*>e>oBN(xu$;$2C zqW=QhU~cudzJ~$C0s=QVmyzB9DwnQ`0eyd#z?_fvCQZGc&z}9%e7AQ%;~qf@6jNBn zhSrZH#%7myEJX}XZTG~O1t>8jWseMjzu10ik~?{`^V<%FEpddMAUr`F)9Cza=jBgv zbOF!4i(E%hvL8YU?26h5B6U9H!F z!x#e-vf*JM0dCdp?B9M44jNO87?!|Nf`k-?&|jU2i)!A0Qor3>-JS29Z*DF(>&si> zR{8Y@^zLJTv9UUVTB=r1KF>|e6^;3H%F$QNQ5%!W0#k@aO_uS#%TfgK*+qX=%mQbF zozk@LEkN=Bw49C(^QJv34=9~uB!mmf)rX~3IqkDR1fs&(*TswPuQBX#gw$dB)ctIt z1^!`CH##7|N|ZdvN?3yA$-qn(@2{>t{(ZfA_v`X6zkmB|EaKR3tyjN1(u%*dsMBIj z3eF{21hh~LaslT2wu88SXg`1SEtcrD{eWA0#TAdH8^E3)dI&}-N(hg}gdxtw5W&(^ zI0TC$ks=Oz4S=--#+ILPk0A|eU>=2viMBl)!(|!?%8=j|@e!z72Ve~P1F!>D_5G&` z7*aZ_>c%V-ewbBrl-Yap$*j;wl9EwTnR^yVV3k)dikY%$U8yW$ZWcsU(G(ddUMH0f z_`pXTql5{By9^+Ya!Y$L&!=`(P1_s<-xMgpjA?)c5fT^l1guRU6nG2^I{I4wf9{aB z(@cWme%=a~?TrDye|P1|yyduOZ_c+* zWsoSlI>9Rs+#bkI5@9NQOL$d67g2z@jvN49o>}%GS_h^%&8jvL)K*;WJ9*X&ECx}W z&F@9&0BVb#DhPp!A@zA*t}mCj3ZUiaoZPr1)P0Gmr3=)*f9-aF{?(%q{i|K8QW-(T zLAhimnE)1GUws7rUf-2ySm0#@=!Qbed%&4wsJe#A~NC<>u<5##J)I(m3$Jb;D1pamu=?&1L%j0pK}YiGMvg*DLDKsgxgJ0FHgXK|cMScu*U0&W-=M3r9!{k2 zJiMzrDP(K;nR=Uh{;g;kS5d2d>x4w|(TV9fCi&d7ZQf&HTYp%@fj$mnjwE-Xmg>yP z{C3WyTNJ2vB_iFFqo{wHd}esbVP#Wh5|8F}$4JMP!7pIHOJH!qF{I75 zgiYGREWAypMF&4ESi5P*F$7R%N*Q&zH3$q;&rn15vam`=YUDuxz7i6sE&Gr}Qywf* zy&+;6u2KIO9UPzoO-t7Uv0kU^%~X3}H%Og6Q(o%4uNX~J2r7SWi%~nx9WQh$0za^R zs?(LpRf%eq?V`1fxvH|`JU9jB;0!eJSzd461oI_9j5tlUIbI)CE_6u2+PI41E^F-L zMzeTolF8KDC%pn;J8_K(pgR+LsF5P$C6LbEQqY^N`5 zGo}FmE_-tue}aFERm?iq`CKy>nruQil7tQ&R3RxtSV3w(GksIfOz4@!m>r*#dDp%7 zimSm))SJ)a7(lAi7Wg}ZKOSNZ>i@*KX?1LSC!?tRY5eD{das@Ls-eOI=b)efRhvF; zTFv<0>zmc;-Nmmz!}5XCY8D(3V^smjd!m-zAGHr~LyLc!i+STU7oSp%=&MG?!2DoB zJd9DlC{Ztp+@QhC7Y`TY#&+bmzLLvNx|f^Zj*x|~&q z0P$jGmeYScEh2-$~4MIHRtqN1>~Pg?}uyot32?!)LXs)P>l)2P?riH{vYx}QPoZd*(CR(tPii4K=nQ-`@c4LYTLkr zkRBmU68s1NcyOdMX?xusTwSbQFW;~4=64@kU+{l?M@l5S8CM(Z*?N7sygpx{$$EKv zdwFhdzkIb`p8xuj4gLYh7&>G1&KToQc%t8E15|XXu&4isDKptiVm+hw^lK|%wGURi zSC_Zv=zMv1{&uptS?$6T_2_wk#X*j2KE7M+Z#L^tJW=4v#Z!=$VaV<{SgvnF(t$aW z-r#>L=GeYDQT=SfeYu_wg}S_cy#aaBFGU{Z4cD8?3y?{YFGQwS@85tpIR1Z=N8BS1 z6a>ec3l&B(`9e(eVRiFrbGs^6A69D&f-&+13P%1rf;Bhq|FB%`W0%xIKX2j;QH~$; z>!$WsP2C%YME!OkjTjU^n0OL;Zz~vL@uPoUR>a}oaHVPRoq9jXv$#Lgl!1ew;&Qw^ z2{6l{m7ot`)>-UNdU%BHsknxX8@NOF&gJyws@0Wz17-T^3=%BcYme`fGSfPAPzZ}CZx zhGhAsxd)pd1T1zJ`|(?VX!6ShP0o&H-O<|xNhWE;IEyFU$4Qb#BqbBUNkkJm={`(; zoE|spvZ>1U=@-{xI2E7m7Jb>F{Te^BHRq(Cu+CepP2 zMG)4b2Fucj!K!u)!Yn|EMM8LF2>c=QR3wjz?&#Me3`5WaJ3-?y%ff)mRjp@F?25vSNPsCFDpyQMXU^K9Lz4O9J>g?W~i zv3A)=hA(yh;H7KykX(sWWSyA|QtC#VT@<|rzD9+$r?3?3Pl8dSu;#?(?FRWI<_4Bd4&5Y0TZmp>8R;O_FJ$ z1V}(RO<8xkuUY74rXS0)P*Usd%$H@JRr;5C(Uxa5(8Jmo7)qz?gs0O+{|=hnw4I); zG?qx2%*uJzf11{%ed?WnL32IlQun(lm9`a+$<#6_g;qu-rA9{JSPMKfM5#B$t{jOO zcsv^p7ix>GYORt%JBms(-{ghe9@AJfRi&-P`9WS~ZCkX~;wjl}2hxRh+QDw?0lHDq zy?oMfvpR2Th>D}B+IVZDrLr@;&x>_=QOpNYS@n%$f61v;ClOJS#4imd0g5ytR6GsH zLrM@fNoof%yD6`#s+5lKcWq0nLTym9e&?bPIwo&SaB8$)OH&Snl~bHVgsBHj5`P^Q z1ECnXIUDDT%vomF^vU~P@k$2{$tj&mG)vT{h7_wm>^WM`L zpH@vaH`CYpX#%2bHLC)Gu<{IeU1&F2={M;^Dp2tx!eZo!;OuQVFHGoz(JE3fGOY_` zklAXO?7NMX~zPJX9A;RNFkD>uq@-Pv#GRO5c0fmeMF8G1#Sq z&3ue)Q|PkT7HElxA#R|pC2(r^IrSLQe=s(dfnNebFcT`(l}=(oAl{`~X;IS^PP1+( zQoN+hKwTTeC@88e3f*wfPrjH4wJUd{J&9(NVC7&L3FI?}f<*Dgd@(rW&%~KKe#$*W zrQVXyHacs~HOYkxy|Muy$+Q$0tSVLi=m142pPpBRN&-q$6{ck?(~qiY-sy;pe+7yF zQ9%PXDo&mED5ivDJLQ}iFC~3=y}rALR zTdgiJ4kQ0JXjp9)~|~98`_r@Yjz41!8eX`0E`Z1e;G7oJ~XAzLsJ%^KGs=iYN8b35|U_f zR?WP0vC=#K!4W6)X{_u=#1K5(fLsN^){s>0D^=8G?@YNT`_HQ^H%)M9fS!6#R`1CG zFg891_6xi7Pb)H68Yg)Af6A_DF)!vk!h8tY@~UYSR%R$xC=*hmjLq`3)hlQnF~EoY zam3tASnKBwonb)PF=x*yjd@CQlxOqPl-W!NBZ<8v2=izfG{a~THD7z1GyH`T$;W- zQ(-7C2-TS?;o=*lD*9}yI<~$rKE16Ad-ORzxP8HqiJ!xSe`b=3-V3!+r(D<5@Jps2 zmV@0VSuiJXXr?ANdA?bW<4WV~+5Ypp1CotAQDl4N+|30esz(gAI5N$FbZo&f|-k| ze*~yOe8Ygcxhf8bjfMv?nXjt=L5{!&*^Ag?L-zQXy#!J-6fpo>jI~~W3{V88ccJK? z0a7N%+wf}&#>M0H{q~QC$Nz*VBH~wSQGh6Huy6|be`Onz6ig_kUR@DOIF5s|#ysMP z3_Wx6`NQ?sZM*&Q<@VuIfV>c($mBU5oe&S7w;?JL7{>?kh+sV-_XF}G*5hxscXuJ0 z18aGHOTxQKpspkbZ^6yu7POUz83NA{{qeXeR8BcU)9>#8{Q36N@89V+PjWGkoFJ$v z(}Cp2e|pO7x7)i9y7~3rpkLMca{c?(_34J>Dm>M$8PjCWt}3JghO~MTNS= z)tt(wOIHJ|55PQ$9n_PVQsX9=(4WtS;6INekqA#iXd_FM%D*=d$ejKFH9#*~bd_kK zV{n+&U$;`0Ow$vV0=m)TR@s$qw43wu%Cs}nRpd==!AX*7n@|a#`j}-Sov)9aoAIb-rvtLiZdF38FYT(X2Ns##it29k(E%%iKdh6iBJj ze@gZon;^vh@5d$q%{{#|~xxy$X>v)G<6 zX05pf=z)1$m))T?*(((z5%^c5E4q1EgO9bkQ^js%PNrpJhi_mAthDFz+c*a~f9OoH z&&K_Ax8yvt)-GT4#h5N!ppsIDL0a71nFeXKj}r~jmLw0N0zLu|oKqJxUJp3hu}u=S zd-tcxHsx>=czs#)i4ljS&4+#f;kr1JXG?@bUfrx_g(`@-`ECX}7tN-guT73PTbFa2 zQ@o3PE_C#jsikqj0(y<&^3vvUf1AHd$p=F`7DtDWM8shDho9X3U@y7U%JMTMBZ?=N z2<)hi5($bDGRkcBo^&Zyps9Bzr788O%Mq&{c#-PqV}?yk?#|pKI-LrktapA`s{_cm z-wc_?Ai8ZjdpL=o6tJN$17mQm7{BDhK>M|%cTb(FuVfgMZnm-vU1zh1W1$z_x1;dq zkKUOWK|Hv{Z18=B2xZ);zv?;;Fe?x7=>Kx}eo$J)6flvC&zF~%axdE^ms?hq=K;B6 z0)+#Aq2PS6mf{!E97I=SE4fTwX7#>rA}L1x;iO&4x1#?7@}RJSmyy*06PLKQ0Tu!@ zIhT>%0V;o6bK5o+e%G&H>h6S|iC|m^ka*|=CDAq$igYC^UT@L|CvmeoW5?6foyPyZ z2N!}M1^KqwX|m(7L{i|v!8r%txdBHXBODz~X6@wQkY1aX}cCOIkE$!`+^LvTdgLU@KaVbS}m$(vtr z^Z|Z*8DYdl8vUt9UPTEJNJ#bGWwf6BJi$AKLvVs96H!VTk~B4}B>O_fjgk$EPn*>% zdsTn7$L4B%ww!_V=IV~dResiNTD?NJ=W%|ROY_SEt)Z|c{@YHgGQ_lKK$u2i*FGK!`o0d*wsO_1c=EFoX*QydpYzbE>p zQ6I0%MX`8`8P($LGF?H|GC+p3XJ2Q z%-7=G2L1Z^`l>p=diUY{E#}xfzkK(>T)?A{5fLF#Mw5=N5kzZNm76asP5o|4JdRR{ zNGiKm)lA#;DTY1a$d`57bhHgUe}yzf33l{gMInAuBpLIpUfd<;DWeJ4DYcRoPmq7K z6QC#Po9nTddwuMZGfz<_vK?~XmPG=)yI*Hm7Q1D8x84Lpgp0fN7MAk}U8amsl(KYW z$ds}Ww@5J35v&c1?XlfJr$zp%IR=H+#_k(}N@P7st ztW2DMsHY?Yt!E=Y#%R1QT1}iWOB|l%J#o038RFLeuner;{IFRU=0&|*tvmkwF)|mc zqe=8ekMp>5*kykLvzQ+nY71)~3HS8{#_HKe2%*X<3Qd5wq(rAu1UX11a81$GM{+9f@%2JRE-tP=RIj1Nvws zK#NNVT*ZJX?Oid#y{rKgcfGM^hJPUe+Ee9=1(8F0d-4CX>f0Tw2HO?Pu3CJ{t0w%B zYNq!u_?uQU?=(CLAs?V?8ej#0BZE*{443}?;_@;Sbwgf89=x#MFK+U8f81PMe7Xsv zNtWm&_%U#DKeX+@S4e-%AXCL7q&%>2zHIyyZCx%;sG#0A53=7A-vO)~q2?$Dp@Qpt_kWjzh_nPHNQ$wP#4rSS)%;PCZb`JuBgqi`=3K!FIojiY2``K~RkA`fN_KER; zjeZbCyqDshru9sx=15=vBg8p_cbuZzVzn&mrfQDP_7fa;B|BFuVSa7{`t`Efc_+(I ziUaDUnV0`sHQ36-tFlvwPFYl8@Azz8&hyGXoxLpPUD0OQ)JON#`9Nimb)@%I`nD6k z5#NJ~)Lv7!`MiJK;l_sZ`+n@}%#QQLqh}UhWoFuJR385n2ENYH)&6N#<-e5ttG|f{ zp+lNgtBvyS(F3kFM_VNb*b&`!a(L6!T}iJn#RK@57bms{;^W_GS=lW%v+pj7HZQBL z4p`-Fm!t#pcwIO|W2yNk#HH7P@<~V$L(Cm7W}eq|(++=mnwxkMcv%DrX9Ti+nmGi^ zDCS1PXxRmEF>ceUajLZ{hXMg?^Go{`!Ko;B$QT?0!EylWQHFKJ7;Q--scHFgoJ zvRRqS);@y0S*}L&!*;a(mD-XdJl6)OB11fk36Bb8g_6X|y7h%u41_zg`Qc)bx4G)Q z-L);>OcRot)ojZPX!P=en{{jRxrMne>wd=F(vs8^X^Z)Pu?;7-#io`nr7NNOv^T4| zAD{v5X`J9;+2uzN&JQ4*9XbRRv!;)Ey1tH){rx+Chj~0K^Q8%rc+}CkJiop890<-C zgj1M3y#Ba2zd4_s|9%mw<*N4By?L|)gO3+Ci&=;x)!<2ehpp0r5V>K43+S~M@BjVj z`tthYZGdin3fXkRpG3FXA-n`&hiBXAwHKk4xLwGwl@J=(JmS(VVoScJ|Pl1SuhZ<@{*8D z5_dY}(E?`PA(!1k78#;cK2*x4oAnS06O2)R${k??I$uM?^=VO6K@s0A;Lu4Vp6G7$ zBMu^U2ax(&1d!q&z=R?~=%BDQsB0vEe&jJ_4IDmh<(ZKSd`E581p5`HG*ps7De226 z+stxAy}sgZX8Zb+t-gfghVg*|2F|WOaBzAGT=I1@S1PN@lfb$;MUsd|E?gY0)ba}; z6=9`qkuTLW^AhlQw1EakT;M)kAAMdKR%&>Ly!W+7@C2m^)C`& zJ*&f(A_iQWIRR!KN(_aeLx#YAf%z(u2Wfrq+X03tK@Z!7@Cb2Cd)M~|AASycA7SkK zUVyj=dtcSe`yRsriCF&bu2&uWco4YCp`k}Pgrb;)RuXE2<<3-&Xw02|1qn09B}ag* zyCU&Qbclyeh$3d^98Ql&&`-gF#i=%GqCY6DJ;oUjh60Lv0~~=I>-L45&>JuupeP1qV-$0)hw8JWR$Hx~%2oZ8OwRLEcU+opl2@f}O_Cqf z()C}N`C(FM{=$_KGlnp=exZri>9k04-zF7^VqwKiYps7Gh$CQsRyDm?c@=!llc^aj zPxMzBL(eXN+etD?l^O?>gb-i!P*Iv6O|q(XmP8s;N`DLx>@4nU{dL>M1QJ!YBmK7O^@RKsS0*l8zBa5#DWN=yBH(E?cV(E_B)?}14M#DExAD3pZo~n*e z1rXUGZMQ+r>O=jNG}Ow<^hhlmuVkb@oYl?m)tLsZ=Bs^w4jL0MRZ^G0n*}!P+I2Ty z(7kYU4`DI})ebOp5#F&t$X(CTx-usCr2A0?{5ZJlHGH_2TZ%LrETsxS8|*Xdr?>Z41=^!q`I?94AIR#>RuhZmo4zvun9_ zi>wz9>7NgOi`D13Pg22A$mvtoY!y?le)nmQ#0m`30V);s18p6BEKCV zt_ICVb+Jgb%?G-UvwPkfF9DGJ=)f9EQ3SpH`r#7D0sezV%g_%jb$TPdQBY+3x#I#D-t}+fp zqz_vw877q(n3Ur*Z%&OUhBHC;w`Ku;0!46GDcJ-=ybW<2+>7*y`L{WUo#_msH1?ju z?IZxZxJ5@mi}v5Bf03g5c6-_2wE^}aR!55RY|2hy&lE)GErVqY7a z!#2q3!xI`VO7H~vNjY_5dsdv3(@B#n$ml#QoA`UC@Zx2c`=~4mxzbL|*Wg9@nzNb? zTv7P7#U$`YmF_yul#5suiV%eYZ{u)R%?w3<^vS~d?Oo{CTX4I-n^f~#@aILKA<(A z0?sbjN)UNaV}kYK=6>0BO~q7P_(g`gyU^O@NTdBgX)LL-1pmcG1`Sy1zW(@RYizVNbxRB z{G>nE%jN3h?PqY39a_=x`|qO_@*=H#z5V#`>F=)zxfH-DFVV!6{;Ze3udWw=|9`$B z*TcFRdal>NHu9^jNfv>_%@H$gAV>N5#8i7gA@zNu$U^D-IhF2p9Xy9$&k zoS-BEOQuupxJ<<0xS9EXd1jc6fwS&$i2&DJ-$fXTyKe~snWNdg6l~P!-x`A*wrliY zXV6~-)}!Rv6-8mIflXy=w7mba{0yLX?F&ZW!yI<{QwxMosF<;5A=ak?@-`+yG6y6m z51G!hB7hSToI=csB43*6%od1+%$pxNlPDt8O%OvLCD^psE`lb17jE*cZ$Pu^2i*cb z!6A9ync02NP@7KuoVj@`9PhZjM)fg}=C&cL$f`3H zM1i7`8@|I?mX9sBsctzjAdEJo=={2}J*q+lUv)sicMSS42Zj)RUTKBNpFVn_02AK8 z){~WpcS>`*N^cH-s*u8&zY(r4%jplkJ*B0Vn@b&fGDFqELMts3r06X#+4VW#< zxlP%)DGfVUQ5*>o^<)W1aO1`zOLZx4O96yn*u&wgaF*DA1%u8ztl#Cy={8#$!)e6C ztFUDN&O$;r*k-wLu;#2TDv8*(B;oQ3kdSYXWZMHcpv1>X?DwJ<(okMR0n!uxT%~q) zPvb?5B8rL0R?1V20ZeEOZCNzWs`?S%`ZjsG_c)DjxdM&m5A(a_4XPewCXp|1nySza zXL|)Xth2d)a-cuf507}(v)OKY1(4t%z>7TVg*23B5qaMfzlvwc(zGy`DX{Re>ss$E z{@>wQ-zJaWvs{6?o^}4|uk{|+dIdqOYq^4;`IkpL>)Bkly#h$!=w*)eY!cf}fddB6 z5A+y-Va-(~JAy1hzDi<|!3(lAEM*;lvao+)4z;R(d1e$qB4TFk$p69Aq)qd>M!vXR zd|msX1{Q7&oa}=d$*IO#JPKuU?x9ElDz>-Vd!b^UR(et9iIY@9s#S0~&FWgdl#!iT z(OG*>CQN7(qP?-)WIBj-?f|$Ya^D4zrZ5HRbUQ6VQ9!)6SnV95a?GIN)n3sax)-&Z zuM&8FXzN`PLjHT4O+8BK)b^iz6(QhQk68E7$NX2XbHMI<`rW~L{>NhEe`m2F=nEfg zI4?H#kueVK6GQ{iavVN?GeStJI=_O((6BivXR7=M&CCq#DveUa zn5{;vKh0N*c6oQZCdZ3E=l5Uk7VG2n_3HM^!}{1)Mgx}(TSLf=EK}}L zn>SMVRBr42WI4TRGjfzz2v`k^sQ z)pJkam5f0^QzWFsyjqEyXD%?cd5DvL6wRX*=+rd=h!g>AoIrH1OHEl;6&0qt{6^}i zy`R@!dt$w?eC(l$0~Kh1c;r4+;ohywf^Mi9P=fn|jTZpAPBNNi=gsScSy7l*luB~f zN^%9K_1^a)zS;-my_DnUJiu?@n*$AGY7xs*2HRxOvnLp={8?Kf@c(ZHaqN9r4YXUu zp@$I!D(A{-TUd@D$NLtzv&&VwfR`fCK0dp=yp$2LDrKM)d3NquHzxoF#4{HzPGrSB zOl7ol22Hls|x*K(f^b*^e4cF}O_pme?HKV(^5+Lw{l0TY)u&H+PzbJI8w{+?f9 z;ASW{jjDH9H^YZEO(9H3dTqGQ4KR$GxFvIm9UK?v{rZy=$BB#_%N@6n-Unz3oAvIq z&#qQ03p&>hbY3-%291Lg>^c%qPMI^fa$E_p#E#$?5SKWEk@J4~#G%=HV zzx7-1-nM&#!$GItQ~$(&5o3D?twH~&efHwx;LX7afg1{m(kRtOxYYFlL$s9A9!mgK zPhH7CL=BoK5Mo0OR)1jnbD^@)9yGo*kP?9o${b-XV2C)wY2*Dz=#13=y>TF5TsYqr zl2eBw4!BIdH*wAze>PwWPX6ZtEM54!bUxZFG`3hQoV?3ROQJjkL4Ka#&*$E? zZ!$_K?@VmqI+xW0rK{J2ce9Zf`{zpaIIBmSs)bTb?E^oYgmd5QtHhh(f*T>ztwaO} zMs+I}(U^tfATHt)w>EJehclCfNrFFUV3}oLk%8qpWD)^J@x2B%ocVznHArPaT=hyy zRIPQZr{d**&3H2E1Yi9q4kLpFE(I9VN^$c?W3w)rv^JyZX;9=RNvj~ zCWii`oUSiR;X9m6#$GV=Pa<#Xe+wg1nM4o+NJ{<9y0&ZIl-Y{~jO5)lDbpo~s$9f= z%j~XRE*6AoatQaHk5iI8U;bW%ET#-FJ@`eyCeR~)YYgUoJn*CGIPgr$I9rs(Dm))V zH-)uWlol1$sxXyU&D4u}9X-6fiKl)LABEq|IZfPZzM2&w7jRNZPhsPR6rVMdAXu<* zzqC=^s*=>NQnM1VEjm?+z|~c<)Xa@E$tO&18-f94MBmt4l_qgvl_nfen28xHbXv%F zu+!Op?lrBFV+Hk3XOh(x#A@LvbQ5y``Ks;Y^}2aAwqG|)#;NThLG))W<;;#I3TA?| z^ojl9=OCPf*SDsXA{koPFXzWz>>YXY^7hka5kEdM#Z>Ldg{Z!aUndLV7Dt7u?$ioH ztQLJta$BFNAA1v2y402P3m~N6`pOV|Gxxl^)*JLL z+TCta6M5CvAfdwJXb%=lNP7fi-y>w}K}ozVf%EyRAh5_@>E@>TX5^46umahiHu`b*)Ebc!2 zd^HI#e_by>n|#CoN@kx0ufu5kuWF0D$(@g(Yf1)9l}!L`PN56NVd;TwJr!Lmzf{zI zIKg-7RHme!tHhxq*N*nq1*H{EXJOz6@!ZI52AGsTuTYgIT;a49BS3No2CXFRhH>e6 z#@)NfM2}m|#d;EN%kV)ZfxMT0%tNsD%%k_v_bl@R-LvA7EL4S^%G~Q7kDrb+^X77W zHdiMdml2@#bF%)^?_Y(IOz>UUY}Uicg897SBfFoy<`RFhWyfhBvu*mCfOyHwG39DGMAwF2Ftov|9~Mk+=OA9Z^nFp zNEjYOz?#X=48}5mH{SgzHa27F69qb1W@(CXbnPrZoW06l5kdrTnq}_A#f7qxo%dVn z2k&-H4Sq8W!q!Rc(67BZrpj`VEo^T2 zpDg7d>QGAxikM=SKeXQ0Uvzt|ZoAb#Xi)Cdf9y8T&%BQB`mKL%2QCT1dHq$>?;d)+ zgAe}eSH}#e2r{7Pz$uPs{Yo*3MrEdD$c9;yF__o}N;Z-*MTWv3j*lV9n&;QP)Cdg0 z7Fi0y72+hY9ovwK?IyclWb8OQ3&H) znU{#12Mh1_MKGHTOzaAdB)4}G+@F0lsgS}cRVhka32u=Um~g1CWcD8B&7h5?Zpnm>zvR zH_;&oucCj27K|aRZD=BC6Qpcbh-3y?q7;%DE^+x>5+2dq7{&oi1c07FaAy@tn$znW zSR^J3qv0t>+;Iwra<^;$>smF5lzq3OtTRG;@E_CrzHREC8E2;$NEbpDZ)`=RcZ` zVh@17OArkpI5GQ{BT9l`)yC!JLy+WNXZb~ONFZEha9Bk}F`w^LQN$(1$OOF% z9Dd1#-j<4jKDvtHPDwG!D=3HqYcS0k(4@AEI8UvbFbR2UUi{Unj?d4t?_tT`Bjo0q z@2`L6*p-A^UVgZx6@=SuNp{BMJ0vE!P^je$Dfv`W?R;jwIgKcjFcsy~WKJ<3RLD^(+m`xnu{e3gVnM>9{6&G-#R2J* z92`|KK;C<7oR0r6Hz6dK4+qD6=~jS7Vpo3`ZS#QWAjQ`T!4lfgl~hnq5sMU81VdI; zP_(NeEcXUv^&K*uq%(EjXw>bo2a1lobXZdSvyR@t1wAyFy zl{7+j>Xc2s%PK1g_sGLb@x7ZZkET@>c@KH0Oni@2N>$J)E0})Uh}*p6 zPTAu{;p7>GIdm(4V!?MMGEjWX?@E+{#Q0T-8#5ZQ{Y1dX`1e``LiORuXEZ)7G~zAq zqdlYXiJ`IT*T^cbfC&DMgX8)O@fClx$iD2;B0Iks0-F25d_J0*5F|lAwkqx%n_Hj%Z>O&uE@iJPX?AUI-Fn5MmLMI!DwRcZz$(ZI8SukAV}KrR=l5n z+H8x|u+QI2cyj=>PFnhZ7`*~3@WZvfPcR%UrZcmBnIb#%xOGG^C>?4H#@3pqqffcM zU=|cgFj2e~{%tV--{;^Dvv7Y>rZt9NMv8d33dMuT&@h2=kP!9`T)s~ze=r+GLIMSg zN2x{;d+}#tPdbQkmT{SI!DvlxgPEB}sSvg0PAN=5c{lmBe*VA}%eGWjp1rkUn>-Py zVFaTrj0n^JAtuePtUK3wC$(3{OltNSmv%V2g8>nsAq8{G$RG0$4dayZhK9= zwYzWFg54n6Yr_LmI|4-eW#SIY)EWc@mt^{Wx0^r#9{PYD;?;gGejU|5Q*!7E3 z4`AAhNA(Vz`U$x1f4!JcE7pb^9YTP6ZaiPJ+wt92C%L=bdJ}#f&E%SL8f=3_mx1bf zaP!Z9nKsyiJ#c?2#US{o)r13&k{aeHMC96ga2f?}?>`WIY@O*7X|6<5<;rlBl)dY! zbyDG(kccFxrootF6bqb!u9oQA;1VLgQ82C<5NW}D_pt44Wt!PYs^zjW9?ds0y^ZTm z^x18nbbBrT^sLp4E?l_nH<`GlM{BU?FLnG1PmWyR)9rtInP_491p}QKak9$~7$m>y zuyO|=rM({3NkV8Qsn58UjciPI@hoiqnFc52o>-WS1{0;jnKVoUwHaA?@Lgs(L?Tvz z*`=M60ALQ_YaBxMBUb6j#l?m8m3~*djA*ys8sz2_@FI2;Tpahb_+Cf<_dWMaPt$Ax zwze$S42ux-<|!TN^>1OUBkBK$bIM4Uk<|ecmwDa+76CJtklq0C*olI2V3^_!alH}lBaZ3t_08bLOKmX_F?Tx2f^uB&=G_G2{6Y!{qs!!L@pI$ z#Cfgbj$G8Tf8{JTFNwC!xkQZA#*>t>ek+`$v17~)!Y60v2$_}y z_sKzsfr!AVYJcS({NeBI%(fiHm~g~{pexo7AFpp+8wCyejRsGm&CQ3+?fMpY7z@uE zZQhY3EO;GDv`Y-`^v=PCOq60TQJ05ncs$LLIJ6kf60jY`|^BJnfz~{;u+6 zYJ=}Ad>%KxTgKV3-YXFWXWHYue4nN0An33FBif4jLl!W`NHTls{$oF>)~sU!#`nEU z9f}v#obkVU$=o+!7_V+xe>hecV*!54NY_MPe{X(u?z>}rKm1_G{%tpo*a7o^d5)dg zaB+{o?55KR%9(tA`I<4;p>Zxvi9ZZP>iEU2L2bA=JA2E-$0Lvo5vYw zf8_MP$V`a{kSFlhnCYMWRw+1=oE?2M@qW{!_cF~#1}hN{kTBjd#=p#%?b;oJ@Gslp zf4_oA01*6u*0{cc{=5wX5e;}NJrE9ha6|-hH_hnKVMuWK4d_UOy;^@HF3Lqxp>2)v zC;758&1Ip1W*6EQR*D1=u>vGMYeZKwzrM z%j|(SOHw<2nJ?|c3iqoYHI^=G2J_C+f8jRQjl4QXvnw3|kt|b{ZV<+7hQzqZkf39k z8EhU;L23%i8+cBbw7kOHd3b3iKUo%~X~o&pzJFontdeqOdP2KWUhfcwr_1?8LwT~a zWagbo#d1;tz-Qj5nOfxY*xIsVZ;hClKg!R|(`GMw@;aEXH?Py9cDKG2kv}S)enpG%YD0x~ zm|6Rl431Ez^sKOzh3Az$S|ePRMKX=6?AbP=Mtu5rn&%gK+mN>5(RY<=m}EADob6zu zCVCPz1&8(k88{7nQM>++CRD$8f9X20?bQ3`8~+z6py*8j56GBFI1u_+taWhp;R769 zu5?8p>alx)^8>PP(Xl6jl-ucL5D*2_)NE6gG3K#Y-)w$coAwoGMK|t#u6k}ax4++P zezn*XSonk-=H&e^4e5}gcG8TF69fQQaD|GjdtJZnUG!`6WWQ~^S2t_7fARYMj`5;n z;QOb~*LOd=Wf6!r#S^2|S10?EZ!j4l?vs4ihI%qxf4cj)`Q4d{~@b30Hi!QGj!R$?%F zaSCIrfDLCp7345lQk1pOw{VhLqnw4MS#6alwWzrhyS@=+xm;wGe<&xa=knCP8M}g^ z)L5oo4~%#Rys};g^i7*)os8I0NIi|R)JV-SHF(B9TA7ps~eIeD=h?^$AHb-SiA)bjlSFWENy+) zGKtIj0w`bz0O*jYf3iLp@9UevF9XE&pnd2r=Ige7K-XDv!-vz&;2HdDu9GN$Iij*! z0vUnazD^1t^jFtOKuZA+-`*xw1jd%1af=~+!vyh2T~YbQCMe=E08k1UCb2m&%FDR+ z+j^?P161>}tLSv60_tXw=V;)DEf2rS|r z)&T4BO5*0#j>NUG?8Lj>gsyw7Kmq1}KaMF-61?|(lzRg!sDl$RqOmEQL^CTUEQ|;} zVG~r3k4#Zv8r#B#8BG&iyHLaD=9wlFb4)IhxM;}Lf2R{`SDCOck=NjB*U6v~E4F36 zdkjup3%d+X?;^B(&ciaA#fAA{Hz#bUeYT8?(rk_EAb%k0Vyen$^qWOph;+0s>iP&Q zb6?bLF|;@8VlI&I$+wTXMAlIknpWD-(vbq55$Ht^`W493(_+&o%y|l}tZtb?hcPcj zC^OH>e<|B6>lnyehyW9pU$%x0xh8f<@C1LA~W zjXl~Grzu3Lx^-qh42dJ~`RWsh1|Hb5oHbl%o}1$2e5-J`Z9IoV`JNh`!pPKDpJ;&V ziNp1+&eh6~y%nFUx32UTvQ|RwQ)h_W+^9MO>(m)ck>}+4_P1C6!OrYmVk8@I9$npC zf4$$lbEnqLT}CgD#og82+AXhu_(x~@&#%{?Ke?+D0p;5@vRa?6FS9rU$HDjcFsu3? ztN9)YNO2MsPWo| z4rVzbEtA>LY%T2v`ok-#G%H-rh5r`~Vl;(VdD zufDjzvW&yIS|&=u>`>+kNfXGpQ;Vp-?Q2=me*ySrNnMwb)d3TigXsYl0yH<5k=_9) zm&54+H3P#Bb(j0;0ZD%(5u*QmRF%Vge)wzk;`tH7ErJXvrqINe)-MzjJ1Ur#Ar7~5jI+c$SgWU5C9VnToMwiYQvDOH|j;iMAn zu@Z4;G@{GH0i&cp$X*^&+|RAjGy7PK=EbbC?fG&#&4v>PZN2M1)u0n|C{-v0Bv5Y79s!kYuDcpadl(u^;h6nfA-W0mo^7xyWtfRk@toR?VC1 zwT;v4m2CjG&>(-fU$`OT!Z4hVs)-viDQb!JuWahN%jzU|Q($j73JFD|=9Nl`FivX8 z(!+tIz^eZL3l4Az;g(L=D8FfobX||lt%7t5-!mXH5hHebqi<5jZJ6eBE+zOU{UBl1XOY1sn!qX}@ z@3K)<{Omd>8ED^q`g4)%*QFS3lvG;T6~Z#@*hEJ`FeYUzFi#^jqZnb4IH`qw z{r569k0#MoM!fMw49DCQ0iaP>@*)oR0QgTS*QrrdGls_ z@o{&0c5$sO8UA9ED}odw0d&IBtN!Yw7@gQ=<)CC?e`fYEE(~MY{FUo=uNS4o6zG{B zru}0B_PRrA>NvK*DMJ##WdNIra?8l~-y1t|;*NrBaKLGdBu~67D)=S{9SD3v(zFL25K({lv=ck9H1V+mgV4d?mJJ<38hW545Pxub z9}O5zk-*H+FyTb7USQ}*fF(;nNtx7|-E1yzZihWYfS8j0g?S_L0}aO69`YOBL+uL) zfi$f)@83oEmf(yYr}Km(oK^Zl1@?g4p! zj$-K+vnDWb{0v$Q*`!1Cbas;%Ex|NGr9F`(NI958WtICx%8$gL2iTMz3n^t@p?(mg zf6@olM|ydLi>RPsqJP~OT0fP&oRxs!3)`7Z$F{M`rj>1(c#FyYB6lBJj|GjHjct!D zp@kz+HZ#s`tIjTT+xX-*k;YXx&n$RhZv2)Hb;Sihmd|j@nM;g;F33@bOD(d1s)Wbl;bt)J#;T|TkaDWiP{VMZccP438?@ou8tHOUwU-yP036X!8BLJWN-ATE*v$k;icAm% z6d|cJw9eOWof*k?1PpuFE8(|)PZyWxMX+80hJu@*v}I8OM<_aUjD&>&Ev`#Lt&BsE zA0xy7V_?BLn7jOVezsdL);Bj7;74zhRthED!w!m&6)07Hz~ghofO@Q8zUBue6wA{VvOSAg3nb-1O{Wk;aLp|&+PBJGz)-;ID|04^53Oe*51z# zYT;(RtJd4Ai|ex(F-X^y*w50d?Wc8o#dYznW#@4-S0=d~I4QoapxJMqc311`-Ei|~ zd{?t%KUw31Akdd=FFL!IWAOnNe@BsIU!P>aB@y?~1dyQnlN654)<)@WnE?4Yq+?vL z0E{l)KDdqV#A(RQIQGM$8110^TVnK^%gxQ5yDNDVNJF%$w{*be{ZjLN_ShW=7+TVO zo5Gh!9_2dj6q8DXW%6yre0%YD&k)%Ue?Cv`j;r3U zZDYH>al!89t$pt5S2pHF2t~Fg4v22oyHDF|msFVUfvc1~Hd<>6yKx7Wq_^y@hTj1} zinDf&H4f9QVRdmdT>2E?Dt$PJ!wD=ReWX!_k>SHJ(sXmZjv=7{zs5SD<0FtTE+~Ut zMILR1@6T@j^I`oZE}T+9e^mL*D&koK?Pu5LkqMF%>6Gm8T)wU;{~BKug(2i1Uw2XD zU*a#uo`MX({6r;?LaT3;pTum8Fly>zffAdoeQ#LN1dQRa?;zF1SCAZ#56gXz zeIo=JqD(RaDuuXT|DiZ0p#dJ}O-4~gC_(}o19-1=@+ds-C6Dt(Fh?fYdNDyI7 zkPDg3hmV_!>m9n;Z9d*}dPcB5x@rnt?zGOGK4DoOdfPIh55&tVat)3J?YjRf2)(MvSUxosT*{?Fhx?`8s_H61X`zMq#R39)jr98upZmgJrZ-g zWC**-RDU$Fr_@s3f0U&Mh}k%+a+WW2*|d9-)s{hZsyF)V1;A5u5X-MCqs-Ovpb=V& z?Xwj{N?ie_oSEt|yeQlNJF^*jRGBKEE^iZd*Wn>VWQzYKGjricHruv!xT{5Ij#-udJj{IyRB_W{{xL+H#xUX^#R-p0yZ?4k=_9)f6ZB0Z`()`e%G(yAOl1OM(w`Y zy}&-u5@j)=$;6_fU1SCeAy$lFskk zomHdLIaQHHTyharUn8Xv)ijDFMNF}%x{5xJ-;|eGnPw-2q(zlfSy{j% zNrV`me@?6NEWJGWrFwTdXSl?0Ef5F>zGAZ5iUQYfXa*4{+irjyr59{9%8! zEJtZI`gKHr1V^M%L?|Q(i@w~9KL3KFD|q)V!br$C`fe$2B2FZd+Wc-8Ek_?m*c)ef zwZ@7GNTel|Mj}EuB3ef=Wk}Q5iFUR9>V%JFe}~jikXrhyyR(Pw=HH%7bjY|ulI;IP9nuEF51; zy}G~JJZ+c2``g`ZfOibMc_SqX@D)hM4Z)Y)-QzZ_tZ_icZbrw5p$=GFy|fAp$aJyH-I8N=7=t}L>v|^Fv*h%qhvfu-e<+R z1H{B#78&3l#pA^OpDwa#lDju=(%i3re}OQ6?hd6Dplao`@gOt6#fjU0LJ5efoD}>- z>T&5UL%mL*+TK^D35dFz&BJv4sBxn zB3V`zMwPHI8Fr2&{hD|}HL>~~juPOv7bX7rMLA1zw`Eqjt8?KTg5BL$rB88MdlM_Z zFRNYoECMSV5O9UloA*GhXc7}71@D&=`&lzj&67{5zkRo=lhRq5 zm*&;F_4j_^Kq%l(6WU*Y+wC@2SKEh>oh71eiE$`rX-F%8t5gEeOP{fX%T}VzRNSYj zZjKUlj%s@olf|frCII6Q>VwuqYuU6WIATz%06W*2G+E9|Gik+fe>qN=6l3ZHFaT^K zVjWRM5T`z@QCX#p2^vxiu7LK0`%>t~($qL~T$GhrFoUJ@)iQNYtxxS!8w$NgEpV8} z1~@EX0~G$b#U-->L*vGG3VbJR=Aw|p6;+3w*GLZS5+|y2Mu=k!m5AHhi$<-qUY@LS zkGjEcX-gNL0ErM0f6|~9#HVg}<0jH1?$|j-F_nAg+Lu28?KlIkH!}bJK>zhS-Peo( zG{?HD*&f^+y6$&86bTG@3VKi;d+^~`Naw_mpNht19Q``tsR zp(U6?g%uy&2V8GMEf^SCGj>#ar?Bn!d*ISFa$jLcOPn3Ae{s-iVBVP0*JwE1?shLq zV_U?D#CZJH%1_>gIz7PBxGkZko2Sk0?mFyRal99nPte;PYO`N#>Y9B%ecOJ246tE9 z#l%Z(C&N&AOB=RO$A_Sx$5dj(2>;*u^2@^(40XVrc5Wa7?rgMp>mD48WdZ#x=liit zUYt_AtbTU;fB0k$@1d!{D{XMV%UHZ>;_;k+1xKs}lAk(9BYZNXuyY>#DhOy@F&G*! z2rnw3f~A1>{IBR3X^0b)DMTFZ7*Sd+>$YsxG(JT-ZAn~K8*WaNfbG>0J)|78XUjkd zHK7IIIz`6Vc#)WF&NwuAf6tW3h7#wi^ALx*=@`u-O`vJA zylf@<4@m5VDNfD1BCXuQl)8qbTN`wwrUKzMyzA<~{O~~4&*9K0(jPbp&RsQbe)qwM zZMRHvUk5MU8(USeLA?d{NuV2ns$3xnr_*7Jblc_Sxvjqg{VP<{ZD(1>n4SN-me9yi zrD;*me~X^&V4)~hS|=0qgTU@J7XI(D7`Wi;(L<_|{cAU>eF*D8L# zcpQcYjnxoZ3_Jmi7X4K5gP&^Hi0O?{$_wYQMdEFeeq3drk~}S{ezWhaGmx4{gAnbQ zp*t-A1un887(+3fh4vdr=0l}~lXF=QDC@!GfBV8kwx^jTRdSXr(`BnL1=Dd(`U>+! z>Wli)UE9G>a>y2rFgIh2zUtMwYy#)ySr9>(sy}xW1ZOn%QLCiyspSEni768MvjurD zjG%9#tq1)U)+BJvv*NwA%FM}7PX#!p)@NRm zf9WDA&i$;&veG9U+`n@EG@oTSm3@B#8}Gd-B%bA9zSBJ}&EZ~W)nY(5Ulk6k0^p(< zl5rE0_q*S&5!B}wo5!c^L$Q78cN#qt8i7T8co-D=7->ovL0yQ5SOB$733gc6 zCSn2EBy*){5V`xF0w41RWY_DpnM5s1^JPTl*@uAMf7UqAICKqO# zY3B3G0o*V>j#9m^vh@(n-I8M zEcSaB;FGr#J~=;`cPFpTWH!l}PPCbHKTfio$y`p-L^74BNp~~(cKWi}R?VtvPiNBP z)4w%~-MXy1qN|!3rV@W)%=FcwYv$$l^!x71S7(Y35Guf!!;llM?<5xlHCk3N4Xb(> zE_4KwW@$P=BjJy`r$u>Eb|=4_2ms*|5jJ8nW`vr&d3W;d_k3~#@4lRHW|DOB9}D?z zqD8`z9KXApv?pJmaK{`zWYUNd!3E2JJE>GGmuXK@WM`UXA{~G1EU~0|+>>u-MkZ5z zQ35CPWLlRU4Vp8;l^Vd6Co(}?#;`$6?G zuzGsPOpzH7qG!?1cfY=6A8#M(+lTMC;it2N^XdKV0}Ws*rnQ2nz~%$#?rDpGQPwN2 zR1r*)B}#ahv(YBxwAh~J({pQd#6bo6XVPTML16#kCUbwLOu$>ezrT&G4N5FVwrA~} zmWP2;8W{N{lF{~%_F%iqs_j)OqL&)1(d;t}Hextasel2{j-=yjCwYrSn<3vN6G>Py zCK&@vy#se9T(o8z+o;&KRk3Z`ww*V&ZQHhO=ZkIIx^>U#F}i=mUSlsjb2>qXDg`-3 z@s!~0`@02`FtU7#fRCB0w&^M|;OZ>2&JNWR;D1K6kq8YIc!mUqL?r?cDFVQOzrz@ERORwoH? z0pZh(eLmfO9t+z)H00F?CWQaM09&a;a@9~e#ZL?21tA2)blYvk zRX)~5xkB3y3xKB>XoWK=>*a64NdLoMl*V>99toDOCd`=1Ox3puXe^IRMNg>kOpVYW zx!tO_Cl-w#PMmKoyM z^KI$zZ;9Ojt#A==A}Ae;LvH|#cQ_LRjVcM77$lDMb^6v;zj=28(hiVj#HmpZ@ouPm zUrLFtlKTQoxAb>K9WQtbt03)cV(%#Q&sc~L(T zbObF+M^qJ)GWDb@a+UP`dcS1Be;<%m#Z9a%rGDj^Wq-so%mB4A4gL4Wvb98V7KE_W z$kg_JT!y2)E{NPEEZlC0>0YWmEJ?@Sl+L~QXwp&*a7F`g6OfZHktICxLJeT+aHRT5 zU0M?)>0DlBpn>If%%}j`e&#M3jnU%w;o^93Ns5WmCMNWH0gJ%uVO3>)mCMPrbSX!i z{rd>oZQC~VWKyyjMrzCrzRys`^|}gR%X#{7rB;pXcKHUQ0rTzoreXJ88?_Y>YwYZR zFB{#JkxArzC4|o!l4g;f2dEL{F?ZP5F%KK zr@m5eb30$qFU&N^SRR2BFchndzo)=GcxFnMPS087KjJBU)Knr>*f1t)v5WzXSac#* zUTzv2Q!SJw?@@LuCP)V6QGa7t3be9sAq8TB;6ODue@n zjq0DMC}Ev?>m2|$AqqqIG7MVZpw5*6@c2Rr%!#G))U>)W79yF@T#LG^B;$(Ll8xbx zf*6(Jt4$`a!C#*!>|(Ce9ozTk+U8>jIStq4a-|SZD&p>wJ!r@l*?;P=Ry=l~RHG&R zDElTV!Fo3vI%#k4(PL|a8BN0q#dvdXD|#Gk+N%8eZz({0PI&d4TycEZkpM^%gi|)~ zf7=(4^G4)1e?ghYXzlY1XTcJ1=j~)pH_de2RytjjgYT=i77ZerK+gG1a-}llKp*L+ z9%!T?2)U}YykmljvmohUo`N5Mqv;7c{s^dZZNPXn_;_C9R)oB0p&K`#aLLt0@{S+vMiT;*qh@m{f7|{DHiz0W;I%T#d-L)y;Po49&Dce!r ztwsy8i;jsNsc{Y+v0WHVHGWC^U!Qhv8TFp?gPbyoQe{pkQ1}XxN1&t1Osy+FcA%5n zAvpm6oe)UDe;orkzrpSgP&Gjt$tH4vdkcv{Y_@|)homhYNCl3ch!&h-q#p)YlND}& zinDeLmI?>=novhEetFyj=;MDw^rS#&by<@Gg;j3ZQ_8DXN3qW9`Lac!*EG!@D`C=R zc=_M+OsGD>ILM?&8q~76XY7H0q#i4_#kSA@iqY&g&s1$xa>dQ6GEevK4G`dexuH}q z@@1j-MU`kUAazkKlc^kfeGkukR;Hsgyk)RcpK{Pw6WQ5ISAug;xY&BC)o3y^(w>Iz zwCSe!%nZs};BS4@w-O}kE@{NO4^d(ns%{1YM!fwp0;4IeO292qIU#yA^dXnJfMPQN zzTwWLPU9fSSZU5<>&Z+RU;*mSdO@qNL^X&+RX9(}AnEcx_|AEUg{bUyPwh)jw^>;v zzCt;?>()}a3)YE%89n9BU270Ao)ue=M=lGA(f6?2o;l~d>b1NDhsC_+?=ft-^(1%- zO037}FQ!kPKJVY5yq2jai?l;B$)AU`3}FyVfCJ*MlYei=Z^B4pG?rRUYhfDI6!Rk_ zDgDR9@Nr4pNYM`$SrvvlUGm-RQg^Ksz=-pX8=O}UBJ4;GA}?#-=V#+|E@i0Q3I^uk zzl`gIqlo&65(IJhFyKFh1R`wrR7C8!)I>^=B5uO6oZI=QjaD302a`+fRb5ucb995y zl-W}+1#;T4CTu2Qf2JkMiwOCQfcTPs?uuoO$*I2<%pTgW00j8R18Eu}AUpuwiv$}? z!Z>^TWc*Y5&Drk`4jEeP%8^usNH;s}dC-qYasy8+ zeG~5|T6PmF^nRe1T88Qe^%F!=!HK{94fiWklDq~%c$*?5L%zWUZx}#!%y4E_x!WG@ zZ4n2ww++sb02ez5Xj|=MPX(W!(+mz8m6)r0Bp*fM`K8u$ekE5%(^fwv=hKuV15YtX zF=owj8eUyH&csq0;IqwPkEG49ZxAen3Jffdi^fymQu$Y7Ok>JF!V=VaSQ&sEPKtS}xUGMu?X~%Y!!y&+afR&bXeiG8D^lC1Fju7ma#i0ftKF zgflqY>ISIZp|8p@lx(_LL-&um?X>OtlU@2k-Dr&RBI6{t#89DbtX@nF7B^d|I+LI@ z6(P-ZoWx&Dw<|kpc8KV=knn$w}f(u8Q_1N+A`SYxPIZH|yVy_x?z+I!RYP?h$)=KA3Q zMc8nYR$)qg}!!ry4Uw^k?G&mHXghP}caq4=3yLe|=Kj zuMPV@)_oe11PI0dl7p_bwVe-J(fwZQ3=-Lkaw6*6kqF=CA*Bj!%`6v@D>&^k&na71 zpQkr=#+{P#c7tf3VIIh~n=L7l?omJnf`Xj?>2ZUKE}_K5A)9XYu8Cxe;6{i~6kqwI zSVUN`$pVQ}8_T<*d-Hr2Xs1f4H#w9inGySizzumPoD`#ukDJ8Vrx?tgCT7aVTGu53|xRLrQ-5^Qae6%7`toVYvuo=|^9?H(3JOn7(0c1zW zeX4_CQH(ao-CzGA>GoIGU}Ox*rzR~=oDmVigo#r=k?R2tNDoTfRIp%StVxRlPUKKc zK8;D_skc1=H^59hZisCdMI=8m9(I0GKC7FxL(1ILhr}gI9VjW681Xf_5EbmaNjPI$ zsa;ohE(Y+n9BKzwTq!AdmeljZ+=iQLp@%`bT<2l;Qc=^O&f~_kOH6Mr$Wn-|9mHc{ zr4|=y(n)<^nTG^vRYty0M7Too{TlP<&;3x?^YQTtIiQ~&(t2;Ome#rp;BE#n#epV| z{XVBzCF42?;7)DA}ODcC9+3}g#uPA;E!5cF^86MD}YRup^{1Nf&5jRRLObu z6yw=ceO>(^ls?tfPX)bCDc888!#S#N*bb%}OFTQ#-|Uc;hnD$aXxs`bt&EgxR^j`U z2LJuZ02n<9zWoSS9-EQear;0MIj8Gaf`b@L_syT2%Tk4mMmBv_uE%pN7NY8Rs5~~5 z5rVZ=Os^P);zNZBK7iiAOltnULpFAx&W4X`7Y~g#?Ww^en0LYPW%CM7U{&lY!fqbv zuE6l(sjuWz1^sCb4JDISWUpEjYAMq zOjTf1#&__&-6O;k1F5|YG=J*ZXt80lc3rY$kL=XM!^0WH@qHu(n6p;mGtrozs6;h_ z+vZ@v9$HU|Kh<L-7RNDx@*QlYGbgJUS z0|W<=#^j(jHr#MgQlDNNU+Z;ub#)4s5HF+t<d<9Ky1 za5fG^xdAT((kvpP=|2rGg)2$!3oeb?0Ynj~6WuTeC#4a*eV_caYVH1bbRf(hVCAFi zGqI5Y$&l~0u-}O-(F$rf?2`9+sS*Doyq?z`Q_vf&&}J|^=rN$ zqvAFqdpG=*pM8ZwN4!qy4(N}f@V$A$qbX`ha&ASDj3en3YFhoO@)m7Xm@IHXo<^h zqNW<^9x%0IC85C`AMSoWH$Z4_mdp{mQ2lz;xrV!jko_b>5aK24M^A6vE8P?4MD|vi zOANaqC?XQ`S+Rn3KKb;WNGIUNw{#WN;@uiD6$6MG9T5D9*}zd&8H4xsRPqgV=+5{k7lM3}(Vb7oxD>9?MbSEWBHSq`BT((wWrL(b9?+v}iI4~y_ z?j?bP4xmriNH)ZTXzjAkREV;4Nc23$a1n-3^IL9RK2+K$-YqbiOy`0PG^WFRH9|5V znv04nL{YRAuys%l!v?gM0Alq!i6Anj$phrKINf&xIj~Z#^|SK^`12gtv=y(Gar3Qv z_Y8UH!R9*uoXnR{V1BR|qk;TnqI~4s`|U%p2kpoMK4-dHf;JBK)w0Vepsq&j>!ekl zG!O{>gy*2{z~9#6LCi^^xr%g(Iy2k*naVHrx@NZiTgG$@kY}TJfQK_iWfTzah|Sqd zq7LY!-o<`Kwa>~~j-x@7S%UjJt$ozXF`>R2wG!5Uh5$yCmg5s+jr8KSojx8|w9$i? z{Xb&K!whoQ82?Ty*ul6kX@|a4fyluOfo-e2o>SI3JK8s|F`@5+yE7>^0qIy#eCP~eyZtJ@ExxI-N9T_?Umd}gT~JyZG>YZFDVZP1qnuqG zy}e#*Ck9EtMo5jQVr~m3P%@?p%Al0bTQ^f;WbbRFc9?5BvAB6wCW(1yNawa%ax&y` zx(}(an`&_{t=6O$fuHuLk1LDPe%wUvnF@S*Wx2Ly`k?tt0Gyl@)e>~NAXg_Hm@6Oq{BgDm@K1T9<>;go1jcq z@|M9#9&vETi<<#-0-Fg>hzw|d1e2w13Cg3;FIbCtQc;TC zJChhNes>e>4C?GjGTupjw{lJCr*M zuImhc4}R#d8_#fF)6+$z+04{VW*#`9(Aj>a5p#hw7SjgJnRvJI+r_`V(~{mwYUPTP z86(|Gd*{Kz5pW0pwc1x?JWUFwKqWbPd)6q^?(U*-Vgi%W=qG9pEd$TL1T6f~f){t> z-KT;DK(QH0qBZj8W3gfuU3w<+54cnMtXzVQX;>~d-7}vA!aJrFZLbSbFwUJ+6)}xi zG1#~)T;XVbE?#6fDp9*fJVEzJVQDfN_lIeo7E=_RTPg08EyKz{;UwaKkH67yhga#! zfw?F358IprdZUV}pyCZSa!~{^q0^Gp7B}Yt{GIKid$J&>@gQsR$cKkP%6N9jxsggC znbvuk8(_r9%#Gc3dUBx+1usAQ`NDgX$x+W=;7d`QBr-wLS5RXKSmUiDBKEWB z+)ITaHk>8J?~_SDYN=D{eq{C}FYIJe_j> zj`xeR#!ogo{BjKLlkqRk7!38eEl?=|{QH*mvAd?J50G5PA!z0jC0#y3djgJq;55X9&00y;QAMaY(?u106=4zEet#rrF1p@a-JcAV;Q#nE1q7*Y+vDe6l1E^_KHmfpIW~E&-Q41OjBWbB zu@R~Cv48$v{|-lgFZ{k2{XS{~o&jI2G$hd2c}9;3H_ly8h;5(Ec4_(5zZVWYW0(2G zBuD%wuEwc>a<7dNcbk86-UysJhn@euv4Yu3~6EKxcc@N`}}#vm!VBMnZ-e1~h7q%|D9W&t2B{0aTyEXHxOF1ZZy-p8XBLltjX-7O_GVbYmA4DDBoqP#Q!+w8A`ocrXg`l2? z!P&g}WZaY`?_j6>V&G(MWH`S%eB$1_{RZmM!td)1>UNhp3r1s*QOA;0-UmX!YL-s_JN40Ti|)Ze^k#^Y3o4q$dghI3 zKN^Is<<%#ttSBQDoi^8FeDt%!i<^Ty+}}GWmJPA{w%zLT*(LzrHekdbP)~$fxOfV@ zxBUG&THOnq#TsG@fCG?PwGVex>r;}yQ(9|Nju%?fTs@q9}P1G$z3QyKgRLpA+2~S%?#FzriIF1f{EB z#YT!m4zNcvl~7KpVvb2WH_2SoF($J*1Q(XNR64zlLQWM4YzCBPFHMPZkvazY%uYIv z6G;-*d^z>ALQ`0t#Sa-^?tp>9cB@yI95csI7HgKwKlUj7q|1j(Bdm0S?0*4 zO$w7lpTuWV9S8K%62+J_c3FbZ+oY3=*q2OHac2C^4Rbn?MTHts{w5;rD&N}ZvxU#| z((L;SFbFxIxN4tDH>k(+@N}B$5HK5C6satrSX!v5Reqt7pZk2YkWI#(1$sBz;3pAp zkJr9)D>&m=J@YG!*H^~*#1vWlxXA{wB+Q3Ubz5der1zBPPI^d0%T==t`lW(|nC zF_;AM39JPonG}>gY|DE$DW!x7rP06x`_%?vkyQD%>60y2nl6&w(1cHfJ%LJKaWz_D{F7D)`)eB~Vf)KvK5OpZp+{;k{1uxv4YC2b zFG2ZVH-N%j4vbFp?u*l1xUSpLG(n=hYLCXR`|CX)Mla1TPV8Rpea^62+gT0kuTuUE z9);1Buy(23b4mee8`nqD*h0n*>sW>GH}vSMSiK`B$W|YmA2s@8zJqKVafI9|;xSeO zG`#_R?a;st!i-?Zo0NbVn0rwoV)0p5Yv^!)YXDNo0CkSG6MNj^)(+h^y6E2E(5Y)W zA~Dpw|H(;OvPDvMBuSp7_H({>X4nQ};gsU7YTxT^SExcI5{aylK)FCLvN%#ST)?w1 zSO7Dei1>PHx8#9kyWZ&vDOA#k4|EJ^*JX%ebFVde&~%Bxta)&m%kKo( zCV*Yg!lcw)@_16doNTguICzo=c-zB!T_ZfbOq23_&wg@q>50R`lfz|I!oMn;_t;j>Y^YlI&IW?tVEFQVgUe#SZS2|Hzws;-HA^q8QZd1vtRBfyc3 ztJ+x9iIs>d@gH6bG8M;mp>ll%BGKmBSiETyu28~ekvZ*oiwu^8OcGR6)rdK4mvnh> z@;zulbRG|(DTnY5wZnXyN>#i;1gq?k7QjY_{d4c0v+26nk;%YaC4c_e4i;DZLdqT> ztl-i}aT2APT}*Fb%Cz@f)*`IZ1;8{R>vu(Ac$xHe%_0SAODhnj-m}e9(X^vF%RjRX zL_@2yx#HLTi((M!|F#E0A~g;y^)efV5P%}wvp2JRIJ5jHNM}$_n07*9zTYC;#bfi? zUkd^ynOPq_IYPf^Jmd$O@OwPZx0zPX?w?pcs(z%ak2bXBC5(LtAF(mg2&il|0O8E0 ztu;&PiM9gD!W@3f_f*103 zZxV3a+Vte@2Jtpg7E|CCXHCEj=vSNC5X8aNL{m(qFh?`(Uocp+XVh>!;T34

    3xTKzI??LvP8Y7KMfB*yA!0z6f@2-$g(8rWs}vCy2k0DEf}ul8&p}!wYK?q9!)(03%mkR_zlvLe?W* zPS>rbNq;}xH@g&B^JvTV#k9pS7`0idJ#pHhmwGmjU;hIkFgMpuZ6HAX*o||!t?2iQ z%F!c1qnbo$n2#Ut*|1@s&NKZ;GOuj}%2#ZlHtUi68*zZ+ZUH>UuJ%CeYVT<#+TqCx z$P6R+kK0WyV@tgl69C~x)%M~_vFk?3@|<_fA%D-Rd$1X6{)HyrRptv$IA{ljNv<+@ zFuwX~0BR5veHS*)?X?HJ6ua!~kjL{(O_RF~;4#Y&J1~k`-aP~vKsJWVKV-bt+b)fA z$jBWf*zQt3>B$h@OVviYPcS*E2W=Y_mw3&Q(yZ!x$NCrw2Q)V?BRYGux-J7=M`Es{ z8{H%Fwce#RVF5RT$LtQ9(1loNC_3=YN(&(70Lj6Jko2=}wa3vBFJB4wjW+tswEk^V z@a0wg@&7L0PZ#_LgX>~;Hj?8(YDRjKP+lI~5gIQCoN}-;TXt#|*@eix5uf^YyWCae zy6hj%6nFD106VR@dHzAL!`s1suMf~OHeZB^6p~=QD3G40ke&tR`^b?(`T6OfQ6sFl z2YN`0{a;j7&qFuKA;S(V6*UU- zOUBNe@P%M2W}p5@Ryp_@klVQP7+gowxLv>N0;>o+fGG^2)}6TWfo^?9#n=cS67^18 z?qu}v|CBlh3clRyGc|GzLgJEe82UH?9pAgSKnrAb{wJGl_JY!mOg9-pANzYTLw16| zc@v=UY38S+U%j5t0^r{_)-1C2^LUz;4c~D@8pOM8KTQ7sYq^rYkhIRTT>p^&rfPd3f8(6Hf6qP8Cy|-DXrif|E8P1 zUDQMYY;N)lV8wl4_zkYIx#Q1|Vs1!p4*Zu`Ye+xa+i{h6h8G0wE^#1H5se8$ko}b#S>5ur@roTlv_`@r94r>dSm&+& z`2g?D`?f2NNJ5nIdh2qOGZrDTDDn#59kr3imhFmA9{es%U4(@shU~*53dI~rzO!yC z5$&D{Fyv2vI=o!^F^M*UO`hIj*rPvYE9?phzx`ptrvMc-BQza9TmFw9HxUJS0&4yg zNeGQOy2SY5ghhEN2Ht}EugV5@0kl_5~vv3&azZb!b_fGV(#(g)`^@f6m z6cz{(kUX57>PWBvbtp7tKEZk;uZ5W8#|Z}kKrmDyB=aD9{Jz^cmVil9F(>V~HUX1N zERE2q%^3??Sea^MmU2zRT)*r%66|$&e z58$=W#H3R*K3y`<2uo3BB(*r(LD;rPcfJ?%2mVq3feWUshO>JWjjlMOfe2b&Y<(mG z6ay67Bx+nOrR_hGng+gOgptZ5%B94_l)dtAd=`{aXSvgpxB<3Y3)vTK?R>7Aw2Ik_ zSW4tLTa5>>va^tvKIfCLG;EA?71#9;3`CWGWWl%u={QPa;H^q~p>={yET_p_Gy~_) zFDaid1$+Ew!NoipfZX0^8_!!*--ihShG)j~6x#IqELTy6nXq2)u+0Z?>De|JUn^m( zLx<}0mS{|a9F|k1eyV|E8Hwz1T|N{|i+MHVX{H`JDf^Bjt*keLJeo8oQHq&yo{^0G z4$_DA48>U31aUVMv*}KOtmZf)#|;dTP`VlCDy=53m{_|_z1pZeQsgdr9#|3p)WnU; zXE*P2GNfH4lCEt-FK5S@YO8HRxL@Zf6$#}=Npr~OVJy+h%+T@k#AiJpA!Q;AK+5Y8 z_I^XAs;mlg7hwS`Qy@5sm!Z7b(?KA&7wA@7Zo8Iwsd9#kw4d`s5x=CL%kdlGO6wha z#`oE!ai7%!p6$;5K_W<3eSsq2Y$#@ZmhynN;smGd!4gspbX3|qM}bIi`iDmIm!?pEeGCgmQt&D) zuNb+27gs*eu#G>q?}r7d^SkTEL8+0*kn0nFkBT2I^zc&A14G76eAXSn!~{&49;rZy zREafQh20|~7N(x3D@X>#0$YK(&q}Np#3FJW_{jH_$(&jjOYDsho>_XmYa z9+NSP{g@zjGwkNoImGwmhcv?32Q)Tj%29}Ox zN#{1t;kvowDbIpo3_spXfg zfOrF86gU>Edq$L;*@+IH)2Y=kFl}B~?XncDE+-eElw(5ewJob%?McDqf>bm#rjcs5 z)sM!u%}%S<+050?uw-uUzP5|JSsaXOtFHA6Fl z>eem>e|?)74}`Sh_9r3#heemiQC~{~P;+4BN(}nPq9cA%LJ`4gBQ+f_V0JntbONYG z4hspz4;`j&_HyIy#(hC@oW+GM9ZPma5`l{^9giEtlbGZCOx=198DuaGBsgiLGO=kp z{G<&)I3kT&=^@I!AcBuBEI0>+vHz>3W_WU-i1OYK=Xgw*We7@A$8HW+;Ax<3hr9yQ zt4Pl#Hcpt*q`?v%(JWJoxUrz_Yk+&W6Pt)+!VcKPYl3`5X70X$CaWGt8>eVu?F1D= zxMPDoehOyY*qibb?;C!zB9(cSn?b9jptDC|Onr_Ivg(U4TFzhyMAs}NlnmE%JhlKL ztwatcpwMYM;&eibPaX}V5v^p5L3PHzKc7hhXe3Z`4f(QyuX~#GMBZ?XWq`#I?(u&q zmzA~0gM(!D3dHDz#3y5AZz zwkp#kY{6_U93nQ|B{oi3XCk^|1aGilkiSeZ(fGRy1t zK>uUWVJrt`blMOhy6F7tO>R9A6asXrVC(gUxtN`Gw0qW5vWJ%

    <22vO8#F0b==P71V6(1?T&`DaU2ebA< zc^C3?a*^JqfP2vfDZp{sHm<#gLxS{C)eIbiUd}iLxJqv=xO#_XA7|zxwXbI7BA`i# zK)_%#HbM7H+dNGcUVOycEKQ#ko6a=2K2YaB$j3T@*j_a!qK>tYG4oESd`+yFt)YVoCrQsV>o)`ACz(D+r zhN9>Cg$sG_ZH6n{T@Uey%EDBxfXogU17uQ(u(Hxx8Gyn{t_P)Cf?L-^uoUllNsi$5 z?8K8E@NAnL{OFJ7i~FU*_}@oQE(b!Tzhn}ze+}MLY6Kw*Ve&|C(PrzTJf6m$;OF`#q>{RGYunNC!ZTSuZK9?j zXT!7@J0O=^++2ymR7#k17J|J`j_++j$WA_%^ryXqx%&^+WZcsI=?NYKq!oaC;nX-WU{myOAzY+pZ-M!xW@j+ zCl&kY`i04ChPRt)l$Z2oc@>0MR|6dvb@J_PULq26OE*Xg+-7}U-L)t18ZgR_yPTPk z9bF)<@wTOWHYR#5OhjLqXDhj7+ov*w#zU7CAg5XtM7rgIfh+_NO$AfUhQ?BsWtBr4z=j z|KrWLk062j?g#&Gc4T1qsBwAnb2by#&K6?6+scTNyZce@ zzSG8eA5XF3{ix>kw2fQ~3#kC|jsJ`W9;^rkpvz+>t*|d~-nwVBGrxTRKsITexc^Jj zFMhpoYR}@|#2b#iTJ?h^0(A>RB?@6Ga72ZTP5eW<$1_}XVLg~C)c?9e{u9vCxIMv9 zLXyfU^lLWQbDO#i%`oTjoFH(*wHnqfX7q1{Q>XNO?HR?qNi-(r+q((9o3axv1BXeW zferjP;A4EZrO}T<4Wjb`GMQ?mq8Yyk>HD|DfyumqPh9))h~X511nbxf+%e6eU~gFe zeDqn>jL?`mL10Xi{Jq|~s6e%DO5V33 zwYK9JB4JiD%px$0F}2>89C=Ewoe&?~(`PJ?zDUIYGbE6X36{zfNQ zk<_QrJtU2<^ShbqE61QW@0dVcdn;$CTA-=D9-r<)zv^X+{3_QQq#v zr;ncLYZB@}6}_4qQ5iB&fOzf@QsKSS|Eoxwicc&su~hX(uf(G-f)B&9S45^>Y})&i zHA`MT51Iv7Jo&-5P)+hQ7tY?cO_FE>by$+Y&b2cbPXG<1|be5D_#WyS{AJcQ;J33vb@x?@W_$_btQZ=5OQ3&51Wx zp1&-IjUFbo#?OQ>kSD8*=i;F%+%{TSVXkm*2;dMAtP*b>o+C2t{$x!+d|LK@r_%)N zKwtoDwGNmSQ|L%b{ly$jZp_#^1eYs}xFP0>R_RX{s2m5vPJ60XefYVgLG7pMyN=}? z5*1s59yvN@5MJr{I0ut$J}C~-Q9*w>YZ^7iibUy++glL>@oGzhnk^Qw>s7F6p6{{z zjgVB)`qR9=LxL$29t~1Bx-p@D&mf$UHSmQz+^gWi znGG5ts}qS%3^Y}VN=S{XG9BW{$?Y2nfx3)kZ(-#jkTq)JHZ==RdKTA`dza#3bYGcG zWiPPSx`yKOJ)TS@HP2zQ{yjQRRZexg!meo_0Va zBxuv$h-rvx$lrEGjV0ELtg#K2{lC%PABxOUuzwb5VLru3!E_Y5jC4sSDjW|5IeE^* zMr~Z!`V)?ZR3kndbY>&{}$RY z;+38s|GR6SFTMNJB+4d|f4#oDl<@w=jEF&AKh-j>EV5D4j;<^w&Bw#Fp zUqg>g!*Kwi1Rw<{p4j6bvJwR}ELO6}4f3GIXVVAv{Jj!3`Uc0YcOTts0(cmCNSsPoe+%B5X{T!ZoH>LZx$8 zuBVR|*TuOokGLUpL_bDJC*-@W&#z&FkI3VQ$%ai04x02{L{dxIhXV)+a7!A#BM1c` zNpp+827ksXWpgCz=W@lR)yL3}m;P#fzsn~h>-ZnS|J=svPg59r^ON)ED0i3rvNXfY zg-gaM#`o$8BnINE*$UwLqQyZuHxyeP9+95JN*o;fsEQe-$LSgG1#iiHZPb|0yDOWP zzk_M{%Few`OY3CTxITxsl-YLG1hf;NM~|4fWs{~~1o_b!pSOaJu|0BeUbb>j3JY?v zGkfx0>D|_uLGxVT>GxU5<*f|4Gve45EC(+{XhH)9K0fokFeff?X8uxWf4&y3{Q}a~ zdEaC4j3K@|(06f_%|wZ++Q|fZ-_qnv)$?$rGZ1J-T`ztL?jK85ro2!jzeEJks5*S> zH<5#25@@9aFDq#s6O=494sMm`pRGZ>H&z{co)w=U3|?iE|9&;i>OYvAu= z5!hvNt;akmq&qZdi@Li~h=Kw=#t!66-3&AdpEl(LLJGhye0EOHxl*41@c;A_f`BQ> zUE$e6bXHzw;p}UcSJp%-^lT5iwe(4Nz#FMt)Q%=;ms8E0UpeWFSri{&jCa4hITdrG zYp)2=$1hH)87Fae!jJ=>T=(39$1PQVBk z7HE(S@B|G{CQNg12EhlYU82B*h7lPs#WR`%gc_uE;|c9lY4J6#dgtx#Wh1&a#LI>1 zslFf>(f>~I&KhBTedJ4NF4cepAs~FDxe$#?s1P_|!Wv~_SgvN3V2U`s4XjGp`Q21P z6!=vp+A2#tTZaGDeL}>l_BqE5Ete;~f?ymkup+^FnK1x^ylw(mpsjpZK9`@Bt$eK8 zDci=6;rej*$ZlFA2kiKCbUM}P5-X;+DR6eB(=I5WM`C*daQ7lXU#n$T%6Tc z_Q;wPsU$$ijc+_#n}OT+hB|3w&K8fH5vwN{z#T; zj%E_=m}3)bT4c>bMzWEj8w#x&qyJ4~aexI=%Dlqj?hq-fsPEn7x6uYr*5=+K;#?!K zl4;~^RVc>dIc~SlMQ82eUEhQxmv!J^*1@C#3~)?3(^iJ+>ezds?^gN2sUn)U>qm{e z^nv_$K+XXSk)v)kW#8=@y?MM_=-;=@eV#hB`~{)Sx_Lj9hf;zF?+L< z`q?21^;}I{TwP00rHd@k8 z&J8VW!{0&4Otuq$;FFT4anhLGKqx`kxtRZVmmlH=!UeEcUV8m0CA-@8T_NDLsioysE4_!{;6QwoK`&swi_2tVYKU7S7{!j_t{*8ugy5yWG;=w9oJVqtz ztb=%e#DJL&7`G-wx#2OdERU7P<9U}CDm-eev&Ts49x-x7=sA%#AEf({ks!%Y-qt11xOTgv^-3Wn%Kt!0$@_+h$Ep(0e2& zX;Guf{|1MQbTMrjyL79t>IlHD3CzMG>;R2M_j68P_nZ}#EhtqesAzwIynmnggJlg@ z1(R^*ch+4tDnYeMk-;Jhpou0ZyMiB^ty9NTkqY4rK4_%lk3on`gPGO8w$=Q}f~e)TQ$xA; z&$8*(;np`$Vh-Vd+_sCb-nflp)lj9xm80yR4vHj%lsx)2M;n5K$fGSJ1@7_n=vGGABEA>!XjAEE66DfdF_yp&T{r=CrXynkGCI2{7fVBi|G-zo#VVUoG=E5{QhAX=4HS3~Vg;DUHZkZ%Ft|1F zX&L;nZ3FsZn|p0|B_7y~BpYr1tjYkbdQ@7*mdWE5TpNn4s6*|E;j5P+P!z*be>KdF zq`QU-a9+}yfCzmjOsDVFQS<_PBE(7Be;l}iVs(wBsVeY?8 z8<6yo)SZ0=R~H#{eD*2FWZ8p&noZLOcK(3cqG2GPloc!-pW~5%*+3=N7qdSr2^MbX zvPM;7?^|(YrbU&WRaUyXElHPtzBx(E_mUdH=BD63^u^bs_#1e%G)c5yL9q4I?CD2 zAvC|t{*-}smDuG`ZKoypf{+7$r?vZnPy?9Z-n6Rj@d6tnN81X)xglC_b&<}r{XW=2 zW#Y6cS5;<=m$p!ugH_NkMo#wr&dORNXI*!=_NGPLFfHVNvNt(I8eI0N7W*?KANjIX z8r-Ssgwi2Z7^MrP=3>zzLQr|BcF&E?lifo@E5tN{?Xq9;nd;>Z(h0$9ud!_1*G{?)ORu_s4F4yOX@_C-E%^z)wGPDFO$uIh{8r1u^ z1E-b@K<%1N?d{9mL_470Gjo4o5-vspcG(?Byzgv2fl0~6ZmzEcwrv8Kb(N@IJ3=9! zXf!C#_-5s6(+G!`kN);Q?`);Wyh9|9-&IY`^i*}t@9wF$pVz)kaC>AVMmVs24wlC|%bqT>PEPi#82GmQ z5aKn-WP1K!wE2A}i*P>-|8}vBmn%Ll*XMNlqOct$0J#;LMiPL=fyVbgVg-Y}Ct3!{ z<6(QC(wi6`QV=YtHT{-hsJ=>`)i@#+p5$u(CF+AH1qNzj}@FO|#=S!~S!k^U{JRJ*W8xLAOQMoRBrB2-ODy zgbpkl2o4%@kqo~X=fztF5}2i3y@J@qPy55#WhE~@P*(Gqb&Llwj(WBgeO=dyF@J)E zS%ZRbnjD|h3RKj%z^swb5W1x3)qy_>j=N%6xMKptaC5U54Efx>`1nu(>q)JE)YM*l zm!-(uX1n+=o#xKff3FYvixGn_AGRQx%otZLO%@na|Lp@OaTo|FN)(jE55?1*(fHMe zqbjA0E-~14%q8AVd7Y5E^!`y@645}}s3I;~8eH+5!0m~egSSbn?sg{=DR$n>Tb98| zHY-Q|{O>>3_+veg#<9jrLiMh12JVclfhO6-NV60BM#YcY4|O5A&+#xh2C(iKD3Al; z-XxG`{nw6PAaa&KBiNXLPZzh*i=HQGQLt@ip>RlFG`H#t&o$Z7!dMd6!L2T90j~Q# z^MKtl+zGeu)c`5emb*BOa@P*9B3Uz%uoO zANh+ph9;!BPHT+<7795OlCgFHm53{uG_!i{_!~0~1^*6v;xnT*W62Sge4#jREdUQ& z*}#z95D5eP(!8rfvuCmbH-C|;jR-8L8U=%W%sjc(t%f{4NKod|i8u(NN+uJjt!#Tb zisDIaMgJIpgcc6WZ{3@c+AhbhoLKljGuW-T+g#_T++Mfmqb*Sc&)xaaEivEsx@JjK zCN(|PjCC701DRU2BW7P&_L+>mX*9z%l#H1}h9`h?2Q0w`l9j}i zi}{Qs0n#R~j;@mY>cL6I&XG`tvRsDZc)Js9<5bjp_{oTD&XtpjQ-veCkO1?&O9mZx z($$|T-pXOj_4??ApGxHO*lt`j8=-scE!aR9NO16Eh<&HDD^E%X9FV|)M%Df)cyIEV zX%vq6n!eM5e1s#PAjN7XNJ%Xxo1K{MY9u92D&kO!JuQ0>v+%|TMgT#Imgt|4*{gRs zNrb!3OJJujSIU|4|Hj*)iId@JVRiXuT1UZ8`q zSKjm-HUgdKC^+=%JkR?J-S^ZH}=3q>cV@XAaO=BJYdo9fl0{4QkIEY^G-sf%Bp>KXwx z)$k0Q^TD)>Id1$l#`;?rUK3wF{S$a&PSgBr`&aF11 zH>xqmYOtX_{E2O}zsXtW`vSfuXFHG_WA*+`Zs$)FbciJL(Ab}yGZ#OEV&cwg`q7zz zT4wu5@+AXtbi`P#`gK!C7*s>gR04~1iJ5Ka>dp1nH$a0^PrOD&Tb&wjfH>G4>xjg# zhX_-tDpg>ws#|_os*Z(EFB-sES1#BSY;LHmuroODjDz!VbIQntWN3c!Ow(7^8@0m~ z#7o0@jsiL(8a*0w!Ke=C zh!Ua=uNuGH^&niC8)1m*$Y+VAyw)gP8x74khs0~2hM{I^!wYqlnFB~)$%j#I!9mw3W=otg?#Um|LsD~FVOG$pyu_MaZ!)t<&zsRhk$goPMz%dz_N@CK z-ok_L=U%BkMsr%vH2^*+NH$wL4T^K?V&Y>(MEuxhT-FODEZqUOlb;3dy>A8X569$F z+go!3&63O-GE%5xL@kRt;tw!YkCH;pU(xUTd7R1O6XS%QFKZS=wcbmA50=OwUi?XX zhYrS7!1)IwzC_Y;zY zc&ZL`xom)p^l3Mj)#MUV3G>5}>wa+tcbA)9^2L%%$(e9> zWAe52(o$1k2YSky;Okg}Ep`o$HMI>9FTI=E2!qJ!fBfWr9K>gSk0~a;VBM5KTQck? zpKmv;U=++}vw(yrHauEob5VS+QlC=XjMI`dkl0_6*`G=xW*({|KHb~(6jg_}b937$ z-tcD6H!(+h1Nf9WV!Q*A)OeFt&v_kdzppj@ z7Q`PJ4E7ievi^CYb@rZW)X?b9#>ewAd*Vb_RB*;?sdj-b40pf4pyP%b{`EeEtEXmJ zWk;55^u0Rkmt%G2&$|7Pt%I95+IZ)B<1q#Kh6!h4;Uy^J|HT&zk3=)XMg8wjGENBE zb09Sv)q*_#wn*R>MRohPmD1b7A(_8(d=cFi!pwqB1{X_k8nHfpXJ($XLNz)DDh&zx zY?q(v3aJ=DdnnHwsQR<}Rya}v(2}*uU2g((P&jF@V^I^Bx6cCAy~V07^!FC#dLK|N ztdIW84EA4+AV)Q~D&49dd!Fo|!`QNCoPfHv$0Fp#adHP5!+5yzTWI9@OPS;g{wF)= zX?5eXfN+C&cA{@6LFa_S5?k>x79}SQ0j?C3c|HuPXrYR~+pK(U(1LOvmj0rk^~oLk zE+Sd;!qKY}kMM({`snfXTw|B#(R%sRxuj&#Fu)AFsJKy6$qsE0>&nl))g(j#$eWy`50tcFG+kW_Qe{v3i=>F{>BW?_wG28=M^V zAibk#lu_nrQ}Ckgr4OyMc}~>pA7K!rs@l?h;ggW%y_MZKnA6Vs!DR9f<#2Q%l`Zl` zHcEbE=Xr<+L32i>PIFgeig1*QfN!^3csU~}R8Hewb$&LFoa}u)PU1kB3q0hp z8N$qd56?RaMG(BRB$8rQ_NnQl=wDYAC*&^SDcw*+Emn5<$dvV^VuQ1|EwebKFwHBF zd@3vN>D8T3&TG=(`n)w=VZk<-%$YeZQfT~ylaQ7zFq6a*Nz3!CT~BS)*VX81`-h3) z%O)qfs$`^n>PHtk^inImH^4v>|HE3C>zlRoSoQw8St^}K|3b5Z9`W-KmGO{_%vvxa zZ0gG3Y$5V$CH*&eg@r1{X(+?&*3WAC*CkED!cUVM&sBr0nU)o^Q#h>-O2jzp0o}gE zsH2*#R@euxk3MA;Hq2|LA#w0{`Z0m3?*`rO%=Jmk@u;k2FaMp)V*(y`q~S}}s|NoB zvt?GRE*5O)tBZVnJnfDP&!o;5SL|x9R_N95cI7-;JrPmrWV3-cEYpRPVbn;`?jmm^ zahQwYMu%6AUR}046H2!&qPz*W)ev>KYXzrpLGSLJY0bVrYJYkC*2VgGk0rqz?8WCPR**WX(thAk=0XQ8I^lQT_gQhbJ%yM=^Nl+nf=!diWohY-kAlYjAbHUM2D=(cwi+-(qYvmH$k zU2=R+F5dBo9ml}r zoCIluUy13GT}pb-Rz6dXh2Q2%4*O>m>~*r&K2Irqr4v^!I7}h@0wh@6tE^^$7Vj)a z%E`1Z5-;arWX;&)JS$X}U>ED1!@7*I_LXEhhx??l97`f@oju5+U zYg6R#qnucFq0^|3cr(F-{H@w`c}De?$jD2Wr)OD}8ATQ8edkiPZ%uS2G~2y(v*X%I z?4=)4oZ))Gimpwa&c)f?)xJ>fdWL!(W&G4l$Y`|i5oHtc%q*=c|i5__s_&y&I1vxA-Zl~CztRCchQqH0MF)*>An!%)@P zhQ!XEsW1Eq$@oHK5WO~v*WQr%TZDoX26dr(uwgi<#XrBph1UK)JPB``&pjc6Kgknw z@sqHb_wT$_UhUkEcdI#mR;l@qP$$|2VVm<_aZ#>!h8J( zK0(Urg@X&mFK zsOmRd;Q8nhBdkOgPhE-=>U(xxfw$AqR_GUi&8kR**x8ZbjKG;=*dEer_B4t~-6Ndie=}RwK&Ciq{#HfJ zya)#2Oxv@)Fxxb7Yw!PH5sCg!bB2S_GR1eGG0M<5M?YKxAy6>XgY7K#)^e$)S&iDZd}{&lM_>pMqFE`+a_{w$ zuw^a59Vl+3KdxUUC_==Oth&wJAM+|Ajt8nnt-H=8 zatVd?0%~-%z-IN&-K|hfXR>YMn|?S}!w;gC4Fla&)yN;r*&y{sFNuxs1s^S=t0|Ch zLhl>SwTyuT_fJ4@-Sh{;f5T02nM^M${0YdohwR_BPtHzBpRBmoUDdV?leZ+3=M7mP z5-K$4r1bfxcaS5Q_v2r}eQ(N5Gh%pcSXr*s{`S{kzJQgijao(>cooF))+t_+>i?)# z*WjLNj-VtxP@@pl$(Nk1>{C8sm(hzKb-n)j{_foBLG1|0O0MF+P{HZp!Ssv_vTMw+ z681-LBHASWxTuq{v=_v*@|9rlz7jZpEE`b(PY`+iqu1y=*BMmydBI(_8<*j>hNzykjH(VH{-wbcd{Z! z{H4@-?NC|MRQc@FH@uMA#du6JvuNNmcU4X>`|s^TT8Z-GDW(jWrS6(KbE6x4f_zLR7Cib-79!dAnFdKl4ec z;Pn2~connzVqWkY5C^YRcle*jm8;o1M|7GpbWgL{jfg&rGO=@|)_z zWo$v!;1lP|va4+G!zu|TcKoKYnG~1o$ZAYy{>PAf>HMo=Qr6Ez^tX^}hm$|Fx77tw zx$-AKuSg{6k-}#ww~P)+tu3|~)-w9o8kd|es5L`KGg4H#XAg1#^GbfU9MU;1&8-&! zJ+J8*GNUu4QLvIUGY@xzT=&<{psn;Fod~VJMUztp^3d((cOi++E5j-!ITYpDC7K7z zN#kTKqK!6`S;(e%dT6;5VX@DR>sA9>XpK6syutYg60dV*}^H?p@DQYc>W9H0w1>3M;D=kONU0Sl4>k6HZ!B>)-+dYusm+5=(lR;wWxu%Y%js{~! zbYGFbcCyQc&G%LLG+j+>GIixXVk;)-A5cou@OI^v(+-&8$sdzDAqwu zI()YLayHtRS1x2t@hV!MvneVR$<=_S@K0iz3OUx%AEtfxMk!&jk#dJ1`|46iRbn1O zWekh_Lu|7$-0xHTwW^UCjwfj_IvZoXTde61MvE@c(T=z>M+K^P;vm+6=nuWepa8qK zXq~L^H1{_V@ByrktIwC91w>gOmR|&u6KRi#(wB;8if%zhm!qk2vGG^Lo7) zR+*31RGE(+v53pZ%ge|2j$eSEKTXmfjO#W*AOheTjWCx|TvD z&k)iStg8xqMRz_)J&D973=nTsYnATu(eU@cBz&=hrp~N;;u;0{^(T=U*2*$Ln6k3a zGr2be!d&DQe_#;Bd)?hpy8*jtc&!nm8_>U`Ae2Xb#G4Ze#)@4AukxLi(g`kuSFDt& zK%@}DoK5)4`sH&ko<%lWOgoq_tO@%s2x}27Am1CPxQ&IA=PQlUtB{ZM!WJM(6_?Ml30{dDj9!eyct-c5Xf~S=jw2=CuQd*%pgu zs{=-K0Eic3f?Uu_hFOycBaT2L1mepBUY{n^>V@31gIA}=w2C12OyJFFxYh>b{tb9# znqDic?MAzNqJm8e47uk9A52SX2|?~T!F$tymRkUitCm75ZqaU=vXT%CNa38`2IuG` z>0)Y)Kwc;{z`#t?yWn)4Ox+h+2N1Bb8w|`ny#ub&Nz--1qQl3X+fr&G%p|*jO*2jJ zfirb-b!oNkA#O_euxW0gZ7_U_4}Mb=+Deri*+!K}bz!Y%-BY1irU~yW>TAtNrnsX7EfX$l&OV%IjM$`YIJK` zcT(G+7j+I4XOtnr-Y<;M5zC^p1!&aP{re>)ZT(J_CnQ|7%&G3~XRc^-}9ukdN)Kr`^FJ@!uYbnnS0#W0pxjDNeFD{IEYas6L{ zi!S;={j14XBT)jJYAi=VM_>QD7F4MV+6WKksRRuLX<8gNv!Mj=TXa!wBbX=#|F)iB zZ13{a*GY2wtVwW;OpJauY_x0PwneHXTlBlZ(aYzTf7}98#Tph_@fX)P7d?x1HQIV|BLLO_nR!ap=;YwsQgP z*O<-$lADWvQ`69==1)P4zsok_Lmc3{sZ1Iu$-n(NpnRLIlzZE{_|{U~rRWM$?|&=R zpyK(<|Hg17v;Ka3Z|++<-L(Wswypz8OZCbZzHM9r&G8hraNP)g+AWof zD=BQ@PO(o}Eu?a(kK5vM+cIy(V+)Cn9TcV5W2j7m$F@Yj>K5Vu-wltkd&% zSx;RlO|?Ql$m`aE7vI;nU&tRzx@}I~|L-K-e@1D)qA`eZ1q1|eSy<%M<#GQ58A<6w delta 57063 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

    hp;s{51wvY)IjrExqBn0#uBWxMcX!~Q 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

    &9#N4HID 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 delta 173384 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

    5oXv@ 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
    6HQ7zQWqvRum6oSWG8j_-*vxa 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

    BOWq@LM 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 C0Xc&J delta 60554 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 aX6)kT - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/analog/html/index.html b/hurricane/doc/analog/html/index.html index 5b898d58..af3d7e70 100644 --- a/hurricane/doc/analog/html/index.html +++ b/hurricane/doc/analog/html/index.html @@ -92,7 +92,7 @@ Open questions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/analog/latex/refman.tex b/hurricane/doc/analog/latex/refman.tex index 1dcb96bc..37edeb6f 100644 --- a/hurricane/doc/analog/latex/refman.tex +++ b/hurricane/doc/analog/latex/refman.tex @@ -34,7 +34,7 @@ \vspace*{1cm} {\large Generated by Doxygen 1.8.14}\\ \vspace*{0.5cm} - {\small Thu Nov 12 2020 13:58:47}\\ + {\small Fri Oct 1 2021 19:23:10}\\ \end{center} \end{titlepage} diff --git a/hurricane/doc/hurricane/doxygen.warn.log b/hurricane/doc/hurricane/doxygen.warn.log index 7d0d6de8..26e9aa90 100644 --- a/hurricane/doc/hurricane/doxygen.warn.log +++ b/hurricane/doc/hurricane/doxygen.warn.log @@ -128,5 +128,5 @@ Possible candidates: /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:131: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:135: warning: Found unknown command `\sreturn' /dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/doc/hurricane/Query.dox:139: warning: Found unknown command `\sreturn' -/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/Query.h:342: warning: The following parameters of Hurricane::Query::setQuery(Cell *cell, const Box &area, const Transformation &transformation, const BasicLayer *basicLayer, ExtensionSlice::Mask extensionMask, Mask filter, DbU::Unit threshold=0) are not documented: +/dsk/l1/jpc/coriolis-2.x/src/coriolis/hurricane/src/hurricane/hurricane/Query.h:357: warning: The following parameters of Hurricane::Query::setQuery(Cell *cell, const Box &area, const Transformation &transformation, const BasicLayer *basicLayer, ExtensionSlice::Mask extensionMask, Mask filter, DbU::Unit threshold=0) are not documented: parameter 'threshold' diff --git a/hurricane/doc/hurricane/html/BasicLayer_8h_source.html b/hurricane/doc/hurricane/html/BasicLayer_8h_source.html index e5ad5bc0..7ec32d1f 100644 --- a/hurricane/doc/hurricane/html/BasicLayer_8h_source.html +++ b/hurricane/doc/hurricane/html/BasicLayer_8h_source.html @@ -44,16 +44,16 @@ $(function() {
    BasicLayer.h
  • -
    1 
    2 // -*- C++ -*-
    3 //
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify
    9 // it under the terms of the GNU Lesser General Public License as
    10 // published by the Free Software Foundation, either version 3 of the
    11 // License, or (at your option) any later version.
    12 //
    13 // Hurricane is distributed in the hope that it will be useful, but
    14 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    15 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    16 // General Public License for more details.
    17 //
    18 // You should have received a copy of the Lesser GNU General Public
    19 // License along with Hurricane. If not, see
    20 // <http://www.gnu.org/licenses/>.
    21 //
    22 // +-----------------------------------------------------------------+
    23 // | H U R R I C A N E |
    24 // | V L S I B a c k e n d D a t a - B a s e |
    25 // | |
    26 // | Author : Remy Escassut |
    27 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    28 // | =============================================================== |
    29 // | C++ Header : "./hurricane/BasicLayer.h" |
    30 // +-----------------------------------------------------------------+
    31 
    32 
    33 # ifndef HURRICANE_BASIC_LAYER_H
    34 # define HURRICANE_BASIC_LAYER_H
    35 
    36 # include "hurricane/Layer.h"
    37 # include "hurricane/BasicLayers.h"
    38 # include "hurricane/Box.h"
    39 
    40 
    41 namespace Hurricane {
    42 
    43 
    44  class BasicLayer : public Layer {
    45  public:
    46  typedef Layer Super;
    47 
    48  public:
    49  // Subclass: Material.
    50  class Material {
    51  // Enum: Code.
    52  public:
    53  enum Code { nWell =0
    58  , poly
    59  , cut
    62  , info
    64  };
    65  // Constructors.
    66  Material ( const Code& code = other );
    67  Material ( const Material& material );
    68  // Methods.
    69  Material& operator= ( const Material& material );
    70  inline operator const Code& () const;
    71  inline const Code& getCode () const;
    72  static Material fromString ( const string& );
    73  inline string _getTypeName () const;
    74  string _getString () const;
    75  Record* _getRecord () const;
    76 
    77  // Internal: Attributes.
    78  private:
    79  Code _code;
    80  };
    81 
    82  public:
    83  // Constructor.
    84  static BasicLayer* create ( Technology* technology
    85  , const Name& name
    86  , const Material& material
    87  , unsigned gds2Layer
    88  , unsigned gds2Datatype
    89  , const DbU::Unit& minimalSize = 0
    90  , const DbU::Unit& minimalSpacing = 0
    91  );
    92  // Accessors.
    93  inline const Material& getMaterial () const;
    94  inline unsigned getGds2Layer () const;
    95  inline unsigned getGds2Datatype () const;
    96  virtual BasicLayers getBasicLayers () const;
    97  virtual BasicLayer* getBlockageLayer () const;
    98  virtual const Layer* getTop () const;
    99  virtual const Layer* getBottom () const;
    100  inline const Name& getRealName () const;
    101  // Updators
    102  inline void setBlockageLayer ( BasicLayer* layer);
    103  inline void setGds2Layer ( unsigned int );
    104  inline void setGds2Datatype ( unsigned int );
    105  inline void setRealName ( const char* realName);
    106  // Hurricane Managment.
    107  virtual void _toJson ( JsonWriter* writer ) const;
    108  virtual BasicLayer* _getSymbolicBasicLayer ();
    109  virtual string _getTypeName () const;
    110  virtual string _getString () const;
    111  virtual Record* _getRecord () const;
    112 
    113  private:
    114  // Internal: Attributes
    115  Material _material;
    116  unsigned _gds2Layer;
    117  unsigned _gds2Datatype;
    118  BasicLayer* _blockageLayer;
    119  Name _realName;
    120 
    121  protected:
    122  // Internal: Constructors & Destructors.
    123  BasicLayer ( Technology* technology
    124  , const Name& name
    125  , const Material& material
    126  , unsigned gds2Layer
    127  , unsigned gds2Datatype
    128  , const DbU::Unit& minimalSize = 0
    129  , const DbU::Unit& minimalSpacing = 0
    130  );
    131  virtual void _postCreate ();
    132  virtual void _preDestroy ();
    133  };
    134 
    135 
    136 // Inline Functions.
    137  inline BasicLayer::Material::operator const Code& () const { return _code; }
    138  inline const BasicLayer::Material::Code&
    139  BasicLayer::Material::getCode () const { return _code; }
    140  inline string BasicLayer::Material::_getTypeName () const { return _TName("BasicLayer::Material"); }
    141  inline const BasicLayer::Material&
    142  BasicLayer::getMaterial () const { return _material; }
    143  inline unsigned BasicLayer::getGds2Layer () const { return _gds2Layer; }
    144  inline unsigned BasicLayer::getGds2Datatype () const { return _gds2Datatype; }
    145  inline const Name& BasicLayer::getRealName () const { return _realName; }
    146  inline void BasicLayer::setBlockageLayer ( BasicLayer* layer) { _blockageLayer = layer; layer->setBlockage(true); }
    147  inline void BasicLayer::setGds2Layer ( unsigned int number ) { _gds2Layer=number; }
    148  inline void BasicLayer::setGds2Datatype ( unsigned int number ) { _gds2Datatype=number; }
    149  inline void BasicLayer::setRealName ( const char* realName) { _realName = realName; }
    150 
    151 
    152 // -------------------------------------------------------------------
    153 // Class : "Hurricane::JsonBasicLayer".
    154 
    155  class JsonBasicLayer : public JsonLayer {
    156  public:
    157  static void initialize ();
    158  JsonBasicLayer ( unsigned long flags );
    159  ~JsonBasicLayer ();
    160  virtual string getTypeName () const;
    161  virtual JsonBasicLayer* clone ( unsigned long ) const;
    162  virtual void toData ( JsonStack& );
    163  };
    164 
    165 
    166 } // End of Hurricane namespace.
    167 
    168 
    169 // -------------------------------------------------------------------
    170 // Inspector Support for : BasicLayer::Material::Code.
    171 
    172 
    173 template<>
    174 inline std::string getString<const Hurricane::BasicLayer::Material::Code*>
    175  ( const Hurricane::BasicLayer::Material::Code* object )
    176 {
    177  switch ( *object ) {
    178  case Hurricane::BasicLayer::Material::nWell: return "nWell";
    179  case Hurricane::BasicLayer::Material::pWell: return "pWell";
    180  case Hurricane::BasicLayer::Material::nImplant: return "nImplant";
    181  case Hurricane::BasicLayer::Material::pImplant: return "pImplant";
    182  case Hurricane::BasicLayer::Material::active: return "active";
    183  case Hurricane::BasicLayer::Material::poly: return "poly";
    184  case Hurricane::BasicLayer::Material::cut: return "cut";
    185  case Hurricane::BasicLayer::Material::metal: return "metal";
    186  case Hurricane::BasicLayer::Material::blockage: return "blockage";
    187  case Hurricane::BasicLayer::Material::info: return "info";
    188  case Hurricane::BasicLayer::Material::other: return "other";
    189  }
    190  return "undefined";
    191 }
    192 
    193 
    194 template<>
    195 inline Hurricane::Record* getRecord<const Hurricane::BasicLayer::Material::Code*>
    196  ( const Hurricane::BasicLayer::Material::Code* object )
    197 {
    198  Hurricane::Record* record = new Hurricane::Record(getString(object));
    199  record->add(getSlot("Code", (unsigned int*)object));
    200  return record;
    201 }
    202 
    203 
    204 INSPECTOR_P_SUPPORT(Hurricane::BasicLayer);
    205 INSPECTOR_P_SUPPORT(Hurricane::BasicLayer::Material);
    206 IOSTREAM_POINTER_SUPPORT(Hurricane::BasicLayer::Material::Code);
    207 
    208 
    209 # endif
    +
    1 
    2 // -*- C++ -*-
    3 //
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify
    9 // it under the terms of the GNU Lesser General Public License as
    10 // published by the Free Software Foundation, either version 3 of the
    11 // License, or (at your option) any later version.
    12 //
    13 // Hurricane is distributed in the hope that it will be useful, but
    14 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    15 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    16 // General Public License for more details.
    17 //
    18 // You should have received a copy of the Lesser GNU General Public
    19 // License along with Hurricane. If not, see
    20 // <http://www.gnu.org/licenses/>.
    21 //
    22 // +-----------------------------------------------------------------+
    23 // | H U R R I C A N E |
    24 // | V L S I B a c k e n d D a t a - B a s e |
    25 // | |
    26 // | Author : Remy Escassut |
    27 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    28 // | =============================================================== |
    29 // | C++ Header : "./hurricane/BasicLayer.h" |
    30 // +-----------------------------------------------------------------+
    31 
    32 
    33 # ifndef HURRICANE_BASIC_LAYER_H
    34 # define HURRICANE_BASIC_LAYER_H
    35 
    36 # include "hurricane/Layer.h"
    37 # include "hurricane/BasicLayers.h"
    38 # include "hurricane/Box.h"
    39 
    40 
    41 namespace Hurricane {
    42 
    43 
    44  class BasicLayer : public Layer {
    45  public:
    46  typedef Layer Super;
    47 
    48  public:
    49  // Subclass: Material.
    50  class Material {
    51  // Enum: Code.
    52  public:
    53  enum Code { nWell =0
    58  , poly
    59  , cut
    62  , info
    64  };
    65  // Constructors.
    66  Material ( const Code& code = other );
    67  Material ( const Material& material );
    68  // Methods.
    69  Material& operator= ( const Material& material );
    70  inline operator const Code& () const;
    71  inline const Code& getCode () const;
    72  static Material fromString ( const string& );
    73  inline string _getTypeName () const;
    74  string _getString () const;
    75  Record* _getRecord () const;
    76 
    77  // Internal: Attributes.
    78  private:
    79  Code _code;
    80  };
    81 
    82  public:
    83  // Constructor.
    84  static BasicLayer* create ( Technology* technology
    85  , const Name& name
    86  , const Material& material
    87  , unsigned gds2Layer = 0
    88  , unsigned gds2Datatype = 0
    89  , const DbU::Unit& minimalSize = 0
    90  , const DbU::Unit& minimalSpacing = 0
    91  );
    92  // Accessors.
    93  inline const Material& getMaterial () const;
    94  inline unsigned getGds2Layer () const;
    95  inline unsigned getGds2Datatype () const;
    96  virtual BasicLayers getBasicLayers () const;
    97  virtual BasicLayer* getBlockageLayer () const;
    98  virtual const Layer* getTop () const;
    99  virtual const Layer* getBottom () const;
    100  inline const Name& getRealName () const;
    101  // Updators
    102  inline void setBlockageLayer ( BasicLayer* layer);
    103  inline void setGds2Layer ( unsigned int );
    104  inline void setGds2Datatype ( unsigned int );
    105  inline void setRealName ( const char* realName);
    106  // Hurricane Managment.
    107  virtual void _toJson ( JsonWriter* writer ) const;
    108  virtual BasicLayer* _getSymbolicBasicLayer ();
    109  virtual string _getTypeName () const;
    110  virtual string _getString () const;
    111  virtual Record* _getRecord () const;
    112 
    113  private:
    114  // Internal: Attributes
    115  Material _material;
    116  unsigned _gds2Layer;
    117  unsigned _gds2Datatype;
    118  BasicLayer* _blockageLayer;
    119  Name _realName;
    120 
    121  protected:
    122  // Internal: Constructors & Destructors.
    123  BasicLayer ( Technology* technology
    124  , const Name& name
    125  , const Material& material
    126  , unsigned gds2Layer
    127  , unsigned gds2Datatype
    128  , const DbU::Unit& minimalSize = 0
    129  , const DbU::Unit& minimalSpacing = 0
    130  );
    131  virtual void _postCreate ();
    132  virtual void _preDestroy ();
    133  };
    134 
    135 
    136 // Inline Functions.
    137  inline BasicLayer::Material::operator const Code& () const { return _code; }
    138  inline const BasicLayer::Material::Code&
    139  BasicLayer::Material::getCode () const { return _code; }
    140  inline string BasicLayer::Material::_getTypeName () const { return _TName("BasicLayer::Material"); }
    141  inline const BasicLayer::Material&
    142  BasicLayer::getMaterial () const { return _material; }
    143  inline unsigned BasicLayer::getGds2Layer () const { return _gds2Layer; }
    144  inline unsigned BasicLayer::getGds2Datatype () const { return _gds2Datatype; }
    145  inline const Name& BasicLayer::getRealName () const { return _realName; }
    146  inline void BasicLayer::setBlockageLayer ( BasicLayer* layer) { _blockageLayer = layer; layer->setBlockage(true); }
    147  inline void BasicLayer::setGds2Layer ( unsigned int number ) { _gds2Layer=number; }
    148  inline void BasicLayer::setGds2Datatype ( unsigned int number ) { _gds2Datatype=number; }
    149  inline void BasicLayer::setRealName ( const char* realName) { _realName = realName; }
    150 
    151 
    152 // -------------------------------------------------------------------
    153 // Class : "Hurricane::JsonBasicLayer".
    154 
    155  class JsonBasicLayer : public JsonLayer {
    156  public:
    157  static void initialize ();
    158  JsonBasicLayer ( unsigned long flags );
    159  ~JsonBasicLayer ();
    160  virtual string getTypeName () const;
    161  virtual JsonBasicLayer* clone ( unsigned long ) const;
    162  virtual void toData ( JsonStack& );
    163  };
    164 
    165 
    166 } // End of Hurricane namespace.
    167 
    168 
    169 // -------------------------------------------------------------------
    170 // Inspector Support for : BasicLayer::Material::Code.
    171 
    172 
    173 template<>
    174 inline std::string getString<const Hurricane::BasicLayer::Material::Code*>
    175  ( const Hurricane::BasicLayer::Material::Code* object )
    176 {
    177  switch ( *object ) {
    178  case Hurricane::BasicLayer::Material::nWell: return "nWell";
    179  case Hurricane::BasicLayer::Material::pWell: return "pWell";
    180  case Hurricane::BasicLayer::Material::nImplant: return "nImplant";
    181  case Hurricane::BasicLayer::Material::pImplant: return "pImplant";
    182  case Hurricane::BasicLayer::Material::active: return "active";
    183  case Hurricane::BasicLayer::Material::poly: return "poly";
    184  case Hurricane::BasicLayer::Material::cut: return "cut";
    185  case Hurricane::BasicLayer::Material::metal: return "metal";
    186  case Hurricane::BasicLayer::Material::blockage: return "blockage";
    187  case Hurricane::BasicLayer::Material::info: return "info";
    188  case Hurricane::BasicLayer::Material::other: return "other";
    189  }
    190  return "undefined";
    191 }
    192 
    193 
    194 template<>
    195 inline Hurricane::Record* getRecord<const Hurricane::BasicLayer::Material::Code*>
    196  ( const Hurricane::BasicLayer::Material::Code* object )
    197 {
    198  Hurricane::Record* record = new Hurricane::Record(getString(object));
    199  record->add(getSlot("Code", (unsigned int*)object));
    200  return record;
    201 }
    202 
    203 
    204 INSPECTOR_P_SUPPORT(Hurricane::BasicLayer);
    205 INSPECTOR_P_SUPPORT(Hurricane::BasicLayer::Material);
    206 IOSTREAM_POINTER_SUPPORT(Hurricane::BasicLayer::Material::Code);
    207 
    208 
    209 # endif
    +
    static BasicLayer * create(Technology *technology, const Name &name, const Material &material, unsigned gds2Layer=0, unsigned gds2Datatype=0, const DbU::Unit &minimalSize=0, const DbU::Unit &minimalSpacing=0)
    Definition: BasicLayer.h:59
    -
    static BasicLayer * create(Technology *technology, const Name &name, const Material &material, unsigned gds2Layer, unsigned gds2Datatype, const DbU::Unit &minimalSize=0, const DbU::Unit &minimalSpacing=0)
    BasicLayer description (API)
    Definition: BasicLayer.h:44
    Definition: BasicLayer.h:58
    Code
    Definition: BasicLayer.h:53
    Name description (API)
    Definition: Name.h:35
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    const Material & getMaterial() const
    Definition: BasicLayer.h:142
    JSON Parser Stack.
    Definition: JsonObject.h:249
    Definition: BasicLayer.h:54
    @@ -74,7 +74,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Box_8h_source.html b/hurricane/doc/hurricane/html/Box_8h_source.html index 89224cbd..570154cf 100644 --- a/hurricane/doc/hurricane/html/Box_8h_source.html +++ b/hurricane/doc/hurricane/html/Box_8h_source.html @@ -49,7 +49,7 @@ $(function() {
    bool contains(const DbU::Unit &x, const DbU::Unit &y) const
    DbU::Unit getXCenter() const
    Definition: Box.h:70
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    DbU::Unit getYCenter() const
    Definition: Box.h:71
    Point description (API)
    Definition: Point.h:32
    bool isPonctual() const
    @@ -80,7 +80,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Boxes_8h_source.html b/hurricane/doc/hurricane/html/Boxes_8h_source.html index 294d91d4..7a0b181f 100644 --- a/hurricane/doc/hurricane/html/Boxes_8h_source.html +++ b/hurricane/doc/hurricane/html/Boxes_8h_source.html @@ -50,7 +50,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Cell_8h_source.html b/hurricane/doc/hurricane/html/Cell_8h_source.html index 04b55d12..324e6a89 100644 --- a/hurricane/doc/hurricane/html/Cell_8h_source.html +++ b/hurricane/doc/hurricane/html/Cell_8h_source.html @@ -44,41 +44,39 @@ $(function() {
    Cell.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Cell.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_CELL_H
    21 #define HURRICANE_CELL_H
    22 
    23 #include <limits>
    24 #include "hurricane/Flags.h"
    25 #include "hurricane/Observer.h"
    26 #include "hurricane/Signature.h"
    27 #include "hurricane/Relation.h"
    28 #include "hurricane/Pathes.h"
    29 #include "hurricane/Entity.h"
    30 #include "hurricane/Cells.h"
    31 #include "hurricane/DeepNet.h"
    32 #include "hurricane/Instance.h"
    33 #include "hurricane/Pin.h"
    34 #include "hurricane/Pins.h"
    35 #include "hurricane/Slices.h"
    36 #include "hurricane/ExtensionSlice.h"
    37 #include "hurricane/Rubbers.h"
    38 #include "hurricane/Markers.h"
    39 #include "hurricane/Marker.h"
    40 #include "hurricane/Reference.h"
    41 #include "hurricane/Components.h"
    42 #include "hurricane/Occurrences.h"
    43 #include "hurricane/Transformation.h"
    44 #include "hurricane/Layer.h"
    45 #include "hurricane/QuadTree.h"
    46 //#include "hurricane/IntrusiveMap.h"
    47 #include "hurricane/IntrusiveSet.h"
    48 #include "hurricane/MapCollection.h"
    49 #include "hurricane/NetAlias.h"
    50 
    51 
    52 
    53 namespace Hurricane {
    54 
    55 class Library;
    56 class BasicLayer;
    57 
    58 typedef multimap<Entity*,Entity*> SlaveEntityMap;
    59 
    60 
    61 
    62 // ****************************************************************************************************
    63 // Cell declaration
    64 // ****************************************************************************************************
    65 
    66 class Cell : public Entity {
    67 // *************************
    68 
    69 // Types
    70 // *****
    71 
    72  public: typedef Entity Inherit;
    73  public: typedef map<Name,ExtensionSlice*> ExtensionSliceMap;
    74 
    75  public: class Flags : public BaseFlags {
    76  public:
    77  enum Flag { NoFlags = (1 << 0)
    78  , BuildRings = (1 << 1)
    79  , BuildClockRings = (1 << 2)
    80  , BuildSupplyRings = (1 << 3)
    81  , NoClockFlatten = (1 << 4)
    82  , WarnOnUnplacedInstances = (1 << 5)
    83  , StayOnPlugs = (1 << 6)
    84  , MaskRings = BuildRings|BuildClockRings|BuildSupplyRings
    85  // Flags set for Observers.
    86  , CellAboutToChange = (1 << 10)
    87  , CellChanged = (1 << 11)
    88  , CellDestroyed = (1 << 12)
    89  // Cell states
    90  , TerminalNetlist = (1 << 20)
    91  , Pad = (1 << 21)
    92  , Feed = (1 << 22)
    93  , FlattenedNets = (1 << 23)
    94  , Placed = (1 << 24)
    95  , Routed = (1 << 25)
    96  , MergedQuadTree = (1 << 26)
    97  , SlavedAb = (1 << 27)
    98  , Materialized = (1 << 28)
    99  };
    100 
    101  public:
    102  Flags ( uint64_t flags = NoFlags );
    103  virtual ~Flags ();
    104  virtual std::string _getTypeName () const;
    105  virtual std::string _getString () const;
    106  };
    107 
    108  class UniquifyRelation : public Relation {
    109  public:
    110  static UniquifyRelation* create ( Cell* );
    111  static UniquifyRelation* get ( const Cell* );
    112  virtual Name getName () const;
    113  static Name staticGetName ();
    114  Name getUniqueName ();
    115  static std::string getTrunkName ( Name name );
    116  virtual bool hasJson () const;
    117  virtual void toJson ( JsonWriter*, const DBo* ) const;
    118  inline void _setOwner ( Cell* );
    119  inline void _setDuplicates ( unsigned int );
    120  virtual string _getTypeName () const;
    121  virtual Record* _getRecord () const;
    122  private:
    123  static const Name _name;
    124  unsigned int _duplicates;
    125  private:
    126  UniquifyRelation ( Cell* );
    127  protected:
    128  virtual void _preDestroy ();
    129 
    130  public:
    131  class JsonProperty : public JsonObject {
    132  public:
    133  static void initialize ();
    134  JsonProperty ( unsigned long flags );
    135  virtual string getTypeName () const;
    136  virtual JsonProperty* clone ( unsigned long ) const;
    137  virtual void toData ( JsonStack& );
    138  };
    139  public:
    140  class JsonPropertyRef : public JsonObject {
    141  public:
    142  static void initialize ();
    143  JsonPropertyRef ( unsigned long flags );
    144  virtual string getTypeName () const;
    145  virtual JsonPropertyRef* clone ( unsigned long ) const;
    146  virtual void toData ( JsonStack& );
    147  };
    148  };
    149 
    150  class ClonedSet : public Collection<Cell*> {
    151  public:
    152  // Sub-Class: Locator.
    153  class Locator : public Hurricane::Locator<Cell*> {
    154  public:
    155  Locator ( const Cell* );
    156  inline Locator ( const Locator& );
    157  virtual Cell* getElement () const;
    158  virtual Hurricane::Locator<Cell*>* getClone () const;
    159  virtual bool isValid () const;
    160  virtual void progress ();
    161  virtual string _getString () const;
    162  protected:
    163  Hurricane::Locator<DBo*>* _dboLocator;
    164  };
    165 
    166  public:
    167  inline ClonedSet ( const Cell* cell );
    168  inline ClonedSet ( const ClonedSet& );
    169  virtual Hurricane::Collection<Cell*>* getClone () const;
    170  virtual Hurricane::Locator<Cell*>* getLocator () const;
    171  virtual string _getString () const;
    172  protected:
    173  const Cell* _cell;
    174  };
    175 
    176  class SlavedsRelation : public Relation {
    177  public:
    178  static SlavedsRelation* create ( Cell* );
    179  static SlavedsRelation* get ( const Cell* );
    180  virtual Name getName () const;
    181  static Name staticGetName ();
    182  virtual bool hasJson () const;
    183  virtual void toJson ( JsonWriter*, const DBo* ) const;
    184  inline void _setOwner ( Cell* );
    185  virtual string _getTypeName () const;
    186  virtual Record* _getRecord () const;
    187  private:
    188  static const Name _name;
    189  private:
    190  SlavedsRelation ( Cell* );
    191  protected:
    192  virtual void _preDestroy ();
    193 
    194  public:
    195  class JsonProperty : public JsonObject {
    196  public:
    197  static void initialize ();
    198  JsonProperty ( unsigned long flags );
    199  virtual string getTypeName () const;
    200  virtual JsonProperty* clone ( unsigned long ) const;
    201  virtual void toData ( JsonStack& );
    202  };
    203  public:
    204  class JsonPropertyRef : public JsonObject {
    205  public:
    206  static void initialize ();
    207  JsonPropertyRef ( unsigned long flags );
    208  virtual string getTypeName () const;
    209  virtual JsonPropertyRef* clone ( unsigned long ) const;
    210  virtual void toData ( JsonStack& );
    211  };
    212  };
    213 
    214  class SlavedsSet : public Collection<Cell*> {
    215  public:
    216  // Sub-Class: Locator.
    217  class Locator : public Hurricane::Locator<Cell*> {
    218  public:
    219  Locator ( const Cell* );
    220  inline Locator ( const Locator& );
    221  virtual Cell* getElement () const;
    222  virtual Hurricane::Locator<Cell*>* getClone () const;
    223  virtual bool isValid () const;
    224  virtual void progress ();
    225  virtual string _getString () const;
    226  protected:
    227  Hurricane::Locator<DBo*>* _dboLocator;
    228  };
    229 
    230  public:
    231  inline SlavedsSet ( const Cell* cell );
    232  inline SlavedsSet ( const SlavedsSet& );
    233  virtual Hurricane::Collection<Cell*>* getClone () const;
    234  virtual Hurricane::Locator<Cell*>* getLocator () const;
    235  virtual string _getString () const;
    236  protected:
    237  const Cell* _cell;
    238  };
    239 
    240  class InstanceMap : public IntrusiveMap<Name, Instance> {
    241  // ****************************************************
    242 
    243  public: typedef IntrusiveMap<Name, Instance> Inherit;
    244 
    245  public: InstanceMap();
    246 
    247  public: virtual Name _getKey(Instance* instance) const;
    248  public: virtual unsigned _getHashValue(Name name) const;
    249  public: virtual Instance* _getNextElement(Instance* instance) const;
    250  public: virtual void _setNextElement(Instance* instance, Instance* nextInstance) const;
    251 
    252  };
    253 
    254  public: class SlaveInstanceSet : public IntrusiveSet<Instance> {
    255  // ***********************************************************
    256 
    257  public: typedef IntrusiveSet<Instance> Inherit;
    258 
    259  public: SlaveInstanceSet();
    260 
    261  public: virtual unsigned _getHashValue(Instance* slaveInstance) const;
    262  public: virtual Instance* _getNextElement(Instance* slaveInstance) const;
    263  public: virtual void _setNextElement(Instance* slaveInstance, Instance* nextSlaveInstance) const;
    264 
    265  };
    266 
    267  public: class NetMap : public IntrusiveMapConst<Name, Net> {
    268  // *********************************************************
    269 
    270  public: typedef IntrusiveMapConst<Name, Net> Inherit;
    271 
    272  public: NetMap();
    273 
    274  public: virtual const Name& _getKey(Net* net) const;
    275  public: virtual unsigned _getHashValue(const Name& name) const;
    276  public: virtual Net* _getNextElement(Net* net) const;
    277  public: virtual void _setNextElement(Net* net, Net* nextNet) const;
    278 
    279  };
    280 
    281  class PinMap : public IntrusiveMap<Name, Pin> {
    282  // *******************************************
    283 
    284  public: typedef IntrusiveMap<Name, Pin> Inherit;
    285 
    286  public: PinMap();
    287 
    288  public: virtual Name _getKey(Pin* pin) const;
    289  public: virtual unsigned _getHashValue(Name name) const;
    290  public: virtual Pin* _getNextElement(Pin* pin) const;
    291  public: virtual void _setNextElement(Pin* pin, Pin* nextPin) const;
    292 
    293  };
    294 
    295  public: class SliceMap : public IntrusiveMap<const Layer*, Slice> {
    296  // **************************************************************
    297 
    298  public: typedef IntrusiveMap<const Layer*, Slice> Inherit;
    299 
    300  public: SliceMap();
    301 
    302  public: virtual const Layer* _getKey(Slice* slice) const;
    303  public: virtual unsigned _getHashValue(const Layer* layer) const;
    304  public: virtual Slice* _getNextElement(Slice* slice) const;
    305  public: virtual void _setNextElement(Slice* slice, Slice* nextSlice) const;
    306 
    307  };
    308 
    309  public: class MarkerSet : public IntrusiveSet<Marker> {
    310  // **************************************************
    311 
    312  public: typedef IntrusiveSet<Marker> Inherit;
    313 
    314  public: MarkerSet();
    315 
    316  public: virtual unsigned _getHashValue(Marker* marker) const;
    317  public: virtual Marker* _getNextElement(Marker* marker) const;
    318  public: virtual void _setNextElement(Marker* marker, Marker* nextMarker) const;
    319 
    320  };
    321 
    322 // Attributes
    323 // **********
    324 
    325  private: Library* _library;
    326  private: Name _name;
    327  private: Path _shuntedPath;
    328  private: InstanceMap _instanceMap;
    329  private: QuadTree* _quadTree;
    330  private: SlaveInstanceSet _slaveInstanceSet;
    331  private: NetMap _netMap;
    332  private: PinMap _pinMap;
    333  private: SliceMap* _sliceMap;
    334  private: ExtensionSliceMap _extensionSlices;
    335  private: MarkerSet _markerSet;
    336  private: Box _abutmentBox;
    337  private: Box _boundingBox;
    338  private: Cell* _nextOfLibraryCellMap;
    339  private: Cell* _nextOfSymbolCellSet;
    340  private: SlaveEntityMap _slaveEntityMap;
    341  private: AliasNameSet _netAliasSet;
    342  private: Observable _observers;
    343  private: Flags _flags;
    344 
    345 // Constructors
    346 // ************
    347 
    348  protected: Cell(Library* library, const Name& name);
    349 
    350 // Others
    351 // ******
    352 
    353  protected: virtual void _postCreate();
    354 
    355  protected: virtual void _preDestroy();
    356 
    357  public: virtual string _getTypeName() const {return _TName("Cell");};
    358  public: virtual string _getString() const;
    359  public: virtual Record* _getRecord() const;
    360  public: static string getFlagString( uint64_t );
    361  public: static Record* getFlagRecord( uint64_t );
    362  public: static Slot* getFlagSlot( uint64_t );
    363 
    364  public: InstanceMap& _getInstanceMap() {return _instanceMap;};
    365  public: QuadTree* _getQuadTree() {return _quadTree;};
    366  public: SlaveInstanceSet& _getSlaveInstanceSet() {return _slaveInstanceSet;};
    367  public: NetMap& _getNetMap() {return _netMap;};
    368  public: PinMap& _getPinMap() {return _pinMap;};
    369  public: SliceMap* _getSliceMap() {return _sliceMap;};
    370  public: ExtensionSliceMap& _getExtensionSliceMap() {return _extensionSlices;};
    371  public: MarkerSet& _getMarkerSet() {return _markerSet;};
    372  public: Cell* _getNextOfLibraryCellMap() const {return _nextOfLibraryCellMap;};
    373  public: Cell* _getNextOfSymbolCellSet() const {return _nextOfSymbolCellSet;};
    374  public: AliasNameSet& _getNetAliasSet() { return _netAliasSet; }
    375 
    376  public: void _setNextOfLibraryCellMap(Cell* cell) {_nextOfLibraryCellMap = cell;};
    377  public: void _setNextOfSymbolCellSet(Cell* cell) {_nextOfSymbolCellSet = cell;};
    378 
    379  public: void _addNetAlias(NetAliasName* alias) { _netAliasSet.insert(alias); }
    380  public: void _removeNetAlias(NetAliasName* alias) { _netAliasSet.erase(alias); }
    381 
    382  public: void _fit(const Box& box);
    383  public: void _unfit(const Box& box);
    384 
    385  public: void _addSlaveEntity(Entity* entity, Entity* slaveEntity);
    386  public: void _removeSlaveEntity(Entity* entity, Entity* slaveEntity);
    387  public: void _getSlaveEntities(SlaveEntityMap::iterator& begin, SlaveEntityMap::iterator& end);
    388  public: void _getSlaveEntities(Entity* entity, SlaveEntityMap::iterator& begin, SlaveEntityMap::iterator& end);
    389  public: void _insertSlice(ExtensionSlice*);
    390  public: void _removeSlice(ExtensionSlice*);
    391  public: void _slaveAbutmentBox(Cell*);
    392  public: void _changeQuadTree(Cell*);
    393  public: void _setShuntedPath(Path path) { _shuntedPath=path; }
    394  protected: void _setAbutmentBox(const Box& abutmentBox);
    395 
    396  public: virtual void _toJson(JsonWriter*) const;
    397  public: virtual void _toJsonCollections(JsonWriter*) const;
    398 
    399 // Constructors
    400 // ************
    401 
    402  public: static Cell* create(Library* library, const Name& name);
    403  public: static Cell* fromJson(const string& filename);
    404 
    405 // Accessors
    406 // *********
    407 
    408  public: virtual Cell* getCell() const {return (Cell*)this;};
    409  public: virtual Box getBoundingBox() const;
    410  public: Library* getLibrary() const {return _library;};
    411  public: string getHierarchicalName() const;
    412  public: const Name& getName() const {return _name;};
    413  public: const Flags& getFlags() const { return _flags; }
    414  public: Flags& getFlags() { return _flags; }
    415  public: Path getShuntedPath() const { return _shuntedPath; }
    416  public: Entity* getEntity(const Signature&) const;
    417  public: Instance* getInstance(const Name& name) const {return _instanceMap.getElement(name);};
    418  public: Instances getInstances() const {return _instanceMap.getElements();};
    419  public: Instances getPlacedInstances() const;
    420  public: Instances getFixedInstances() const;
    421  public: Instances getUnplacedInstances() const;
    422  public: Instances getNotUnplacedInstances() const;
    423  public: Instances getInstancesUnder(const Box& area, DbU::Unit threshold=0) const;
    424  public: Instances getPlacedInstancesUnder(const Box& area) const;
    425  public: Instances getFixedInstancesUnder(const Box& area) const;
    426  public: Instances getUnplacedInstancesUnder(const Box& area) const;
    427  public: Instances getNotUnplacedInstancesUnder(const Box& area) const;
    428  public: Instances getSlaveInstances() const; // {return _slaveInstanceSet.getElements();}; NOON!!
    429  public: Instances getTerminalInstances() const;
    430  public: Instances getTerminalInstancesUnder(const Box& area) const;
    431  public: Instances getNonTerminalInstances() const;
    432  public: Instances getNonTerminalInstancesUnder(const Box& area) const;
    433  public: Instances getTerminalNetlistInstances() const;
    434  public: Instances getTerminalNetlistInstancesUnder(const Box& area) const;
    435  public: Instances getNonTerminalNetlistInstances() const;
    436  public: Instances getNonTerminalNetlistInstancesUnder(const Box& area) const;
    437  public: Net* getNet(const Name& name) const;
    438  public: DeepNet* getDeepNet( Path, const Net* ) const;
    439  public: Nets getNets() const {return _netMap.getElements();};
    440  public: Nets getGlobalNets() const;
    441  public: Nets getExternalNets() const;
    442  public: Nets getInternalNets() const;
    443  public: Nets getClockNets() const;
    444  public: Nets getSupplyNets() const;
    445  public: Nets getPowerNets() const;
    446  public: Nets getGroundNets() const;
    447  public: Pin* getPin(const Name& name) const {return _pinMap.getElement(name);};
    448  public: Pins getPins() const {return _pinMap.getElements();};
    449  public: Slice* getSlice(const Layer* layer) const {return _sliceMap->getElement(layer);};
    450  public: Slices getSlices(const Layer::Mask& mask = ~0) const;
    451  public: const ExtensionSliceMap& getExtensionSliceMap() const { return _extensionSlices; };
    452  public: ExtensionSlice* getExtensionSlice(const Name& name) const;
    453  public: ExtensionSlices getExtensionSlices(ExtensionSlice::Mask mask=~0) const;
    454  public: Rubbers getRubbers() const;
    455  public: Rubbers getRubbersUnder(const Box& area) const;
    456  public: Markers getMarkers() const {return _markerSet.getElements();};
    457  public: Markers getMarkersUnder(const Box& area) const;
    458  public: References getReferences() const;
    459  public: Components getComponents(const Layer::Mask& mask = ~0) const;
    460  public: Components getComponentsUnder(const Box& area, const Layer::Mask& mask = ~0) const;
    461  public: Occurrences getOccurrences(unsigned searchDepth = std::numeric_limits<unsigned int>::max()) const;
    462  public: Occurrences getOccurrencesUnder(const Box& area, unsigned searchDepth = std::numeric_limits<unsigned int>::max()) const;
    464  public: Occurrences getTerminalInstanceOccurrencesUnder(const Box& area) const;
    465  public: Occurrences getTerminalNetlistInstanceOccurrences( const Instance* topInstance=NULL ) const;
    466  public: Occurrences getTerminalNetlistInstanceOccurrencesUnder(const Box& area) const;
    467  public: Occurrences getNonTerminalNetlistInstanceOccurrences( const Instance* topInstance=NULL ) const;
    468  public: Occurrences getComponentOccurrences(const Layer::Mask& mask = ~0) const;
    469  public: Occurrences getComponentOccurrencesUnder(const Box& area, const Layer::Mask& mask = ~0) const;
    470  public: Occurrences getHyperNetRootNetOccurrences() const;
    471  public: ExtensionSlice::Mask getExtensionSliceMask ( const Name& name ) const;
    472  public: Gos getExtensionGos ( const Name& name ) const;
    473  public: Gos getExtensionGos ( ExtensionSlice::Mask mask = ~0 ) const;
    474  public: Gos getExtensionGosUnder ( const Box& area, const Name& name ) const;
    475  public: Gos getExtensionGosUnder ( const Box& area, ExtensionSlice::Mask mask = ~0 ) const;
    476  public: Cells getSubCells() const;
    477  public: Cells getClonedCells() const;
    478  public: Cell* getCloneMaster() const;
    479  public: Pathes getRecursiveSlavePathes() const;
    480  public: const Box& getAbutmentBox() const {return _abutmentBox;};
    481 
    482 // Predicates
    483 // **********
    484 
    485  public: bool isCalledBy(Cell* cell) const;
    486  public: bool isTerminal() const {return _instanceMap.isEmpty();};
    487  public: bool isTerminalNetlist() const {return _flags.isset(Flags::TerminalNetlist);};
    488  public: bool isUnique() const;
    489  public: bool isUniquified() const;
    490  public: bool isUniquifyMaster() const;
    491  public: bool isPad() const {return _flags.isset(Flags::Pad);};
    492  public: bool isFeed() const {return _flags.isset(Flags::Feed);};
    493  public: bool isFlattenedNets() const {return _flags.isset(Flags::FlattenedNets);};
    494  public: bool isPlaced() const {return _flags.isset(Flags::Placed);};
    495  public: bool isRouted() const {return _flags.isset(Flags::Routed);};
    496  public: bool isNetAlias(const Name& name) const;
    497 
    498 // Updators
    499 // ********
    500 
    501  public: void setName(const Name& name);
    502  public: void setAbutmentBox(const Box& abutmentBox);
    503  public: void slaveAbutmentBox(Cell*);
    504  public: void unslaveAbutmentBox(Cell*);
    505  public: void setTerminalNetlist(bool isTerminalNetlist) {_flags.set(Flags::TerminalNetlist,isTerminalNetlist);};
    506  public: void setPad(bool isPad) {_flags.set(Flags::Pad,isPad);};
    507  public: void setFeed(bool isFeed) {_flags.set(Flags::Feed,isFeed);};
    508  public: void setRouted(bool isRouted) {_flags.set(Flags::Routed,isRouted);};
    509  public: void flattenNets(uint64_t flags=Flags::BuildRings);
    510  public: void flattenNets(const Instance* instance, uint64_t flags=Flags::BuildRings);
    511  public: void createRoutingPadRings(uint64_t flags=Flags::BuildRings);
    512  public: void setFlags(uint64_t flags) { _flags |= flags; }
    513  public: void resetFlags(uint64_t flags) { _flags &= ~flags; }
    514  public: bool updatePlacedFlag();
    515  public: void materialize();
    516  public: void unmaterialize();
    517  public: Cell* getClone();
    518  public: void uniquify(unsigned int depth=std::numeric_limits<unsigned int>::max());
    519  public: void addObserver(BaseObserver*);
    520  public: void removeObserver(BaseObserver*);
    521  public: void notify(unsigned flags);
    522  public: void destroyPhysical();
    523 };
    524 
    525 
    526 inline Cell::ClonedSet::Locator::Locator ( const Locator& other )
    527  : Hurricane::Locator<Cell*>()
    528  , _dboLocator(other._dboLocator)
    529 { }
    530 
    531 inline Cell::ClonedSet::ClonedSet ( const Cell* cell )
    532  : Hurricane::Collection<Cell*>()
    533  , _cell(cell)
    534 { }
    535 
    536 inline Cell::ClonedSet::ClonedSet ( const ClonedSet& other )
    537  : Hurricane::Collection<Cell*>()
    538  , _cell(other._cell)
    539 { }
    540 
    541 
    542 inline void Cell::UniquifyRelation::_setOwner ( Cell* owner ) { _setMasterOwner(owner); }
    543 inline void Cell::UniquifyRelation::_setDuplicates ( unsigned int duplicates ) { _duplicates=duplicates; }
    544 
    545 
    546 inline Cell::SlavedsSet::Locator::Locator ( const Locator& other )
    547  : Hurricane::Locator<Cell*>()
    548  , _dboLocator(other._dboLocator)
    549 { }
    550 
    551 inline Cell::SlavedsSet::SlavedsSet ( const Cell* cell )
    552  : Hurricane::Collection<Cell*>()
    553  , _cell(cell)
    554 { }
    555 
    556 inline Cell::SlavedsSet::SlavedsSet ( const SlavedsSet& other )
    557  : Hurricane::Collection<Cell*>()
    558  , _cell(other._cell)
    559 { }
    560 
    561 
    562 inline void Cell::SlavedsRelation::_setOwner ( Cell* owner ) { _setMasterOwner(owner); }
    563 
    564 
    565 class JsonCell : public JsonEntity {
    566 // *********************************
    567 
    568  public: static void initialize();
    569  public: JsonCell(unsigned long flags);
    570  public: virtual ~JsonCell();
    571  public: virtual string getTypeName() const;
    572  public: virtual JsonCell* clone(unsigned long) const;
    573  public: virtual void toData(JsonStack&);
    574  private: Cell* _cell;
    575  private: bool _materializationState;
    576 };
    577 
    578 } // End of Hurricane namespace.
    579 
    580 
    581 INSPECTOR_P_SUPPORT(Hurricane::Cell);
    582 INSPECTOR_P_SUPPORT(Hurricane::Cell::Flags);
    583 INSPECTOR_P_SUPPORT(Hurricane::Cell::InstanceMap);
    584 INSPECTOR_P_SUPPORT(Hurricane::Cell::SlaveInstanceSet);
    585 INSPECTOR_P_SUPPORT(Hurricane::Cell::NetMap);
    586 INSPECTOR_P_SUPPORT(Hurricane::Cell::PinMap);
    587 INSPECTOR_P_SUPPORT(Hurricane::Cell::SliceMap);
    588 INSPECTOR_P_SUPPORT(Hurricane::Cell::MarkerSet);
    589 INSPECTOR_PR_SUPPORT(Hurricane::Cell::SlavedsRelation);
    590 
    591 
    592 #endif // HURRICANE_CELL_H
    593 
    594 
    595 // ****************************************************************************************************
    596 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    597 // ****************************************************************************************************
    bool isTerminalNetlist() const
    Definition: Cell.h:487
    -
    Path description (API)
    Definition: Path.h:37
    +
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Cell.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #pragma once
    21 #include <limits>
    22 #include "hurricane/Flags.h"
    23 #include "hurricane/Observer.h"
    24 #include "hurricane/Signature.h"
    25 #include "hurricane/Relation.h"
    26 #include "hurricane/Pathes.h"
    27 #include "hurricane/Entity.h"
    28 #include "hurricane/Cells.h"
    29 #include "hurricane/DeepNet.h"
    30 #include "hurricane/Instance.h"
    31 #include "hurricane/Pin.h"
    32 #include "hurricane/Pins.h"
    33 #include "hurricane/Slices.h"
    34 #include "hurricane/ExtensionSlice.h"
    35 #include "hurricane/Rubbers.h"
    36 #include "hurricane/Markers.h"
    37 #include "hurricane/Marker.h"
    38 #include "hurricane/Reference.h"
    39 #include "hurricane/Components.h"
    40 #include "hurricane/Occurrences.h"
    41 #include "hurricane/Transformation.h"
    42 #include "hurricane/Layer.h"
    43 #include "hurricane/QuadTree.h"
    44 //#include "hurricane/IntrusiveMap.h"
    45 #include "hurricane/IntrusiveSet.h"
    46 #include "hurricane/MapCollection.h"
    47 #include "hurricane/NetAlias.h"
    48 
    49 
    50 
    51 namespace Hurricane {
    52 
    53 class Library;
    54 class BasicLayer;
    55 
    56 typedef multimap<Entity*,Entity*> SlaveEntityMap;
    57 
    58 
    59 
    60 // ****************************************************************************************************
    61 // Cell declaration
    62 // ****************************************************************************************************
    63 
    64 class Cell : public Entity {
    65 // *************************
    66 
    67 // Types
    68 // *****
    69 
    70  public: typedef Entity Inherit;
    71  public: typedef map<Name,ExtensionSlice*> ExtensionSliceMap;
    72 
    73  public: class Flags : public BaseFlags {
    74  public:
    75  enum Flag { NoFlags = 0
    76  , BuildRings = (1 << 1)
    77  , BuildClockRings = (1 << 2)
    78  , BuildSupplyRings = (1 << 3)
    79  , NoClockFlatten = (1 << 4)
    80  , WarnOnUnplacedInstances = (1 << 5)
    81  , StayOnPlugs = (1 << 6)
    82  , MaskRings = BuildRings|BuildClockRings|BuildSupplyRings
    83  // Flags set for Observers.
    84  , CellAboutToChange = (1 << 10)
    85  , CellChanged = (1 << 11)
    86  , CellDestroyed = (1 << 12)
    87  // Cell states
    88  , TerminalNetlist = (1 << 20)
    89  , Pad = (1 << 21)
    90  , Feed = (1 << 22)
    91  , FlattenedNets = (1 << 23)
    92  , AbstractedSupply = (1 << 24)
    93  , Placed = (1 << 25)
    94  , Routed = (1 << 26)
    95  , SlavedAb = (1 << 27)
    96  , Materialized = (1 << 28)
    97  };
    98 
    99  public:
    100  Flags ( uint64_t flags = NoFlags );
    101  virtual ~Flags ();
    102  virtual std::string _getTypeName () const;
    103  virtual std::string _getString () const;
    104  };
    105 
    106  class UniquifyRelation : public Relation {
    107  public:
    108  static UniquifyRelation* create ( Cell* );
    109  static UniquifyRelation* get ( const Cell* );
    110  virtual Name getName () const;
    111  static Name staticGetName ();
    112  Name getUniqueName ();
    113  static std::string getTrunkName ( Name name );
    114  virtual bool hasJson () const;
    115  virtual void toJson ( JsonWriter*, const DBo* ) const;
    116  inline void _setOwner ( Cell* );
    117  inline void _setDuplicates ( unsigned int );
    118  virtual string _getTypeName () const;
    119  virtual Record* _getRecord () const;
    120  private:
    121  static const Name _name;
    122  unsigned int _duplicates;
    123  private:
    124  UniquifyRelation ( Cell* );
    125  protected:
    126  virtual void _preDestroy ();
    127 
    128  public:
    129  class JsonProperty : public JsonObject {
    130  public:
    131  static void initialize ();
    132  JsonProperty ( unsigned long flags );
    133  virtual string getTypeName () const;
    134  virtual JsonProperty* clone ( unsigned long ) const;
    135  virtual void toData ( JsonStack& );
    136  };
    137  public:
    138  class JsonPropertyRef : public JsonObject {
    139  public:
    140  static void initialize ();
    141  JsonPropertyRef ( unsigned long flags );
    142  virtual string getTypeName () const;
    143  virtual JsonPropertyRef* clone ( unsigned long ) const;
    144  virtual void toData ( JsonStack& );
    145  };
    146  };
    147 
    148  class ClonedSet : public Collection<Cell*> {
    149  public:
    150  // Sub-Class: Locator.
    151  class Locator : public Hurricane::Locator<Cell*> {
    152  public:
    153  Locator ( const Cell* );
    154  inline Locator ( const Locator& );
    155  virtual Cell* getElement () const;
    156  virtual Hurricane::Locator<Cell*>* getClone () const;
    157  virtual bool isValid () const;
    158  virtual void progress ();
    159  virtual string _getString () const;
    160  protected:
    161  Hurricane::Locator<DBo*>* _dboLocator;
    162  };
    163 
    164  public:
    165  inline ClonedSet ( const Cell* cell );
    166  inline ClonedSet ( const ClonedSet& );
    167  virtual Hurricane::Collection<Cell*>* getClone () const;
    168  virtual Hurricane::Locator<Cell*>* getLocator () const;
    169  virtual string _getString () const;
    170  protected:
    171  const Cell* _cell;
    172  };
    173 
    174  class SlavedsRelation : public Relation {
    175  public:
    176  static SlavedsRelation* create ( Cell* );
    177  static SlavedsRelation* get ( const Cell* );
    178  virtual Name getName () const;
    179  static Name staticGetName ();
    180  virtual bool hasJson () const;
    181  virtual void toJson ( JsonWriter*, const DBo* ) const;
    182  inline void _setOwner ( Cell* );
    183  virtual string _getTypeName () const;
    184  virtual Record* _getRecord () const;
    185  private:
    186  static const Name _name;
    187  private:
    188  SlavedsRelation ( Cell* );
    189  protected:
    190  virtual void _preDestroy ();
    191 
    192  public:
    193  class JsonProperty : public JsonObject {
    194  public:
    195  static void initialize ();
    196  JsonProperty ( unsigned long flags );
    197  virtual string getTypeName () const;
    198  virtual JsonProperty* clone ( unsigned long ) const;
    199  virtual void toData ( JsonStack& );
    200  };
    201  public:
    202  class JsonPropertyRef : public JsonObject {
    203  public:
    204  static void initialize ();
    205  JsonPropertyRef ( unsigned long flags );
    206  virtual string getTypeName () const;
    207  virtual JsonPropertyRef* clone ( unsigned long ) const;
    208  virtual void toData ( JsonStack& );
    209  };
    210  };
    211 
    212  class SlavedsSet : public Collection<Cell*> {
    213  public:
    214  // Sub-Class: Locator.
    215  class Locator : public Hurricane::Locator<Cell*> {
    216  public:
    217  Locator ( const Cell* );
    218  inline Locator ( const Locator& );
    219  virtual Cell* getElement () const;
    220  virtual Hurricane::Locator<Cell*>* getClone () const;
    221  virtual bool isValid () const;
    222  virtual void progress ();
    223  virtual string _getString () const;
    224  protected:
    225  Hurricane::Locator<DBo*>* _dboLocator;
    226  };
    227 
    228  public:
    229  inline SlavedsSet ( const Cell* cell );
    230  inline SlavedsSet ( const SlavedsSet& );
    231  virtual Hurricane::Collection<Cell*>* getClone () const;
    232  virtual Hurricane::Locator<Cell*>* getLocator () const;
    233  virtual string _getString () const;
    234  protected:
    235  const Cell* _cell;
    236  };
    237 
    238  class InstanceMap : public IntrusiveMap<Name, Instance> {
    239  // ****************************************************
    240 
    241  public: typedef IntrusiveMap<Name, Instance> Inherit;
    242 
    243  public: InstanceMap();
    244 
    245  public: virtual Name _getKey(Instance* instance) const;
    246  public: virtual unsigned _getHashValue(Name name) const;
    247  public: virtual Instance* _getNextElement(Instance* instance) const;
    248  public: virtual void _setNextElement(Instance* instance, Instance* nextInstance) const;
    249 
    250  };
    251 
    252  public: class SlaveInstanceSet : public IntrusiveSet<Instance> {
    253  // ***********************************************************
    254 
    255  public: typedef IntrusiveSet<Instance> Inherit;
    256 
    257  public: SlaveInstanceSet();
    258 
    259  public: virtual unsigned _getHashValue(Instance* slaveInstance) const;
    260  public: virtual Instance* _getNextElement(Instance* slaveInstance) const;
    261  public: virtual void _setNextElement(Instance* slaveInstance, Instance* nextSlaveInstance) const;
    262 
    263  };
    264 
    265  public: class NetMap : public IntrusiveMapConst<Name, Net> {
    266  // *********************************************************
    267 
    268  public: typedef IntrusiveMapConst<Name, Net> Inherit;
    269 
    270  public: NetMap();
    271 
    272  public: virtual const Name& _getKey(Net* net) const;
    273  public: virtual unsigned _getHashValue(const Name& name) const;
    274  public: virtual Net* _getNextElement(Net* net) const;
    275  public: virtual void _setNextElement(Net* net, Net* nextNet) const;
    276 
    277  };
    278 
    279  class PinMap : public IntrusiveMap<Name, Pin> {
    280  // *******************************************
    281 
    282  public: typedef IntrusiveMap<Name, Pin> Inherit;
    283 
    284  public: PinMap();
    285 
    286  public: virtual Name _getKey(Pin* pin) const;
    287  public: virtual unsigned _getHashValue(Name name) const;
    288  public: virtual Pin* _getNextElement(Pin* pin) const;
    289  public: virtual void _setNextElement(Pin* pin, Pin* nextPin) const;
    290 
    291  };
    292 
    293  public: class SliceMap : public IntrusiveMap<const Layer*, Slice> {
    294  // **************************************************************
    295 
    296  public: typedef IntrusiveMap<const Layer*, Slice> Inherit;
    297 
    298  public: SliceMap();
    299 
    300  public: virtual const Layer* _getKey(Slice* slice) const;
    301  public: virtual unsigned _getHashValue(const Layer* layer) const;
    302  public: virtual Slice* _getNextElement(Slice* slice) const;
    303  public: virtual void _setNextElement(Slice* slice, Slice* nextSlice) const;
    304 
    305  };
    306 
    307  public: class MarkerSet : public IntrusiveSet<Marker> {
    308  // **************************************************
    309 
    310  public: typedef IntrusiveSet<Marker> Inherit;
    311 
    312  public: MarkerSet();
    313 
    314  public: virtual unsigned _getHashValue(Marker* marker) const;
    315  public: virtual Marker* _getNextElement(Marker* marker) const;
    316  public: virtual void _setNextElement(Marker* marker, Marker* nextMarker) const;
    317 
    318  };
    319 
    320 // Attributes
    321 // **********
    322 
    323  private: Library* _library;
    324  private: Name _name;
    325  private: Path _shuntedPath;
    326  private: InstanceMap _instanceMap;
    327  private: QuadTree* _quadTree;
    328  private: SlaveInstanceSet _slaveInstanceSet;
    329  private: NetMap _netMap;
    330  private: PinMap _pinMap;
    331  private: SliceMap* _sliceMap;
    332  private: ExtensionSliceMap _extensionSlices;
    333  private: MarkerSet _markerSet;
    334  private: Box _abutmentBox;
    335  private: Box _boundingBox;
    336  private: Cell* _nextOfLibraryCellMap;
    337  private: Cell* _nextOfSymbolCellSet;
    338  private: SlaveEntityMap _slaveEntityMap;
    339  private: AliasNameSet _netAliasSet;
    340  private: Observable _observers;
    341  private: Flags _flags;
    342 
    343 // Constructors
    344 // ************
    345 
    346  protected: Cell(Library* library, const Name& name);
    347 
    348 // Others
    349 // ******
    350 
    351  protected: virtual void _postCreate();
    352 
    353  protected: virtual void _preDestroy();
    354 
    355  public: virtual string _getTypeName() const {return _TName("Cell");};
    356  public: virtual string _getString() const;
    357  public: virtual Record* _getRecord() const;
    358  public: static string getFlagString( uint64_t );
    359  public: static Record* getFlagRecord( uint64_t );
    360  public: static Slot* getFlagSlot( uint64_t );
    361 
    362  public: InstanceMap& _getInstanceMap() {return _instanceMap;};
    363  public: QuadTree* _getQuadTree() {return _quadTree;};
    364  public: SlaveInstanceSet& _getSlaveInstanceSet() {return _slaveInstanceSet;};
    365  public: NetMap& _getNetMap() {return _netMap;};
    366  public: PinMap& _getPinMap() {return _pinMap;};
    367  public: SliceMap* _getSliceMap() {return _sliceMap;};
    368  public: ExtensionSliceMap& _getExtensionSliceMap() {return _extensionSlices;};
    369  public: MarkerSet& _getMarkerSet() {return _markerSet;};
    370  public: Cell* _getNextOfLibraryCellMap() const {return _nextOfLibraryCellMap;};
    371  public: Cell* _getNextOfSymbolCellSet() const {return _nextOfSymbolCellSet;};
    372  public: AliasNameSet& _getNetAliasSet() { return _netAliasSet; }
    373 
    374  public: void _setNextOfLibraryCellMap(Cell* cell) {_nextOfLibraryCellMap = cell;};
    375  public: void _setNextOfSymbolCellSet(Cell* cell) {_nextOfSymbolCellSet = cell;};
    376 
    377  public: void _addNetAlias(NetAliasName* alias) { _netAliasSet.insert(alias); }
    378  public: void _removeNetAlias(NetAliasName* alias) { _netAliasSet.erase(alias); }
    379 
    380  public: void _fit(const Box& box);
    381  public: void _unfit(const Box& box);
    382 
    383  public: void _addSlaveEntity(Entity* entity, Entity* slaveEntity);
    384  public: void _removeSlaveEntity(Entity* entity, Entity* slaveEntity);
    385  public: void _getSlaveEntities(SlaveEntityMap::iterator& begin, SlaveEntityMap::iterator& end);
    386  public: void _getSlaveEntities(Entity* entity, SlaveEntityMap::iterator& begin, SlaveEntityMap::iterator& end);
    387  public: void _insertSlice(ExtensionSlice*);
    388  public: void _removeSlice(ExtensionSlice*);
    389  public: void _slaveAbutmentBox(Cell*);
    390  public: void _setShuntedPath(Path path) { _shuntedPath=path; }
    391  protected: void _setAbutmentBox(const Box& abutmentBox);
    392 
    393  public: virtual void _toJson(JsonWriter*) const;
    394  public: virtual void _toJsonCollections(JsonWriter*) const;
    395 
    396 // Constructors
    397 // ************
    398 
    399  public: static Cell* create(Library* library, const Name& name);
    400  public: static Cell* fromJson(const string& filename);
    401 
    402 // Accessors
    403 // *********
    404 
    405  public: virtual Cell* getCell() const {return (Cell*)this;};
    406  public: virtual Box getBoundingBox() const;
    407  public: Library* getLibrary() const {return _library;};
    408  public: string getHierarchicalName() const;
    409  public: const Name& getName() const {return _name;};
    410  public: const Flags& getFlags() const { return _flags; }
    411  public: Flags& getFlags() { return _flags; }
    412  public: Path getShuntedPath() const { return _shuntedPath; }
    413  public: Entity* getEntity(const Signature&) const;
    414  public: Instance* getInstance(const Name& name) const {return _instanceMap.getElement(name);};
    415  public: Instances getInstances() const {return _instanceMap.getElements();};
    416  public: Instances getPlacedInstances() const;
    417  public: Instances getFixedInstances() const;
    418  public: Instances getUnplacedInstances() const;
    419  public: Instances getNotUnplacedInstances() const;
    420  public: Instances getInstancesUnder(const Box& area, DbU::Unit threshold=0) const;
    421  public: Instances getPlacedInstancesUnder(const Box& area) const;
    422  public: Instances getFixedInstancesUnder(const Box& area) const;
    423  public: Instances getUnplacedInstancesUnder(const Box& area) const;
    424  public: Instances getNotUnplacedInstancesUnder(const Box& area) const;
    425  public: Instances getSlaveInstances() const; // {return _slaveInstanceSet.getElements();}; NOON!!
    426  public: Instances getTerminalInstances() const;
    427  public: Instances getTerminalInstancesUnder(const Box& area) const;
    428  public: Instances getNonTerminalInstances() const;
    429  public: Instances getNonTerminalInstancesUnder(const Box& area) const;
    430  public: Instances getTerminalNetlistInstances() const;
    431  public: Instances getTerminalNetlistInstancesUnder(const Box& area) const;
    432  public: Instances getNonTerminalNetlistInstances() const;
    433  public: Instances getNonTerminalNetlistInstancesUnder(const Box& area) const;
    434  public: Net* getNet(const Name& name, bool useAlias=true) const;
    435  public: DeepNet* getDeepNet( Path, const Net* ) const;
    436  public: Nets getNets() const {return _netMap.getElements();};
    437  public: Nets getGlobalNets() const;
    438  public: Nets getExternalNets() const;
    439  public: Nets getInternalNets() const;
    440  public: Nets getClockNets() const;
    441  public: Nets getSupplyNets() const;
    442  public: Nets getPowerNets() const;
    443  public: Nets getGroundNets() const;
    444  public: Pin* getPin(const Name& name) const {return _pinMap.getElement(name);};
    445  public: Pins getPins() const {return _pinMap.getElements();};
    446  public: Slice* getSlice(const Layer* layer) const {return _sliceMap->getElement(layer);};
    447  public: Slices getSlices(const Layer::Mask& mask = ~0) const;
    448  public: const ExtensionSliceMap& getExtensionSliceMap() const { return _extensionSlices; };
    449  public: ExtensionSlice* getExtensionSlice(const Name& name) const;
    450  public: ExtensionSlices getExtensionSlices(ExtensionSlice::Mask mask=~0) const;
    451  public: Rubbers getRubbers() const;
    452  public: Rubbers getRubbersUnder(const Box& area) const;
    453  public: Markers getMarkers() const {return _markerSet.getElements();};
    454  public: Markers getMarkersUnder(const Box& area) const;
    455  public: References getReferences() const;
    456  public: Components getComponents(const Layer::Mask& mask = ~0) const;
    457  public: Components getComponentsUnder(const Box& area, const Layer::Mask& mask = ~0) const;
    458  public: Occurrences getOccurrences(unsigned searchDepth = std::numeric_limits<unsigned int>::max()) const;
    459  public: Occurrences getOccurrencesUnder(const Box& area, unsigned searchDepth = std::numeric_limits<unsigned int>::max(), DbU::Unit threshold=0) const;
    461  public: Occurrences getTerminalInstanceOccurrencesUnder(const Box& area) const;
    462  public: Occurrences getTerminalNetlistInstanceOccurrences( const Instance* topInstance=NULL ) const;
    463  public: Occurrences getTerminalNetlistInstanceOccurrencesUnder(const Box& area) const;
    464  public: Occurrences getNonTerminalNetlistInstanceOccurrences( const Instance* topInstance=NULL ) const;
    465  public: Occurrences getComponentOccurrences(const Layer::Mask& mask = ~0) const;
    466  public: Occurrences getComponentOccurrencesUnder(const Box& area, const Layer::Mask& mask = ~0) const;
    467  public: Occurrences getHyperNetRootNetOccurrences() const;
    468  public: ExtensionSlice::Mask getExtensionSliceMask ( const Name& name ) const;
    469  public: Gos getExtensionGos ( const Name& name ) const;
    470  public: Gos getExtensionGos ( ExtensionSlice::Mask mask = ~0 ) const;
    471  public: Gos getExtensionGosUnder ( const Box& area, const Name& name ) const;
    472  public: Gos getExtensionGosUnder ( const Box& area, ExtensionSlice::Mask mask = ~0 ) const;
    473  public: Cells getSubCells() const;
    474  public: Cells getClonedCells() const;
    475  public: Cell* getCloneMaster() const;
    476  public: Pathes getRecursiveSlavePathes() const;
    477  public: const Box& getAbutmentBox() const {return _abutmentBox;};
    478 
    479 // Predicates
    480 // **********
    481 
    482  public: bool isCalledBy(Cell* cell) const;
    483  public: bool isTerminal() const {return _instanceMap.isEmpty();};
    484  public: bool isTerminalNetlist() const {return _flags.isset(Flags::TerminalNetlist);};
    485  public: bool isUnique() const;
    486  public: bool isUniquified() const;
    487  public: bool isUniquifyMaster() const;
    488  public: bool isPad() const {return _flags.isset(Flags::Pad);};
    489  public: bool isFeed() const {return _flags.isset(Flags::Feed);};
    490  public: bool isFlattenedNets() const {return _flags.isset(Flags::FlattenedNets);};
    491  public: bool isAbstractedSupply() const {return _flags.isset(Flags::AbstractedSupply);};
    492  public: bool isPlaced() const {return _flags.isset(Flags::Placed);};
    493  public: bool isRouted() const {return _flags.isset(Flags::Routed);};
    494  public: bool isNetAlias(const Name& name) const;
    495 
    496 // Updators
    497 // ********
    498 
    499  public: void setName(const Name& name);
    500  public: void setAbutmentBox(const Box& abutmentBox);
    501  public: void slaveAbutmentBox(Cell*);
    502  public: void unslaveAbutmentBox(Cell*);
    503  public: void setTerminalNetlist(bool state) { _flags.set(Flags::TerminalNetlist,state); };
    504  public: void setPad(bool state) {_flags.set(Flags::Pad,state);};
    505  public: void setFeed(bool state) {_flags.set(Flags::Feed,state);};
    506  public: void setRouted(bool state) {_flags.set(Flags::Routed,state);};
    507  public: void setAbstractedSupply(bool state) { _flags.set(Flags::AbstractedSupply,state); };
    508  public: void flattenNets(uint64_t flags=Flags::BuildRings);
    509  public: void flattenNets(const Instance* instance, uint64_t flags=Flags::BuildRings);
    510  public: void flattenNets(const Instance* instance, const std::set<std::string>& excludeds, uint64_t flags=Flags::BuildRings);
    511  public: void createRoutingPadRings(uint64_t flags=Flags::BuildRings);
    512  public: void setFlags(uint64_t flags) { _flags |= flags; }
    513  public: void resetFlags(uint64_t flags) { _flags &= ~flags; }
    514  public: bool updatePlacedFlag();
    515  public: void materialize();
    516  public: void unmaterialize();
    517  public: Cell* getClone();
    518  public: void uniquify(unsigned int depth=std::numeric_limits<unsigned int>::max());
    519  public: void addObserver(BaseObserver*);
    520  public: void removeObserver(BaseObserver*);
    521  public: void notify(unsigned flags);
    522  public: void destroyPhysical();
    523 };
    524 
    525 
    526 inline Cell::ClonedSet::Locator::Locator ( const Locator& other )
    527  : Hurricane::Locator<Cell*>()
    528  , _dboLocator(other._dboLocator)
    529 { }
    530 
    531 inline Cell::ClonedSet::ClonedSet ( const Cell* cell )
    532  : Hurricane::Collection<Cell*>()
    533  , _cell(cell)
    534 { }
    535 
    536 inline Cell::ClonedSet::ClonedSet ( const ClonedSet& other )
    537  : Hurricane::Collection<Cell*>()
    538  , _cell(other._cell)
    539 { }
    540 
    541 
    542 inline void Cell::UniquifyRelation::_setOwner ( Cell* owner ) { _setMasterOwner(owner); }
    543 inline void Cell::UniquifyRelation::_setDuplicates ( unsigned int duplicates ) { _duplicates=duplicates; }
    544 
    545 
    546 inline Cell::SlavedsSet::Locator::Locator ( const Locator& other )
    547  : Hurricane::Locator<Cell*>()
    548  , _dboLocator(other._dboLocator)
    549 { }
    550 
    551 inline Cell::SlavedsSet::SlavedsSet ( const Cell* cell )
    552  : Hurricane::Collection<Cell*>()
    553  , _cell(cell)
    554 { }
    555 
    556 inline Cell::SlavedsSet::SlavedsSet ( const SlavedsSet& other )
    557  : Hurricane::Collection<Cell*>()
    558  , _cell(other._cell)
    559 { }
    560 
    561 
    562 inline void Cell::SlavedsRelation::_setOwner ( Cell* owner ) { _setMasterOwner(owner); }
    563 
    564 
    565 class JsonCell : public JsonEntity {
    566 // *********************************
    567 
    568  public: static void initialize();
    569  public: JsonCell(unsigned long flags);
    570  public: virtual ~JsonCell();
    571  public: virtual string getTypeName() const;
    572  public: virtual JsonCell* clone(unsigned long) const;
    573  public: virtual void toData(JsonStack&);
    574  private: Cell* _cell;
    575  private: bool _materializationState;
    576 };
    577 
    578 } // End of Hurricane namespace.
    579 
    580 
    581 INSPECTOR_P_SUPPORT(Hurricane::Cell);
    582 INSPECTOR_P_SUPPORT(Hurricane::Cell::Flags);
    583 INSPECTOR_P_SUPPORT(Hurricane::Cell::InstanceMap);
    584 INSPECTOR_P_SUPPORT(Hurricane::Cell::SlaveInstanceSet);
    585 INSPECTOR_P_SUPPORT(Hurricane::Cell::NetMap);
    586 INSPECTOR_P_SUPPORT(Hurricane::Cell::PinMap);
    587 INSPECTOR_P_SUPPORT(Hurricane::Cell::SliceMap);
    588 INSPECTOR_P_SUPPORT(Hurricane::Cell::MarkerSet);
    589 INSPECTOR_PR_SUPPORT(Hurricane::Cell::SlavedsRelation);
    590 
    591 
    592 // ****************************************************************************************************
    593 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    594 // ****************************************************************************************************
    bool isTerminalNetlist() const
    Definition: Cell.h:484
    +
    Path description (API)
    Definition: Path.h:35
    Collection description (API)
    Definition: Collection.h:39
    Pad description (API)
    Definition: Pad.h:36
    Library description (API)
    Definition: Library.h:38
    Nets getClockNets() const
    GenericCollection< Go * > Gos
    Definition: Gos.h:27
    void unmaterialize()
    -
    const Box & getAbutmentBox() const
    Definition: Cell.h:480
    -
    Net * getNet(const Name &name) const
    -
    Pin description (API)
    Definition: Pin.h:34
    +
    const Box & getAbutmentBox() const
    Definition: Cell.h:477
    +
    Pin description (API)
    Definition: Pin.h:41
    Instances getSlaveInstances() const
    -
    void setTerminalNetlist(bool isTerminalNetlist)
    Definition: Cell.h:505
    Relation description (API)
    Definition: Relation.h:33
    Components getComponentsUnder(const Box &area, const Layer::Mask &mask=~0) const
    Support for JSON export.
    Definition: JsonObject.h:83
    Name description (API)
    Definition: Name.h:35
    Slices getSlices(const Layer::Mask &mask=~0) const
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    void uniquify(unsigned int depth=std::numeric_limits< unsigned int >::max())
    -
    The model (API).
    Definition: Cell.h:66
    +
    The model (API).
    Definition: Cell.h:64
    Occurrences getOccurrences(unsigned searchDepth=std::numeric_limits< unsigned int >::max()) const
    Nets getSupplyNets() const
    Components getComponents(const Layer::Mask &mask=~0) const
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    Hurricane::Mask< unsigned long long > Mask
    Definition: Layer.h:65
    Nets getExternalNets() const
    -
    Nets getNets() const
    Definition: Cell.h:439
    -
    Library * getLibrary() const
    Definition: Cell.h:410
    +
    Nets getNets() const
    Definition: Cell.h:436
    +
    Library * getLibrary() const
    Definition: Cell.h:407
    Cell * getClone()
    +
    void setTerminalNetlist(bool state)
    Definition: Cell.h:503
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    -
    const Name & getName() const
    Definition: Cell.h:412
    +
    const Name & getName() const
    Definition: Cell.h:409
    JSON Parser Stack.
    Definition: JsonObject.h:249
    -
    Occurrences getOccurrencesUnder(const Box &area, unsigned searchDepth=std::numeric_limits< unsigned int >::max()) const
    Nets getInternalNets() const
    static Cell * create(Library *library, const Name &name)
    void setAbutmentBox(const Box &abutmentBox)
    @@ -86,18 +84,19 @@ $(function() {
    GenericCollection< Cell * > Cells
    Definition: Cells.h:27
    Box description (API)
    Definition: Box.h:31
    bool isUnique() const
    -
    Instance description (API)
    Definition: Instance.h:37
    +
    Instance description (API)
    Definition: Instance.h:35
    Rubbers getRubbers() const
    +
    Net * getNet(const Name &name, bool useAlias=true) const
    GenericCollection< Rubber * > Rubbers
    Definition: Rubbers.h:27
    Layer description (API)
    Definition: Layer.h:52
    bool isCalledBy(Cell *cell) const
    Rubbers getRubbersUnder(const Box &area) const
    -
    Slice * getSlice(const Layer *layer) const
    Definition: Cell.h:449
    +
    Slice * getSlice(const Layer *layer) const
    Definition: Cell.h:446
    Slice description (API)
    Definition: Slice.h:38
    GenericCollection< Path > Pathes
    Definition: Pathes.h:34
    void setName(const Name &name)
    -
    Instance * getInstance(const Name &name) const
    Definition: Cell.h:417
    +
    Instance * getInstance(const Name &name) const
    Definition: Cell.h:414
    Occurrences getTerminalInstanceOccurrences() const
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    Occurrences getNonTerminalNetlistInstanceOccurrences(const Instance *topInstance=NULL) const
    @@ -105,11 +104,12 @@ $(function() {
    Instances getInstancesUnder(const Box &area, DbU::Unit threshold=0) const
    GenericCollection< Component * > Components
    Definition: Components.h:27
    Net description (API)
    Definition: Net.h:48
    +
    Occurrences getOccurrencesUnder(const Box &area, unsigned searchDepth=std::numeric_limits< unsigned int >::max(), DbU::Unit threshold=0) const
    GenericCollection< Occurrence > Occurrences
    Definition: Occurrences.h:40
    -
    Instances getInstances() const
    Definition: Cell.h:418
    +
    Instances getInstances() const
    Definition: Cell.h:415
    Nets getGlobalNets() const
    bool isUniquifyMaster() const
    -
    bool isTerminal() const
    Definition: Cell.h:486
    +
    bool isTerminal() const
    Definition: Cell.h:483
    Occurrences getTerminalNetlistInstanceOccurrences(const Instance *topInstance=NULL) const
    bool isUniquified() const
    @@ -117,7 +117,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Cells_8h_source.html b/hurricane/doc/hurricane/html/Cells_8h_source.html index a7231fbf..608fddc7 100644 --- a/hurricane/doc/hurricane/html/Cells_8h_source.html +++ b/hurricane/doc/hurricane/html/Cells_8h_source.html @@ -47,7 +47,7 @@ $(function() {
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Cells.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_CELLS
    21 #define HURRICANE_CELLS
    22 
    23 #include "hurricane/Collection.h"
    24 
    25 namespace Hurricane {
    26 
    27 class Cell;
    28 
    29 
    30 
    31 // ****************************************************************************************************
    32 // Cells declaration
    33 // ****************************************************************************************************
    34 
    36 
    37 
    38 
    39 // ****************************************************************************************************
    40 // CellLocator declaration
    41 // ****************************************************************************************************
    42 
    44 
    45 
    46 
    47 // ****************************************************************************************************
    48 // CellFilter declaration
    49 // ****************************************************************************************************
    50 
    52 
    53 
    54 
    55 // ****************************************************************************************************
    56 // for_each_cell declaration
    57 // ****************************************************************************************************
    58 
    59 #define for_each_cell(cell, cells)\
    60 /*********************************/\
    61 {\
    62  CellLocator _locator = cells.getLocator();\
    63  while (_locator.isValid()) {\
    64  Cell* cell = _locator.getElement();\
    65  _locator.progress();
    66 
    67 
    68 
    69 } // End of Hurricane namespace.
    70 
    71 #endif // HURRICANE_CELLS
    72 
    73 
    74 // ****************************************************************************************************
    75 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    76 // ****************************************************************************************************
    GenericLocator< Cell * > CellLocator
    Definition: Cells.h:43
    Generic Locator auto-pointer.
    Definition: Locator.h:113
    Generic Filter auto-pointer.
    Definition: Filter.h:27
    -
    The model (API).
    Definition: Cell.h:66
    +
    The model (API).
    Definition: Cell.h:64
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    GenericCollection< Cell * > Cells
    Definition: Cells.h:27
    GenericFilter< Cell * > CellFilter
    Definition: Cells.h:51
    @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Collection_8h_source.html b/hurricane/doc/hurricane/html/Collection_8h_source.html index 7d5a3702..8f9edb2c 100644 --- a/hurricane/doc/hurricane/html/Collection_8h_source.html +++ b/hurricane/doc/hurricane/html/Collection_8h_source.html @@ -76,7 +76,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Commons_8h_source.html b/hurricane/doc/hurricane/html/Commons_8h_source.html index e16c86ba..faf1126f 100644 --- a/hurricane/doc/hurricane/html/Commons_8h_source.html +++ b/hurricane/doc/hurricane/html/Commons_8h_source.html @@ -44,7 +44,7 @@ $(function() {
    Commons.h
    -
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Remy Escassut |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/Commons.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #pragma once
    33 #define HURRICANE_COMMONS_H
    34 
    35 #include <cstdio>
    36 #include <cassert>
    37 #include <cmath>
    38 #include <memory>
    39 #include <string>
    40 #include <list>
    41 #include <set>
    42 #include <map>
    43 #include <stack>
    44 #include <array>
    45 #include <vector>
    46 #include <iostream>
    47 #include <iomanip>
    48 #include <fstream>
    49 #include <sstream>
    50 
    51 
    52 // +-----------------------------------------------------------------+
    53 // | Macros Definition |
    54 // +-----------------------------------------------------------------+
    55 
    56 
    57 namespace Hurricane {
    58 
    59  using namespace std;
    60 
    61  class Slot;
    62 
    63 
    64  // +-------------------------------------------------------------+
    65  // | shared_ptr<> support for DBo |
    66  // +-------------------------------------------------------------+
    67 
    68 
    69  template<typename DboType>
    70  class DboDestroy {
    71  public:
    72  inline void operator() ( DboType* dbo ) { dbo->destroy(); }
    73  };
    74 
    75 
    76  template<typename DboType>
    77  class dbo_ptr : public std::shared_ptr<DboType> {
    78  public:
    79  dbo_ptr ( DboType* dbo ) : std::shared_ptr<DboType>(dbo,DboDestroy<DboType>()) { }
    80  };
    81 
    82 
    83 
    84 
    85  // +-------------------------------------------------------------+
    86  // | Miscellaneous Utilites |
    87  // +-------------------------------------------------------------+
    88 
    89 
    90  inline string _TName ( const string& s ) { return s; }
    91  inline string _PName ( const string& s ) { return "Hurricane::" + s; }
    92 
    93  template<class Type>
    94  inline Type abs ( const Type& value ) { return (value<0) ? -value : value; }
    95 
    96  string demangle ( const char* symbol );
    97  inline string demangle ( string symbol ) { return demangle(symbol.c_str()); }
    98  inline string demangle ( const type_info& info ) { return demangle(info.name()); }
    99 
    100  template<typename Element>
    101  inline void erase_element ( vector<Element*>& v, const Element* e )
    102  {
    103  for ( auto ielement = v.begin() ; ielement != v.end() ; ++ielement )
    104  if (*ielement == e) { v.erase( ielement ); return; }
    105  }
    106 
    107 
    108 #if DEPRECATED
    109 // For a complete explanation of this function, please look at :
    110 // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
    111 
    112  inline int floatCompare ( float a, float b )
    113  {
    114  assert ( sizeof(float) == sizeof(int) );
    115 
    116  if ( a == b ) return 0;
    117  return *(int*)&a - *(int*)&b;
    118  }
    119 
    120  inline int floatDifference ( float a, float b, int threshold )
    121  {
    122  int difference = floatCompare(a,b);
    123  if ( abs(difference) < threshold ) return 0;
    124 
    125  return (difference<0) ? -1 : 1;
    126  }
    127 
    128 
    129  inline void floatRound ( float& value, float precision )
    130  {
    131  float rounded = roundf ( value*precision );
    132  value = rounded / precision;
    133  }
    134 #endif
    135 
    136  inline float roundfp ( float value, float precision=100.0 ) { return roundf(value*precision)/precision; }
    137 
    138 
    139  template<typename Type> inline void order ( Type& a, Type& b ) { if (a>b) std::swap(a,b); }
    140 
    141  template<typename Type> inline Type setInBound ( Type lower, Type upper, Type& value )
    142  {
    143  if (value < lower) value = lower;
    144  else if (value > upper) value = upper;
    145  return value;
    146  }
    147 
    148 
    149 } // End of Hurricane namespace.
    150 
    151 
    152 #include "hurricane/Record.h"
    153 
    154 
    155 // +-----------------------------------------------------------------+
    156 // | Functions for Inspector Support |
    157 // +-----------------------------------------------------------------+
    158 
    159 // Note 1: Theses are specialized templates for "getString<>()" & "getRecord<>()".
    160 // Note 2: we are outside the Hurricane namespace.
    161 // Note 3: thoses templates manage all POD & STL types.
    162 
    163 
    164 // Forward declaration of "getSlot<>()" template.
    165 
    166 template<typename Data> inline Hurricane::Slot* getSlot ( std::string name, Data );
    167 template<typename Data> inline Hurricane::Slot* getSlot ( std::string name, Data* );
    168 
    169 
    170 // -------------------------------------------------------------------
    171 // Inspector Support for : "POD types".
    172 
    173 // Default match.
    174 
    175 template<typename Data> inline std::string getString ( Data data )
    176 { return std::string("<type ")
    177  + Hurricane::demangle(typeid(data).name())
    178  + std::string(" unsupported by getString()>"); }
    179 
    180 // "const &" flavors.
    181 
    182 template<> inline std::string getString<const bool&> ( const bool& b )
    183 { return (b)?"True":"False" ; }
    184 
    185 template<> inline std::string getString<const int&> ( const int& i )
    186 { std::ostringstream os (""); os << i; return os.str(); }
    187 
    188 template<> inline std::string getString<const long&> ( const long& l )
    189 { std::ostringstream os (""); os << l; return os.str(); }
    190 
    191 template<> inline std::string getString<const unsigned int&> ( const unsigned int& u )
    192 { std::ostringstream os (""); os << u; return os.str(); }
    193 
    194 template<> inline std::string getString<const unsigned long&> ( const unsigned long& ul )
    195 { std::ostringstream os (""); os << ul; return os.str(); }
    196 
    197 template<> inline std::string getString<const unsigned long long&> ( const unsigned long long& ull )
    198 { std::ostringstream os (""); os << ull; return os.str(); }
    199 
    200 template<> inline std::string getString<const unsigned short int&> ( const unsigned short int& us )
    201 { std::ostringstream os (""); os << us; return os.str(); }
    202 
    203 template<> inline std::string getString<const float&> ( const float& f )
    204 { std::ostringstream os (""); os << f; return os.str(); }
    205 
    206 template<> inline std::string getString<const double&> ( const double& d )
    207 { std::ostringstream os; os << d; return os.str(); }
    208 
    209 template<> inline std::string getString<const std::string&> ( const std::string& s )
    210 { return s; }
    211 
    212 // "const *" flavors.
    213 
    214 template<> inline std::string getString<const bool*> ( const bool* b )
    215 { return (*b)?"True":"False" ; }
    216 
    217 template<> inline std::string getString<const char*> ( const char* c )
    218 { return c; }
    219 
    220 template<> inline std::string getString<const int*> ( const int* i )
    221 { std::ostringstream os (""); os << *i; return os.str(); }
    222 
    223 template<> inline std::string getString<const long*> ( const long* l )
    224 { std::ostringstream os (""); os << *l; return os.str(); }
    225 
    226 template<> inline std::string getString<const unsigned int*> ( const unsigned int* u )
    227 { std::ostringstream os (""); os << *u; return os.str(); }
    228 
    229 template<> inline std::string getString<const unsigned long*> ( const unsigned long* ul )
    230 { std::ostringstream os (""); os << *ul; return os.str(); }
    231 
    232 template<> inline std::string getString<const unsigned long long*> ( const unsigned long long* ull )
    233 { std::ostringstream os (""); os << *ull; return os.str(); }
    234 
    235 template<> inline std::string getString<const unsigned short int*> ( const unsigned short int* us )
    236 { std::ostringstream os (""); os << *us; return os.str(); }
    237 
    238 template<> inline std::string getString<const float*> ( const float* f )
    239 { std::ostringstream os (""); os << *f; return os.str(); }
    240 
    241 template<> inline std::string getString<const double*> ( const double* d )
    242 { std::ostringstream os; os << *d; return os.str(); }
    243 
    244 template<> inline std::string getString<const void*> ( const void* p )
    245 { std::ostringstream os ("0x"); os << std::hex << p; return os.str(); }
    246 
    247 template<> inline std::string getString<const std::string*> ( const std::string* s )
    248 { return *s; }
    249 
    250 
    251 // "*" flavors.
    252 
    253 template<> inline std::string getString<bool*> ( bool* b )
    254 { return (*b)?"True":"False" ; }
    255 
    256 template<> inline std::string getString<char*> ( char* c )
    257 { return c; }
    258 
    259 template<> inline std::string getString<int*> ( int* i )
    260 { std::ostringstream os (""); os << *i; return os.str(); }
    261 
    262 template<> inline std::string getString<long*> ( long* l )
    263 { std::ostringstream os (""); os << *l; return os.str(); }
    264 
    265 template<> inline std::string getString<unsigned int*> ( unsigned int* u )
    266 { std::ostringstream os (""); os << *u; return os.str(); }
    267 
    268 template<> inline std::string getString<unsigned long*> ( unsigned long* ul )
    269 { std::ostringstream os (""); os << *ul; return os.str(); }
    270 
    271 template<> inline std::string getString<unsigned long long*> ( unsigned long long* ull )
    272 { std::ostringstream os (""); os << *ull; return os.str(); }
    273 
    274 template<> inline std::string getString<unsigned short int*> ( unsigned short int* us )
    275 { std::ostringstream os (""); os << *us; return os.str(); }
    276 
    277 template<> inline std::string getString<float*> ( float* f )
    278 { std::ostringstream os (""); os << *f; return os.str(); }
    279 
    280 template<> inline std::string getString<double*> ( double* d )
    281 { std::ostringstream os; os << *d; return os.str(); }
    282 
    283 template<> inline std::string getString<void*> ( void* p )
    284 { std::ostringstream os ("0x"); os << std::hex << p; return os.str(); }
    285 
    286 template<> inline std::string getString<std::string*> ( std::string* s )
    287 { return *s; }
    288 
    289 
    290 // "by value" flavors.
    291 
    292 template<> inline std::string getString<bool> ( bool b )
    293 { return (b)?"True":"False" ; }
    294 
    295 template<> inline std::string getString<char> ( char c )
    296 { return std::string(1,c); }
    297 
    298 template<> inline std::string getString<int> ( int i )
    299 { std::ostringstream os (""); os << i; return os.str(); }
    300 
    301 template<> inline std::string getString<long> ( long l )
    302 { std::ostringstream os (""); os << l; return os.str(); }
    303 
    304 template<> inline std::string getString<unsigned int> ( unsigned int u )
    305 { std::ostringstream os (""); os << u; return os.str(); }
    306 
    307 template<> inline std::string getString<unsigned long> ( unsigned long ul )
    308 { std::ostringstream os (""); os << ul; return os.str(); }
    309 
    310 template<> inline std::string getString<unsigned long long> ( unsigned long long ull )
    311 { std::ostringstream os (""); os << ull; return os.str(); }
    312 
    313 template<> inline std::string getString<unsigned short int> ( unsigned short int us )
    314 { std::ostringstream os (""); os << us; return os.str(); }
    315 
    316 template<> inline std::string getString<float> ( float f )
    317 { std::ostringstream os (""); os << f; return os.str(); }
    318 
    319 template<> inline std::string getString<double> ( double d )
    320 { std::ostringstream os; os << d; return os.str(); }
    321 
    322 template<> inline std::string getString<std::string> ( std::string s )
    323 { return s; }
    324 
    325 
    326 template<typename Data> inline Hurricane::Record* getRecord ( Data data )
    327 { return NULL; }
    328 
    329 
    330 // -------------------------------------------------------------------
    331 // Inspector Support for : "[const] std::pair<T,U>&".
    332 
    333 template<typename T, typename U>
    334 inline std::string getString ( const std::pair<T,U>& p )
    335 {
    336  return "const std::pair<T,U>";
    337 }
    338 
    339 
    340 template<typename T, typename U>
    341 inline Hurricane::Record* getRecord ( const std::pair<T,U>& p )
    342 {
    343  Hurricane::Record* record = NULL;
    344  record = new Hurricane::Record ( "const std::pair<T,U>" );
    345  record->add( getSlot<const T>(std::string("first" ), &p.first ) );
    346  record->add( getSlot<const U>(std::string("second"), &p.second) );
    347  return record;
    348 }
    349 
    350 
    351 template<typename T, typename U>
    352 inline std::string getString ( std::pair<T,U>& p )
    353 {
    354  return "std::pair<T,U>";
    355 }
    356 
    357 
    358 template<typename T, typename U>
    359 inline Hurricane::Record* getRecord ( std::pair<T,U>& p )
    360 {
    361  Hurricane::Record* record = NULL;
    362  record = new Hurricane::Record ( "std::pair<T,U>" );
    363  record->add( getSlot<T>(std::string("first" ), &p.first ) );
    364  record->add( getSlot<U>(std::string("second"), &p.second) );
    365  return record;
    366 }
    367 
    368 
    369 // -------------------------------------------------------------------
    370 // Inspector Support for : "[const] std::array<Element>*".
    371 
    372 
    373 template<typename Element,size_t N>
    374 inline std::string getString ( std::array<Element,N>* v )
    375 {
    376  std::string name = "const std::array<Element,N>:";
    377  return name + getString<size_t>(v->size());
    378 }
    379 
    380 
    381 template<typename Element,size_t N>
    382 inline Hurricane::Record* getRecord ( std::array<Element,N>* v )
    383 {
    384  Hurricane::Record* record = NULL;
    385  if ( !v->empty() ) {
    386  record = new Hurricane::Record ( "std::array<Element,N>" );
    387  unsigned n = 0;
    388  typename std::array<Element,N>::iterator iterator = v->begin();
    389  while ( iterator != v->end() ) {
    390  record->add ( getSlot<Element>(getString(n++), *iterator) );
    391  ++iterator;
    392  }
    393  }
    394  return record;
    395 }
    396 
    397 
    398 template<typename Element,size_t N>
    399 inline std::string getString ( const std::array<Element,N>* v )
    400 {
    401  std::string name = "const std::array<Element,N>:";
    402  return name + getString<size_t>(v->size());
    403 }
    404 
    405 
    406 template<typename Element,size_t N>
    407 inline Hurricane::Record* getRecord ( const std::array<Element,N>* v )
    408 {
    409  Hurricane::Record* record = NULL;
    410  if ( !v->empty() ) {
    411  record = new Hurricane::Record ( "const std::array<Element,N>" );
    412  unsigned n = 0;
    413  typename std::array<Element,N>::const_iterator iterator = v->begin();
    414  while ( iterator != v->end() ) {
    415  record->add ( getSlot<const Element>(getString(n++), *iterator) );
    416  ++iterator;
    417  }
    418  }
    419  return record;
    420 }
    421 
    422 
    423 template<typename Element,size_t N>
    424 inline std::string getString ( std::array<Element,N>& v )
    425 {
    426  std::string name = "std::array<Element,N>&:";
    427  return name + getString<size_t>(v.size());
    428 }
    429 
    430 
    431 template<typename Element,size_t N>
    432 inline Hurricane::Record* getRecord ( std::array<Element,N>& v )
    433 {
    434  Hurricane::Record* record = NULL;
    435  if (not v.empty()) {
    436  record = new Hurricane::Record ( "std::array<Element,N>&" );
    437  unsigned n = 0;
    438  for ( auto element : v )
    439  record->add( getSlot<Element>(getString(n++), element) );
    440  }
    441  return record;
    442 }
    443 
    444 
    445 template<typename Element,size_t N>
    446 inline std::string getString ( const std::array<Element,N>& v )
    447 {
    448  std::string name = "const std::array<Element,N>&:";
    449  return name + getString<size_t>(v.size());
    450 }
    451 
    452 
    453 template<typename Element,size_t N>
    454 inline Hurricane::Record* getRecord ( const std::array<Element,N>& v )
    455 {
    456  Hurricane::Record* record = NULL;
    457  if (not v.empty()) {
    458  record = new Hurricane::Record ( "const std::array<Element,N>&" );
    459  unsigned n = 0;
    460  for ( auto element : v )
    461  record->add( getSlot<Element>(getString(n++), element) );
    462  }
    463  return record;
    464 }
    465 
    466 
    467 // -------------------------------------------------------------------
    468 // Inspector Support for : "std::vector<Element>*".
    469 
    470 
    471 template<typename Element>
    472 inline std::string getString ( std::vector<Element>* v )
    473 {
    474  std::string name = "std::vector<Element>*:";
    475  return name + getString<size_t>(v->size());
    476 }
    477 
    478 
    479 template<typename Element>
    480 inline Hurricane::Record* getRecord ( std::vector<Element>* v )
    481 {
    482  Hurricane::Record* record = NULL;
    483  if ( !v->empty() ) {
    484  record = new Hurricane::Record ( "std::vector<Element>*" );
    485  unsigned n = 0;
    486  typename std::vector<Element>::iterator iterator = v->begin();
    487  while ( iterator != v->end() ) {
    488  record->add ( getSlot<Element>(getString(n++), &(*iterator)) );
    489  ++iterator;
    490  }
    491  }
    492  return record;
    493 }
    494 
    495 
    496 // -------------------------------------------------------------------
    497 // Inspector Support for : "std::vector<Element*>*".
    498 
    499 
    500 template<typename Element>
    501 inline std::string getString ( std::vector<Element*>* v )
    502 {
    503  std::string name = "std::vector<Element*>*:";
    504  return name + getString<size_t>(v->size());
    505 }
    506 
    507 
    508 template<typename Element>
    509 inline Hurricane::Record* getRecord ( std::vector<Element*>* v )
    510 {
    511  Hurricane::Record* record = NULL;
    512  if ( !v->empty() ) {
    513  record = new Hurricane::Record ( "std::vector<Element*>*" );
    514  unsigned n = 0;
    515  typename std::vector<Element>::iterator iterator = v->begin();
    516  while ( iterator != v->end() ) {
    517  record->add ( getSlot<Element>(getString(n++), *iterator) );
    518  ++iterator;
    519  }
    520  }
    521  return record;
    522 }
    523 
    524 
    525 // -------------------------------------------------------------------
    526 // Inspector Support for : "const std::vector<Element>*".
    527 
    528 
    529 template<typename Element>
    530 inline std::string getString ( const std::vector<Element>* v )
    531 {
    532  std::string name = "const std::vector<Element>*:";
    533  return name + getString<size_t>(v->size());
    534 }
    535 
    536 
    537 template<typename Element>
    538 inline Hurricane::Record* getRecord ( const std::vector<Element>* v )
    539 {
    540  Hurricane::Record* record = NULL;
    541  if ( !v->empty() ) {
    542  record = new Hurricane::Record ( "const std::vector<Element>*" );
    543  unsigned n = 0;
    544  typename std::vector<Element>::const_iterator iterator = v->begin();
    545  while ( iterator != v->end() ) {
    546  record->add ( getSlot<const Element>(getString(n++), &(*iterator)) );
    547  ++iterator;
    548  }
    549  }
    550  return record;
    551 }
    552 
    553 
    554 // -------------------------------------------------------------------
    555 // Inspector Support for : "const std::vector<Element*>*".
    556 
    557 
    558 template<typename Element>
    559 inline std::string getString ( const std::vector<Element*>* v )
    560 {
    561  std::string name = "const std::vector<Element*>*:";
    562  return name + getString<size_t>(v->size());
    563 }
    564 
    565 
    566 template<typename Element>
    567 inline Hurricane::Record* getRecord ( const std::vector<Element*>* v )
    568 {
    569  Hurricane::Record* record = NULL;
    570  if (not v->empty()) {
    571  record = new Hurricane::Record ( "const std::vector<Element*>*" );
    572  size_t n = 0;
    573  typename std::vector<Element*>::const_iterator iterator = v->begin();
    574  while (iterator != v->end()) {
    575  record->add ( getSlot<const Element*>(getString(n++), *iterator) );
    576  ++iterator;
    577  }
    578  }
    579  return record;
    580 }
    581 
    582 
    583 // -------------------------------------------------------------------
    584 // Inspector Support for : "const std::list<Element>*".
    585 
    586 
    587 template<typename Element>
    588 inline std::string getString ( const std::list<Element>* l )
    589 {
    590  std::string name = "const std::list<Element>:";
    591  return name + getString<size_t>(l->size());
    592 }
    593 
    594 
    595 template<typename Element>
    596 inline Hurricane::Record* getRecord ( const std::list<Element>* l )
    597 {
    598  Hurricane::Record* record = NULL;
    599  if ( !l->empty() ) {
    600  record = new Hurricane::Record ( "const std::list<Element>" );
    601  unsigned n = 1;
    602  typename std::list<Element>::const_iterator iterator = l->begin();
    603  while ( iterator != l->end() ) {
    604  record->add ( getSlot<const Element>(getString(n++), *iterator) );
    605  ++iterator;
    606  }
    607  }
    608  return record;
    609 }
    610 
    611 
    612 template<typename Element>
    613 inline std::string getString ( std::list<Element>* l )
    614 {
    615  std::string name = "std::list<Element>:";
    616  return name + getString<size_t>(l->size());
    617 }
    618 
    619 
    620 template<typename Element>
    621 inline Hurricane::Record* getRecord ( std::list<Element>* l )
    622 {
    623  Hurricane::Record* record = NULL;
    624  if ( !l->empty() ) {
    625  record = new Hurricane::Record ( "std::list<Element>" );
    626  unsigned n = 1;
    627  typename std::list<Element>::iterator iterator = l->begin();
    628  while ( iterator != l->end() ) {
    629  record->add ( getSlot<Element>(getString(n++), *iterator) );
    630  ++iterator;
    631  }
    632  }
    633  return record;
    634 }
    635 
    636 
    637 // -------------------------------------------------------------------
    638 // Inspector Support for : "[const] std::map<Key,Element,Compare>*.
    639 
    640 
    641 template<typename Key, typename Element>
    642 inline std::string getString ( std::map<Key,Element>* m )
    643 {
    644  std::string name = "std::map<Element>:";
    645  return name + getString<size_t>(m->size());
    646 }
    647 
    648 
    649 template<typename Key, typename Element>
    650 inline Hurricane::Record* getRecord ( std::map<Key,Element>* m )
    651 {
    652  Hurricane::Record* record = NULL;
    653  if ( !m->empty() ) {
    654  record = new Hurricane::Record ( "std::map<Element>" );
    655  typename std::map<Key,Element>::iterator iterator = m->begin();
    656  while ( iterator != m->end() ) {
    657  record->add ( getSlot<Element>(getString(iterator->first), iterator->second) );
    658  ++iterator;
    659  }
    660  }
    661  return record;
    662 }
    663 
    664 
    665 template<typename Key, typename Element>
    666 inline std::string getString ( const std::map<Key,Element>* m )
    667 {
    668  std::string name = "const std::map<Element>:";
    669  return name + getString<size_t>(m->size());
    670 }
    671 
    672 
    673 template<typename Key, typename Element>
    674 inline Hurricane::Record* getRecord ( const std::map<Key,Element>* m )
    675 {
    676  Hurricane::Record* record = NULL;
    677  if ( !m->empty() ) {
    678  record = new Hurricane::Record ( "const std::map<Element>" );
    679  typename std::map<Key,Element>::const_iterator iterator = m->begin();
    680  while ( iterator != m->end() ) {
    681  record->add ( getSlot<const Element>(getString(iterator->first), iterator->second) );
    682  ++iterator;
    683  }
    684  }
    685  return record;
    686 }
    687 
    688 
    689 // -------------------------------------------------------------------
    690 // Inspector Support for : "[const] std::map<Key,Element,Compare>*.
    691 
    692 
    693 template<typename Key, typename Element, typename Compare>
    694 inline std::string getString ( std::map<Key,Element,Compare>* m )
    695 {
    696  std::string name = "std::map<Element>:";
    697  return name + getString<size_t>(m->size());
    698 }
    699 
    700 
    701 template<typename Key, typename Element, typename Compare>
    702 inline Hurricane::Record* getRecord ( std::map<Key,Element,Compare>* m )
    703 {
    704  Hurricane::Record* record = NULL;
    705  if ( !m->empty() ) {
    706  record = new Hurricane::Record ( "std::map<Element>" );
    707  typename std::map<Key,Element,Compare>::iterator iterator = m->begin();
    708  while ( iterator != m->end() ) {
    709  record->add ( getSlot<Element>(getString(iterator->first), iterator->second) );
    710  ++iterator;
    711  }
    712  }
    713  return record;
    714 }
    715 
    716 
    717 template<typename Key, typename Element, typename Compare>
    718 inline std::string getString ( const std::map<Key,Element,Compare>* m )
    719 {
    720  std::string name = "const std::map<Element>:";
    721  return name + getString<size_t>(m->size());
    722 }
    723 
    724 
    725 template<typename Key, typename Element, typename Compare>
    726 inline Hurricane::Record* getRecord ( const std::map<Key,Element,Compare>* m )
    727 {
    728  Hurricane::Record* record = NULL;
    729  if ( !m->empty() ) {
    730  record = new Hurricane::Record ( "const std::map<Element>" );
    731  typename std::map<Key,Element,Compare>::const_iterator iterator = m->begin();
    732  while ( iterator != m->end() ) {
    733  record->add ( getSlot<const Element>(getString(iterator->first), iterator->second) );
    734  ++iterator;
    735  }
    736  }
    737  return record;
    738 }
    739 
    740 
    741 // -------------------------------------------------------------------
    742 // Inspector Support for : "const std::multimap<Key,Element,Compare>*".
    743 
    744 
    745 template<typename Key, typename Element, typename Compare>
    746 inline std::string getString ( const std::multimap<Key,Element,Compare>* m )
    747 {
    748  std::string name = "const std::multimap<Element>:";
    749  return name + getString<size_t>(m->size());
    750 }
    751 
    752 
    753 template<typename Key, typename Element, typename Compare>
    754 inline Hurricane::Record* getRecord ( const std::multimap<Key,Element,Compare>* m )
    755 {
    756  Hurricane::Record* record = NULL;
    757  if ( !m->empty() ) {
    758  record = new Hurricane::Record ( "const std::multimap<Element>" );
    759  typename std::multimap<Key,Element,Compare>::const_iterator iterator = m->begin();
    760  while ( iterator != m->end() ) {
    761  record->add ( getSlot<const Element>(getString(iterator->first), iterator->second) );
    762  ++iterator;
    763  }
    764  }
    765  return record;
    766 }
    767 
    768 
    769 template<typename Key, typename Element, typename Compare>
    770 inline std::string getString ( std::multimap<Key,Element,Compare>* m )
    771 {
    772  std::string name = "std::multimap<Element>:";
    773  return name + getString<size_t>(m->size());
    774 }
    775 
    776 
    777 template<typename Key, typename Element, typename Compare>
    778 inline Hurricane::Record* getRecord ( std::multimap<Key,Element,Compare>* m )
    779 {
    780  Hurricane::Record* record = NULL;
    781  if ( !m->empty() ) {
    782  record = new Hurricane::Record ( "std::multimap<Element>" );
    783  typename std::multimap<Key,Element,Compare>::iterator iterator = m->begin();
    784  while ( iterator != m->end() ) {
    785  record->add ( getSlot<Element>(getString(iterator->first), iterator->second) );
    786  ++iterator;
    787  }
    788  }
    789  return record;
    790 }
    791 
    792 
    793 // -------------------------------------------------------------------
    794 // Inspector Support for : "[const] std::set<Element,Compare>*".
    795 
    796 
    797 template<typename Element, typename Compare>
    798 inline std::string getString ( const std::set<Element,Compare>* s )
    799 {
    800  std::string name = "const std::set<Element>:";
    801  return name + getString<size_t>(s->size());
    802 }
    803 
    804 
    805 template<typename Element, typename Compare>
    806 inline Hurricane::Record* getRecord ( const std::set<Element,Compare>* s )
    807 {
    808  Hurricane::Record* record = NULL;
    809  if ( !s->empty() ) {
    810  record = new Hurricane::Record ( "const std::set<Element>" );
    811  unsigned n = 1;
    812  typename std::set<Element,Compare>::const_iterator iterator = s->begin();
    813  while ( iterator != s->end() ) {
    814  record->add ( getSlot<const Element>(getString(n++), *iterator) );
    815  ++iterator;
    816  }
    817  }
    818  return record;
    819 }
    820 
    821 
    822 template< typename Element, typename Compare, typename Allocator >
    823 inline std::string getString ( std::set<Element,Compare,Allocator>* s )
    824 {
    825  std::string name = "std::set<Element>:";
    826  return name + getString<size_t>(s->size());
    827 }
    828 
    829 
    830 template< typename Element, typename Compare, typename Allocator >
    831 inline Hurricane::Record* getRecord ( std::set<Element,Compare,Allocator>* s )
    832 {
    833  Hurricane::Record* record = NULL;
    834  if ( !s->empty() ) {
    835  record = new Hurricane::Record ( "std::set<Element>" );
    836  unsigned n = 1;
    837  typename std::set<Element,Compare,Allocator>::iterator iterator = s->begin();
    838  while ( iterator != s->end() ) {
    839  record->add ( getSlot<Element>(getString(n++), *iterator) );
    840  ++iterator;
    841  }
    842  }
    843  return record;
    844 }
    845 
    846 // -------------------------------------------------------------------
    847 // Inspector Support for : "[const] std::set<Element,Compare>&".
    848 
    849 
    850 template<typename Element, typename Compare>
    851 inline std::string getString ( const std::set<Element,Compare>& s )
    852 {
    853  std::string name = "const std::set<Element>:";
    854  return name + getString<size_t>(s.size());
    855 }
    856 
    857 
    858 template<typename Element, typename Compare>
    859 inline Hurricane::Record* getRecord ( const std::set<Element,Compare>& s )
    860 {
    861  Hurricane::Record* record = NULL;
    862  if ( !s.empty() ) {
    863  record = new Hurricane::Record ( "const std::set<Element>" );
    864  unsigned n = 1;
    865  typename std::set<Element,Compare>::const_iterator iterator = s.begin();
    866  while ( iterator != s.end() ) {
    867  record->add ( getSlot<Element>(getString(n++), *iterator) );
    868  ++iterator;
    869  }
    870  }
    871  return record;
    872 }
    873 
    874 // -------------------------------------------------------------------
    875 // Inspector Support for : "const std::multiset<Element,Compare>*".
    876 
    877 
    878 template<typename Element, typename Compare>
    879 inline std::string getString ( const std::multiset<Element,Compare>* s )
    880 {
    881  std::string name = "std::multiset<Element>:";
    882  return name + getString<size_t>(s->size());
    883 }
    884 
    885 
    886 template<typename Element, typename Compare>
    887 inline Hurricane::Record* getRecord ( const std::multiset<Element,Compare>* s )
    888 {
    889  Hurricane::Record* record = NULL;
    890  if ( !s->empty() ) {
    891  record = new Hurricane::Record ( "std::multiset<Element>" );
    892  unsigned n = 1;
    893  typename std::multiset<Element,Compare>::const_iterator iterator = s->begin();
    894  while ( iterator != s->end() ) {
    895  record->add ( getSlot<Element>(getString(n++), *iterator) );
    896  ++iterator;
    897  }
    898  }
    899  return record;
    900 }
    901 
    902 
    903 # define GETSTRING_POINTER_SUPPORT(Data) \
    904  template<> inline std::string getString<Data*>( Data* data ) \
    905  { \
    906  if (!data) return "NULL [" #Data "]"; \
    907  return data->_getString(); \
    908  } \
    909  \
    910  template<> inline std::string getString<const Data*>( const Data* data ) \
    911  { if (!data) return "NULL [const " #Data "]"; return data->_getString(); }
    912 
    913 
    914 # define IOSTREAM_POINTER_SUPPORT(Data) \
    915  inline std::ostream& operator<< ( std::ostream& o, Data* d ) \
    916  { \
    917  if (!d) return o << "NULL [" #Data "]"; \
    918  return o << "&" << getString<const Data*>(d); \
    919  } \
    920  inline std::ostream& operator<< ( std::ostream& o, const Data* d ) \
    921  { \
    922  if (!d) return o << "NULL [const " #Data "]"; \
    923  return o << "&" << getString<const Data*>(d); \
    924  } \
    925 
    926 
    927 # define GETRECORD_POINTER_SUPPORT(Data) \
    928  template<> inline Hurricane::Record* getRecord<Data*>( Data* data ) \
    929  { if (!data) return NULL; return data->_getRecord(); } \
    930  \
    931  template<> inline Hurricane::Record* getRecord<const Data*>( const Data* data ) \
    932  { if (!data) return NULL; return data->_getRecord(); }
    933 
    934 
    935 # define GETSTRING_REFERENCE_SUPPORT(Data) \
    936  template<> inline std::string getString<Data&>( Data& data ) \
    937  { return data._getString(); } \
    938  \
    939  template<> inline std::string getString<const Data&>( const Data& data ) \
    940  { return data._getString(); }
    941 
    942 
    943 # define IOSTREAM_REFERENCE_SUPPORT(Data) \
    944  inline std::ostream& operator<< ( std::ostream& o, Data& d ) \
    945  { return o << getString<Data&>(d); } \
    946  \
    947  inline std::ostream& operator<< ( std::ostream& o, const Data& d ) \
    948  { return o << getString<const Data&>(d); } \
    949  \
    950 
    951 # define GETRECORD_REFERENCE_SUPPORT(Data) \
    952  template<> inline Hurricane::Record* getRecord<Data&>( Data& data ) \
    953  { return data._getRecord(); } \
    954  \
    955  template<> inline Hurricane::Record* getRecord<const Data&>( const Data& data ) \
    956  { return data._getRecord(); }
    957 
    958 
    959 # define GETSTRING_VALUE_SUPPORT(Data) \
    960  template<> inline std::string getString<Data>( Data data ) \
    961  { return data._getString(); }
    962 
    963 
    964 # define IOSTREAM_VALUE_SUPPORT(Data) \
    965  inline std::ostream& operator<< ( std::ostream& o, Data d ) \
    966  { return o << getString<Data>(d); }
    967 
    968 
    969 # define GETRECORD_VALUE_SUPPORT(Data) \
    970  template<> inline Hurricane::Record* getRecord<Data>( Data data ) \
    971  { return data._getRecord(); }
    972 
    973 
    974 # define INSPECTOR_P_SUPPORT(Data) \
    975  GETRECORD_POINTER_SUPPORT(Data) \
    976  GETSTRING_POINTER_SUPPORT(Data) \
    977  IOSTREAM_POINTER_SUPPORT(Data)
    978 
    979 
    980 # define INSPECTOR_R_SUPPORT(Data) \
    981  GETRECORD_REFERENCE_SUPPORT(Data) \
    982  GETSTRING_REFERENCE_SUPPORT(Data) \
    983  IOSTREAM_REFERENCE_SUPPORT(Data)
    984 
    985 
    986 # define INSPECTOR_PR_SUPPORT(Data) \
    987  GETSTRING_POINTER_SUPPORT(Data) \
    988  GETSTRING_REFERENCE_SUPPORT(Data) \
    989  GETSTRING_VALUE_SUPPORT(Data) \
    990  IOSTREAM_POINTER_SUPPORT(Data) \
    991  IOSTREAM_REFERENCE_SUPPORT(Data) \
    992  GETRECORD_POINTER_SUPPORT(Data) \
    993  GETRECORD_REFERENCE_SUPPORT(Data)
    994 
    995 
    996 #include "hurricane/Tabulation.h"
    997 
    998 
    999 // -------------------------------------------------------------------
    1000 // Class : "::cdebug()".
    1001 //
    1002 // Wrapper around the STL ostream which to print debugging messages.
    1003 
    1004 class tstream : public std::ostream {
    1005  public:
    1006  inline int getMinLevel () const;
    1007  inline int getMaxLevel () const;
    1008  inline int setMinLevel ( int );
    1009  inline int setMaxLevel ( int );
    1010  inline int getLevel () const;
    1011  inline int setLevel ( int );
    1012  inline bool enabled () const;
    1013  inline bool enabled ( int ) const;
    1014  inline tstream& log ( int level, int count=0 );
    1015  inline tstream& tabw ( int level, int count );
    1016  inline tstream ( std::ostream & );
    1017  inline tstream& put ( char c );
    1018  inline tstream& flush ();
    1019  private:
    1020  inline tstream& _tab ();
    1021  inline tstream& _tabw ( int count );
    1022  public:
    1023  // Overload for manipulators.
    1024  inline tstream& operator<< ( std::ostream& (*pf)(std::ostream &) );
    1025  private:
    1026  int _minLevel;
    1027  int _maxLevel;
    1028  int _level;
    1029  Hurricane::Tabulation _tabulation;
    1030 };
    1031 
    1032 
    1033 inline tstream::tstream ( std::ostream& s )
    1034  : std::ostream(s.rdbuf())
    1035  , _minLevel (100000)
    1036  , _maxLevel (0)
    1037  , _level (0)
    1038  , _tabulation(" ")
    1039 { }
    1040 
    1041 inline int tstream::getMinLevel () const { return _minLevel; }
    1042 inline int tstream::getMaxLevel () const { return _maxLevel; }
    1043 inline int tstream::setMinLevel ( int l ) { int pl=_minLevel; _minLevel=l; return pl; }
    1044 inline int tstream::setMaxLevel ( int l ) { int pl=_maxLevel; _maxLevel=l; return pl; }
    1045 inline int tstream::getLevel () const { return _level; }
    1046 inline int tstream::setLevel ( int l ) { int pl=_level; _level=l; return pl; }
    1047 inline bool tstream::enabled () const { return (_level >= _minLevel) and (_level < _maxLevel); }
    1048 inline bool tstream::enabled ( int l ) const { return (l >= _minLevel) and (l < _maxLevel); }
    1049 inline tstream& tstream::tabw ( int level, int count ) { setLevel(level); return _tabw(count); }
    1050 inline tstream& tstream::put ( char c ) { if (enabled()) static_cast<std::ostream*>(this)->put(c); return *this; }
    1051 inline tstream& tstream::flush () { if (enabled()) static_cast<std::ostream*>(this)->flush(); return *this; }
    1052 inline tstream& tstream::operator<< ( std::ostream& (*pf)(std::ostream&) ) { if (enabled()) (*pf)(*this); return *this; }
    1053 
    1054 
    1055 inline tstream& tstream::_tab () { if (enabled()) (*this) << _tabulation; return *this; }
    1056 inline tstream& tstream::_tabw ( int count )
    1057 {
    1058  if (enabled()) {
    1059  if (count > 0) while(count--) _tabulation++;
    1060  else if (count < 0) while(count++) _tabulation--;
    1061  }
    1062  return *this;
    1063 }
    1064 
    1065 inline tstream& tstream::log ( int level, int count )
    1066 { setLevel(level); _tab(); return _tabw(count); }
    1067 
    1068 // For STL Types.
    1069 inline tstream& operator<< ( tstream& o, const std::string s )
    1070 { if (o.enabled()) { static_cast<std::ostream&>(o) << s; } return o; };
    1071 
    1072 // For POD Types.
    1073 // template<typename T>
    1074 // inline tstream& operator<< ( tstream& o, T& t )
    1075 // { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<T&>(t); } return o; };
    1076 
    1077 template<typename T>
    1078 inline tstream& operator<< ( tstream& o, T* t )
    1079 { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<T*>(t); } return o; };
    1080 
    1081 // template<typename T>
    1082 // inline tstream& operator<< ( tstream& o, const T& t )
    1083 // { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<const T&>(t); } return o; };
    1084 
    1085 template<typename T>
    1086 inline tstream& operator<< ( tstream& o, T t )
    1087 { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<T>(t); } return o; };
    1088 
    1089 template<typename T>
    1090 inline tstream& operator<< ( tstream& o, const T* t )
    1091 { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<const T*>(t); } return o; };
    1092 
    1093 template<>
    1094 inline tstream& operator<< ( tstream& o, std::ios_base& (*pf)(std::ios_base&) )
    1095 { if (o.enabled()) { static_cast<std::ostream&>(o) << pf; } return o; };
    1096 
    1097 struct _Tsetw { int n_; };
    1098 inline _Tsetw tsetw ( int n ) { return { n }; }
    1099 
    1100 struct _Tsetf { int n_; };
    1101 inline _Tsetf tsetf ( int n ) { return { n }; }
    1102 
    1103 template<>
    1104 inline tstream& operator<< ( tstream& o, _Tsetw manip )
    1105 { if (o.enabled()) { static_cast<std::ostream&>(o) << std::setw(manip.n_); } return o; }
    1106 
    1107 extern tstream cdebug;
    1108 
    1109 
    1110 #define cdebug_log(level,indent) if (cdebug.enabled(level)) cdebug.log(level,indent)
    1111 #define cdebug_tabw(level,indent) cdebug.tabw(level,indent)
    1112 
    1113 
    1114 // x-----------------------------------------------------------------x
    1115 // | Classes Neededs in All Hurricane Modules |
    1116 // x-----------------------------------------------------------------x
    1117 
    1118 #include "hurricane/Slot.h"
    1119 #include "hurricane/Initializer.h"
    1120 #include "hurricane/JsonWriter.h"
    1121 #include "hurricane/JsonObject.h"
    int getLevel() const
    Definition: Commons.h:1045
    +
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Remy Escassut |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/Commons.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #pragma once
    33 #define HURRICANE_COMMONS_H
    34 
    35 #include <cstdio>
    36 #include <cassert>
    37 #include <cmath>
    38 #include <memory>
    39 #include <string>
    40 #include <list>
    41 #include <set>
    42 #include <map>
    43 #include <stack>
    44 #include <array>
    45 #include <vector>
    46 #include <iostream>
    47 #include <iomanip>
    48 #include <fstream>
    49 #include <sstream>
    50 
    51 
    52 // +-----------------------------------------------------------------+
    53 // | Macros Definition |
    54 // +-----------------------------------------------------------------+
    55 
    56 
    57 namespace Hurricane {
    58 
    59  using namespace std;
    60 
    61  class Slot;
    62 
    63 
    64  // +-------------------------------------------------------------+
    65  // | shared_ptr<> support for DBo |
    66  // +-------------------------------------------------------------+
    67 
    68 
    69  template<typename DboType>
    70  class DboDestroy {
    71  public:
    72  inline void operator() ( DboType* dbo ) { dbo->destroy(); }
    73  };
    74 
    75 
    76  template<typename DboType>
    77  class dbo_ptr : public std::shared_ptr<DboType> {
    78  public:
    79  dbo_ptr ( DboType* dbo ) : std::shared_ptr<DboType>(dbo,DboDestroy<DboType>()) { }
    80  };
    81 
    82 
    83 
    84 
    85  // +-------------------------------------------------------------+
    86  // | Miscellaneous Utilites |
    87  // +-------------------------------------------------------------+
    88 
    89 
    90  inline string _TName ( const string& s ) { return s; }
    91  inline string _PName ( const string& s ) { return "Hurricane::" + s; }
    92 
    93  template<class Type>
    94  inline Type abs ( const Type& value ) { return (value<0) ? -value : value; }
    95 
    96  string demangle ( const char* symbol );
    97  inline string demangle ( string symbol ) { return demangle(symbol.c_str()); }
    98  inline string demangle ( const type_info& info ) { return demangle(info.name()); }
    99 
    100  template<typename Element>
    101  inline void erase_element ( vector<Element*>& v, const Element* e )
    102  {
    103  for ( auto ielement = v.begin() ; ielement != v.end() ; ++ielement )
    104  if (*ielement == e) { v.erase( ielement ); return; }
    105  }
    106 
    107 
    108 #if DEPRECATED
    109 // For a complete explanation of this function, please look at :
    110 // http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm
    111 
    112  inline int floatCompare ( float a, float b )
    113  {
    114  assert ( sizeof(float) == sizeof(int) );
    115 
    116  if ( a == b ) return 0;
    117  return *(int*)&a - *(int*)&b;
    118  }
    119 
    120  inline int floatDifference ( float a, float b, int threshold )
    121  {
    122  int difference = floatCompare(a,b);
    123  if ( abs(difference) < threshold ) return 0;
    124 
    125  return (difference<0) ? -1 : 1;
    126  }
    127 
    128 
    129  inline void floatRound ( float& value, float precision )
    130  {
    131  float rounded = roundf ( value*precision );
    132  value = rounded / precision;
    133  }
    134 #endif
    135 
    136  inline float roundfp ( float value, float precision=100.0 ) { return roundf(value*precision)/precision; }
    137 
    138 
    139  template<typename Type> inline void order ( Type& a, Type& b ) { if (a>b) std::swap(a,b); }
    140 
    141  template<typename Type> inline Type setInBound ( Type lower, Type upper, Type& value )
    142  {
    143  if (value < lower) value = lower;
    144  else if (value > upper) value = upper;
    145  return value;
    146  }
    147 
    148 
    149 } // End of Hurricane namespace.
    150 
    151 
    152 #include "hurricane/Record.h"
    153 
    154 
    155 // +-----------------------------------------------------------------+
    156 // | Functions for Inspector Support |
    157 // +-----------------------------------------------------------------+
    158 
    159 // Note 1: Theses are specialized templates for "getString<>()" & "getRecord<>()".
    160 // Note 2: we are outside the Hurricane namespace.
    161 // Note 3: thoses templates manage all POD & STL types.
    162 
    163 
    164 template<typename Data> inline Hurricane::Slot* getSlot ( std::string name, Data );
    165 
    166 
    167 // -------------------------------------------------------------------
    168 // Inspector Support for : "POD types".
    169 
    170 // Default match.
    171 
    172 template<typename Data> inline std::string getString ( Data data )
    173 { return std::string("<type ")
    174  + Hurricane::demangle(typeid(data).name())
    175  + std::string(" unsupported by getString()>"); }
    176 
    177 // "const &" flavors.
    178 
    179 template<> inline std::string getString<const bool&> ( const bool& b )
    180 { return (b)?"True":"False" ; }
    181 
    182 template<> inline std::string getString<const int&> ( const int& i )
    183 { std::ostringstream os (""); os << i; return os.str(); }
    184 
    185 template<> inline std::string getString<const long&> ( const long& l )
    186 { std::ostringstream os (""); os << l; return os.str(); }
    187 
    188 template<> inline std::string getString<const unsigned int&> ( const unsigned int& u )
    189 { std::ostringstream os (""); os << u; return os.str(); }
    190 
    191 template<> inline std::string getString<const unsigned long&> ( const unsigned long& ul )
    192 { std::ostringstream os (""); os << ul; return os.str(); }
    193 
    194 template<> inline std::string getString<const unsigned long long&> ( const unsigned long long& ull )
    195 { std::ostringstream os (""); os << ull; return os.str(); }
    196 
    197 template<> inline std::string getString<const unsigned short int&> ( const unsigned short int& us )
    198 { std::ostringstream os (""); os << us; return os.str(); }
    199 
    200 template<> inline std::string getString<const float&> ( const float& f )
    201 { std::ostringstream os (""); os << f; return os.str(); }
    202 
    203 template<> inline std::string getString<const double&> ( const double& d )
    204 { std::ostringstream os; os << d; return os.str(); }
    205 
    206 template<> inline std::string getString<const std::string&> ( const std::string& s )
    207 { return s; }
    208 
    209 // "const *" flavors.
    210 
    211 template<> inline std::string getString<const bool*> ( const bool* b )
    212 { return (*b)?"True":"False" ; }
    213 
    214 template<> inline std::string getString<const char*> ( const char* c )
    215 { return c; }
    216 
    217 template<> inline std::string getString<const int*> ( const int* i )
    218 { std::ostringstream os (""); os << *i; return os.str(); }
    219 
    220 template<> inline std::string getString<const long*> ( const long* l )
    221 { std::ostringstream os (""); os << *l; return os.str(); }
    222 
    223 template<> inline std::string getString<const unsigned int*> ( const unsigned int* u )
    224 { std::ostringstream os (""); os << *u; return os.str(); }
    225 
    226 template<> inline std::string getString<const unsigned long*> ( const unsigned long* ul )
    227 { std::ostringstream os (""); os << *ul; return os.str(); }
    228 
    229 template<> inline std::string getString<const unsigned long long*> ( const unsigned long long* ull )
    230 { std::ostringstream os (""); os << *ull; return os.str(); }
    231 
    232 template<> inline std::string getString<const unsigned short int*> ( const unsigned short int* us )
    233 { std::ostringstream os (""); os << *us; return os.str(); }
    234 
    235 template<> inline std::string getString<const float*> ( const float* f )
    236 { std::ostringstream os (""); os << *f; return os.str(); }
    237 
    238 template<> inline std::string getString<const double*> ( const double* d )
    239 { std::ostringstream os; os << *d; return os.str(); }
    240 
    241 template<> inline std::string getString<const void*> ( const void* p )
    242 { std::ostringstream os ("0x"); os << std::hex << p; return os.str(); }
    243 
    244 template<> inline std::string getString<const std::string*> ( const std::string* s )
    245 { return *s; }
    246 
    247 
    248 // "*" flavors.
    249 
    250 template<> inline std::string getString<bool*> ( bool* b )
    251 { return (*b)?"True":"False" ; }
    252 
    253 template<> inline std::string getString<char*> ( char* c )
    254 { return c; }
    255 
    256 template<> inline std::string getString<int*> ( int* i )
    257 { std::ostringstream os (""); os << *i; return os.str(); }
    258 
    259 template<> inline std::string getString<long*> ( long* l )
    260 { std::ostringstream os (""); os << *l; return os.str(); }
    261 
    262 template<> inline std::string getString<unsigned int*> ( unsigned int* u )
    263 { std::ostringstream os (""); os << *u; return os.str(); }
    264 
    265 template<> inline std::string getString<unsigned long*> ( unsigned long* ul )
    266 { std::ostringstream os (""); os << *ul; return os.str(); }
    267 
    268 template<> inline std::string getString<unsigned long long*> ( unsigned long long* ull )
    269 { std::ostringstream os (""); os << *ull; return os.str(); }
    270 
    271 template<> inline std::string getString<unsigned short int*> ( unsigned short int* us )
    272 { std::ostringstream os (""); os << *us; return os.str(); }
    273 
    274 template<> inline std::string getString<float*> ( float* f )
    275 { std::ostringstream os (""); os << *f; return os.str(); }
    276 
    277 template<> inline std::string getString<double*> ( double* d )
    278 { std::ostringstream os; os << *d; return os.str(); }
    279 
    280 template<> inline std::string getString<void*> ( void* p )
    281 { std::ostringstream os ("0x"); os << std::hex << p; return os.str(); }
    282 
    283 template<> inline std::string getString<std::string*> ( std::string* s )
    284 { return *s; }
    285 
    286 
    287 // "by value" flavors.
    288 
    289 template<> inline std::string getString<bool> ( bool b )
    290 { return (b)?"True":"False" ; }
    291 
    292 template<> inline std::string getString<char> ( char c )
    293 { return std::string(1,c); }
    294 
    295 template<> inline std::string getString<int> ( int i )
    296 { std::ostringstream os (""); os << i; return os.str(); }
    297 
    298 template<> inline std::string getString<long> ( long l )
    299 { std::ostringstream os (""); os << l; return os.str(); }
    300 
    301 template<> inline std::string getString<unsigned int> ( unsigned int u )
    302 { std::ostringstream os (""); os << u; return os.str(); }
    303 
    304 template<> inline std::string getString<unsigned long> ( unsigned long ul )
    305 { std::ostringstream os (""); os << ul; return os.str(); }
    306 
    307 template<> inline std::string getString<unsigned long long> ( unsigned long long ull )
    308 { std::ostringstream os (""); os << ull; return os.str(); }
    309 
    310 template<> inline std::string getString<unsigned short int> ( unsigned short int us )
    311 { std::ostringstream os (""); os << us; return os.str(); }
    312 
    313 template<> inline std::string getString<float> ( float f )
    314 { std::ostringstream os (""); os << f; return os.str(); }
    315 
    316 template<> inline std::string getString<double> ( double d )
    317 { std::ostringstream os; os << d; return os.str(); }
    318 
    319 template<> inline std::string getString<std::string> ( std::string s )
    320 { return s; }
    321 
    322 
    323 template<typename Data> inline Hurricane::Record* getRecord ( Data data )
    324 {
    325 //std::cerr << "::getRecord(Data) Data=" << Hurricane::demangle(typeid(data).name()) << std::endl;
    326  return NULL;
    327 }
    328 
    329 
    330 // -------------------------------------------------------------------
    331 // Inspector Support for : "[const] std::pair<T,U>&".
    332 
    333 template<typename T, typename U>
    334 inline std::string getString ( const std::pair<T,U>& p )
    335 {
    336  return "const std::pair<T,U>";
    337 }
    338 
    339 
    340 template<typename T, typename U>
    341 inline Hurricane::Record* getRecord ( const std::pair<T,U>& p )
    342 {
    343  Hurricane::Record* record = NULL;
    344  record = new Hurricane::Record ( "const std::pair<T,U>" );
    345  record->add( getSlot<const T>(std::string("first" ), &p.first ) );
    346  record->add( getSlot<const U>(std::string("second"), &p.second) );
    347  return record;
    348 }
    349 
    350 
    351 template<typename T, typename U>
    352 inline std::string getString ( std::pair<T,U>& p )
    353 {
    354  return "std::pair<T,U>";
    355 }
    356 
    357 
    358 template<typename T, typename U>
    359 inline Hurricane::Record* getRecord ( std::pair<T,U>& p )
    360 {
    361  Hurricane::Record* record = NULL;
    362  record = new Hurricane::Record ( "std::pair<T,U>" );
    363  record->add( getSlot<T>(std::string("first" ), &p.first ) );
    364  record->add( getSlot<U>(std::string("second"), &p.second) );
    365  return record;
    366 }
    367 
    368 
    369 // -------------------------------------------------------------------
    370 // Inspector Support for : "[const] std::array<Element>*".
    371 
    372 
    373 template<typename Element,size_t N>
    374 inline std::string getString ( std::array<Element,N>* v )
    375 {
    376  std::string name = "const std::array<Element,N>:";
    377  return name + getString<size_t>(v->size());
    378 }
    379 
    380 
    381 template<typename Element,size_t N>
    382 inline Hurricane::Record* getRecord ( std::array<Element,N>* v )
    383 {
    384  Hurricane::Record* record = NULL;
    385  if ( !v->empty() ) {
    386  record = new Hurricane::Record ( "std::array<Element,N>" );
    387  unsigned n = 0;
    388  typename std::array<Element,N>::iterator iterator = v->begin();
    389  while ( iterator != v->end() ) {
    390  record->add ( getSlot<Element>(getString(n++), *iterator) );
    391  ++iterator;
    392  }
    393  }
    394  return record;
    395 }
    396 
    397 
    398 template<typename Element,size_t N>
    399 inline std::string getString ( const std::array<Element,N>* v )
    400 {
    401  std::string name = "const std::array<Element,N>:";
    402  return name + getString<size_t>(v->size());
    403 }
    404 
    405 
    406 template<typename Element,size_t N>
    407 inline Hurricane::Record* getRecord ( const std::array<Element,N>* v )
    408 {
    409  Hurricane::Record* record = NULL;
    410  if ( !v->empty() ) {
    411  record = new Hurricane::Record ( "const std::array<Element,N>" );
    412  unsigned n = 0;
    413  typename std::array<Element,N>::const_iterator iterator = v->begin();
    414  while ( iterator != v->end() ) {
    415  record->add ( getSlot<const Element>(getString(n++), *iterator) );
    416  ++iterator;
    417  }
    418  }
    419  return record;
    420 }
    421 
    422 
    423 template<typename Element,size_t N>
    424 inline std::string getString ( std::array<Element,N>& v )
    425 {
    426  std::string name = "std::array<Element,N>&:";
    427  return name + getString<size_t>(v.size());
    428 }
    429 
    430 
    431 template<typename Element,size_t N>
    432 inline Hurricane::Record* getRecord ( std::array<Element,N>& v )
    433 {
    434  Hurricane::Record* record = NULL;
    435  if (not v.empty()) {
    436  record = new Hurricane::Record ( "std::array<Element,N>&" );
    437  unsigned n = 0;
    438  for ( auto element : v )
    439  record->add( getSlot<Element>(getString(n++), element) );
    440  }
    441  return record;
    442 }
    443 
    444 
    445 template<typename Element,size_t N>
    446 inline std::string getString ( const std::array<Element,N>& v )
    447 {
    448  std::string name = "const std::array<Element,N>&:";
    449  return name + getString<size_t>(v.size());
    450 }
    451 
    452 
    453 template<typename Element,size_t N>
    454 inline Hurricane::Record* getRecord ( const std::array<Element,N>& v )
    455 {
    456  Hurricane::Record* record = NULL;
    457  if (not v.empty()) {
    458  record = new Hurricane::Record ( "const std::array<Element,N>&" );
    459  unsigned n = 0;
    460  for ( auto element : v )
    461  record->add( getSlot<Element>(getString(n++), element) );
    462  }
    463  return record;
    464 }
    465 
    466 
    467 // -------------------------------------------------------------------
    468 // Inspector Support for : "std::vector<Element>*".
    469 
    470 
    471 template<typename Element>
    472 inline std::string getString ( std::vector<Element>* v )
    473 {
    474  std::string name = "std::vector<Element>*:";
    475  return name + getString<size_t>(v->size());
    476 }
    477 
    478 
    479 template<typename Element>
    480 inline Hurricane::Record* getRecord ( std::vector<Element>* v )
    481 {
    482  Hurricane::Record* record = NULL;
    483  if ( !v->empty() ) {
    484  record = new Hurricane::Record ( "std::vector<Element>*" );
    485  unsigned n = 0;
    486  typename std::vector<Element>::iterator iterator = v->begin();
    487  while ( iterator != v->end() ) {
    488  record->add ( getSlot<const Element*>(getString(n++), &(*iterator)) );
    489  ++iterator;
    490  }
    491  }
    492  return record;
    493 }
    494 
    495 
    496 // -------------------------------------------------------------------
    497 // Inspector Support for : "std::vector<Element*>*".
    498 
    499 
    500 template<typename Element>
    501 inline std::string getString ( std::vector<Element*>* v )
    502 {
    503  std::string name = "std::vector<Element*>*:";
    504  return name + getString<size_t>(v->size());
    505 }
    506 
    507 
    508 template<typename Element>
    509 inline Hurricane::Record* getRecord ( std::vector<Element*>* v )
    510 {
    511  Hurricane::Record* record = NULL;
    512  if ( !v->empty() ) {
    513  record = new Hurricane::Record ( "std::vector<Element*>*" );
    514  unsigned n = 0;
    515  typename std::vector<Element*>::iterator iterator = v->begin();
    516  while ( iterator != v->end() ) {
    517  record->add ( getSlot<Element*>(getString(n++), *iterator) );
    518  ++iterator;
    519  }
    520  }
    521  return record;
    522 }
    523 
    524 
    525 // -------------------------------------------------------------------
    526 // Inspector Support for : "const std::vector<Element>*".
    527 
    528 
    529 template<typename Element>
    530 inline std::string getString ( const std::vector<Element>* v )
    531 {
    532  std::string name = "const std::vector<Element>*:";
    533  return name + getString<size_t>(v->size());
    534 }
    535 
    536 
    537 template<typename Element>
    538 inline Hurricane::Record* getRecord ( const std::vector<Element>* v )
    539 {
    540  Hurricane::Record* record = NULL;
    541  if ( !v->empty() ) {
    542  record = new Hurricane::Record ( "const std::vector<Element>*" );
    543  unsigned n = 0;
    544  typename std::vector<Element>::const_iterator iterator = v->begin();
    545  while ( iterator != v->end() ) {
    546  record->add ( getSlot<const Element*>(getString(n++), &(*iterator)) );
    547  ++iterator;
    548  }
    549  }
    550  return record;
    551 }
    552 
    553 
    554 // -------------------------------------------------------------------
    555 // Inspector Support for : "const std::vector<Element*>*".
    556 
    557 
    558 template<typename Element>
    559 inline std::string getString ( const std::vector<Element*>* v )
    560 {
    561  std::string name = "const std::vector<Element*>*:";
    562  return name + getString<size_t>(v->size());
    563 }
    564 
    565 
    566 template<typename Element>
    567 inline Hurricane::Record* getRecord ( const std::vector<Element*>* v )
    568 {
    569  Hurricane::Record* record = NULL;
    570  if (not v->empty()) {
    571  record = new Hurricane::Record ( "const std::vector<Element*>*" );
    572  size_t n = 0;
    573  typename std::vector<Element*>::const_iterator iterator = v->begin();
    574  while (iterator != v->end()) {
    575  record->add ( getSlot<const Element*>(getString(n++), *iterator) );
    576  ++iterator;
    577  }
    578  }
    579  return record;
    580 }
    581 
    582 
    583 // -------------------------------------------------------------------
    584 // Inspector Support for : "const std::list<Element>*".
    585 
    586 
    587 template<typename Element>
    588 inline std::string getString ( const std::list<Element>* l )
    589 {
    590  std::string name = "const std::list<Element>*:";
    591  return name + getString<size_t>(l->size());
    592 }
    593 
    594 
    595 template<typename Element>
    596 inline Hurricane::Record* getRecord ( const std::list<Element>* l )
    597 {
    598  Hurricane::Record* record = NULL;
    599  if ( !l->empty() ) {
    600  record = new Hurricane::Record ( "const std::list<Element>" );
    601  unsigned n = 1;
    602  typename std::list<Element>::const_iterator iterator = l->begin();
    603  while ( iterator != l->end() ) {
    604  record->add ( getSlot<const Element*>(getString(n++), &(*iterator)) );
    605  ++iterator;
    606  }
    607  }
    608  return record;
    609 }
    610 
    611 
    612 template<typename Element>
    613 inline std::string getString ( std::list<Element>* l )
    614 {
    615  std::string name = "std::list<Element>*:";
    616  return name + getString<size_t>(l->size());
    617 }
    618 
    619 
    620 template<typename Element>
    621 inline Hurricane::Record* getRecord ( std::list<Element>* l )
    622 {
    623  Hurricane::Record* record = NULL;
    624  if ( !l->empty() ) {
    625  record = new Hurricane::Record ( "std::list<Element>" );
    626  unsigned n = 1;
    627  typename std::list<Element>::iterator iterator = l->begin();
    628  while ( iterator != l->end() ) {
    629  record->add ( getSlot<const Element*>(getString(n++), &(*iterator)) );
    630  ++iterator;
    631  }
    632  }
    633  return record;
    634 }
    635 
    636 
    637 // -------------------------------------------------------------------
    638 // Inspector Support for : "[const] std::map<Key,Element,Compare>*.
    639 
    640 
    641 template<typename Key, typename Element>
    642 inline std::string getString ( std::map<Key,Element>* m )
    643 {
    644  std::string name = "std::map<Element>:";
    645  return name + getString<size_t>(m->size());
    646 }
    647 
    648 
    649 template<typename Key, typename Element>
    650 inline Hurricane::Record* getRecord ( std::map<Key,Element>* m )
    651 {
    652  Hurricane::Record* record = NULL;
    653  if ( !m->empty() ) {
    654  record = new Hurricane::Record ( "std::map<Element>" );
    655  typename std::map<Key,Element>::iterator iterator = m->begin();
    656  while ( iterator != m->end() ) {
    657  record->add ( getSlot<Element>(getString(iterator->first), iterator->second) );
    658  ++iterator;
    659  }
    660  }
    661  return record;
    662 }
    663 
    664 
    665 template<typename Key, typename Element>
    666 inline std::string getString ( const std::map<Key,Element>* m )
    667 {
    668  std::string name = "const std::map<Element>:";
    669  return name + getString<size_t>(m->size());
    670 }
    671 
    672 
    673 template<typename Key, typename Element>
    674 inline Hurricane::Record* getRecord ( const std::map<Key,Element>* m )
    675 {
    676  Hurricane::Record* record = NULL;
    677  if ( !m->empty() ) {
    678  record = new Hurricane::Record ( "const std::map<Element>" );
    679  typename std::map<Key,Element>::const_iterator iterator = m->begin();
    680  while ( iterator != m->end() ) {
    681  record->add ( getSlot<const Element>(getString(iterator->first), iterator->second) );
    682  ++iterator;
    683  }
    684  }
    685  return record;
    686 }
    687 
    688 
    689 // -------------------------------------------------------------------
    690 // Inspector Support for : "[const] std::map<Key,Element,Compare>*.
    691 
    692 
    693 template<typename Key, typename Element, typename Compare>
    694 inline std::string getString ( std::map<Key,Element,Compare>* m )
    695 {
    696  std::string name = "std::map<Element>:";
    697  return name + getString<size_t>(m->size());
    698 }
    699 
    700 
    701 template<typename Key, typename Element, typename Compare>
    702 inline Hurricane::Record* getRecord ( std::map<Key,Element,Compare>* m )
    703 {
    704  Hurricane::Record* record = NULL;
    705  if ( !m->empty() ) {
    706  record = new Hurricane::Record ( "std::map<Element>" );
    707  typename std::map<Key,Element,Compare>::iterator iterator = m->begin();
    708  while ( iterator != m->end() ) {
    709  record->add ( getSlot<Element>(getString(iterator->first), iterator->second) );
    710  ++iterator;
    711  }
    712  }
    713  return record;
    714 }
    715 
    716 
    717 template<typename Key, typename Element, typename Compare>
    718 inline std::string getString ( const std::map<Key,Element,Compare>* m )
    719 {
    720  std::string name = "const std::map<Element>:";
    721  return name + getString<size_t>(m->size());
    722 }
    723 
    724 
    725 template<typename Key, typename Element, typename Compare>
    726 inline Hurricane::Record* getRecord ( const std::map<Key,Element,Compare>* m )
    727 {
    728  Hurricane::Record* record = NULL;
    729  if ( !m->empty() ) {
    730  record = new Hurricane::Record ( "const std::map<Element>" );
    731  typename std::map<Key,Element,Compare>::const_iterator iterator = m->begin();
    732  while ( iterator != m->end() ) {
    733  record->add ( getSlot<const Element>(getString(iterator->first), iterator->second) );
    734  ++iterator;
    735  }
    736  }
    737  return record;
    738 }
    739 
    740 
    741 // -------------------------------------------------------------------
    742 // Inspector Support for : "const std::multimap<Key,Element,Compare>*".
    743 
    744 
    745 template<typename Key, typename Element, typename Compare>
    746 inline std::string getString ( const std::multimap<Key,Element,Compare>* m )
    747 {
    748  std::string name = "const std::multimap<Element>:";
    749  return name + getString<size_t>(m->size());
    750 }
    751 
    752 
    753 template<typename Key, typename Element, typename Compare>
    754 inline Hurricane::Record* getRecord ( const std::multimap<Key,Element,Compare>* m )
    755 {
    756  Hurricane::Record* record = NULL;
    757  if ( !m->empty() ) {
    758  record = new Hurricane::Record ( "const std::multimap<Element>" );
    759  typename std::multimap<Key,Element,Compare>::const_iterator iterator = m->begin();
    760  while ( iterator != m->end() ) {
    761  record->add ( getSlot<const Element>(getString(iterator->first), iterator->second) );
    762  ++iterator;
    763  }
    764  }
    765  return record;
    766 }
    767 
    768 
    769 template<typename Key, typename Element, typename Compare>
    770 inline std::string getString ( std::multimap<Key,Element,Compare>* m )
    771 {
    772  std::string name = "std::multimap<Element>:";
    773  return name + getString<size_t>(m->size());
    774 }
    775 
    776 
    777 template<typename Key, typename Element, typename Compare>
    778 inline Hurricane::Record* getRecord ( std::multimap<Key,Element,Compare>* m )
    779 {
    780  Hurricane::Record* record = NULL;
    781  if ( !m->empty() ) {
    782  record = new Hurricane::Record ( "std::multimap<Element>" );
    783  typename std::multimap<Key,Element,Compare>::iterator iterator = m->begin();
    784  while ( iterator != m->end() ) {
    785  record->add ( getSlot<Element>(getString(iterator->first), iterator->second) );
    786  ++iterator;
    787  }
    788  }
    789  return record;
    790 }
    791 
    792 
    793 // -------------------------------------------------------------------
    794 // Inspector Support for : "[const] std::set<Element,Compare>*".
    795 
    796 
    797 template<typename Element, typename Compare>
    798 inline std::string getString ( const std::set<Element,Compare>* s )
    799 {
    800  std::string name = "const std::set<Element>:";
    801  return name + getString<size_t>(s->size());
    802 }
    803 
    804 
    805 template<typename Element, typename Compare>
    806 inline Hurricane::Record* getRecord ( const std::set<Element,Compare>* s )
    807 {
    808  Hurricane::Record* record = NULL;
    809  if ( !s->empty() ) {
    810  record = new Hurricane::Record ( "const std::set<Element>" );
    811  unsigned n = 1;
    812  typename std::set<Element,Compare>::const_iterator iterator = s->begin();
    813  while ( iterator != s->end() ) {
    814  record->add ( getSlot<const Element>(getString(n++), *iterator) );
    815  ++iterator;
    816  }
    817  }
    818  return record;
    819 }
    820 
    821 
    822 template< typename Element, typename Compare, typename Allocator >
    823 inline std::string getString ( std::set<Element,Compare,Allocator>* s )
    824 {
    825  std::string name = "std::set<Element>:";
    826  return name + getString<size_t>(s->size());
    827 }
    828 
    829 
    830 template< typename Element, typename Compare, typename Allocator >
    831 inline Hurricane::Record* getRecord ( std::set<Element,Compare,Allocator>* s )
    832 {
    833  Hurricane::Record* record = NULL;
    834  if (not s->empty()) {
    835  record = new Hurricane::Record ( "std::set<Element>" );
    836  unsigned n = 1;
    837  typename std::set<Element,Compare,Allocator>::iterator iterator = s->begin();
    838  while ( iterator != s->end() ) {
    839  record->add( getSlot<Element>(getString(n++), *iterator) );
    840  ++iterator;
    841  }
    842  }
    843  return record;
    844 }
    845 
    846 // -------------------------------------------------------------------
    847 // Inspector Support for : "[const] std::set<Element,Compare>&".
    848 
    849 
    850 template<typename Element, typename Compare>
    851 inline std::string getString ( const std::set<Element,Compare>& s )
    852 {
    853  std::string name = "const std::set<Element>:";
    854  return name + getString<size_t>(s.size());
    855 }
    856 
    857 
    858 template<typename Element, typename Compare>
    859 inline Hurricane::Record* getRecord ( const std::set<Element,Compare>& s )
    860 {
    861  Hurricane::Record* record = NULL;
    862  if ( !s.empty() ) {
    863  record = new Hurricane::Record ( "const std::set<Element>" );
    864  unsigned n = 1;
    865  typename std::set<Element,Compare>::const_iterator iterator = s.begin();
    866  while ( iterator != s.end() ) {
    867  record->add ( getSlot<Element>(getString(n++), *iterator) );
    868  ++iterator;
    869  }
    870  }
    871  return record;
    872 }
    873 
    874 // -------------------------------------------------------------------
    875 // Inspector Support for : "const std::multiset<Element,Compare>*".
    876 
    877 
    878 template<typename Element, typename Compare>
    879 inline std::string getString ( const std::multiset<Element,Compare>* s )
    880 {
    881  std::string name = "std::multiset<Element>:";
    882  return name + getString<size_t>(s->size());
    883 }
    884 
    885 
    886 template<typename Element, typename Compare>
    887 inline Hurricane::Record* getRecord ( const std::multiset<Element,Compare>* s )
    888 {
    889  Hurricane::Record* record = NULL;
    890  if ( !s->empty() ) {
    891  record = new Hurricane::Record ( "std::multiset<Element>" );
    892  unsigned n = 1;
    893  typename std::multiset<Element,Compare>::const_iterator iterator = s->begin();
    894  while ( iterator != s->end() ) {
    895  record->add ( getSlot<Element>(getString(n++), *iterator) );
    896  ++iterator;
    897  }
    898  }
    899  return record;
    900 }
    901 
    902 
    903 # define GETSTRING_POINTER_SUPPORT(Data) \
    904  template<> inline std::string getString<Data*>( Data* data ) \
    905  { \
    906  if (!data) return "NULL [" #Data "]"; \
    907  return data->_getString(); \
    908  } \
    909  \
    910  template<> inline std::string getString<const Data*>( const Data* data ) \
    911  { if (!data) return "NULL [const " #Data "]"; return data->_getString(); }
    912 
    913 
    914 # define IOSTREAM_POINTER_SUPPORT(Data) \
    915  inline std::ostream& operator<< ( std::ostream& o, Data* d ) \
    916  { \
    917  if (!d) return o << "NULL [" #Data "]"; \
    918  return o << "&" << getString<const Data*>(d); \
    919  } \
    920  inline std::ostream& operator<< ( std::ostream& o, const Data* d ) \
    921  { \
    922  if (!d) return o << "NULL [const " #Data "]"; \
    923  return o << "&" << getString<const Data*>(d); \
    924  } \
    925 
    926 
    927 # define GETRECORD_POINTER_SUPPORT(Data) \
    928  template<> inline Hurricane::Record* getRecord<Data*>( Data* data ) \
    929  { if (!data) return NULL; return data->_getRecord(); } \
    930  \
    931  template<> inline Hurricane::Record* getRecord<const Data*>( const Data* data ) \
    932  { if (!data) return NULL; return data->_getRecord(); }
    933 
    934 
    935 # define GETSTRING_REFERENCE_SUPPORT(Data) \
    936  template<> inline std::string getString<Data&>( Data& data ) \
    937  { return data._getString(); } \
    938  \
    939  template<> inline std::string getString<const Data&>( const Data& data ) \
    940  { return data._getString(); }
    941 
    942 
    943 # define IOSTREAM_REFERENCE_SUPPORT(Data) \
    944  inline std::ostream& operator<< ( std::ostream& o, Data& d ) \
    945  { return o << getString<Data&>(d); } \
    946  \
    947  inline std::ostream& operator<< ( std::ostream& o, const Data& d ) \
    948  { return o << getString<const Data&>(d); } \
    949  \
    950 
    951 # define GETRECORD_REFERENCE_SUPPORT(Data) \
    952  template<> inline Hurricane::Record* getRecord<Data&>( Data& data ) \
    953  { return data._getRecord(); } \
    954  \
    955  template<> inline Hurricane::Record* getRecord<const Data&>( const Data& data ) \
    956  { return data._getRecord(); }
    957 
    958 
    959 # define GETSTRING_VALUE_SUPPORT(Data) \
    960  template<> inline std::string getString<Data>( Data data ) \
    961  { return data._getString(); }
    962 
    963 
    964 # define IOSTREAM_VALUE_SUPPORT(Data) \
    965  inline std::ostream& operator<< ( std::ostream& o, Data d ) \
    966  { return o << getString<Data>(d); }
    967 
    968 
    969 # define GETRECORD_VALUE_SUPPORT(Data) \
    970  template<> inline Hurricane::Record* getRecord<Data>( Data data ) \
    971  { return data._getRecord(); }
    972 
    973 
    974 # define INSPECTOR_P_SUPPORT(Data) \
    975  GETRECORD_POINTER_SUPPORT(Data) \
    976  GETSTRING_POINTER_SUPPORT(Data) \
    977  IOSTREAM_POINTER_SUPPORT(Data)
    978 
    979 
    980 # define INSPECTOR_R_SUPPORT(Data) \
    981  GETRECORD_REFERENCE_SUPPORT(Data) \
    982  GETSTRING_REFERENCE_SUPPORT(Data) \
    983  IOSTREAM_REFERENCE_SUPPORT(Data)
    984 
    985 
    986 # define INSPECTOR_PR_SUPPORT(Data) \
    987  GETSTRING_POINTER_SUPPORT(Data) \
    988  GETSTRING_REFERENCE_SUPPORT(Data) \
    989  GETSTRING_VALUE_SUPPORT(Data) \
    990  IOSTREAM_POINTER_SUPPORT(Data) \
    991  IOSTREAM_REFERENCE_SUPPORT(Data) \
    992  GETRECORD_POINTER_SUPPORT(Data) \
    993  GETRECORD_REFERENCE_SUPPORT(Data)
    994 
    995 
    996 #include "hurricane/Tabulation.h"
    997 
    998 
    999 // -------------------------------------------------------------------
    1000 // Class : "::cdebug()".
    1001 //
    1002 // Wrapper around the STL ostream which to print debugging messages.
    1003 
    1004 class tstream : public std::ostream {
    1005  public:
    1006  inline int getMinLevel () const;
    1007  inline int getMaxLevel () const;
    1008  inline int setMinLevel ( int );
    1009  inline int setMaxLevel ( int );
    1010  inline int getLevel () const;
    1011  inline int setLevel ( int );
    1012  inline bool enabled () const;
    1013  inline bool enabled ( int ) const;
    1014  inline tstream& log ( int level, int count=0 );
    1015  inline tstream& tabw ( int level, int count );
    1016  inline tstream ( std::ostream & );
    1017  inline tstream& put ( char c );
    1018  inline tstream& flush ();
    1019  private:
    1020  inline tstream& _tab ();
    1021  inline tstream& _tabw ( int count );
    1022  public:
    1023  // Overload for manipulators.
    1024  inline tstream& operator<< ( std::ostream& (*pf)(std::ostream &) );
    1025  private:
    1026  int _minLevel;
    1027  int _maxLevel;
    1028  int _level;
    1029  Hurricane::Tabulation _tabulation;
    1030 };
    1031 
    1032 
    1033 inline tstream::tstream ( std::ostream& s )
    1034  : std::ostream(s.rdbuf())
    1035  , _minLevel (100000)
    1036  , _maxLevel (0)
    1037  , _level (0)
    1038  , _tabulation(" ")
    1039 { }
    1040 
    1041 inline int tstream::getMinLevel () const { return _minLevel; }
    1042 inline int tstream::getMaxLevel () const { return _maxLevel; }
    1043 inline int tstream::setMinLevel ( int l ) { int pl=_minLevel; _minLevel=l; return pl; }
    1044 inline int tstream::setMaxLevel ( int l ) { int pl=_maxLevel; _maxLevel=l; return pl; }
    1045 inline int tstream::getLevel () const { return _level; }
    1046 inline int tstream::setLevel ( int l ) { int pl=_level; _level=l; return pl; }
    1047 inline bool tstream::enabled () const { return (_level >= _minLevel) and (_level < _maxLevel); }
    1048 inline bool tstream::enabled ( int l ) const { return (l >= _minLevel) and (l < _maxLevel); }
    1049 inline tstream& tstream::tabw ( int level, int count ) { setLevel(level); return _tabw(count); }
    1050 inline tstream& tstream::put ( char c ) { if (enabled()) static_cast<std::ostream*>(this)->put(c); return *this; }
    1051 inline tstream& tstream::flush () { if (enabled()) static_cast<std::ostream*>(this)->flush(); return *this; }
    1052 inline tstream& tstream::operator<< ( std::ostream& (*pf)(std::ostream&) ) { if (enabled()) (*pf)(*this); return *this; }
    1053 
    1054 
    1055 inline tstream& tstream::_tab () { if (enabled()) (*this) << _tabulation; return *this; }
    1056 inline tstream& tstream::_tabw ( int count )
    1057 {
    1058  if (enabled()) {
    1059  if (count > 0) while(count--) _tabulation++;
    1060  else if (count < 0) while(count++) _tabulation--;
    1061  }
    1062  return *this;
    1063 }
    1064 
    1065 inline tstream& tstream::log ( int level, int count )
    1066 { setLevel(level); _tab(); return _tabw(count); }
    1067 
    1068 // For STL Types.
    1069 inline tstream& operator<< ( tstream& o, const std::string s )
    1070 { if (o.enabled()) { static_cast<std::ostream&>(o) << s; } return o; };
    1071 
    1072 // For POD Types.
    1073 // template<typename T>
    1074 // inline tstream& operator<< ( tstream& o, T& t )
    1075 // { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<T&>(t); } return o; };
    1076 
    1077 template<typename T>
    1078 inline tstream& operator<< ( tstream& o, T* t )
    1079 { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<T*>(t); } return o; };
    1080 
    1081 // template<typename T>
    1082 // inline tstream& operator<< ( tstream& o, const T& t )
    1083 // { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<const T&>(t); } return o; };
    1084 
    1085 template<typename T>
    1086 inline tstream& operator<< ( tstream& o, T t )
    1087 { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<T>(t); } return o; };
    1088 
    1089 template<typename T>
    1090 inline tstream& operator<< ( tstream& o, const T* t )
    1091 { if (o.enabled()) { static_cast<std::ostream&>(o) << getString<const T*>(t); } return o; };
    1092 
    1093 template<>
    1094 inline tstream& operator<< ( tstream& o, std::ios_base& (*pf)(std::ios_base&) )
    1095 { if (o.enabled()) { static_cast<std::ostream&>(o) << pf; } return o; };
    1096 
    1097 struct _Tsetw { int n_; };
    1098 inline _Tsetw tsetw ( int n ) { return { n }; }
    1099 
    1100 struct _Tsetf { int n_; };
    1101 inline _Tsetf tsetf ( int n ) { return { n }; }
    1102 
    1103 template<>
    1104 inline tstream& operator<< ( tstream& o, _Tsetw manip )
    1105 { if (o.enabled()) { static_cast<std::ostream&>(o) << std::setw(manip.n_); } return o; }
    1106 
    1107 extern tstream cdebug;
    1108 
    1109 
    1110 #define cdebug_log(level,indent) if (cdebug.enabled(level)) cdebug.log(level,indent)
    1111 #define cdebug_tabw(level,indent) cdebug.tabw(level,indent)
    1112 
    1113 
    1114 // x-----------------------------------------------------------------x
    1115 // | Classes Neededs in All Hurricane Modules |
    1116 // x-----------------------------------------------------------------x
    1117 
    1118 #include "hurricane/Slot.h"
    1119 #include "hurricane/Initializer.h"
    1120 #include "hurricane/JsonWriter.h"
    1121 #include "hurricane/JsonObject.h"
    int getLevel() const
    Definition: Commons.h:1045
    Definition: JsonObject.h:213
    string demangle(const char *symbol)
    int setMaxLevel(int)
    Definition: Commons.h:1044
    @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Component_8h_source.html b/hurricane/doc/hurricane/html/Component_8h_source.html index b81896e3..68ad3c38 100644 --- a/hurricane/doc/hurricane/html/Component_8h_source.html +++ b/hurricane/doc/hurricane/html/Component_8h_source.html @@ -44,7 +44,7 @@ $(function() {
    Component.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Component.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 
    21 #ifndef HURRICANE_COMPONENT_H
    22 #define HURRICANE_COMPONENT_H
    23 
    24 #include "hurricane/Points.h"
    25 #include "hurricane/Go.h"
    26 #include "hurricane/Components.h"
    27 #include "hurricane/Hook.h"
    28 #include "hurricane/Hooks.h"
    29 #include "hurricane/Interval.h"
    30 
    31 
    32 namespace Hurricane {
    33 
    34  class Net;
    35  class Rubber;
    36  class Layer;
    37 
    38 
    39 // -------------------------------------------------------------------
    40 // Class : "Component".
    41 
    42  class Component : public Go {
    43  public:
    44  typedef Go Inherit;
    45 
    46  public:
    47  class Points_Contour : public PointHC {
    48  public:
    49  class Locator : public PointHL {
    50  public:
    51  Locator ( const Component* );
    52  inline Locator ( const Locator& );
    53  virtual Point getElement () const;
    54  virtual PointHL* getClone () const;
    55  virtual bool isValid () const;
    56  virtual void progress ();
    57  virtual string _getString () const;
    58  protected:
    59  const Component* _component;
    60  size_t _iPoint;
    61  };
    62  public:
    63  inline Points_Contour ( const Component* );
    64  inline Points_Contour ( const Points_Contour& );
    65  virtual PointHC* getClone () const;
    66  virtual PointHL* getLocator () const;
    67  virtual string _getString () const;
    68  protected:
    69  const Component* _component;
    70  };
    71 
    72  public:
    73  class BodyHook : public Hook {
    74  friend class Component;
    75  public:
    76  typedef Hook Inherit;
    77  public:
    78  virtual Component* getComponent () const;
    79  virtual bool isMaster () const {return true;};
    80  virtual string _getTypeName () const { return "Component::BodyHook"; };
    81  virtual string _getString () const;
    82  static Hook* _compToHook ( Component* );
    83  private:
    84  BodyHook ( Component* );
    85  };
    86 
    87  protected:
    88  Component ( Net* , bool inPlugCreate = false );
    89  public:
    90  // Accessors.
    91  virtual bool isManhattanized () const;
    92  virtual bool isNonRectangle () const;
    93  virtual Cell* getCell () const;
    94  Net* getNet () const { return _net; };
    95  Rubber* getRubber () const { return _rubber; };
    96  Hook* getBodyHook () { return &_bodyHook; };
    97  virtual Hooks getHooks () const;
    98  virtual DbU::Unit getX () const = 0;
    99  virtual DbU::Unit getY () const = 0;
    100  virtual Point getPosition () const { return Point( getX(), getY() ); };
    101  virtual Point getCenter () const { return getPosition(); };
    102  virtual const Layer* getLayer () const = 0;
    103  virtual size_t getPointsSize () const;
    104  virtual Point getPoint ( size_t ) const;
    105  virtual Box getBoundingBox () const = 0;
    106  virtual Box getBoundingBox ( const BasicLayer* ) const = 0;
    107  inline Points getContour () const;
    108  virtual Points getMContour () const;
    111  // Mutators.
    112  virtual void materialize ();
    113  virtual void unmaterialize ();
    114  virtual void invalidate ( bool propagateFlag = true );
    115  virtual void forceId ( unsigned int id );
    116  // Filters
    117  static ComponentFilter getIsUnderFilter ( const Box& area );
    118  // Others
    119  protected:
    120  virtual void _postCreate ();
    121  virtual void _preDestroy ();
    122  public:
    123  virtual void _toJson ( JsonWriter* ) const;
    124  virtual void _toJsonSignature ( JsonWriter* ) const;
    125  virtual string _getString () const;
    126  virtual Record* _getRecord () const;
    127  Component* _getNextOfNetComponentSet () const {return _nextOfNetComponentSet;};
    128  void _setNet ( Net* );
    129  void _setRubber ( Rubber* );
    130  void _setNextOfNetComponentSet ( Component* component ) { _nextOfNetComponentSet = component; };
    131  private:
    132  Net* _net;
    133  Rubber* _rubber;
    134  BodyHook _bodyHook;
    135  Component* _nextOfNetComponentSet;
    136  };
    137 
    138 
    139  inline Points Component::getContour () const { return Points_Contour(this); }
    140 
    141 
    142  inline Component::Points_Contour::Locator::Locator ( const Locator &locator )
    143  : PointHL ()
    144  , _component(locator._component)
    145  , _iPoint (locator._iPoint)
    146  { }
    147 
    148 
    149  inline Component::Points_Contour::Points_Contour ( const Component* component )
    150  : PointHC ()
    151  , _component(component)
    152  { }
    153 
    154 
    155  inline Component::Points_Contour::Points_Contour ( const Points_Contour& other )
    156  : PointHC ()
    157  , _component(other._component)
    158  { }
    159 
    160 
    161  double getArea ( Component* component );
    162 
    163 
    164 // -------------------------------------------------------------------
    165 // Class : "JsonComponent".
    166 
    167  class JsonComponent : public JsonEntity {
    168  public:
    169  JsonComponent ( unsigned long flags );
    170  };
    171 
    172 
    173 } // Hurricane namespace.
    174 
    175 
    176 INSPECTOR_P_SUPPORT(Hurricane::Component);
    177 INSPECTOR_P_SUPPORT(Hurricane::Component::BodyHook);
    178 
    179 
    180 #endif // HURRICANE_COMPONENT_H
    181 
    182 // ****************************************************************************************************
    183 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    184 // ****************************************************************************************************
    Go description (API)
    Definition: Go.h:36
    +
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Component.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 
    21 #ifndef HURRICANE_COMPONENT_H
    22 #define HURRICANE_COMPONENT_H
    23 
    24 #include "hurricane/Points.h"
    25 #include "hurricane/Go.h"
    26 #include "hurricane/Components.h"
    27 #include "hurricane/Hook.h"
    28 #include "hurricane/Hooks.h"
    29 #include "hurricane/Interval.h"
    30 
    31 
    32 namespace Hurricane {
    33 
    34  class Net;
    35  class Rubber;
    36  class Layer;
    37 
    38 
    39 // -------------------------------------------------------------------
    40 // Class : "Component".
    41 
    42  class Component : public Go {
    43  public:
    44  typedef Go Inherit;
    45 
    46  public:
    47  class Points_Contour : public PointHC {
    48  public:
    49  class Locator : public PointHL {
    50  public:
    51  Locator ( const Component* );
    52  inline Locator ( const Locator& );
    53  virtual Point getElement () const;
    54  virtual PointHL* getClone () const;
    55  virtual bool isValid () const;
    56  virtual void progress ();
    57  virtual string _getString () const;
    58  protected:
    59  const Component* _component;
    60  size_t _iPoint;
    61  };
    62  public:
    63  inline Points_Contour ( const Component* );
    64  inline Points_Contour ( const Points_Contour& );
    65  virtual PointHC* getClone () const;
    66  virtual PointHL* getLocator () const;
    67  virtual string _getString () const;
    68  protected:
    69  const Component* _component;
    70  };
    71 
    72  public:
    73  class BodyHook : public Hook {
    74  friend class Component;
    75  public:
    76  typedef Hook Inherit;
    77  public:
    78  virtual Component* getComponent () const;
    79  virtual bool isMaster () const {return true;};
    80  virtual string _getTypeName () const { return "Component::BodyHook"; };
    81  virtual string _getString () const;
    82  static Hook* _compToHook ( Component* );
    83  private:
    84  BodyHook ( Component* );
    85  };
    86 
    87  protected:
    88  Component ( Net* , bool inPlugCreate = false );
    89  public:
    90  // Accessors.
    91  virtual bool isManhattanized () const;
    92  virtual bool isNonRectangle () const;
    93  virtual Cell* getCell () const;
    94  Net* getNet () const { return _net; };
    95  Rubber* getRubber () const { return _rubber; };
    96  Hook* getBodyHook () { return &_bodyHook; };
    97  virtual Hooks getHooks () const;
    98  virtual DbU::Unit getX () const = 0;
    99  virtual DbU::Unit getY () const = 0;
    100  virtual Point getPosition () const { return Point( getX(), getY() ); };
    101  virtual Point getCenter () const { return getPosition(); };
    102  virtual const Layer* getLayer () const = 0;
    103  virtual size_t getPointsSize () const;
    104  virtual Point getPoint ( size_t ) const;
    105  virtual Box getBoundingBox () const = 0;
    106  virtual Box getBoundingBox ( const BasicLayer* ) const = 0;
    107  inline Points getContour () const;
    108  virtual Points getMContour () const;
    111  // Mutators.
    112  virtual void materialize ();
    113  virtual void unmaterialize ();
    114  virtual void invalidate ( bool propagateFlag = true );
    115  virtual void forceId ( unsigned int id );
    116  // Filters
    117  static ComponentFilter getIsUnderFilter ( const Box& area );
    118  // Others
    119  protected:
    120  virtual void _postCreate ();
    121  virtual void _preDestroy ();
    122  public:
    123  virtual void _toJson ( JsonWriter* ) const;
    124  virtual void _toJsonSignature ( JsonWriter* ) const;
    125  virtual string _getString () const;
    126  virtual Record* _getRecord () const;
    127  Component* _getNextOfNetComponentSet () const {return _nextOfNetComponentSet;};
    128  void _setNet ( Net* );
    129  void _setRubber ( Rubber* );
    130  void _setNextOfNetComponentSet ( Component* component ) { _nextOfNetComponentSet = component; };
    131  private:
    132  Net* _net;
    133  Rubber* _rubber;
    134  BodyHook _bodyHook;
    135  Component* _nextOfNetComponentSet;
    136  };
    137 
    138 
    139  inline Points Component::getContour () const { return Points_Contour(this); }
    140 
    141 
    142  inline Component::Points_Contour::Locator::Locator ( const Locator &locator )
    143  : PointHL ()
    144  , _component(locator._component)
    145  , _iPoint (locator._iPoint)
    146  { }
    147 
    148 
    149  inline Component::Points_Contour::Points_Contour ( const Component* component )
    150  : PointHC ()
    151  , _component(component)
    152  { }
    153 
    154 
    155  inline Component::Points_Contour::Points_Contour ( const Points_Contour& other )
    156  : PointHC ()
    157  , _component(other._component)
    158  { }
    159 
    160 
    161  double getArea ( Component* component );
    162 
    163 
    164 // -------------------------------------------------------------------
    165 // Class : "JsonComponent".
    166 
    167  class JsonComponent : public JsonEntity {
    168  public:
    169  JsonComponent ( unsigned long flags );
    170  };
    171 
    172 
    173 } // Hurricane namespace.
    174 
    175 
    176 INSPECTOR_P_SUPPORT(Hurricane::Component);
    177 INSPECTOR_P_SUPPORT(Hurricane::Component::BodyHook);
    178 
    179 
    180 #endif // HURRICANE_COMPONENT_H
    181 
    182 // ****************************************************************************************************
    183 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    184 // ****************************************************************************************************
    Go description (API)
    Definition: Go.h:34
    Collection description (API)
    Definition: Collection.h:39
    Net * getNet() const
    Definition: Component.h:94
    virtual Hooks getHooks() const
    @@ -53,13 +53,13 @@ $(function() {
    virtual DbU::Unit getX() const =0
    Components getConnexComponents() const
    virtual const Layer * getLayer() const =0
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    Components getSlaveComponents() const
    -
    The model (API).
    Definition: Cell.h:66
    +
    The model (API).
    Definition: Cell.h:64
    Point description (API)
    Definition: Point.h:32
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    virtual DbU::Unit getY() const =0
    -
    Hook description (API)
    Definition: Hook.h:36
    +
    Hook description (API)
    Definition: Hook.h:34
    Locator description (API)
    Definition: Locator.h:33
    static ComponentFilter getIsUnderFilter(const Box &area)
    Go Inherit
    Definition: Component.h:44
    @@ -76,7 +76,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Components_8h_source.html b/hurricane/doc/hurricane/html/Components_8h_source.html index 143a4041..8568564d 100644 --- a/hurricane/doc/hurricane/html/Components_8h_source.html +++ b/hurricane/doc/hurricane/html/Components_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/ContactLayer_8h_source.html b/hurricane/doc/hurricane/html/ContactLayer_8h_source.html index a75159fd..039be0fc 100644 --- a/hurricane/doc/hurricane/html/ContactLayer_8h_source.html +++ b/hurricane/doc/hurricane/html/ContactLayer_8h_source.html @@ -47,9 +47,9 @@ $(function() {
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Jean-Paul Chaput |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/ContactLayer.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #ifndef HURRICANE_CONTACT_LAYER_H
    33 #define HURRICANE_CONTACT_LAYER_H
    34 
    35 #include <vector>
    36 
    37 #include "hurricane/Layer.h"
    38 
    39 
    40 namespace Hurricane {
    41 
    42 
    43 // -------------------------------------------------------------------
    44 // Class : "Hurricane::ContactLayer".
    45 
    46  class ContactLayer : public Layer {
    47  public:
    48  typedef Layer Super;
    49 
    50  public:
    51  // Constructor.
    52  static ContactLayer* create ( Technology* technology
    53  , const Name& name
    54  , BasicLayer* metalLayer
    55  , BasicLayer* cutLayer
    56  , BasicLayer* activeLayer
    57  , BasicLayer* diffusionLayer
    58  , BasicLayer* wellLayer
    59  );
    60  // Accessors.
    61  virtual BasicLayers getBasicLayers () const;
    62  virtual DbU::Unit getEnclosure ( uint32_t flags ) const;
    63  virtual DbU::Unit getEnclosure ( const BasicLayer* layer, uint32_t flags ) const;
    64  // Updators.
    65  virtual void setEnclosure ( const BasicLayer* layer, DbU::Unit enclosure, uint32_t flags );
    66  // Hurricane Managment.
    67  virtual void _toJson ( JsonWriter* ) const;
    68  virtual void _onDbuChange ( float scale );
    69  virtual string _getTypeName () const;
    70  virtual string _getString () const;
    71  virtual Record* _getRecord () const;
    72 
    73  private:
    74  // Internal: Attributes
    75  vector<BasicLayer*> _basicLayers;
    76  vector< pair<DbU::Unit,DbU::Unit> > _enclosures;
    77  DbU::Unit _maximalEnclosure;
    78 
    79  protected:
    80  ContactLayer ( Technology* technology
    81  , const Name& name
    82  , BasicLayer* metalLayer
    83  , BasicLayer* cutLayer
    84  , BasicLayer* activeLayer
    85  , BasicLayer* diffusionLayer
    86  , BasicLayer* wellLayer
    87  );
    88  };
    89 
    90 
    91 // -------------------------------------------------------------------
    92 // Class : "Hurricane::JsonContactLayer".
    93 
    94  class JsonContactLayer : public JsonLayer {
    95  public:
    96  static void initialize ();
    97  JsonContactLayer ( unsigned long flags );
    98  ~JsonContactLayer ();
    99  virtual string getTypeName () const;
    100  virtual JsonContactLayer* clone ( unsigned long ) const;
    101  virtual void toData ( JsonStack& );
    102  };
    103 
    104 
    105 } // End of Hurricane namespace.
    106 
    107 
    108 INSPECTOR_P_SUPPORT(Hurricane::ContactLayer);
    109 
    110 
    111 # endif
    BasicLayer description (API)
    Definition: BasicLayer.h:44
    static ContactLayer * create(Technology *technology, const Name &name, BasicLayer *metalLayer, BasicLayer *cutLayer, BasicLayer *activeLayer, BasicLayer *diffusionLayer, BasicLayer *wellLayer)
    Name description (API)
    Definition: Name.h:35
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    ContactLayer description (API)
    Definition: ContactLayer.h:46
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    JSON Parser Stack.
    Definition: JsonObject.h:249
    Layer description (API)
    Definition: Layer.h:52
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    @@ -59,7 +59,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Contact_8h_source.html b/hurricane/doc/hurricane/html/Contact_8h_source.html index 167519b7..8ca56c1f 100644 --- a/hurricane/doc/hurricane/html/Contact_8h_source.html +++ b/hurricane/doc/hurricane/html/Contact_8h_source.html @@ -44,44 +44,44 @@ $(function() {
    Contact.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Contact.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_CONTACT
    21 #define HURRICANE_CONTACT
    22 
    23 #include "hurricane/Component.h"
    24 #include "hurricane/Contacts.h"
    25 
    26 namespace Hurricane {
    27 
    28 
    29 // ****************************************************************************************************
    30 // Contact declaration
    31 // ****************************************************************************************************
    32 
    33 class Contact : public Component {
    34 // *****************************
    35 
    36 // Types
    37 // *****
    38 
    39  public: typedef Component Inherit;
    40 
    41  public: class AnchorHook : public Hook {
    42  // ***********************************
    43 
    44  friend class Contact;
    45 
    46  public: typedef Hook Inherit;
    47 
    48  private: AnchorHook(Contact* contact);
    49 
    50  public: virtual Component* getComponent() const;
    51 
    52  public: virtual bool isMaster() const {return false;};
    53 
    54  public: virtual string _getTypeName() const { return "Contact::AnchorHook"; };
    55  public: virtual string _getString() const;
    56  public: static Hook* _compToHook(Component*);
    57  };
    58 
    59 // Attributes
    60 // **********
    61 
    62  private: AnchorHook _anchorHook;
    63  private: const Layer* _layer;
    64  private: DbU::Unit _dx;
    65  private: DbU::Unit _dy;
    66  protected: DbU::Unit _width;
    67  protected: DbU::Unit _height;
    68 
    69 // Constructors
    70 // ************
    71 
    72  protected: Contact( Net* net
    73  , const Layer* layer
    74  , const DbU::Unit& x
    75  , const DbU::Unit& y
    76  , const DbU::Unit& width = 0
    77  , const DbU::Unit& height = 0
    78  );
    79  protected: Contact( Net* net
    80  , Component* anchor
    81  , const Layer* layer
    82  , const DbU::Unit& dx
    83  , const DbU::Unit& dy
    84  , const DbU::Unit& width = 0
    85  , const DbU::Unit& height = 0
    86  );
    87 
    88  public: static Contact* create( Net* net
    89  , const Layer* layer
    90  , const DbU::Unit& x
    91  , const DbU::Unit& y
    92  , const DbU::Unit& width = 0
    93  , const DbU::Unit& height = 0
    94  );
    95  public: static Contact* create( Component* anchor
    96  , const Layer* layer
    97  , const DbU::Unit& dx
    98  , const DbU::Unit& dy
    99  , const DbU::Unit& width = 0
    100  , const DbU::Unit& height = 0
    101  );
    102 
    103 // Accessors
    104 // *********
    105 
    106  public: virtual Hooks getHooks() const;
    107  public: virtual DbU::Unit getX() const;
    108  public: virtual DbU::Unit getY() const;
    109  public: virtual Point getPosition() const;
    110  public: virtual Box getBoundingBox() const;
    111  public: virtual const Layer* getLayer() const {return _layer;};
    112  public: virtual Box getBoundingBox(const BasicLayer* basicLayer) const;
    113  public: Hook* getAnchorHook() {return &_anchorHook;};
    114  public: Component* getAnchor() const;
    115  public: const DbU::Unit& getDx() const {return _dx;};
    116  public: const DbU::Unit& getDy() const {return _dy;};
    117  public: const DbU::Unit& getWidth() const {return _width;};
    118  public: DbU::Unit getHalfWidth() const {return (_width / 2);};
    119  public: const DbU::Unit& getHeight() const {return _height;};
    120  public: DbU::Unit getHalfHeight() const {return (_height / 2);};
    121 
    122 // Updators
    123 // ********
    124 
    125  public: virtual void translate(const DbU::Unit& dx, const DbU::Unit& dy);
    126 
    127  public: void setLayer(const Layer* layer);
    128  public: void setWidth(const DbU::Unit& width);
    129  public: void setHeight(const DbU::Unit& height);
    130  public: void setSizes(const DbU::Unit& width, const DbU::Unit& height);
    131  public: void setX(const DbU::Unit& x);
    132  public: void setY(const DbU::Unit& y);
    133  public: void setPosition(const DbU::Unit& x, const DbU::Unit& y);
    134  public: void setPosition(const Point& position);
    135  public: void setDx(const DbU::Unit& dx);
    136  public: void setDy(const DbU::Unit& dy);
    137  public: void setOffset(const DbU::Unit& dx, const DbU::Unit& dy);
    138 
    139 // Others
    140 // ******
    141 
    142  protected: virtual void _preDestroy();
    143 
    144  public: virtual void _toJson(JsonWriter*) const;
    145  public: virtual string _getTypeName() const {return _TName("Contact");};
    146  public: virtual string _getString() const;
    147  public: virtual Record* _getRecord() const;
    148 
    149 };
    150 
    151 
    152 class JsonContact : public JsonComponent {
    153 // ***************************************
    154 
    155  public: static void initialize();
    156  public: JsonContact(unsigned long flags);
    157  public: virtual string getTypeName() const;
    158  public: virtual JsonContact* clone(unsigned long) const;
    159  public: virtual void toData(JsonStack&);
    160 };
    161 
    162 } // End of Hurricane namespace.
    163 
    164 
    165 INSPECTOR_P_SUPPORT(Hurricane::Contact);
    166 INSPECTOR_P_SUPPORT(Hurricane::Contact::AnchorHook);
    167 
    168 
    169 #endif // HURRICANE_CONTACT
    170 
    171 
    172 // ****************************************************************************************************
    173 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    174 // ****************************************************************************************************
    DbU::Unit getHalfWidth() const
    Definition: Contact.h:118
    -
    void setX(const DbU::Unit &x)
    +
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2020, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Remy Escassut |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/Commons.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #pragma once
    33 #include "hurricane/Component.h"
    34 #include "hurricane/Contacts.h"
    35 
    36 
    37 namespace Hurricane {
    38 
    39 
    40 // -------------------------------------------------------------------
    41 // Class : "Hurricane::Contact".
    42 
    43  class Contact : public Component {
    44  public:
    45  typedef Component Inherit;
    46  public:
    47  class AnchorHook : public Hook {
    48  friend class Contact;
    49  public:
    50  typedef Hook Inherit;
    51  private:
    52  AnchorHook ( Contact* );
    53  public:
    54  virtual Component* getComponent () const;
    55  virtual bool isMaster () const { return false; };
    56  virtual std::string _getTypeName () const { return "Contact::AnchorHook"; };
    57  virtual std::string _getString () const;
    58  static Hook* _compToHook ( Component* );
    59  };
    60 
    61  protected:
    62  Contact ( Net* net
    63  , const Layer* layer
    64  , DbU::Unit x
    65  , DbU::Unit y
    66  , DbU::Unit width
    67  , DbU::Unit height
    68  );
    69  Contact ( Net* net
    70  , Component* anchor
    71  , const Layer* layer
    72  , DbU::Unit dx
    73  , DbU::Unit dy
    74  , DbU::Unit width
    75  , DbU::Unit height
    76  );
    77  public:
    78  static inline void enableCheckMinSize ();
    79  static inline void disableCheckMinSize ();
    80  static Contact* create ( Net* net
    81  , const Layer* layer
    82  , DbU::Unit x
    83  , DbU::Unit y
    84  , DbU::Unit width =0
    85  , DbU::Unit height=0
    86  );
    87  static Contact* create ( Component* anchor
    88  , const Layer* layer
    89  , DbU::Unit dx
    90  , DbU::Unit dy
    91  , DbU::Unit width =0
    92  , DbU::Unit height=0
    93  );
    94  public:
    95  virtual Hooks getHooks () const;
    96  virtual DbU::Unit getX () const;
    97  virtual DbU::Unit getY () const;
    98  virtual Point getPosition () const;
    99  virtual Box getBoundingBox () const;
    100  virtual const Layer* getLayer () const {return _layer;};
    101  virtual Box getBoundingBox ( const BasicLayer* ) const;
    102  Hook* getAnchorHook () { return &_anchorHook; };
    103  Component* getAnchor () const;
    104  DbU::Unit getDx () const { return _dx; };
    105  DbU::Unit getDy () const { return _dy; };
    106  DbU::Unit getWidth () const { return _width; };
    107  DbU::Unit getHalfWidth () const { return (_width / 2); };
    108  DbU::Unit getHeight () const { return _height; };
    109  DbU::Unit getHalfHeight () const { return (_height / 2); };
    110  public:
    111  virtual void translate ( const DbU::Unit& dx, const DbU::Unit& dy );
    112  void setLayer ( const Layer* );
    113  void setWidth ( DbU::Unit );
    114  void setHeight ( DbU::Unit );
    115  void setSizes ( DbU::Unit width, DbU::Unit height);
    116  void setX ( DbU::Unit );
    117  void setY ( DbU::Unit );
    118  void setPosition ( DbU::Unit x, DbU::Unit y);
    119  void setPosition ( const Point& );
    120  void setDx ( DbU::Unit );
    121  void setDy ( DbU::Unit );
    122  void setOffset ( DbU::Unit dx, DbU::Unit dy);
    123  private:
    124  bool _postCheck ();
    125  protected:
    126  virtual void _preDestroy ();
    127  public:
    128  virtual void _toJson ( JsonWriter* ) const;
    129  virtual std::string _getTypeName () const { return _TName("Contact"); };
    130  virtual std::string _getString () const;
    131  virtual Record* _getRecord () const;
    132  private:
    133  static bool _checkMinSize;
    134  AnchorHook _anchorHook;
    135  const Layer* _layer;
    136  DbU::Unit _dx;
    137  DbU::Unit _dy;
    138  protected:
    139  DbU::Unit _width;
    140  DbU::Unit _height;
    141  };
    142 
    143 
    144  inline void Contact::enableCheckMinSize () { _checkMinSize=true; }
    145  inline void Contact::disableCheckMinSize () { _checkMinSize=false; }
    146 
    147 
    148 // -------------------------------------------------------------------
    149 // Class : "Hurricane::JsonContact".
    150 
    151  class JsonContact : public JsonComponent {
    152  public:
    153  static void initialize ();
    154  JsonContact ( unsigned long flags );
    155  virtual std::string getTypeName () const;
    156  virtual JsonContact* clone ( unsigned long ) const;
    157  virtual void toData ( JsonStack& );
    158  };
    159 
    160 
    161 } // Hurricane namespace.
    162 
    163 
    164 INSPECTOR_P_SUPPORT(Hurricane::Contact);
    165 INSPECTOR_P_SUPPORT(Hurricane::Contact::AnchorHook);
    DbU::Unit getHalfWidth() const
    Definition: Contact.h:107
    BasicLayer description (API)
    Definition: BasicLayer.h:44
    +
    void setSizes(DbU::Unit width, DbU::Unit height)
    +
    void setLayer(const Layer *)
    Component description (API)
    Definition: Component.h:42
    -
    void setDx(const DbU::Unit &dx)
    -
    Contact description (API)
    Definition: Contact.h:33
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    void setWidth(const DbU::Unit &width)
    -
    void setOffset(const DbU::Unit &dx, const DbU::Unit &dy)
    -
    Definition: Contact.h:41
    +
    DbU::Unit getDy() const
    Definition: Contact.h:105
    +
    Contact description (API)
    Definition: Contact.h:43
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    Definition: Contact.h:47
    Point description (API)
    Definition: Point.h:32
    -
    void setY(const DbU::Unit &y)
    -
    DbU::Unit getHalfHeight() const
    Definition: Contact.h:120
    -
    void setSizes(const DbU::Unit &width, const DbU::Unit &height)
    +
    DbU::Unit getHalfHeight() const
    Definition: Contact.h:109
    +
    void setPosition(DbU::Unit x, DbU::Unit y)
    +
    void setHeight(DbU::Unit)
    Component * getAnchor() const
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    -
    Hook description (API)
    Definition: Hook.h:36
    -
    const DbU::Unit & getWidth() const
    Definition: Contact.h:117
    -
    Hook * getAnchorHook()
    Definition: Contact.h:113
    +
    DbU::Unit getDx() const
    Definition: Contact.h:104
    +
    void setDx(DbU::Unit)
    +
    Hook description (API)
    Definition: Hook.h:34
    +
    void setWidth(DbU::Unit)
    +
    Hook * getAnchorHook()
    Definition: Contact.h:102
    Box description (API)
    Definition: Box.h:31
    -
    static Contact * create(Net *net, const Layer *layer, const DbU::Unit &x, const DbU::Unit &y, const DbU::Unit &width=0, const DbU::Unit &height=0)
    +
    void setOffset(DbU::Unit dx, DbU::Unit dy)
    +
    DbU::Unit getWidth() const
    Definition: Contact.h:106
    +
    void setDy(DbU::Unit)
    +
    void setY(DbU::Unit)
    Layer description (API)
    Definition: Layer.h:52
    -
    void setDy(const DbU::Unit &dy)
    -
    const DbU::Unit & getDy() const
    Definition: Contact.h:116
    +
    void setX(DbU::Unit)
    +
    static Contact * create(Net *net, const Layer *layer, DbU::Unit x, DbU::Unit y, DbU::Unit width=0, DbU::Unit height=0)
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    -
    const DbU::Unit & getHeight() const
    Definition: Contact.h:119
    -
    void setLayer(const Layer *layer)
    +
    DbU::Unit getHeight() const
    Definition: Contact.h:108
    Net description (API)
    Definition: Net.h:48
    -
    const DbU::Unit & getDx() const
    Definition: Contact.h:115
    -
    void setPosition(const DbU::Unit &x, const DbU::Unit &y)
    -
    Component Inherit
    Definition: Contact.h:39
    -
    void setHeight(const DbU::Unit &height)
    +
    Component Inherit
    Definition: Contact.h:45


    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Contacts_8h_source.html b/hurricane/doc/hurricane/html/Contacts_8h_source.html index 8382a82c..fec1311f 100644 --- a/hurricane/doc/hurricane/html/Contacts_8h_source.html +++ b/hurricane/doc/hurricane/html/Contacts_8h_source.html @@ -46,7 +46,7 @@ $(function() {
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Contacts.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_CONTACTS
    21 #define HURRICANE_CONTACTS
    22 
    23 #include "hurricane/Collection.h"
    24 
    25 namespace Hurricane {
    26 
    27 class Contact;
    28 
    29 
    30 
    31 // ****************************************************************************************************
    32 // Contacts declaration
    33 // ****************************************************************************************************
    34 
    36 
    37 
    38 
    39 // ****************************************************************************************************
    40 // ContactLocator declaration
    41 // ****************************************************************************************************
    42 
    44 
    45 
    46 
    47 // ****************************************************************************************************
    48 // ContactFilter declaration
    49 // ****************************************************************************************************
    50 
    52 
    53 
    54 
    55 // ****************************************************************************************************
    56 // for_each_contact declaration
    57 // ****************************************************************************************************
    58 
    59 #define for_each_contact(contact, contacts)\
    60 /******************************************/\
    61 {\
    62  ContactLocator _locator = contacts.getLocator();\
    63  while (_locator.isValid()) {\
    64  Contact* contact = _locator.getElement();\
    65  _locator.progress();
    66 
    67 
    68 
    69 } // End of Hurricane namespace.
    70 
    71 #endif // HURRICANE_CONTACTS
    72 
    73 
    74 // ****************************************************************************************************
    75 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    76 // ****************************************************************************************************
    Generic Locator auto-pointer.
    Definition: Locator.h:113
    Generic Filter auto-pointer.
    Definition: Filter.h:27
    -
    Contact description (API)
    Definition: Contact.h:33
    +
    Contact description (API)
    Definition: Contact.h:43
    GenericLocator< Contact * > ContactLocator
    Definition: Contacts.h:43
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    GenericCollection< Contact * > Contacts
    Definition: Contacts.h:27
    @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/DBo_8h_source.html b/hurricane/doc/hurricane/html/DBo_8h_source.html index 6d37d66f..e4f8dc39 100644 --- a/hurricane/doc/hurricane/html/DBo_8h_source.html +++ b/hurricane/doc/hurricane/html/DBo_8h_source.html @@ -44,15 +44,14 @@ $(function() {
    DBo.h
    -
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Remy Escassut |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/DBo.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #ifndef HURRICANE_DBO_H
    33 #define HURRICANE_DBO_H
    34 
    35 #include "hurricane/Error.h"
    36 #include "hurricane/DBos.h"
    37 #include "hurricane/Name.h"
    38 #include "hurricane/Properties.h"
    39 
    40 
    41 namespace Hurricane {
    42 
    43 
    44 // -------------------------------------------------------------------
    45 // Class : "Hurricane::DBo".
    46 
    47  class DBo {
    48  public:
    49  enum DBoFlags { ForcedIdMode = (1<<0)
    50  , NextIdSet = (1<<1)
    51  };
    52  public:
    53  static void setMemoryLimit ( unsigned int );
    54  static void setIdCounterLimit ( unsigned int );
    55  static unsigned int getIdCounter ();
    56  unsigned int getNextId ();
    57  static void setNextId ( unsigned int );
    58  static void resetId ();
    59  static bool inForcedIdMode ();
    60  static void enableForcedIdMode ();
    61  static void disableForcedIdMode ();
    62  static void useIdCounter2 ();
    63  public:
    64  virtual void destroy ();
    65  inline set<Property*>& _getPropertySet ();
    66  void _onDestroyed ( Property* property );
    67  inline unsigned int getId () const;
    68  Property* getProperty ( const Name& ) const;
    69  Properties getProperties () const;
    70  inline bool hasProperty () const;
    71  void setId ( unsigned int );
    72  void put ( Property* );
    73  void remove ( Property* );
    74  void removeProperty ( const Name& );
    75  void clearProperties ();
    76  virtual string _getTypeName () const;
    77  virtual string _getString () const;
    78  virtual Record* _getRecord () const;
    79  virtual void _toJson ( JsonWriter* ) const;
    80  virtual void _toJsonCollections ( JsonWriter* ) const;
    81  virtual void _toJsonSignature ( JsonWriter* ) const;
    82  void toJson ( JsonWriter* ) const;
    83  void toJsonSignature ( JsonWriter* ) const;
    84  protected:
    85  DBo ();
    86  virtual ~DBo () throw(Error);
    87  virtual void _postCreate ();
    88  virtual void _preDestroy ();
    89  private:
    90  DBo ( const DBo& ) = delete;
    91  DBo& operator= ( const DBo& ) = delete;
    92  private:
    93  static unsigned int _memoryLimit;
    94  static unsigned long _flags;
    95  static unsigned int _nextId;
    96  static unsigned int _idCount;
    97  static unsigned int _idCounter;
    98  static unsigned int _idCounterLimit;
    99  unsigned int _id;
    100  mutable set<Property*> _propertySet;
    101  public:
    102  struct CompareById : public std::binary_function<const DBo*,const DBo*,bool> {
    103  template<typename Key>
    104  inline bool operator() ( const Key* lhs, const Key* rhs ) const;
    105  };
    106  };
    107 
    108 
    109 // Inline Functions.
    110  inline set<Property*>& DBo::_getPropertySet () { return _propertySet; }
    111  inline bool DBo::hasProperty () const { return !_propertySet.empty(); }
    112  inline unsigned int DBo::getId () const { return _id; }
    113 
    114  template<typename Key>
    115  inline bool DBo::CompareById::operator() ( const Key* lhs, const Key* rhs ) const
    116  { return ((lhs)?lhs->getId():0) < ((rhs)?rhs->getId():0); }
    117 
    118 
    119 // -------------------------------------------------------------------
    120 // Class : "Hurricane::JsonDBo".
    121 
    122  class JsonDBo : public JsonObject {
    123  public:
    124  JsonDBo ( unsigned int flags );
    125  template<typename T> inline void update ( JsonStack&, T );
    126  };
    127 
    128 
    129  template<typename T> inline void JsonDBo::update ( JsonStack& stack, T hobject )
    130  {
    131  JsonObject::update<T>( stack, hobject );
    132  stack.push_back_dbo( dynamic_cast<DBo*>(hobject) );
    133  }
    134 
    135 
    136 } // Hurricane namespace.
    137 
    138 INSPECTOR_P_SUPPORT(Hurricane::DBo);
    139 
    140 #endif // HURRICANE_DBO_H
    Error description (API)
    Definition: Error.h:43
    -
    void removeProperty(const Name &)
    +
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2021, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Remy Escassut |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/DBo.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #pragma once
    33 #include "hurricane/Error.h"
    34 #include "hurricane/DBos.h"
    35 #include "hurricane/Name.h"
    36 #include "hurricane/Properties.h"
    37 
    38 
    39 namespace Hurricane {
    40 
    41 
    42 // -------------------------------------------------------------------
    43 // Class : "Hurricane::DBo".
    44 
    45  class DBo {
    46  public:
    47  enum DBoFlags { ForcedIdMode = (1<<0)
    48  , NextIdSet = (1<<1)
    49  };
    50  public:
    51  static void setMemoryLimit ( unsigned int );
    52  static void setIdCounterLimit ( unsigned int );
    53  static unsigned int getIdCounter ();
    54  unsigned int getNextId ();
    55  static void setNextId ( unsigned int );
    56  static void resetId ();
    57  static bool inForcedIdMode ();
    58  static void enableForcedIdMode ();
    59  static void disableForcedIdMode ();
    60  static void useIdCounter2 ();
    61  public:
    62  virtual void destroy ();
    63  inline set<Property*>& _getPropertySet ();
    64  void _onDestroyed ( Property* property );
    65  inline unsigned int getId () const;
    66  Property* getProperty ( const Name& ) const;
    67  Properties getProperties () const;
    68  inline bool hasProperty () const;
    69  void setId ( unsigned int );
    70  void put ( Property* );
    71  void remove ( Property* );
    72  void removeProperty ( const Name& );
    73  void clearProperties ();
    74  virtual string _getTypeName () const;
    75  virtual string _getString () const;
    76  virtual Record* _getRecord () const;
    77  virtual void _toJson ( JsonWriter* ) const;
    78  virtual void _toJsonCollections ( JsonWriter* ) const;
    79  virtual void _toJsonSignature ( JsonWriter* ) const;
    80  void toJson ( JsonWriter* ) const;
    81  void toJsonSignature ( JsonWriter* ) const;
    82  protected:
    83  DBo ();
    84  virtual ~DBo () noexcept(false);
    85  virtual void _postCreate ();
    86  virtual void _preDestroy ();
    87  private:
    88  DBo ( const DBo& ) = delete;
    89  DBo& operator= ( const DBo& ) = delete;
    90  private:
    91  static unsigned int _memoryLimit;
    92  static unsigned long _flags;
    93  static unsigned int _nextId;
    94  static unsigned int _idCount;
    95  static unsigned int _idCounter;
    96  static unsigned int _idCounterLimit;
    97  unsigned int _id;
    98  mutable set<Property*> _propertySet;
    99  public:
    100  struct CompareById : public std::binary_function<const DBo*,const DBo*,bool> {
    101  template<typename Key>
    102  inline bool operator() ( const Key* lhs, const Key* rhs ) const;
    103  };
    104  };
    105 
    106 
    107 // Inline Functions.
    108  inline set<Property*>& DBo::_getPropertySet () { return _propertySet; }
    109  inline bool DBo::hasProperty () const { return !_propertySet.empty(); }
    110  inline unsigned int DBo::getId () const { return _id; }
    111 
    112  template<typename Key>
    113  inline bool DBo::CompareById::operator() ( const Key* lhs, const Key* rhs ) const
    114  { return ((lhs)?lhs->getId():0) < ((rhs)?rhs->getId():0); }
    115 
    116 
    117 // -------------------------------------------------------------------
    118 // Class : "Hurricane::JsonDBo".
    119 
    120  class JsonDBo : public JsonObject {
    121  public:
    122  JsonDBo ( unsigned int flags );
    123  template<typename T> inline void update ( JsonStack&, T );
    124  };
    125 
    126 
    127  template<typename T> inline void JsonDBo::update ( JsonStack& stack, T hobject )
    128  {
    129  JsonObject::update<T>( stack, hobject );
    130  stack.push_back_dbo( dynamic_cast<DBo*>(hobject) );
    131  }
    132 
    133 
    134 } // Hurricane namespace.
    135 
    136 INSPECTOR_P_SUPPORT(Hurricane::DBo);
    void removeProperty(const Name &)
    Name description (API)
    Definition: Name.h:35
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    void clearProperties()
    -
    bool hasProperty() const
    Definition: DBo.h:111
    +
    bool hasProperty() const
    Definition: DBo.h:109
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    virtual void destroy()
    -
    Property description (API)
    Definition: Property.h:58
    +
    Property description (API)
    Definition: Property.h:56
    Property * getProperty(const Name &) const
    void put(Property *)
    Properties getProperties() const
    @@ -62,7 +61,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/DBos_8h_source.html b/hurricane/doc/hurricane/html/DBos_8h_source.html index c0b63b0a..ee8dae75 100644 --- a/hurricane/doc/hurricane/html/DBos_8h_source.html +++ b/hurricane/doc/hurricane/html/DBos_8h_source.html @@ -47,7 +47,7 @@ $(function() {
    1 // ****************************************************************************************************
    2 // File: ./hurricane/DBos.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_DBOS
    21 #define HURRICANE_DBOS
    22 
    23 #include "hurricane/Collection.h"
    24 
    25 namespace Hurricane {
    26 
    27 class DBo;
    28 
    29 
    30 
    31 // ****************************************************************************************************
    32 // DBos declaration
    33 // ****************************************************************************************************
    34 
    36 
    37 
    38 
    39 // ****************************************************************************************************
    40 // DBoLocator declaration
    41 // ****************************************************************************************************
    42 
    44 
    45 
    46 
    47 // ****************************************************************************************************
    48 // DBoFilter declaration
    49 // ****************************************************************************************************
    50 
    52 
    53 
    54 
    55 // ****************************************************************************************************
    56 // for_each_dbo declaration
    57 // ****************************************************************************************************
    58 
    59 #define for_each_dbo(dbo, dbos)\
    60 /******************************/\
    61 {\
    62  DBoLocator _locator = dbos.getLocator();\
    63  while (_locator.isValid()) {\
    64  DBo* dbo = _locator.getElement();\
    65  _locator.progress();
    66 
    67 
    68 
    69 } // End of Hurricane namespace.
    70 
    71 #endif // HURRICANE_DBOS
    72 
    73 
    74 // ****************************************************************************************************
    75 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    76 // ****************************************************************************************************
    GenericFilter< DBo * > DBoFilter
    Definition: DBos.h:51
    Generic Locator auto-pointer.
    Definition: Locator.h:113
    Generic Filter auto-pointer.
    Definition: Filter.h:27
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    GenericLocator< DBo * > DBoLocator
    Definition: DBos.h:43
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/DataBase_8h_source.html b/hurricane/doc/hurricane/html/DataBase_8h_source.html index e0c41487..05e0eb1e 100644 --- a/hurricane/doc/hurricane/html/DataBase_8h_source.html +++ b/hurricane/doc/hurricane/html/DataBase_8h_source.html @@ -48,8 +48,8 @@ $(function() {
    Technology * getTechnology() const
    Definition: DataBase.h:85
    Library * getRootLibrary() const
    Definition: DataBase.h:86
    static DataBase * create()
    -
    The model (API).
    Definition: Cell.h:66
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    The model (API).
    Definition: Cell.h:64
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    The whole DataBase (API).
    Definition: DataBase.h:40
    static DataBase * getDB()
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    @@ -59,7 +59,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/DbU_8h_source.html b/hurricane/doc/hurricane/html/DbU_8h_source.html index 94664f45..2cf65c22 100644 --- a/hurricane/doc/hurricane/html/DbU_8h_source.html +++ b/hurricane/doc/hurricane/html/DbU_8h_source.html @@ -44,61 +44,61 @@ $(function() {
    DbU.h
    -
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Remy Escassut |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/DbU.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #ifndef HURRICANE_DBU_H
    33 #define HURRICANE_DBU_H
    34 
    35 
    36 #include <cstdint>
    37 #include <cmath>
    38 #include "hurricane/Commons.h"
    39 
    40 
    41 namespace Hurricane {
    42 
    43  class DataBase;
    44 
    45 
    46  class DbU {
    47  friend class DataBase;
    48  public:
    49  enum FunctionFlags { NoFlags = 0
    50  , NoTechnoUpdate = (1<<0)
    51  };
    52  enum UnitPower { Pico = 1
    53  , Nano
    54  , Micro
    55  , Milli
    56  , Unity
    57  , Kilo
    58  };
    59  enum StringMode { Db = (1<<0)
    60  , Grid = (1<<1)
    61  , Symbolic = (1<<2)
    62  , Physical = (1<<3)
    63  , SmartTruncate = (1<<4)
    64  };
    65  enum SnapMode { Inferior = 1
    66  , Superior = 2
    67  , Nearest = 4
    68  };
    69  public:
    70  typedef std::int64_t Unit;
    71 
    72  public:
    73  static void checkGridBound ( double value );
    74  static void checkLambdaBound ( double value );
    75  static void checkPhysicalBound ( double value, UnitPower p );
    76  // User to DB Converters.
    77  static inline Unit fromDb ( Unit value );
    78  static inline Unit fromGrid ( double value );
    79  static inline Unit fromLambda ( double value );
    80  static inline Unit fromPhysical ( double value, UnitPower p );
    81  // Old naming scheme (was not very clear).
    82  static inline Unit db ( Unit value );
    83  static inline Unit grid ( double value );
    84  static inline Unit lambda ( double value );
    85  static inline Unit physicalToDbu ( double value, UnitPower p );
    86  // Precision & Resolution Managment.
    87  static unsigned int getPrecision ();
    88  static unsigned int getMaximalPrecision ();
    89  static double getResolution ();
    90  static void setPrecision ( unsigned int precision, unsigned int flags=NoFlags );
    91  // Foundry Grid Managment.
    92  static double getUnitPower ( UnitPower p );
    93  static void setPhysicalsPerGrid ( double gridsPerLambda, UnitPower p );
    94  static double getPhysicalsPerGrid ();
    95  static double physicalToGrid ( double physical, UnitPower p );
    96  // Huge Polygon Step Managment.
    97  static inline DbU::Unit getPolygonStep ();
    98  static inline void setPolygonStep ( DbU::Unit );
    99  // Lamba Managment.
    100  static void setGridsPerLambda ( double gridsPerLambda, unsigned int flags=NoFlags );
    101  static double getGridsPerLambda ();
    102  // Snap Grid Managment.
    103  static DbU::Unit getRealSnapGridStep ();
    105  static inline void setRealSnapGridStep ( DbU::Unit step );
    108  static inline void setSymbolicSnapGridStep ( DbU::Unit step );
    109  static DbU::Unit getOnCustomGrid ( DbU::Unit u, DbU::Unit step, SnapMode mode=Nearest );
    110  static inline DbU::Unit getOnPhysicalGrid ( DbU::Unit u, SnapMode mode=Superior );
    111  // Conversions.
    112  static inline Unit toDb ( Unit u );
    113  static inline double toGrid ( Unit u );
    114  static inline double toGrid ( double u );
    115  static inline double toLambda ( Unit u );
    116  static inline double toLambda ( double u );
    117  static inline double toPhysical ( Unit u, UnitPower p );
    118  static inline double toPhysical ( double u, UnitPower p );
    119  // Old naming scheme (not very clear).
    120  static inline Unit getDb ( Unit u );
    121  static inline double getGrid ( Unit u );
    122  static inline double getGrid ( double u );
    123  static inline double getLambda ( Unit u );
    124  static inline double getLambda ( double u );
    125  static inline double getPhysical ( Unit u, UnitPower p );
    126  static inline double getPhysical ( double u, UnitPower p );
    127  static string getValueString ( Unit u, int mode=SmartTruncate );
    128  static string getValueString ( double u, int mode=SmartTruncate );
    129  static Record* getValueRecord ( const Unit* u );
    130  static Slot* getValueSlot ( const string& name, const Unit* u );
    131  static void setStringMode ( unsigned int mode, UnitPower p=Nano );
    132  static void getStringMode ( unsigned int& mode, UnitPower& p );
    133  private:
    134  static void _updateBounds ();
    135 
    136  public:
    137  // Static Attributes: constants.
    138  static const Unit Min;
    139  static const Unit Max;
    140  private:
    141  // Internal: Static Attributes.
    142  static const unsigned int _maximalPrecision;
    143  static unsigned int _precision;
    144  static double _resolution;
    145  static double _gridsPerLambda;
    146  static double _physicalsPerGrid;
    147  static unsigned int _stringMode;
    148  static DbU::UnitPower _stringModeUnitPower;
    149  static DbU::Unit _realSnapGridStep;
    150  static DbU::Unit _symbolicSnapGridStep;
    151  static DbU::Unit _polygonStep;
    152  static double _gridMax;
    153  static double _lambdaMax;
    154  static double _physicalMax;
    155  };
    156 
    157 
    158 // Inline Functions.
    159 // New converter naming scheme.
    160  inline DbU::Unit DbU::fromDb ( DbU::Unit value ) { return value; }
    161  inline DbU::Unit DbU::fromGrid ( double value ) { checkGridBound (value); return (Unit)rint( value/_resolution ); }
    162  inline DbU::Unit DbU::fromLambda ( double value ) { checkLambdaBound (value); return fromGrid(value*_gridsPerLambda); }
    163  inline DbU::Unit DbU::fromPhysical ( double value, UnitPower p ) { checkPhysicalBound(value,p); return fromGrid((value*getUnitPower(p))/_physicalsPerGrid); }
    164  inline DbU::Unit DbU::toDb ( DbU::Unit u ) { return u; }
    165  inline double DbU::toGrid ( DbU::Unit u ) { return _resolution*(double)u; }
    166  inline double DbU::toGrid ( double u ) { return _resolution*u; }
    167  inline double DbU::toLambda ( DbU::Unit u ) { return toGrid(u)/_gridsPerLambda; }
    168  inline double DbU::toLambda ( double u ) { return toGrid(u)/_gridsPerLambda; }
    169  inline double DbU::toPhysical ( DbU::Unit u, UnitPower p ) { return (_physicalsPerGrid*_resolution*(double)u)/getUnitPower(p); }
    170  inline double DbU::toPhysical ( double u, UnitPower p ) { return (_physicalsPerGrid*_resolution*u)/getUnitPower(p); }
    171  inline DbU::Unit DbU::getPolygonStep () { return _polygonStep; }
    172 
    173 // Old converter naming scheme.
    174  inline DbU::Unit DbU::db ( DbU::Unit value ) { return fromDb(value); }
    175  inline DbU::Unit DbU::grid ( double value ) { return fromGrid(value); }
    176  inline DbU::Unit DbU::lambda ( double value ) { return fromLambda(value); }
    177  inline DbU::Unit DbU::physicalToDbu ( double value, UnitPower p ) { return fromPhysical(value,p); }
    178  inline DbU::Unit DbU::getDb ( DbU::Unit u ) { return toDb(u); }
    179  inline double DbU::getGrid ( DbU::Unit u ) { return toGrid(u); }
    180  inline double DbU::getGrid ( double u ) { return toGrid(u); }
    181  inline double DbU::getLambda ( DbU::Unit u ) { return toLambda(u); }
    182  inline double DbU::getLambda ( double u ) { return toLambda(u); }
    183  inline double DbU::getPhysical ( DbU::Unit u, UnitPower p ) { return toPhysical(u,p); }
    184  inline double DbU::getPhysical ( double u, UnitPower p ) { return toPhysical(u,p); }
    185 
    186  inline void DbU::setRealSnapGridStep ( DbU::Unit step ) { _realSnapGridStep = step; }
    187  inline void DbU::setSymbolicSnapGridStep ( DbU::Unit step ) { _symbolicSnapGridStep = step; }
    188  inline void DbU::setPolygonStep ( DbU::Unit step ) { _polygonStep = step; }
    189  inline DbU::Unit DbU::getOnPhysicalGrid ( DbU::Unit u, SnapMode mode ) { return getOnCustomGrid(u, grid(1), mode); }
    190 
    191 
    192 } // End of Hurricane namespace.
    193 
    194 
    195 // inline void jsonWriteDbU ( JsonWriter* w, const std::string& key, long* value )
    196 // { w->key( key ); w->write( value ); }
    197 
    198 
    199 template<>
    200 inline std::string getString ( const std::pair<Hurricane::DbU::Unit,Hurricane::DbU::Unit>& p )
    201 {
    202  return "const std::pair<DbU::Unit,DbU::Unit>";
    203 }
    204 
    205 
    206 template<>
    207 inline Hurricane::Record* getRecord ( const std::pair<Hurricane::DbU::Unit,Hurricane::DbU::Unit>& p )
    208 {
    209  Hurricane::Record* record = NULL;
    210  record = new Hurricane::Record ( "const std::pair<DbU::Unit,DbU::Unit>" );
    211  record->add( Hurricane::DbU::getValueSlot("first" , &p.first ) );
    212  record->add( Hurricane::DbU::getValueSlot("second", &p.second) );
    213  return record;
    214 }
    215 
    216 
    217 template<>
    218 inline std::string getString ( const std::array<Hurricane::DbU::Unit*,3>& a )
    219 {
    220  return "const array<DbU::Unit*,3>";
    221 }
    222 
    223 
    224 template<>
    225 inline Hurricane::Record* getRecord ( const std::array<Hurricane::DbU::Unit*,3>& a )
    226 {
    227  Hurricane::Record* record = NULL;
    228  record = new Hurricane::Record ( "const array<DbU::Unit*,3>" );
    229 
    230  for ( size_t i=0 ; i<a.size() ; ++i ) {
    231  std::string label = "[" + getString(i) + "] ";
    232  record->add( Hurricane::DbU::getValueSlot(label, a[i]) );
    233  }
    234  return record;
    235 }
    236 
    237 
    238 template<>
    239 inline std::string getString ( const std::vector<Hurricane::DbU::Unit>* v )
    240 {
    241  std::string name = "const std::vector<DbU::Unit>:";
    242  return name + getString<size_t>(v->size());
    243 }
    244 
    245 
    246 template<>
    247 inline Hurricane::Record* getRecord ( const std::vector<Hurricane::DbU::Unit>* v )
    248 {
    249  Hurricane::Record* record = NULL;
    250  record = new Hurricane::Record ( "const vector<DbU::Unit>" );
    251 
    252  for ( size_t i=0 ; i<v->size() ; ++i ) {
    253  std::string label = "[" + getString(i) + "] ";
    254  record->add( Hurricane::DbU::getValueSlot(label, &(*v)[i]) );
    255  }
    256  return record;
    257 }
    258 
    259 
    260 #endif // HURRICANE_DBU_H
    static Unit toDb(Unit u)
    Definition: DbU.h:164
    +
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Remy Escassut |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/DbU.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #pragma once
    33 #include <cstdint>
    34 #include <cmath>
    35 #include "hurricane/Commons.h"
    36 
    37 
    38 namespace Hurricane {
    39 
    40  class DataBase;
    41 
    42 
    43  class DbU {
    44  friend class DataBase;
    45  public:
    46  enum FunctionFlags { NoFlags = 0
    47  , NoTechnoUpdate = (1<<0)
    48  };
    49  enum UnitPower { Pico = 1
    50  , Nano
    51  , Micro
    52  , Milli
    53  , Unity
    54  , Kilo
    55  };
    56  enum StringMode { Db = (1<<0)
    57  , Grid = (1<<1)
    58  , Symbolic = (1<<2)
    59  , Physical = (1<<3)
    60  , SmartTruncate = (1<<4)
    61  };
    62  enum SnapMode { Inferior = 1
    63  , Superior = 2
    64  , Nearest = 4
    65  };
    66  public:
    67  typedef std::int64_t Unit;
    68 
    69  public:
    70  static void checkGridBound ( double value );
    71  static void checkLambdaBound ( double value );
    72  static void checkPhysicalBound ( double value, UnitPower p );
    73  // User to DB Converters.
    74  static inline Unit fromDb ( Unit value );
    75  static inline Unit fromGrid ( double value );
    76  static inline Unit fromLambda ( double value );
    77  static inline Unit fromPhysical ( double value, UnitPower p );
    78  static inline Unit fromMicrons ( double value );
    79  static inline Unit fromNanos ( double value );
    80  // Old naming scheme (was not very clear).
    81  static inline Unit db ( Unit value );
    82  static inline Unit grid ( double value );
    83  static inline Unit lambda ( double value );
    84  static inline Unit physicalToDbu ( double value, UnitPower p );
    85  // Precision & Resolution Managment.
    86  static unsigned int getPrecision ();
    87  static unsigned int getMaximalPrecision ();
    88  static double getResolution ();
    89  static void setPrecision ( unsigned int precision, unsigned int flags=NoFlags );
    90  // Foundry Grid Managment.
    91  static double getUnitPower ( UnitPower p );
    92  static void setPhysicalsPerGrid ( double gridsPerLambda, UnitPower p );
    93  static double getPhysicalsPerGrid ();
    94  static double physicalToGrid ( double physical, UnitPower p );
    95  // Huge Polygon Step Managment.
    96  static inline DbU::Unit getPolygonStep ();
    97  static inline void setPolygonStep ( DbU::Unit );
    98  // Lamba Managment.
    99  static void setGridsPerLambda ( double gridsPerLambda, unsigned int flags=NoFlags );
    100  static double getGridsPerLambda ();
    101  // Snap Grid Managment.
    102  static DbU::Unit getRealSnapGridStep ();
    104  static inline void setRealSnapGridStep ( DbU::Unit step );
    107  static inline void setSymbolicSnapGridStep ( DbU::Unit step );
    108  static DbU::Unit getOnCustomGrid ( DbU::Unit u, DbU::Unit step, SnapMode mode=Nearest );
    109  static inline DbU::Unit getOnPhysicalGrid ( DbU::Unit u, SnapMode mode=Superior );
    110  static inline DbU::Unit toCeil ( DbU::Unit u, DbU::Unit step );
    111  static inline DbU::Unit toFloor ( DbU::Unit u, DbU::Unit step );
    112  // Conversions.
    113  static inline Unit toDb ( Unit u );
    114  static inline double toGrid ( Unit u );
    115  static inline double toGrid ( double u );
    116  static inline double toLambda ( Unit u );
    117  static inline double toLambda ( double u );
    118  static inline double toPhysical ( Unit u, UnitPower p );
    119  static inline double toPhysical ( double u, UnitPower p );
    120  static inline double toMicrons ( Unit u );
    121  static inline double toNanos ( Unit u );
    122  // Old naming scheme (not very clear).
    123  static inline Unit getDb ( Unit u );
    124  static inline double getGrid ( Unit u );
    125  static inline double getGrid ( double u );
    126  static inline double getLambda ( Unit u );
    127  static inline double getLambda ( double u );
    128  static inline double getPhysical ( Unit u, UnitPower p );
    129  static inline double getPhysical ( double u, UnitPower p );
    130  static string getValueString ( Unit u, int mode=SmartTruncate );
    131  static string getValueString ( double u, int mode=SmartTruncate );
    132  static Record* getValueRecord ( const Unit* u );
    133  static Slot* getValueSlot ( const string& name, const Unit* u );
    134  static void setStringMode ( unsigned int mode, UnitPower p=Nano );
    135  static void getStringMode ( unsigned int& mode, UnitPower& p );
    136  private:
    137  static void _updateBounds ();
    138 
    139  public:
    140  // Static Attributes: constants.
    141  static const Unit Min;
    142  static const Unit Max;
    143  private:
    144  // Internal: Static Attributes.
    145  static const unsigned int _maximalPrecision;
    146  static unsigned int _precision;
    147  static double _resolution;
    148  static double _gridsPerLambda;
    149  static double _physicalsPerGrid;
    150  static unsigned int _stringMode;
    151  static DbU::UnitPower _stringModeUnitPower;
    152  static DbU::Unit _realSnapGridStep;
    153  static DbU::Unit _symbolicSnapGridStep;
    154  static DbU::Unit _polygonStep;
    155  static double _gridMax;
    156  static double _lambdaMax;
    157  static double _physicalMax;
    158  };
    159 
    160 
    161 // Inline Functions.
    162 // New converter naming scheme.
    163  inline DbU::Unit DbU::fromDb ( DbU::Unit value ) { return value; }
    164  inline DbU::Unit DbU::fromGrid ( double value ) { checkGridBound (value); return (Unit)rint( value/_resolution ); }
    165  inline DbU::Unit DbU::fromLambda ( double value ) { checkLambdaBound (value); return fromGrid(value*_gridsPerLambda); }
    166  inline DbU::Unit DbU::fromPhysical ( double value, UnitPower p ) { checkPhysicalBound(value,p); return fromGrid((value*getUnitPower(p))/_physicalsPerGrid); }
    167  inline DbU::Unit DbU::fromMicrons ( double value ) { return fromPhysical(value,UnitPower::Micro); }
    168  inline DbU::Unit DbU::fromNanos ( double value ) { return fromPhysical(value,UnitPower::Nano); }
    169  inline DbU::Unit DbU::toDb ( DbU::Unit u ) { return u; }
    170  inline double DbU::toGrid ( DbU::Unit u ) { return _resolution*(double)u; }
    171  inline double DbU::toGrid ( double u ) { return _resolution*u; }
    172  inline double DbU::toLambda ( DbU::Unit u ) { return toGrid(u)/_gridsPerLambda; }
    173  inline double DbU::toLambda ( double u ) { return toGrid(u)/_gridsPerLambda; }
    174  inline double DbU::toPhysical ( DbU::Unit u, UnitPower p ) { return (_physicalsPerGrid*_resolution*(double)u)/getUnitPower(p); }
    175  inline double DbU::toPhysical ( double u, UnitPower p ) { return (_physicalsPerGrid*_resolution*u)/getUnitPower(p); }
    176  inline double DbU::toMicrons ( Unit u ) { return toPhysical(u,UnitPower::Micro); }
    177  inline double DbU::toNanos ( Unit u ) { return toPhysical(u,UnitPower::Nano); }
    178  inline DbU::Unit DbU::getPolygonStep () { return _polygonStep; }
    179 
    180 // Old converter naming scheme.
    181  inline DbU::Unit DbU::db ( DbU::Unit value ) { return fromDb(value); }
    182  inline DbU::Unit DbU::grid ( double value ) { return fromGrid(value); }
    183  inline DbU::Unit DbU::lambda ( double value ) { return fromLambda(value); }
    184  inline DbU::Unit DbU::physicalToDbu ( double value, UnitPower p ) { return fromPhysical(value,p); }
    185  inline DbU::Unit DbU::getDb ( DbU::Unit u ) { return toDb(u); }
    186  inline double DbU::getGrid ( DbU::Unit u ) { return toGrid(u); }
    187  inline double DbU::getGrid ( double u ) { return toGrid(u); }
    188  inline double DbU::getLambda ( DbU::Unit u ) { return toLambda(u); }
    189  inline double DbU::getLambda ( double u ) { return toLambda(u); }
    190  inline double DbU::getPhysical ( DbU::Unit u, UnitPower p ) { return toPhysical(u,p); }
    191  inline double DbU::getPhysical ( double u, UnitPower p ) { return toPhysical(u,p); }
    192 
    193  inline void DbU::setRealSnapGridStep ( DbU::Unit step ) { _realSnapGridStep = step; }
    194  inline void DbU::setSymbolicSnapGridStep ( DbU::Unit step ) { _symbolicSnapGridStep = step; }
    195  inline void DbU::setPolygonStep ( DbU::Unit step ) { _polygonStep = step; }
    196  inline DbU::Unit DbU::getOnPhysicalGrid ( DbU::Unit u, SnapMode mode ) { return getOnCustomGrid(u, grid(1), mode); }
    197 
    198  inline DbU::Unit DbU::toCeil ( DbU::Unit u, DbU::Unit step )
    199  { DbU::Unit modulo = u % step; return (modulo) ? (u + step - modulo) : u; }
    200 
    201  inline DbU::Unit DbU::toFloor ( DbU::Unit u, DbU::Unit step )
    202  { DbU::Unit modulo = u % step; return (modulo) ? (u - modulo) : u; }
    203 
    204 
    205 } // End of Hurricane namespace.
    206 
    207 
    208 // inline void jsonWriteDbU ( JsonWriter* w, const std::string& key, long* value )
    209 // { w->key( key ); w->write( value ); }
    210 
    211 
    212 template<>
    213 inline std::string getString ( const std::pair<Hurricane::DbU::Unit,Hurricane::DbU::Unit>& p )
    214 {
    215  return "const std::pair<DbU::Unit,DbU::Unit>";
    216 }
    217 
    218 
    219 template<>
    220 inline Hurricane::Record* getRecord ( const std::pair<Hurricane::DbU::Unit,Hurricane::DbU::Unit>& p )
    221 {
    222  Hurricane::Record* record = NULL;
    223  record = new Hurricane::Record ( "const std::pair<DbU::Unit,DbU::Unit>" );
    224  record->add( Hurricane::DbU::getValueSlot("first" , &p.first ) );
    225  record->add( Hurricane::DbU::getValueSlot("second", &p.second) );
    226  return record;
    227 }
    228 
    229 
    230 template<>
    231 inline std::string getString ( const std::array<Hurricane::DbU::Unit*,3>& a )
    232 {
    233  return "const array<DbU::Unit*,3>";
    234 }
    235 
    236 
    237 template<>
    238 inline Hurricane::Record* getRecord ( const std::array<Hurricane::DbU::Unit*,3>& a )
    239 {
    240  Hurricane::Record* record = NULL;
    241  record = new Hurricane::Record ( "const array<DbU::Unit*,3>" );
    242 
    243  for ( size_t i=0 ; i<a.size() ; ++i ) {
    244  std::string label = "[" + getString(i) + "] ";
    245  record->add( Hurricane::DbU::getValueSlot(label, a[i]) );
    246  }
    247  return record;
    248 }
    249 
    250 
    251 template<>
    252 inline std::string getString ( const std::vector<Hurricane::DbU::Unit>* v )
    253 {
    254  std::string name = "const std::vector<DbU::Unit>:";
    255  return name + getString<size_t>(v->size());
    256 }
    257 
    258 
    259 template<>
    260 inline Hurricane::Record* getRecord ( const std::vector<Hurricane::DbU::Unit>* v )
    261 {
    262  Hurricane::Record* record = NULL;
    263  record = new Hurricane::Record ( "const vector<DbU::Unit>" );
    264 
    265  for ( size_t i=0 ; i<v->size() ; ++i ) {
    266  std::string label = "[" + getString(i) + "] ";
    267  record->add( Hurricane::DbU::getValueSlot(label, &(*v)[i]) );
    268  }
    269  return record;
    270 }
    static Unit toDb(Unit u)
    Definition: DbU.h:169
    static DbU::Unit getOnCustomGrid(DbU::Unit u, DbU::Unit step, SnapMode mode=Nearest)
    static unsigned int getPrecision()
    static void setStringMode(unsigned int mode, UnitPower p=Nano)
    static double getResolution()
    -
    Definition: DbU.h:66
    -
    static Unit fromPhysical(double value, UnitPower p)
    Definition: DbU.h:163
    -
    static Unit lambda(double value)
    Definition: DbU.h:176
    +
    Definition: DbU.h:63
    +
    static Unit fromPhysical(double value, UnitPower p)
    Definition: DbU.h:166
    +
    static Unit lambda(double value)
    Definition: DbU.h:183
    static DbU::Unit getOnSymbolicSnapGrid(DbU::Unit u, SnapMode mode=Nearest)
    -
    Definition: DbU.h:59
    -
    static Unit getDb(Unit u)
    Definition: DbU.h:178
    -
    Definition: DbU.h:67
    -
    Definition: DbU.h:65
    -
    static DbU::Unit getOnPhysicalGrid(DbU::Unit u, SnapMode mode=Superior)
    Definition: DbU.h:189
    -
    static void setSymbolicSnapGridStep(DbU::Unit step)
    Definition: DbU.h:187
    -
    static Unit fromLambda(double value)
    Definition: DbU.h:162
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    StringMode
    Definition: DbU.h:59
    +
    Definition: DbU.h:56
    +
    static Unit getDb(Unit u)
    Definition: DbU.h:185
    +
    Definition: DbU.h:64
    +
    Definition: DbU.h:62
    +
    static DbU::Unit getOnPhysicalGrid(DbU::Unit u, SnapMode mode=Superior)
    Definition: DbU.h:196
    +
    static void setSymbolicSnapGridStep(DbU::Unit step)
    Definition: DbU.h:194
    +
    static Unit fromLambda(double value)
    Definition: DbU.h:165
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    StringMode
    Definition: DbU.h:56
    static void setGridsPerLambda(double gridsPerLambda, unsigned int flags=NoFlags)
    -
    Definition: DbU.h:57
    +
    Definition: DbU.h:54
    static DbU::Unit getOnRealSnapGrid(DbU::Unit u, SnapMode mode=Nearest)
    -
    Definition: DbU.h:60
    +
    Definition: DbU.h:57
    static DbU::Unit getRealSnapGridStep()
    static string getValueString(Unit u, int mode=SmartTruncate)
    -
    static Unit fromDb(Unit value)
    Definition: DbU.h:160
    +
    static Unit fromDb(Unit value)
    Definition: DbU.h:163
    static void setPrecision(unsigned int precision, unsigned int flags=NoFlags)
    -
    Definition: DbU.h:52
    +
    Definition: DbU.h:49
    The whole DataBase (API).
    Definition: DataBase.h:40
    -
    static Unit db(Unit value)
    Definition: DbU.h:174
    -
    Definition: DbU.h:54
    -
    DataBase Unit managment (API).
    Definition: DbU.h:46
    -
    static double toPhysical(Unit u, UnitPower p)
    Definition: DbU.h:169
    +
    static Unit db(Unit value)
    Definition: DbU.h:181
    +
    Definition: DbU.h:51
    +
    DataBase Unit managment (API).
    Definition: DbU.h:43
    +
    static double toPhysical(Unit u, UnitPower p)
    Definition: DbU.h:174
    static double getGridsPerLambda()
    -
    static void setRealSnapGridStep(DbU::Unit step)
    Definition: DbU.h:186
    -
    UnitPower
    Definition: DbU.h:52
    -
    static Unit grid(double value)
    Definition: DbU.h:175
    -
    Definition: DbU.h:56
    -
    static double toGrid(Unit u)
    Definition: DbU.h:165
    -
    Definition: DbU.h:53
    -
    Definition: DbU.h:61
    +
    static void setRealSnapGridStep(DbU::Unit step)
    Definition: DbU.h:193
    +
    UnitPower
    Definition: DbU.h:49
    +
    static Unit grid(double value)
    Definition: DbU.h:182
    +
    Definition: DbU.h:53
    +
    static double toGrid(Unit u)
    Definition: DbU.h:170
    +
    Definition: DbU.h:50
    +
    Definition: DbU.h:58
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    static unsigned int getMaximalPrecision()
    -
    SnapMode
    Definition: DbU.h:65
    +
    SnapMode
    Definition: DbU.h:62
    static DbU::Unit getSymbolicSnapGridStep()
    -
    static Unit fromGrid(double value)
    Definition: DbU.h:161
    -
    static double getLambda(Unit u)
    Definition: DbU.h:181
    -
    static double getGrid(Unit u)
    Definition: DbU.h:179
    -
    static double toLambda(Unit u)
    Definition: DbU.h:167
    -
    Definition: DbU.h:55
    +
    static Unit fromGrid(double value)
    Definition: DbU.h:164
    +
    static double getLambda(Unit u)
    Definition: DbU.h:188
    +
    static double getGrid(Unit u)
    Definition: DbU.h:186
    +
    static double toLambda(Unit u)
    Definition: DbU.h:172
    +
    Definition: DbU.h:52


    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/DebugSession_8h_source.html b/hurricane/doc/hurricane/html/DebugSession_8h_source.html index da10fc46..ce8bf179 100644 --- a/hurricane/doc/hurricane/html/DebugSession_8h_source.html +++ b/hurricane/doc/hurricane/html/DebugSession_8h_source.html @@ -47,7 +47,7 @@ $(function() {
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Jean-Paul Chaput |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/DebugSession.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #ifndef HURRICANE_DEBUG_SESSION_H
    33 #define HURRICANE_DEBUG_SESSION_H
    34 
    35 #include <set>
    36 #include <stack>
    37 #include "hurricane/Commons.h"
    38 
    39 
    40 namespace Hurricane {
    41 
    42  class Name;
    43  class Net;
    44  class Cell;
    45 
    46  using std::pair;
    47  using std::make_pair;
    48  using std::set;
    49  using std::stack;
    50 
    51 
    52 // -------------------------------------------------------------------
    53 // Class : "Hurricane::DebugSession".
    54 
    55  class DebugSession {
    56 
    57  public:
    58  // Static Access.
    59  static DebugSession* create ();
    60  static inline DebugSession* get ();
    61  static inline bool isTraced ( const void* symbol );
    62  static inline void isTracedNet ( const Net* );
    63  static inline void addToTrace ( const void* symbol );
    64  static inline void addToTrace ( const Cell*, const Name& );
    65  static inline void addToTrace ( const Net* );
    66  static inline void open ( int minLevel, int maxLevel );
    67  static inline void open ( const void* symbol, int minLevel, int maxLevel );
    68  static inline void close ();
    69  // Singleton Access.
    70  inline bool _isTraced ( const void* symbol ) const;
    71  inline void _addToTrace ( const void* symbol );
    72  void _addToTrace ( const Cell*, const Name& );
    73  inline void _addToTrace ( const Net* net );
    74  // Inspector Management.
    75  Record* _getRecord () const;
    76  string _getString () const;
    77  string _getTypeName () const;
    78 
    79  protected:
    80  // Internal: Attributes.
    81  static DebugSession* _singleton;
    82  set<const void*> _symbols;
    83  stack< pair<int,int> > _levels;
    84 
    85  protected:
    86  // Internal: Constructor & Destructor.
    87  DebugSession ();
    88  ~DebugSession ();
    89  private:
    90  DebugSession ( const DebugSession& );
    91  DebugSession& operator= ( const DebugSession& );
    92  };
    93 
    94 
    95 // Inline Functions.
    96 
    97  void DebugSession::open ( int minLevel, int maxLevel )
    98  {
    99  if (cdebug.getMinLevel() < minLevel) minLevel = cdebug.getMinLevel();
    100  if (cdebug.getMaxLevel() > maxLevel) maxLevel = cdebug.getMaxLevel();
    101 
    102  _singleton->_levels.push( make_pair( cdebug.setMinLevel(minLevel)
    103  , cdebug.setMaxLevel(maxLevel) ) );
    104 
    105  //std::cerr << "DebugSession::open() " << minLevel << ":" << maxLevel << std::endl;
    106  }
    107 
    108 
    109  void DebugSession::open ( const void* symbol, int minLevel, int maxLevel )
    110  {
    111  if (cdebug.getMinLevel() < minLevel) minLevel = cdebug.getMinLevel();
    112  if (cdebug.getMaxLevel() > maxLevel) maxLevel = cdebug.getMaxLevel();
    113 
    114  if ( _singleton->_isTraced(symbol) ) {
    115  _singleton->_levels.push( make_pair( cdebug.setMinLevel(minLevel)
    116  , cdebug.setMaxLevel(maxLevel) ) );
    117 
    118  //std::cerr << "DebugSession::open() " << symbol << " " << minLevel << ":" << maxLevel << std::endl;
    119  } else {
    120  _singleton->_levels.push ( make_pair( cdebug.getMinLevel()
    121  , cdebug.getMaxLevel() ) );
    122 
    123  //std::cerr << "DebugSession::open() Same level " << minLevel << ":" << maxLevel << std::endl;
    124  }
    125  }
    126 
    127 
    129  {
    130  if ( not _singleton->_levels.empty() ) {
    131  cdebug.setMinLevel( _singleton->_levels.top().first );
    132  cdebug.setMaxLevel( _singleton->_levels.top().second );
    133  _singleton->_levels.pop ();
    134 
    135  //std::cerr << "DebugSession::close() " << cdebug.getMinLevel() << ":" << cdebug.getMaxLevel() << std::endl;
    136  }
    137  }
    138 
    139 
    140  DebugSession* DebugSession::get () { return _singleton; }
    141  bool DebugSession::isTraced ( const void* symbol ) { return _singleton->_isTraced(symbol); }
    142  void DebugSession::addToTrace ( const void* symbol ) { _singleton->_addToTrace(symbol); }
    143  void DebugSession::addToTrace ( const Net* net ) { _singleton->_addToTrace(net); }
    144  void DebugSession::addToTrace ( const Cell* cell
    145  , const Name& name ) { _singleton->_addToTrace( cell, name ); }
    146  bool DebugSession::_isTraced ( const void* symbol ) const { return _symbols.find(symbol) != _symbols.end(); }
    147  void DebugSession::_addToTrace ( const void* symbol ) { _symbols.insert( symbol ); }
    148  void DebugSession::_addToTrace ( const Net* net ) { _addToTrace( static_cast<const void*>(net) ); }
    149 
    150 
    151 
    152 } // Hurricane namespace.
    153 
    154 
    155 INSPECTOR_P_SUPPORT(Hurricane::DebugSession);
    156 
    157 
    158 #endif // HURRICANE_DEBUG_SESSION_H
    static void addToTrace(const void *symbol)
    Definition: DebugSession.h:142
    Name description (API)
    Definition: Name.h:35
    int setMaxLevel(int)
    Definition: Commons.h:1044
    -
    The model (API).
    Definition: Cell.h:66
    +
    The model (API).
    Definition: Cell.h:64
    static void close()
    Definition: DebugSession.h:128
    int setMinLevel(int)
    Definition: Commons.h:1043
    int getMinLevel() const
    Definition: Commons.h:1041
    @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Diagonal_8h_source.html b/hurricane/doc/hurricane/html/Diagonal_8h_source.html index 6e64f5da..c1f7b19a 100644 --- a/hurricane/doc/hurricane/html/Diagonal_8h_source.html +++ b/hurricane/doc/hurricane/html/Diagonal_8h_source.html @@ -47,7 +47,7 @@ $(function() {
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Authors : Jean-Paul Chaput |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/Diagonal.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #ifndef HURRICANE_DIAGONAL_H
    33 #define HURRICANE_DIAGONAL_H
    34 
    35 #include "hurricane/Component.h"
    36 
    37 
    38 namespace Hurricane {
    39 
    40  class Layer;
    41 
    42 
    43 // -------------------------------------------------------------------
    44 // Class : "Diagonal".
    45 
    46  class Diagonal : public Component {
    47  public:
    48  typedef Component Super;
    49 
    50  public:
    51  static Diagonal* create ( Net*, const Layer*, const Point& source, const Point& target, DbU::Unit width );
    52  // Accessors.
    53  virtual bool isNonRectangle () const;
    54  virtual DbU::Unit getX () const;
    55  virtual DbU::Unit getY () const;
    56  virtual DbU::Unit getSourceX () const;
    57  virtual DbU::Unit getSourceY () const;
    58  virtual DbU::Unit getTargetX () const;
    59  virtual DbU::Unit getTargetY () const;
    60  virtual Point getSourcePosition () const;
    61  virtual Point getTargetPosition () const;
    62  virtual Box getBoundingBox () const;
    63  virtual Box getBoundingBox ( const BasicLayer* ) const;
    64  virtual size_t getPointsSize () const;
    65  virtual Point getPoint ( size_t i ) const;
    66  DbU::Unit getWidth () const;
    67  virtual const Layer* getLayer () const;
    68  // Mutators.
    69  void setLayer ( const Layer* );
    70  void setWidth ( DbU::Unit );
    71  virtual void translate ( const DbU::Unit& dx, const DbU::Unit& dy );
    72  void setSource ( Point );
    73  void setTarget ( Point );
    74  // Hurricane management.
    75  virtual void _toJson ( JsonWriter* ) const;
    76  static JsonObject* getJsonObject ( unsigned long flags );
    77  virtual string _getTypeName () const;
    78  virtual string _getString () const;
    79  virtual Record* _getRecord () const;
    80  protected:
    81  Diagonal ( Net*, const Layer*, const Point& source, const Point& target, DbU::Unit width );
    82  void _updateB ();
    83  private:
    84  const Layer* _layer;
    85  Point _source;
    86  Point _target;
    87  DbU::Unit _width;
    88  DbU::Unit _B; // octagon half Y.
    89  };
    90 
    91 
    92 // -------------------------------------------------------------------
    93 // Class : "JsonRoutingDiagonal".
    94 
    95  class JsonDiagonal : public JsonComponent {
    96  public:
    97  static void initialize ();
    98  JsonDiagonal ( unsigned long flags );
    99  virtual std::string getTypeName () const;
    100  virtual JsonDiagonal* clone ( unsigned long ) const;
    101  virtual void toData ( JsonStack& );
    102  };
    103 
    104 } // Hurricane namespace.
    105 
    106 
    107 INSPECTOR_P_SUPPORT(Hurricane::Diagonal);
    108 
    109 #endif // HURRICANE_DIAGONAL_H
    BasicLayer description (API)
    Definition: BasicLayer.h:44
    Component description (API)
    Definition: Component.h:42
    Support for JSON export.
    Definition: JsonObject.h:83
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    Diagonal description (API)
    Definition: Diagonal.h:46
    Point description (API)
    Definition: Point.h:32
    JSON Parser Stack.
    Definition: JsonObject.h:249
    @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/DiffusionLayer_8h_source.html b/hurricane/doc/hurricane/html/DiffusionLayer_8h_source.html index e1fbc747..a70f1507 100644 --- a/hurricane/doc/hurricane/html/DiffusionLayer_8h_source.html +++ b/hurricane/doc/hurricane/html/DiffusionLayer_8h_source.html @@ -47,8 +47,8 @@ $(function() {
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Jean-Paul Chaput |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/DiffusionLayer.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #ifndef HURRICANE_DIFFUSION_LAYER_H
    33 #define HURRICANE_DIFFUSION_LAYER_H
    34 
    35 #include <vector>
    36 
    37 #include "hurricane/Layer.h"
    38 
    39 
    40 namespace Hurricane {
    41 
    42 // -------------------------------------------------------------------
    43 // Class : "Hurricane::DiffusionLayer".
    44 
    45  class DiffusionLayer : public Layer {
    46  public:
    47  typedef Layer Super;
    48 
    49  public:
    50  // Constructor.
    51  static DiffusionLayer* create ( Technology* technology
    52  , const Name& name
    53  , BasicLayer* activeLayer
    54  , BasicLayer* diffusionLayer
    55  , BasicLayer* wellLayer
    56  );
    57  // Accessors.
    58  virtual BasicLayers getBasicLayers () const;
    59  virtual DbU::Unit getExtentionCap () const;
    60  virtual DbU::Unit getExtentionWidth () const;
    61  virtual DbU::Unit getExtentionCap ( const BasicLayer* layer ) const;
    62  virtual DbU::Unit getExtentionWidth ( const BasicLayer* layer ) const;
    63  // Updators.
    64  virtual void setExtentionCap ( const BasicLayer* layer, DbU::Unit cap );
    65  virtual void setExtentionWidth ( const BasicLayer* layer, DbU::Unit width );
    66  // Hurricane Managment.
    67  virtual void _toJson ( JsonWriter* ) const;
    68  virtual void _onDbuChange ( float scale );
    69  virtual string _getTypeName () const;
    70  virtual string _getString () const;
    71  virtual Record* _getRecord () const;
    72 
    73  private:
    74  // Internal: Attributes
    75  vector<BasicLayer*> _basicLayers;
    76  vector<DbU::Unit> _extentionCaps;
    77  vector<DbU::Unit> _extentionWidths;
    78  DbU::Unit _maximalExtentionCap;
    79  DbU::Unit _maximalExtentionWidth;
    80 
    81  protected:
    82  // Internal: Constructors & Destructors.
    83  DiffusionLayer ( Technology* technology
    84  , const Name& name
    85  , BasicLayer* activeLayer
    86  , BasicLayer* diffusionLayer
    87  , BasicLayer* wellLayer
    88  );
    89  };
    90 
    91 
    92 // -------------------------------------------------------------------
    93 // Class : "Hurricane::JsonDiffusionLayer".
    94 
    95  class JsonDiffusionLayer : public JsonLayer {
    96  public:
    97  static void initialize ();
    98  JsonDiffusionLayer ( unsigned long flags );
    99  ~JsonDiffusionLayer ();
    100  virtual string getTypeName () const;
    101  virtual JsonDiffusionLayer* clone ( unsigned long ) const;
    102  virtual void toData ( JsonStack& );
    103  };
    104 
    105 
    106 } // End of Hurricane namespace.
    107 
    108 
    109 INSPECTOR_P_SUPPORT(Hurricane::DiffusionLayer);
    110 
    111 
    112 #endif
    BasicLayer description (API)
    Definition: BasicLayer.h:44
    DiffusionLayer description (API)
    Definition: DiffusionLayer.h:45
    Name description (API)
    Definition: Name.h:35
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    JSON Parser Stack.
    Definition: JsonObject.h:249
    Layer description (API)
    Definition: Layer.h:52
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    @@ -59,7 +59,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Entities_8h_source.html b/hurricane/doc/hurricane/html/Entities_8h_source.html index 23cb6175..b3159258 100644 --- a/hurricane/doc/hurricane/html/Entities_8h_source.html +++ b/hurricane/doc/hurricane/html/Entities_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Entity_8h_source.html b/hurricane/doc/hurricane/html/Entity_8h_source.html index 2cb79409..18c9b106 100644 --- a/hurricane/doc/hurricane/html/Entity_8h_source.html +++ b/hurricane/doc/hurricane/html/Entity_8h_source.html @@ -44,11 +44,10 @@ $(function() {
    Entity.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Entity.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_ENTITY
    21 #define HURRICANE_ENTITY
    22 
    23 #include <functional>
    24 #include "hurricane/DBo.h"
    25 #include "hurricane/Entities.h"
    26 #include "hurricane/Box.h"
    27 
    28 namespace Hurricane {
    29 
    30  class Cell;
    31  class Quark;
    32  class SharedPath;
    33 
    34 
    35 // -------------------------------------------------------------------
    36 // Class : "Hurricane::Entity".
    37 
    38  class Entity : public DBo
    39  {
    40  public:
    41  typedef DBo Inherit;
    42  public:
    43  virtual Cell* getCell () const = 0;
    44  virtual Box getBoundingBox () const = 0;
    45  virtual void _toJson ( JsonWriter* ) const;
    46  virtual string _getString () const;
    47  virtual Record* _getRecord () const;
    48  Quark* _getQuark ( SharedPath* sharedPath = NULL ) const;
    49  protected:
    50  Entity ();
    51  virtual ~Entity () throw(Error);
    52  virtual void _postCreate ();
    53  virtual void _preDestroy ();
    54  };
    55 
    56 
    57 // -------------------------------------------------------------------
    58 // Class : "Hurricane::JsonEntity".
    59 
    60  class JsonEntity : public JsonDBo {
    61  public:
    62  JsonEntity ( unsigned long flags );
    63  template<typename T> inline void update ( JsonStack&, T );
    64  };
    65 
    66 
    67  template<typename T> inline void JsonEntity::update ( JsonStack& stack, T hobject )
    68  {
    69  unsigned int jsonId = get<int64_t>(stack,"_id");
    70 
    71  JsonDBo::update<T>( stack, hobject );
    72  stack.addEntity( jsonId, hobject );
    73  }
    74 
    75 
    76 // -------------------------------------------------------------------
    77 // Class : "JsonEntityRef".
    78 
    79  class JsonEntityRef : public JsonObject {
    80  public:
    81  static void initialize ();
    82  JsonEntityRef ( unsigned long flags );
    83  virtual string getTypeName () const;
    84  virtual JsonEntityRef* clone ( unsigned long ) const;
    85  virtual void toData ( JsonStack& );
    86  };
    87 
    88 
    89 } // Hurricane namespace.
    90 
    91 
    92 INSPECTOR_P_SUPPORT(Hurricane::Entity);
    93 
    94 
    95 #endif // HURRICANE_ENTITY
    96 
    97 // ****************************************************************************************************
    98 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    99 // ****************************************************************************************************
    Quark description (API)
    Definition: Quark.h:35
    -
    Error description (API)
    Definition: Error.h:43
    -
    The model (API).
    Definition: Cell.h:66
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    -
    Occurrenceable objects root class (API).
    Definition: Entity.h:38
    +
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Entity.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #pragma once
    21 #include <functional>
    22 #include "hurricane/DBo.h"
    23 #include "hurricane/Entities.h"
    24 #include "hurricane/Box.h"
    25 
    26 namespace Hurricane {
    27 
    28  class Cell;
    29  class Quark;
    30  class SharedPath;
    31 
    32 
    33 // -------------------------------------------------------------------
    34 // Class : "Hurricane::Entity".
    35 
    36  class Entity : public DBo
    37  {
    38  public:
    39  typedef DBo Inherit;
    40  public:
    41  virtual Cell* getCell () const = 0;
    42  virtual Box getBoundingBox () const = 0;
    43  virtual void _toJson ( JsonWriter* ) const;
    44  virtual string _getString () const;
    45  virtual Record* _getRecord () const;
    46  Quark* _getQuark ( SharedPath* sharedPath = NULL ) const;
    47  protected:
    48  Entity ();
    49  virtual ~Entity ();
    50  virtual void _postCreate ();
    51  virtual void _preDestroy ();
    52  };
    53 
    54 
    55 // -------------------------------------------------------------------
    56 // Class : "Hurricane::JsonEntity".
    57 
    58  class JsonEntity : public JsonDBo {
    59  public:
    60  JsonEntity ( unsigned long flags );
    61  template<typename T> inline void update ( JsonStack&, T );
    62  };
    63 
    64 
    65  template<typename T> inline void JsonEntity::update ( JsonStack& stack, T hobject )
    66  {
    67  unsigned int jsonId = get<int64_t>(stack,"_id");
    68 
    69  JsonDBo::update<T>( stack, hobject );
    70  stack.addEntity( jsonId, hobject );
    71  }
    72 
    73 
    74 // -------------------------------------------------------------------
    75 // Class : "JsonEntityRef".
    76 
    77  class JsonEntityRef : public JsonObject {
    78  public:
    79  static void initialize ();
    80  JsonEntityRef ( unsigned long flags );
    81  virtual string getTypeName () const;
    82  virtual JsonEntityRef* clone ( unsigned long ) const;
    83  virtual void toData ( JsonStack& );
    84  };
    85 
    86 
    87 } // Hurricane namespace.
    88 
    89 
    90 INSPECTOR_P_SUPPORT(Hurricane::Entity);
    91 
    92 // ****************************************************************************************************
    93 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    94 // ****************************************************************************************************
    Quark description (API)
    Definition: Quark.h:35
    +
    The model (API).
    Definition: Cell.h:64
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    +
    Occurrenceable objects root class (API).
    Definition: Entity.h:36
    JSON Parser Stack.
    Definition: JsonObject.h:249
    Box description (API)
    Definition: Box.h:31
    @@ -60,7 +59,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Error_8h_source.html b/hurricane/doc/hurricane/html/Error_8h_source.html index 6774e1a9..e76b6574 100644 --- a/hurricane/doc/hurricane/html/Error_8h_source.html +++ b/hurricane/doc/hurricane/html/Error_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Exception_8h_source.html b/hurricane/doc/hurricane/html/Exception_8h_source.html index 58b03d62..dbbf3811 100644 --- a/hurricane/doc/hurricane/html/Exception_8h_source.html +++ b/hurricane/doc/hurricane/html/Exception_8h_source.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Filter_8h_source.html b/hurricane/doc/hurricane/html/Filter_8h_source.html index 368fa184..bd3d8f3c 100644 --- a/hurricane/doc/hurricane/html/Filter_8h_source.html +++ b/hurricane/doc/hurricane/html/Filter_8h_source.html @@ -61,7 +61,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Go_8h_source.html b/hurricane/doc/hurricane/html/Go_8h_source.html index 0ce80f61..8e9dac44 100644 --- a/hurricane/doc/hurricane/html/Go_8h_source.html +++ b/hurricane/doc/hurricane/html/Go_8h_source.html @@ -44,18 +44,17 @@ $(function() {
    Go.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Go.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_GO
    21 #define HURRICANE_GO
    22 
    23 #include "hurricane/Entity.h"
    24 #include "hurricane/Gos.h"
    25 #include "hurricane/Transformation.h"
    26 
    27 namespace Hurricane {
    28 
    29 class BasicLayer;
    30 class QuadTree;
    31 
    32 // ****************************************************************************************************
    33 // Go declaration
    34 // ****************************************************************************************************
    35 
    36 class Go : public Entity {
    37 // *********************
    38 
    39 // Friends
    40 // *******
    41 
    42  friend class QuadTree;
    43 
    44 // Types
    45 // *****
    46 
    47  public: typedef Entity Inherit;
    48 
    49 // Attributes
    50 // **********
    51 
    52  private: QuadTree* _quadTree;
    53  private: Go* _nextOfQuadTreeGoSet;
    54 
    55 // Constructors
    56 // ************
    57 
    58  protected: Go();
    59  protected: virtual ~Go() throw(Error);
    60 
    61 // Predicates
    62 // **********
    63 
    64  public: static bool autoMaterializationIsDisabled();
    65 
    66  public: bool isMaterialized() const {return (_quadTree != NULL);};
    67 
    68 // Updators
    69 // ********
    70 
    71  public: static void enableAutoMaterialization();
    72  public: static void disableAutoMaterialization();
    73 
    74  public: virtual void materialize() = 0;
    75  public: virtual void unmaterialize() = 0;
    76 
    77  public: virtual void invalidate(bool propagateFlag = true);
    78  // implementation located on file UpdateSession.cpp to access local variables
    79 
    80  public: virtual void translate(const DbU::Unit& dx, const DbU::Unit& dy) = 0;
    81 
    82 // Others
    83 // ******
    84 
    85  protected: virtual void _postCreate();
    86 
    87  protected: virtual void _preDestroy();
    88 
    89  public: virtual string _getString() const;
    90  public: virtual Record* _getRecord() const;
    91  public: Go* _getNextOfQuadTreeGoSet() const {return _nextOfQuadTreeGoSet;};
    92 
    93  public: void _setNextOfQuadTreeGoSet(Go* go) {_nextOfQuadTreeGoSet = go;};
    94 
    95 };
    96 
    97 
    98 } // End of Hurricane namespace.
    99 
    100 
    101 INSPECTOR_P_SUPPORT(Hurricane::Go);
    102 
    103 
    104 #endif // HURRICANE_GO
    105 
    106 
    107 // ****************************************************************************************************
    108 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    109 // ****************************************************************************************************
    Go description (API)
    Definition: Go.h:36
    +
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Go.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #pragma once
    21 #include "hurricane/Entity.h"
    22 #include "hurricane/Gos.h"
    23 #include "hurricane/Transformation.h"
    24 
    25 namespace Hurricane {
    26 
    27 class BasicLayer;
    28 class QuadTree;
    29 
    30 // ****************************************************************************************************
    31 // Go declaration
    32 // ****************************************************************************************************
    33 
    34 class Go : public Entity {
    35 // *********************
    36 
    37 // Friends
    38 // *******
    39 
    40  friend class QuadTree;
    41 
    42 // Types
    43 // *****
    44 
    45  public: typedef Entity Inherit;
    46 
    47 // Attributes
    48 // **********
    49 
    50  private: QuadTree* _quadTree;
    51  private: Go* _nextOfQuadTreeGoSet;
    52 
    53 // Constructors
    54 // ************
    55 
    56  protected: Go();
    57  protected: virtual ~Go();
    58 
    59 // Predicates
    60 // **********
    61 
    62  public: static bool autoMaterializationIsDisabled();
    63 
    64  public: bool isMaterialized() const {return (_quadTree != NULL);};
    65 
    66 // Updators
    67 // ********
    68 
    69  public: static void enableAutoMaterialization();
    70  public: static void disableAutoMaterialization();
    71 
    72  public: virtual void materialize() = 0;
    73  public: virtual void unmaterialize() = 0;
    74 
    75  public: virtual void invalidate(bool propagateFlag = true);
    76  // implementation located on file UpdateSession.cpp to access local variables
    77 
    78  public: virtual void translate(const DbU::Unit& dx, const DbU::Unit& dy) = 0;
    79 
    80 // Others
    81 // ******
    82 
    83  protected: virtual void _postCreate();
    84 
    85  protected: virtual void _preDestroy();
    86 
    87  public: virtual string _getString() const;
    88  public: virtual Record* _getRecord() const;
    89  public: Go* _getNextOfQuadTreeGoSet() const {return _nextOfQuadTreeGoSet;};
    90 
    91  public: void _setNextOfQuadTreeGoSet(Go* go) {_nextOfQuadTreeGoSet = go;};
    92 
    93 };
    94 
    95 
    96 } // End of Hurricane namespace.
    97 
    98 
    99 INSPECTOR_P_SUPPORT(Hurricane::Go);
    100 
    101 
    102 // ****************************************************************************************************
    103 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    104 // ****************************************************************************************************
    Go description (API)
    Definition: Go.h:34
    static bool autoMaterializationIsDisabled()
    virtual void translate(const DbU::Unit &dx, const DbU::Unit &dy)=0
    -
    Error description (API)
    Definition: Error.h:43
    virtual void invalidate(bool propagateFlag=true)
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    static void disableAutoMaterialization()
    virtual void unmaterialize()=0
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    -
    bool isMaterialized() const
    Definition: Go.h:66
    +
    bool isMaterialized() const
    Definition: Go.h:64
    QuadTree description (API)
    Definition: QuadTree.h:33
    static void enableAutoMaterialization()
    virtual void materialize()=0
    @@ -64,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Gos_8h_source.html b/hurricane/doc/hurricane/html/Gos_8h_source.html index 6e534d0e..231b6170 100644 --- a/hurricane/doc/hurricane/html/Gos_8h_source.html +++ b/hurricane/doc/hurricane/html/Gos_8h_source.html @@ -44,7 +44,7 @@ $(function() {
    Gos.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Gos.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_GOS
    21 #define HURRICANE_GOS
    22 
    23 #include "hurricane/Collection.h"
    24 
    25 namespace Hurricane {
    26 
    27 class Go;
    28 
    29 
    30 
    31 // ****************************************************************************************************
    32 // Gos declaration
    33 // ****************************************************************************************************
    34 
    36 
    37 
    38 
    39 // ****************************************************************************************************
    40 // GoLocator declaration
    41 // ****************************************************************************************************
    42 
    44 
    45 
    46 
    47 // ****************************************************************************************************
    48 // GoFilter declaration
    49 // ****************************************************************************************************
    50 
    52 
    53 
    54 
    55 // ****************************************************************************************************
    56 // for_each_go declaration
    57 // ****************************************************************************************************
    58 
    59 #define for_each_go(go, gos)\
    60 /***************************/\
    61 {\
    62  GoLocator _locator = gos.getLocator();\
    63  while (_locator.isValid()) {\
    64  Go* go = _locator.getElement();\
    65  _locator.progress();
    66 
    67 
    68 
    69 } // End of Hurricane namespace.
    70 
    71 #endif // HURRICANE_GOS
    72 
    73 
    74 // ****************************************************************************************************
    75 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    76 // ****************************************************************************************************
    Go description (API)
    Definition: Go.h:36
    +
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Gos.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_GOS
    21 #define HURRICANE_GOS
    22 
    23 #include "hurricane/Collection.h"
    24 
    25 namespace Hurricane {
    26 
    27 class Go;
    28 
    29 
    30 
    31 // ****************************************************************************************************
    32 // Gos declaration
    33 // ****************************************************************************************************
    34 
    36 
    37 
    38 
    39 // ****************************************************************************************************
    40 // GoLocator declaration
    41 // ****************************************************************************************************
    42 
    44 
    45 
    46 
    47 // ****************************************************************************************************
    48 // GoFilter declaration
    49 // ****************************************************************************************************
    50 
    52 
    53 
    54 
    55 // ****************************************************************************************************
    56 // for_each_go declaration
    57 // ****************************************************************************************************
    58 
    59 #define for_each_go(go, gos)\
    60 /***************************/\
    61 {\
    62  GoLocator _locator = gos.getLocator();\
    63  while (_locator.isValid()) {\
    64  Go* go = _locator.getElement();\
    65  _locator.progress();
    66 
    67 
    68 
    69 } // End of Hurricane namespace.
    70 
    71 #endif // HURRICANE_GOS
    72 
    73 
    74 // ****************************************************************************************************
    75 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    76 // ****************************************************************************************************
    Go description (API)
    Definition: Go.h:34
    GenericFilter< Go * > GoFilter
    Definition: Gos.h:51
    GenericCollection< Go * > Gos
    Definition: Gos.h:27
    Generic Locator auto-pointer.
    Definition: Locator.h:113
    @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Hook_8h_source.html b/hurricane/doc/hurricane/html/Hook_8h_source.html index 896eae6d..6c06a522 100644 --- a/hurricane/doc/hurricane/html/Hook_8h_source.html +++ b/hurricane/doc/hurricane/html/Hook_8h_source.html @@ -44,12 +44,11 @@ $(function() {
    Hook.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Hook.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_HOOK
    21 #define HURRICANE_HOOK
    22 
    23 #include "hurricane/Error.h"
    24 #include "hurricane/Hooks.h"
    25 
    26 namespace Hurricane {
    27 
    28 class Component;
    29 
    30 
    31 
    32 // ****************************************************************************************************
    33 // Hook declaration
    34 // ****************************************************************************************************
    35 
    36 class Hook {
    37 // *********
    38 
    39  typedef Hook* (*compToHook_t)(Component*);
    40 
    41 // Attributes
    42 // **********
    43 
    44  private: static map<string,compToHook_t> _compToHookMap;
    45  private: Hook* _nextHook;
    46 
    47 // Constructors
    48 // ************
    49 
    50  protected: Hook();
    51 
    52  private: Hook(const Hook& hook); // not implemented to forbid copy construction
    53 
    54 // Destructor
    55 // **********
    56 
    57  protected: virtual ~Hook() throw(Error);
    58 
    59 // Operators
    60 // *********
    61 
    62  private: Hook& operator=(const Hook& hook); // not implemented to forbid assignment
    63 
    64 // Accessors
    65 // *********
    66 
    67  public: virtual Component* getComponent() const = 0;
    68 
    69  public: Hook* getNextHook() const;
    70  public: Hook* getPreviousHook() const;
    71 
    72  public: Hook* getMasterHook() const;
    73  public: Hook* getNextMasterHook() const;
    74  public: Hook* getPreviousMasterHook() const;
    75 
    76  public: Hooks getHooks() const;
    77  public: Hooks getSlaveHooks() const;
    78 
    79 // Filters
    80 // *******
    81 
    82  public: static HookFilter getIsMasterFilter();
    83 
    84 // Predicates
    85 // **********
    86 
    87  public: virtual bool isMaster() const = 0;
    88 
    89  public: bool isAttached() const;
    90 
    91 // Updators
    92 // ********
    93 
    94  public: Hook* detach();
    95  public: Hook* attach(Hook* hook);
    96  public: Hook* merge(Hook* hook);
    97  public: void _setNextHook(Hook* hook);
    98 
    99 // Others
    100 // ******
    101 
    102  public: static void addCompToHook(const string&, compToHook_t );
    103  public: static Hook* compToHook(const string& tname, Component* );
    104  public: string toJson() const;
    105  public: virtual string _getTypeName() const = 0;
    106  public: virtual string _getString() const = 0;
    107  public: virtual Record* _getRecord() const;
    108 
    109 };
    110 
    111 
    112 } // End of Hurricane namespace.
    113 
    114 
    115 INSPECTOR_P_SUPPORT(Hurricane::Hook);
    116 
    117 
    118 #endif // HURRICANE_HOOK
    119 
    120 
    121 // ****************************************************************************************************
    122 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    123 // ****************************************************************************************************
    Hooks getSlaveHooks() const
    +
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Hook.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #pragma once
    21 #include "hurricane/Error.h"
    22 #include "hurricane/Hooks.h"
    23 
    24 namespace Hurricane {
    25 
    26 class Component;
    27 
    28 
    29 
    30 // ****************************************************************************************************
    31 // Hook declaration
    32 // ****************************************************************************************************
    33 
    34 class Hook {
    35 // *********
    36 
    37  typedef Hook* (*compToHook_t)(Component*);
    38 
    39 // Attributes
    40 // **********
    41 
    42  private: static map<string,compToHook_t> _compToHookMap;
    43  private: Hook* _nextHook;
    44 
    45 // Constructors
    46 // ************
    47 
    48  protected: Hook();
    49 
    50  private: Hook(const Hook& hook); // not implemented to forbid copy construction
    51 
    52 // Destructor
    53 // **********
    54 
    55  protected: virtual ~Hook() noexcept(false);
    56 
    57 // Operators
    58 // *********
    59 
    60  private: Hook& operator=(const Hook& hook); // not implemented to forbid assignment
    61 
    62 // Accessors
    63 // *********
    64 
    65  public: virtual Component* getComponent() const = 0;
    66 
    67  public: Hook* getNextHook() const;
    68  public: Hook* getPreviousHook() const;
    69 
    70  public: Hook* getMasterHook() const;
    71  public: Hook* getNextMasterHook() const;
    72  public: Hook* getPreviousMasterHook() const;
    73 
    74  public: Hooks getHooks() const;
    75  public: Hooks getSlaveHooks() const;
    76 
    77 // Filters
    78 // *******
    79 
    80  public: static HookFilter getIsMasterFilter();
    81 
    82 // Predicates
    83 // **********
    84 
    85  public: virtual bool isMaster() const = 0;
    86 
    87  public: bool isAttached() const;
    88 
    89 // Updators
    90 // ********
    91 
    92  public: Hook* detach();
    93  public: Hook* attach(Hook* hook);
    94  public: Hook* merge(Hook* hook);
    95  public: void _setNextHook(Hook* hook);
    96 
    97 // Others
    98 // ******
    99 
    100  public: static void addCompToHook(const string&, compToHook_t );
    101  public: static Hook* compToHook(const string& tname, Component* );
    102  public: string toJson() const;
    103  public: virtual string _getTypeName() const = 0;
    104  public: virtual string _getString() const = 0;
    105  public: virtual Record* _getRecord() const;
    106 
    107 };
    108 
    109 
    110 } // End of Hurricane namespace.
    111 
    112 
    113 INSPECTOR_P_SUPPORT(Hurricane::Hook);
    114 
    115 
    116 // ****************************************************************************************************
    117 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    118 // ****************************************************************************************************
    Hooks getSlaveHooks() const
    Hooks getHooks() const
    virtual bool isMaster() const =0
    Component description (API)
    Definition: Component.h:42
    Hook * getPreviousHook() const
    -
    Error description (API)
    Definition: Error.h:43
    Generic Filter auto-pointer.
    Definition: Filter.h:27
    bool isAttached() const
    virtual Component * getComponent() const =0
    @@ -58,7 +57,7 @@ $(function() {
    Hook * getMasterHook() const
    Hook * getPreviousMasterHook() const
    -
    Hook description (API)
    Definition: Hook.h:36
    +
    Hook description (API)
    Definition: Hook.h:34
    Hook * merge(Hook *hook)
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    Hook * getNextMasterHook() const
    @@ -68,7 +67,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Hooks_8h_source.html b/hurricane/doc/hurricane/html/Hooks_8h_source.html index 7da18b8c..42a418e1 100644 --- a/hurricane/doc/hurricane/html/Hooks_8h_source.html +++ b/hurricane/doc/hurricane/html/Hooks_8h_source.html @@ -49,7 +49,7 @@ $(function() {
    GenericFilter< Hook * > HookFilter
    Definition: Hooks.h:51
    GenericCollection< Hook * > Hooks
    Definition: Hooks.h:27
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    -
    Hook description (API)
    Definition: Hook.h:36
    +
    Hook description (API)
    Definition: Hook.h:34
    GenericLocator< Hook * > HookLocator
    Definition: Hooks.h:43
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Horizontal_8h_source.html b/hurricane/doc/hurricane/html/Horizontal_8h_source.html index aa684022..67496cfa 100644 --- a/hurricane/doc/hurricane/html/Horizontal_8h_source.html +++ b/hurricane/doc/hurricane/html/Horizontal_8h_source.html @@ -50,7 +50,7 @@ $(function() {
    void setY(const DbU::Unit &y)
    Support for JSON export.
    Definition: JsonObject.h:83
    Segment Inherit
    Definition: Horizontal.h:42
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    Point description (API)
    Definition: Point.h:32
    Horizontal description (API)
    Definition: Horizontal.h:36
    Box description (API)
    Definition: Box.h:31
    @@ -65,7 +65,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Horizontals_8h_source.html b/hurricane/doc/hurricane/html/Horizontals_8h_source.html index d9b188e1..3cedb504 100644 --- a/hurricane/doc/hurricane/html/Horizontals_8h_source.html +++ b/hurricane/doc/hurricane/html/Horizontals_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/HyperNet_8h_source.html b/hurricane/doc/hurricane/html/HyperNet_8h_source.html index 25dfa54d..c958f629 100644 --- a/hurricane/doc/hurricane/html/HyperNet_8h_source.html +++ b/hurricane/doc/hurricane/html/HyperNet_8h_source.html @@ -50,7 +50,7 @@ $(function() {
    Cell * getCell() const
    Definition: HyperNet.h:56
    HyperNet(const Occurrence &occurrence)
    const Occurrence & getNetOccurrence() const
    Definition: HyperNet.h:55
    -
    The model (API).
    Definition: Cell.h:66
    +
    The model (API).
    Definition: Cell.h:64
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    Cell * getOwnerCell() const
    Box description (API)
    Definition: Box.h:31
    @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Initializer_8h_source.html b/hurricane/doc/hurricane/html/Initializer_8h_source.html index ae7dfff0..f666e598 100644 --- a/hurricane/doc/hurricane/html/Initializer_8h_source.html +++ b/hurricane/doc/hurricane/html/Initializer_8h_source.html @@ -52,7 +52,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Instance_8h_source.html b/hurricane/doc/hurricane/html/Instance_8h_source.html index 750bbe25..c30bf547 100644 --- a/hurricane/doc/hurricane/html/Instance_8h_source.html +++ b/hurricane/doc/hurricane/html/Instance_8h_source.html @@ -44,21 +44,21 @@ $(function() {
    Instance.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Instance.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_INSTANCE_H
    21 #define HURRICANE_INSTANCE_H
    22 
    23 #include "hurricane/Go.h"
    24 #include "hurricane/Plug.h"
    25 #include "hurricane/SharedPath.h"
    26 //#include "hurricane/IntrusiveMap.h"
    27 
    28 namespace Hurricane {
    29 
    30 class Net;
    31 class BasicLayer;
    32 
    33 // ****************************************************************************************************
    34 // Instance declaration
    35 // ****************************************************************************************************
    36 
    37 class Instance : public Go {
    38 // ***********************
    39 
    40 // Types
    41 // *****
    42 
    43  public: typedef Go Inherit;
    44 
    45  public: class PlacementStatus {
    46  // **************************
    47 
    48  public: enum Code {UNPLACED=0, PLACED=1, FIXED=2};
    49 
    50  private: Code _code;
    51 
    52  public: PlacementStatus(const Code& code = UNPLACED);
    53  public: PlacementStatus(const PlacementStatus& placementstatus);
    54  public: PlacementStatus(string);
    55 
    56  public: PlacementStatus& operator=(const PlacementStatus& placementstatus);
    57 
    58  public: operator const Code&() const {return _code;};
    59 
    60  public: const Code& getCode() const {return _code;};
    61 
    62  public: string _getTypeName() const { return _TName("Instance::PlacementStatus"); };
    63  public: string _getString() const;
    64  public: Record* _getRecord() const;
    65 
    66  };
    67 
    68  public: class PlugMap : public IntrusiveMap<const Net*, Plug> {
    69  // **********************************************************
    70 
    71  public: typedef IntrusiveMap<const Net*, Plug> Inherit;
    72 
    73  public: PlugMap();
    74 
    75  public: virtual const Net* _getKey(Plug* plug) const;
    76  public: virtual unsigned _getHashValue(const Net* masterNet) const;
    77  public: virtual Plug* _getNextElement(Plug* plug) const;
    78  public: virtual void _setNextElement(Plug* plug, Plug* nextPlug) const;
    79 
    80  };
    81 
    82  public: class SharedPathMap : public IntrusiveMap<const SharedPath*, SharedPath> {
    83  // *****************************************************************************
    84 
    85  public: typedef IntrusiveMap<const SharedPath*, SharedPath> Inherit;
    86 
    87  public: SharedPathMap();
    88 
    89  public: virtual const SharedPath* _getKey(SharedPath* sharedPath) const;
    90  public: virtual unsigned _getHashValue(const SharedPath* tailSharedPath) const;
    91  public: virtual SharedPath* _getNextElement(SharedPath* sharedPath) const;
    92  public: virtual void _setNextElement(SharedPath* sharedPath, SharedPath* nextSharedPath) const;
    93 
    94  };
    95 
    96 // Attributes
    97 // **********
    98 
    99  private: Cell* _cell;
    100  private: Name _name;
    101  private: Cell* _masterCell;
    102  private: Transformation _transformation;
    103  private: PlacementStatus _placementStatus;
    104  private: PlugMap _plugMap;
    105  private: SharedPathMap _sharedPathMap;
    106  private: Instance* _nextOfCellInstanceMap;
    107  private: Instance* _nextOfCellSlaveInstanceSet;
    108 
    109 // Constructors
    110 // ************
    111 
    112  protected: Instance(Cell* cell, const Name& name, Cell* masterCell, const Transformation& transformation, const PlacementStatus& placementstatus, bool secureFlag);
    113 
    114  public: static Instance* create(Cell* cell, const Name& name, Cell* masterCell, bool secureFlag = true);
    115  public: static Instance* create(Cell* cell, const Name& name, Cell* masterCell, const Transformation& transformation, const PlacementStatus& placementstatus, bool secureFlag = true);
    116 
    117 // Accessors
    118 // *********
    119 
    120  public: virtual Cell* getCell() const {return _cell;};
    121  public: virtual Box getBoundingBox() const;
    122  public: const Name& getName() const {return _name;};
    123  public: Cell* getMasterCell() const {return _masterCell;};
    124  public: const Transformation& getTransformation() const {return _transformation;};
    125  public: const PlacementStatus& getPlacementStatus() const {return _placementStatus;};
    126  public: Plug* getPlug(const Net* masterNet) const {return _plugMap.getElement(masterNet);};
    127  public: Plugs getPlugs() const {return _plugMap.getElements();};
    128  public: Plugs getConnectedPlugs() const;
    129  public: Plugs getUnconnectedPlugs() const;
    130  public: Path getPath(const Path& tailPath = Path()) const;
    131  public: Box getAbutmentBox() const;
    132 
    133 // Predicates
    134 // **********
    135 
    136  public: bool isUnplaced() const {return _placementStatus == PlacementStatus::UNPLACED;};
    137  public: bool isPlaced() const {return _placementStatus == PlacementStatus::PLACED;};
    138  public: bool isFixed() const {return _placementStatus == PlacementStatus::FIXED;};
    139  public: bool isTerminal() const;
    140  public: bool isTerminalNetlist() const;
    141  public: bool isUnique() const;
    142  public: bool isUniquified() const;
    143  public: bool isUniquifyMaster() const;
    144 
    145 // Filters
    146 // *******
    147 
    148  public: static InstanceFilter getIsUnderFilter(const Box& area);
    149  public: static InstanceFilter getIsTerminalFilter();
    150  public: static InstanceFilter getIsTerminalNetlistFilter();
    151  public: static InstanceFilter getIsUnplacedFilter();
    152  public: static InstanceFilter getIsPlacedFilter();
    153  public: static InstanceFilter getIsFixedFilter();
    154  public: static InstanceFilter getIsNotUnplacedFilter();
    155 
    156 // Updators
    157 // ********
    158 
    159  public: virtual void materialize();
    160  public: virtual void unmaterialize();
    161  public: virtual void invalidate(bool propagateFlag = true);
    162  public: virtual void translate(const DbU::Unit& dx, const DbU::Unit& dy);
    163 
    164  public: void setName(const Name& name);
    165  public: void setTransformation(const Transformation& transformation);
    166  public: void setPlacementStatus(const PlacementStatus& placementstatus);
    167  public: void setMasterCell(Cell* masterCell, bool secureFlag = true);
    168  public: void uniquify();
    169  public: void slaveAbutmentBox();
    170  public: Instance* getClone(Cell* cloneCell) const;
    171 
    172 // Others
    173 // ******
    174 
    175  protected: virtual void _postCreate();
    176 
    177  protected: virtual void _preDestroy();
    178 
    179  public: virtual string _getTypeName() const {return _TName("Instance");};
    180  public: virtual string _getString() const;
    181  public: virtual Record* _getRecord() const;
    182  public: virtual void _toJson(JsonWriter*) const;
    183  public: virtual void _toJsonCollections(JsonWriter*) const;
    184  public: PlugMap& _getPlugMap() {return _plugMap;};
    185  public: SharedPath* _getSharedPath(const SharedPath* tailSharedPath) const {return _sharedPathMap.getElement(tailSharedPath);}
    186  public: SharedPathes _getSharedPathes() const {return _sharedPathMap.getElements();};
    187  public: SharedPathMap& _getSharedPathMap() {return _sharedPathMap;};
    188  public: Instance* _getNextOfCellInstanceMap() const {return _nextOfCellInstanceMap;};
    189  public: Instance* _getNextOfCellSlaveInstanceSet() const {return _nextOfCellSlaveInstanceSet;};
    190 
    191  public: void _setNextOfCellInstanceMap(Instance* instance) {_nextOfCellInstanceMap = instance;};
    192  public: void _setNextOfCellSlaveInstanceSet(Instance* instance) {_nextOfCellSlaveInstanceSet = instance;};
    193 
    194 };
    195 
    196 
    197 class JsonInstance : public JsonEntity {
    198 // *************************************
    199 
    200  public: static void initialize();
    201  public: JsonInstance(unsigned long flags);
    202  public: virtual string getTypeName() const;
    203  public: virtual JsonInstance* clone(unsigned long) const;
    204  public: virtual void toData(JsonStack&);
    205 };
    206 
    207 } // End of Hurricane namespace.
    208 
    209 
    210 // -------------------------------------------------------------------
    211 // Inspector Support for : Instance::PlacementStatus::Code*".
    212 
    213 template<>
    214 inline std::string getString<const Hurricane::Instance::PlacementStatus::Code*>
    216  {
    217  switch ( *object ) {
    218  case Hurricane::Instance::PlacementStatus::UNPLACED: return "UNPLACED";
    219  case Hurricane::Instance::PlacementStatus::PLACED: return "PLACED";
    220  case Hurricane::Instance::PlacementStatus::FIXED: return "FIXED";
    221  }
    222  return "ABNORMAL";
    223  }
    224 
    225 template<>
    226 inline std::string getString<Hurricane::Instance::PlacementStatus::Code>
    228  {
    229  switch ( object ) {
    230  case Hurricane::Instance::PlacementStatus::UNPLACED: return "UNPLACED";
    231  case Hurricane::Instance::PlacementStatus::PLACED: return "PLACED";
    232  case Hurricane::Instance::PlacementStatus::FIXED: return "FIXED";
    233  }
    234  return "ABNORMAL";
    235  }
    236 
    237 template<>
    238 inline Hurricane::Record* getRecord<const Hurricane::Instance::PlacementStatus::Code*>
    240  {
    241  Hurricane::Record* record = new Hurricane::Record(getString(object));
    242  record->add(getSlot("Code", (unsigned int*)object));
    243  return record;
    244  }
    245 
    246 template<>
    247 inline Hurricane::Record* getRecord<const Hurricane::Instance::PlacementStatus::Code>
    249  {
    250  Hurricane::Record* record = new Hurricane::Record(getString(object));
    251  record->add(getSlot("Code", (unsigned int)object));
    252  return record;
    253  }
    254 
    255 
    256 INSPECTOR_P_SUPPORT(Hurricane::Instance);
    257 INSPECTOR_P_SUPPORT(Hurricane::Instance::PlacementStatus);
    258 INSPECTOR_P_SUPPORT(Hurricane::Instance::PlugMap);
    259 INSPECTOR_P_SUPPORT(Hurricane::Instance::SharedPathMap);
    260 
    261 inline void jsonWrite ( JsonWriter* w, const std::string& key, const Hurricane::Instance::PlacementStatus& status )
    262 {
    263  w->key( key );
    264  w->write( getString(status.getCode()) );
    265 }
    266 
    267 #endif // HURRICANE_INSTANCE
    268 
    269 
    270 // ****************************************************************************************************
    271 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    272 // ****************************************************************************************************
    Path description (API)
    Definition: Path.h:37
    -
    Go description (API)
    Definition: Go.h:36
    -
    const Code & getCode() const
    Definition: Instance.h:60
    +
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Instance.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #pragma once
    21 #include "hurricane/Go.h"
    22 #include "hurricane/Plug.h"
    23 #include "hurricane/SharedPath.h"
    24 //#include "hurricane/IntrusiveMap.h"
    25 
    26 namespace Hurricane {
    27 
    28 class Net;
    29 class BasicLayer;
    30 
    31 // ****************************************************************************************************
    32 // Instance declaration
    33 // ****************************************************************************************************
    34 
    35 class Instance : public Go {
    36 // ***********************
    37 
    38 // Types
    39 // *****
    40 
    41  public: typedef Go Inherit;
    42 
    43  public: class PlacementStatus {
    44  // **************************
    45 
    46  public: enum Code {UNPLACED=0, PLACED=1, FIXED=2};
    47 
    48  private: Code _code;
    49 
    50  public: PlacementStatus(const Code& code = UNPLACED);
    51  public: PlacementStatus(const PlacementStatus& placementstatus);
    52  public: PlacementStatus(string);
    53 
    54  public: PlacementStatus& operator=(const PlacementStatus& placementstatus);
    55 
    56  public: operator const Code&() const {return _code;};
    57 
    58  public: const Code& getCode() const {return _code;};
    59 
    60  public: string _getTypeName() const { return _TName("Instance::PlacementStatus"); };
    61  public: string _getString() const;
    62  public: Record* _getRecord() const;
    63 
    64  };
    65 
    66  public: class PlugMap : public IntrusiveMap<const Net*, Plug> {
    67  // **********************************************************
    68 
    69  public: typedef IntrusiveMap<const Net*, Plug> Inherit;
    70 
    71  public: PlugMap();
    72 
    73  public: virtual const Net* _getKey(Plug* plug) const;
    74  public: virtual unsigned _getHashValue(const Net* masterNet) const;
    75  public: virtual Plug* _getNextElement(Plug* plug) const;
    76  public: virtual void _setNextElement(Plug* plug, Plug* nextPlug) const;
    77 
    78  };
    79 
    80  public: class SharedPathMap : public IntrusiveMap<const SharedPath*, SharedPath> {
    81  // *****************************************************************************
    82 
    83  public: typedef IntrusiveMap<const SharedPath*, SharedPath> Inherit;
    84 
    85  public: SharedPathMap();
    86 
    87  public: virtual const SharedPath* _getKey(SharedPath* sharedPath) const;
    88  public: virtual unsigned _getHashValue(const SharedPath* tailSharedPath) const;
    89  public: virtual SharedPath* _getNextElement(SharedPath* sharedPath) const;
    90  public: virtual void _setNextElement(SharedPath* sharedPath, SharedPath* nextSharedPath) const;
    91 
    92  };
    93 
    94 // Attributes
    95 // **********
    96 
    97  private: Cell* _cell;
    98  private: Name _name;
    99  private: Cell* _masterCell;
    100  private: Transformation _transformation;
    101  private: PlacementStatus _placementStatus;
    102  private: PlugMap _plugMap;
    103  private: SharedPathMap _sharedPathMap;
    104  private: Instance* _nextOfCellInstanceMap;
    105  private: Instance* _nextOfCellSlaveInstanceSet;
    106 
    107 // Constructors
    108 // ************
    109 
    110  protected: Instance(Cell* cell, const Name& name, Cell* masterCell, const Transformation& transformation, const PlacementStatus& placementstatus, bool secureFlag);
    111 
    112  public: static Instance* create(Cell* cell, const Name& name, Cell* masterCell, bool secureFlag = true);
    113  public: static Instance* create(Cell* cell, const Name& name, Cell* masterCell, const Transformation& transformation, const PlacementStatus& placementstatus, bool secureFlag = true);
    114 
    115 // Accessors
    116 // *********
    117 
    118  public: virtual Cell* getCell() const {return _cell;};
    119  public: virtual Box getBoundingBox() const;
    120  public: const Name& getName() const {return _name;};
    121  public: Cell* getMasterCell() const {return _masterCell;};
    122  public: const Transformation& getTransformation() const {return _transformation;};
    123  public: const PlacementStatus& getPlacementStatus() const {return _placementStatus;};
    124  public: Plug* getPlug(const Net* masterNet) const {return _plugMap.getElement(masterNet);};
    125  public: Plugs getPlugs() const {return _plugMap.getElements();};
    126  public: Plugs getConnectedPlugs() const;
    127  public: Plugs getUnconnectedPlugs() const;
    128  public: Path getPath(const Path& tailPath = Path()) const;
    129  public: Box getAbutmentBox() const;
    130 
    131 // Predicates
    132 // **********
    133 
    134  public: bool isUnplaced() const {return _placementStatus == PlacementStatus::UNPLACED;};
    135  public: bool isPlaced() const {return _placementStatus == PlacementStatus::PLACED;};
    136  public: bool isFixed() const {return _placementStatus == PlacementStatus::FIXED;};
    137  public: bool isTerminal() const;
    138  public: bool isTerminalNetlist() const;
    139  public: bool isUnique() const;
    140  public: bool isUniquified() const;
    141  public: bool isUniquifyMaster() const;
    142 
    143 // Filters
    144 // *******
    145 
    146  public: static InstanceFilter getIsUnderFilter(const Box& area);
    147  public: static InstanceFilter getIsTerminalFilter();
    148  public: static InstanceFilter getIsTerminalNetlistFilter();
    149  public: static InstanceFilter getIsUnplacedFilter();
    150  public: static InstanceFilter getIsPlacedFilter();
    151  public: static InstanceFilter getIsFixedFilter();
    152  public: static InstanceFilter getIsNotUnplacedFilter();
    153  public: static InstanceFilter getPruneMasterFilter( uint64_t );
    154 
    155 // Updators
    156 // ********
    157 
    158  public: virtual void materialize();
    159  public: virtual void unmaterialize();
    160  public: virtual void invalidate(bool propagateFlag = true);
    161  public: virtual void translate(const DbU::Unit& dx, const DbU::Unit& dy);
    162 
    163  public: void setName(const Name& name);
    164  public: void setTransformation(const Transformation& transformation);
    165  public: void setPlacementStatus(const PlacementStatus& placementstatus);
    166  public: void setMasterCell(Cell* masterCell, bool secureFlag = true);
    167  public: void uniquify();
    168  public: void slaveAbutmentBox();
    169  public: Instance* getClone(Cell* cloneCell) const;
    170 
    171 // Others
    172 // ******
    173 
    174  protected: virtual void _postCreate();
    175 
    176  protected: virtual void _preDestroy();
    177 
    178  public: virtual string _getTypeName() const {return _TName("Instance");};
    179  public: virtual string _getString() const;
    180  public: virtual Record* _getRecord() const;
    181  public: virtual void _toJson(JsonWriter*) const;
    182  public: virtual void _toJsonCollections(JsonWriter*) const;
    183  public: PlugMap& _getPlugMap() {return _plugMap;};
    184  public: SharedPath* _getSharedPath(const SharedPath* tailSharedPath) const {return _sharedPathMap.getElement(tailSharedPath);}
    185  public: SharedPathes _getSharedPathes() const {return _sharedPathMap.getElements();};
    186  public: SharedPathMap& _getSharedPathMap() {return _sharedPathMap;};
    187  public: Instance* _getNextOfCellInstanceMap() const {return _nextOfCellInstanceMap;};
    188  public: Instance* _getNextOfCellSlaveInstanceSet() const {return _nextOfCellSlaveInstanceSet;};
    189 
    190  public: void _setNextOfCellInstanceMap(Instance* instance) {_nextOfCellInstanceMap = instance;};
    191  public: void _setNextOfCellSlaveInstanceSet(Instance* instance) {_nextOfCellSlaveInstanceSet = instance;};
    192 
    193 };
    194 
    195 
    196 class JsonInstance : public JsonEntity {
    197 // *************************************
    198 
    199  public: static void initialize();
    200  public: JsonInstance(unsigned long flags);
    201  public: virtual string getTypeName() const;
    202  public: virtual JsonInstance* clone(unsigned long) const;
    203  public: virtual void toData(JsonStack&);
    204 };
    205 
    206 } // End of Hurricane namespace.
    207 
    208 
    209 // -------------------------------------------------------------------
    210 // Inspector Support for : Instance::PlacementStatus::Code*".
    211 
    212 template<>
    213 inline std::string getString<const Hurricane::Instance::PlacementStatus::Code*>
    215  {
    216  switch ( *object ) {
    217  case Hurricane::Instance::PlacementStatus::UNPLACED: return "UNPLACED";
    218  case Hurricane::Instance::PlacementStatus::PLACED: return "PLACED";
    219  case Hurricane::Instance::PlacementStatus::FIXED: return "FIXED";
    220  }
    221  return "ABNORMAL";
    222  }
    223 
    224 template<>
    225 inline std::string getString<Hurricane::Instance::PlacementStatus::Code>
    227  {
    228  switch ( object ) {
    229  case Hurricane::Instance::PlacementStatus::UNPLACED: return "UNPLACED";
    230  case Hurricane::Instance::PlacementStatus::PLACED: return "PLACED";
    231  case Hurricane::Instance::PlacementStatus::FIXED: return "FIXED";
    232  }
    233  return "ABNORMAL";
    234  }
    235 
    236 template<>
    237 inline Hurricane::Record* getRecord<const Hurricane::Instance::PlacementStatus::Code*>
    239  {
    240  Hurricane::Record* record = new Hurricane::Record(getString(object));
    241  record->add(getSlot("Code", (unsigned int*)object));
    242  return record;
    243  }
    244 
    245 // template<>
    246 // inline Hurricane::Record* getRecord<const Hurricane::Instance::PlacementStatus::Code>
    247 // ( const Hurricane::Instance::PlacementStatus::Code object )
    248 // {
    249 // Hurricane::Record* record = new Hurricane::Record(getString(object));
    250 // record->add(getSlot("Code", (unsigned int)object));
    251 // return record;
    252 // }
    253 
    254 
    255 INSPECTOR_P_SUPPORT(Hurricane::Instance);
    256 INSPECTOR_P_SUPPORT(Hurricane::Instance::PlacementStatus);
    257 INSPECTOR_P_SUPPORT(Hurricane::Instance::PlugMap);
    258 INSPECTOR_P_SUPPORT(Hurricane::Instance::SharedPathMap);
    259 
    260 inline void jsonWrite ( JsonWriter* w, const std::string& key, const Hurricane::Instance::PlacementStatus& status )
    261 {
    262  w->key( key );
    263  w->write( getString(status.getCode()) );
    264 }
    265 
    266 
    267 // ****************************************************************************************************
    268 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    269 // ****************************************************************************************************
    Path description (API)
    Definition: Path.h:35
    +
    Go description (API)
    Definition: Go.h:34
    +
    const Code & getCode() const
    Definition: Instance.h:58
    PlacementStatus(const Code &code=UNPLACED)
    GenericFilter< Instance * > InstanceFilter
    Definition: Instances.h:51
    -
    Cell * getMasterCell() const
    Definition: Instance.h:123
    -
    Plugs getPlugs() const
    Definition: Instance.h:127
    +
    Cell * getMasterCell() const
    Definition: Instance.h:121
    +
    Plugs getPlugs() const
    Definition: Instance.h:125
    Plugs getConnectedPlugs() const
    Name description (API)
    Definition: Name.h:35
    static InstanceFilter getIsUnderFilter(const Box &area)
    -
    Code
    Definition: Instance.h:48
    -
    std::int64_t Unit
    Definition: DbU.h:70
    - -
    The model (API).
    Definition: Cell.h:66
    - +
    Code
    Definition: Instance.h:46
    +
    std::int64_t Unit
    Definition: DbU.h:67
    + +
    The model (API).
    Definition: Cell.h:64
    +
    Instance * getClone(Cell *cloneCell) const
    Box getAbutmentBox() const
    @@ -66,27 +66,27 @@ $(function() {
    Transformation description (API)
    Definition: Transformation.h:32
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    Path getPath(const Path &tailPath=Path()) const
    -
    const Name & getName() const
    Definition: Instance.h:122
    +
    const Name & getName() const
    Definition: Instance.h:120
    Box description (API)
    Definition: Box.h:31
    -
    Instance description (API)
    Definition: Instance.h:37
    -
    Go Inherit
    Definition: Instance.h:43
    +
    Instance description (API)
    Definition: Instance.h:35
    +
    Go Inherit
    Definition: Instance.h:41
    void setTransformation(const Transformation &transformation)
    static Instance * create(Cell *cell, const Name &name, Cell *masterCell, bool secureFlag=true)
    -
    Instance Placement Status (API)
    Definition: Instance.h:45
    +
    Instance Placement Status (API)
    Definition: Instance.h:43
    void setMasterCell(Cell *masterCell, bool secureFlag=true)
    Plug description (API)
    Definition: Plug.h:37
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    -
    Plug * getPlug(const Net *masterNet) const
    Definition: Instance.h:126
    -
    const Transformation & getTransformation() const
    Definition: Instance.h:124
    +
    Plug * getPlug(const Net *masterNet) const
    Definition: Instance.h:124
    +
    const Transformation & getTransformation() const
    Definition: Instance.h:122
    Plugs getUnconnectedPlugs() const
    - +
    Net description (API)
    Definition: Net.h:48


    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Instances_8h_source.html b/hurricane/doc/hurricane/html/Instances_8h_source.html index ae64e468..a2af97ec 100644 --- a/hurricane/doc/hurricane/html/Instances_8h_source.html +++ b/hurricane/doc/hurricane/html/Instances_8h_source.html @@ -49,7 +49,7 @@ $(function() {
    GenericLocator< Instance * > InstanceLocator
    Definition: Instances.h:43
    Generic Filter auto-pointer.
    Definition: Filter.h:27
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    -
    Instance description (API)
    Definition: Instance.h:37
    +
    Instance description (API)
    Definition: Instance.h:35
    GenericCollection< Instance * > Instances
    Definition: Instances.h:27
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Interruption_8h_source.html b/hurricane/doc/hurricane/html/Interruption_8h_source.html index 87bb972d..2bc49bbe 100644 --- a/hurricane/doc/hurricane/html/Interruption_8h_source.html +++ b/hurricane/doc/hurricane/html/Interruption_8h_source.html @@ -55,7 +55,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Interval_8h_source.html b/hurricane/doc/hurricane/html/Interval_8h_source.html index 3e8268c7..5e5f7bc0 100644 --- a/hurricane/doc/hurricane/html/Interval_8h_source.html +++ b/hurricane/doc/hurricane/html/Interval_8h_source.html @@ -49,7 +49,7 @@ $(function() {
    const DbU::Unit & getVMin() const
    Definition: Interval.h:100
    Interval & merge(const DbU::Unit &)
    bool isPonctual() const
    Definition: Interval.h:108
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    Interval description (API)
    Definition: Interval.h:44
    Interval & makeEmpty()
    bool isEmpty() const
    Definition: Interval.h:106
    @@ -72,7 +72,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Intervals_8h_source.html b/hurricane/doc/hurricane/html/Intervals_8h_source.html index 8c3cb297..27055dce 100644 --- a/hurricane/doc/hurricane/html/Intervals_8h_source.html +++ b/hurricane/doc/hurricane/html/Intervals_8h_source.html @@ -50,7 +50,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/JsonObject_8h_source.html b/hurricane/doc/hurricane/html/JsonObject_8h_source.html index 55aef57c..989df96c 100644 --- a/hurricane/doc/hurricane/html/JsonObject_8h_source.html +++ b/hurricane/doc/hurricane/html/JsonObject_8h_source.html @@ -55,8 +55,8 @@ $(function() {
    Definition: JsonObject.h:213
    string demangle(const char *symbol)
    void pop_back_dbo()
    Definition: JsonObject.h:372
    -
    The model (API).
    Definition: Cell.h:66
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    The model (API).
    Definition: Cell.h:64
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    size_t size() const
    Definition: JsonObject.h:375
    void print(std::ostream &) const
    void addEntity(unsigned int jsonId, Entity *)
    @@ -92,7 +92,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/JsonReader_8h_source.html b/hurricane/doc/hurricane/html/JsonReader_8h_source.html index 3d0227c0..8fb09ced 100644 --- a/hurricane/doc/hurricane/html/JsonReader_8h_source.html +++ b/hurricane/doc/hurricane/html/JsonReader_8h_source.html @@ -50,7 +50,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Layer_8h_source.html b/hurricane/doc/hurricane/html/Layer_8h_source.html index cc56b847..400e608c 100644 --- a/hurricane/doc/hurricane/html/Layer_8h_source.html +++ b/hurricane/doc/hurricane/html/Layer_8h_source.html @@ -44,17 +44,17 @@ $(function() {
    Layer.h
    -
    1 
    2 // -*- C++ -*-
    3 //
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify
    9 // it under the terms of the GNU Lesser General Public License as
    10 // published by the Free Software Foundation, either version 3 of the
    11 // License, or (at your option) any later version.
    12 //
    13 // Hurricane is distributed in the hope that it will be useful, but
    14 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    15 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    16 // General Public License for more details.
    17 //
    18 // You should have received a copy of the Lesser GNU General Public
    19 // License along with Hurricane. If not, see
    20 // <http://www.gnu.org/licenses/>.
    21 //
    22 // +-----------------------------------------------------------------+
    23 // | H U R R I C A N E |
    24 // | V L S I B a c k e n d D a t a - B a s e |
    25 // | |
    26 // | Author : Remy Escassut |
    27 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    28 // | =============================================================== |
    29 // | C++ Header : "./hurricane/Layer.h" |
    30 // +-----------------------------------------------------------------+
    31 
    32 
    33 #ifndef HURRICANE_LAYER_H
    34 #define HURRICANE_LAYER_H
    35 
    36 #include "hurricane/Mask.h"
    37 #include "hurricane/DBo.h"
    38 #include "hurricane/Layers.h"
    39 #include "hurricane/DbU.h"
    40 #include "hurricane/BasicLayers.h"
    41 
    42 
    43 namespace Hurricane {
    44 
    45 
    46  class Technology;
    47 
    48 
    49 // -------------------------------------------------------------------
    50 // Class : "Hurricane::Layer".
    51 
    52  class Layer : public DBo {
    53  public:
    54  typedef DBo Super;
    55  public:
    56  static const uint32_t NoFlags = 0;
    57  static const uint32_t EnclosureH = (1 << 0);
    58  static const uint32_t EnclosureV = (1 << 1);
    59  static const uint32_t EnclosureMax = (1 << 2);
    60  static const uint32_t ExtensionCap = (1 << 3);
    61  static const uint32_t ExtensionWidth = (1 << 4);
    62 
    63  public:
    64  // Types.
    65  typedef Hurricane::Mask<unsigned long long> Mask;
    66  // Accessors.
    67  inline Technology* getTechnology () const;
    68  inline const Name& getName () const;
    69  inline const Mask& getMask () const;
    70  inline const Mask& getExtractMask () const;
    71  inline const DbU::Unit& getMinimalSize () const;
    72  inline const DbU::Unit& getMinimalSpacing () const;
    73  virtual BasicLayers getBasicLayers () const = 0;
    74  virtual const Layer* getBlockageLayer () const;
    75  virtual const Layer* getCut () const;
    76  virtual const Layer* getTop () const;
    77  virtual const Layer* getBottom () const;
    78  virtual const Layer* getOpposite ( const Layer* ) const;
    79  Layer* getMetalAbove ( bool useSymbolic=true ) const;
    80  Layer* getMetalBelow ( bool useSymbolic=true ) const;
    81  Layer* getCutAbove ( bool useSymbolic=true ) const;
    82  Layer* getCutBelow ( bool useSymbolic=true ) const;
    83  virtual DbU::Unit getEnclosure ( uint32_t flags ) const;
    84  virtual DbU::Unit getExtentionCap () const;
    85  virtual DbU::Unit getExtentionWidth () const;
    86  virtual DbU::Unit getEnclosure ( const BasicLayer* layer, uint32_t flags ) const;
    87  virtual DbU::Unit getExtentionCap ( const BasicLayer* layer ) const;
    88  virtual DbU::Unit getExtentionWidth ( const BasicLayer* layer ) const;
    89  virtual DbU::Unit getTopEnclosure ( uint32_t flags ) const;
    90  virtual DbU::Unit getBottomEnclosure ( uint32_t flags ) const;
    91  // Predicates
    92  inline bool above ( const Layer* layer ) const;
    93  inline bool below ( const Layer* layer ) const;
    94  bool contains ( const Layer* layer ) const;
    95  bool intersect ( const Layer* layer ) const;
    96  inline bool isSymbolic () const;
    97  inline bool isBlockage () const;
    98  // Updators
    99  void setName ( const Name& name );
    100  inline void setSymbolic ( bool );
    101  inline void setBlockage ( bool );
    102  void setMinimalSize ( const DbU::Unit& minimalSize );
    103  void setMinimalSpacing ( const DbU::Unit& minimalSpacing );
    104  virtual void setEnclosure ( const BasicLayer* layer, DbU::Unit, uint32_t flags );
    105  virtual void setExtentionCap ( const BasicLayer* layer, DbU::Unit );
    106  virtual void setExtentionWidth ( const BasicLayer* layer, DbU::Unit );
    107  // Hurricane Managment.
    108  virtual void _toJson ( JsonWriter* ) const;
    109  virtual string _getString () const;
    110  virtual Record* _getRecord () const;
    111  inline Layer* _getNextOfTechnologyLayerMap () const;
    112  inline void _setMask ( const Mask& mask );
    113  inline void _setExtractMask ( const Mask& extractMask );
    114  inline void _setNextOfTechnologyLayerMap ( Layer* layer );
    115  virtual void _onDbuChange ( float scale );
    116  static const Name& _sgetName ( const Layer* );
    117 
    118  private:
    119  // Internal: Attributes
    120  Technology* _technology;
    121  Name _name;
    122  Mask _mask;
    123  Mask _extractMask;
    124  DbU::Unit _minimalSize;
    125  DbU::Unit _minimalSpacing;
    126  Layer* _nextOfTechnologyLayerMap;
    127  bool _symbolic;
    128  bool _blockage;
    129 
    130  protected:
    131  // Internal: Constructors & Destructors.
    132  Layer ( Technology* technology
    133  , const Name& name
    134  , const DbU::Unit& minimalSize = 0
    135  , const DbU::Unit& minimalSpacing = 0
    136  , const DbU::Unit& pitch = 0
    137  );
    138  virtual void _postCreate ();
    139  virtual void _preDestroy ();
    140 
    141  public:
    142  struct CompareByMask : public binary_function<const Layer*,const Layer*,bool> {
    143  inline bool operator() ( const Layer* lhs, const Layer* rhs ) const;
    144  };
    145  };
    146 
    147 
    148 // Inline Functions.
    149  inline bool Layer::isSymbolic () const { return _symbolic; }
    150  inline bool Layer::isBlockage () const { return _blockage; }
    151  inline bool Layer::above ( const Layer* layer ) const { return _mask > layer->getMask(); }
    152  inline bool Layer::below ( const Layer* layer ) const { return _mask < layer->getMask(); }
    153  inline Technology* Layer::getTechnology () const { return _technology; }
    154  inline const Name& Layer::getName () const { return _name; }
    155  inline const Layer::Mask& Layer::getMask () const { return _mask; }
    156  inline const Layer::Mask& Layer::getExtractMask () const { return _extractMask; }
    157  inline const DbU::Unit& Layer::getMinimalSize () const { return _minimalSize; }
    158  inline const DbU::Unit& Layer::getMinimalSpacing () const { return _minimalSpacing; }
    159  inline void Layer::setSymbolic ( bool state ) { _symbolic = state; }
    160  inline void Layer::setBlockage ( bool state ) { _blockage = state; }
    161  inline Layer* Layer::_getNextOfTechnologyLayerMap () const { return _nextOfTechnologyLayerMap; }
    162  inline void Layer::_setMask ( const Mask& mask ) { _mask = mask; }
    163  inline void Layer::_setExtractMask ( const Mask& extractMask ) { _extractMask = extractMask; }
    164  inline void Layer::_setNextOfTechnologyLayerMap ( Layer* layer ) { _nextOfTechnologyLayerMap = layer; }
    165 
    166  inline bool Layer::CompareByMask::operator() ( const Layer* lhs, const Layer* rhs ) const
    167  { return (lhs?lhs->getMask():Layer::Mask()) < (rhs?rhs->getMask():Layer::Mask()); }
    168 
    169 
    170 // -------------------------------------------------------------------
    171 // Class : "Hurricane::JsonLayer".
    172 
    173  class JsonLayer : public JsonDBo {
    174  public:
    175  JsonLayer ( unsigned long flags );
    176  Technology* lookupTechnology ( JsonStack&, const string& fname ) const;
    177  };
    178 
    179 
    180 } // Hurricane namespace.
    181 
    182 
    183 INSPECTOR_P_SUPPORT(Hurricane::Layer);
    184 INSPECTOR_PR_SUPPORT(Hurricane::Layer::Mask);
    185 
    186 
    187 #endif // HURRICANE_LAYER_H
    void setName(const Name &name)
    +
    1 
    2 // -*- C++ -*-
    3 //
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify
    9 // it under the terms of the GNU Lesser General Public License as
    10 // published by the Free Software Foundation, either version 3 of the
    11 // License, or (at your option) any later version.
    12 //
    13 // Hurricane is distributed in the hope that it will be useful, but
    14 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    15 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    16 // General Public License for more details.
    17 //
    18 // You should have received a copy of the Lesser GNU General Public
    19 // License along with Hurricane. If not, see
    20 // <http://www.gnu.org/licenses/>.
    21 //
    22 // +-----------------------------------------------------------------+
    23 // | H U R R I C A N E |
    24 // | V L S I B a c k e n d D a t a - B a s e |
    25 // | |
    26 // | Author : Remy Escassut |
    27 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    28 // | =============================================================== |
    29 // | C++ Header : "./hurricane/Layer.h" |
    30 // +-----------------------------------------------------------------+
    31 
    32 
    33 #ifndef HURRICANE_LAYER_H
    34 #define HURRICANE_LAYER_H
    35 
    36 #include "hurricane/Mask.h"
    37 #include "hurricane/DBo.h"
    38 #include "hurricane/Layers.h"
    39 #include "hurricane/DbU.h"
    40 #include "hurricane/BasicLayers.h"
    41 
    42 
    43 namespace Hurricane {
    44 
    45 
    46  class Technology;
    47 
    48 
    49 // -------------------------------------------------------------------
    50 // Class : "Hurricane::Layer".
    51 
    52  class Layer : public DBo {
    53  public:
    54  typedef DBo Super;
    55  public:
    56  static const uint32_t NoFlags = 0;
    57  static const uint32_t EnclosureH = (1 << 0);
    58  static const uint32_t EnclosureV = (1 << 1);
    59  static const uint32_t EnclosureMax = (1 << 2);
    60  static const uint32_t ExtensionCap = (1 << 3);
    61  static const uint32_t ExtensionWidth = (1 << 4);
    62 
    63  public:
    64  // Types.
    65  typedef Hurricane::Mask<unsigned long long> Mask;
    66  // Accessors.
    67  inline Technology* getTechnology () const;
    68  inline const Name& getName () const;
    69  inline const Mask& getMask () const;
    70  inline const Mask& getExtractMask () const;
    71  inline const DbU::Unit& getMinimalSize () const;
    72  inline const DbU::Unit& getMinimalSpacing () const;
    73  virtual BasicLayers getBasicLayers () const = 0;
    74  virtual const Layer* getBlockageLayer () const;
    75  virtual const Layer* getCut () const;
    76  virtual const Layer* getTop () const;
    77  virtual const Layer* getBottom () const;
    78  virtual const Layer* getOpposite ( const Layer* ) const;
    79  Layer* getMetalAbove ( bool useSymbolic=true ) const;
    80  Layer* getMetalBelow ( bool useSymbolic=true ) const;
    81  Layer* getCutAbove ( bool useSymbolic=true ) const;
    82  Layer* getCutBelow ( bool useSymbolic=true ) const;
    83  virtual DbU::Unit getEnclosure ( uint32_t flags ) const;
    84  virtual DbU::Unit getExtentionCap () const;
    85  virtual DbU::Unit getExtentionWidth () const;
    86  virtual DbU::Unit getEnclosure ( const BasicLayer* layer, uint32_t flags ) const;
    87  virtual DbU::Unit getExtentionCap ( const BasicLayer* layer ) const;
    88  virtual DbU::Unit getExtentionWidth ( const BasicLayer* layer ) const;
    89  virtual DbU::Unit getTopEnclosure ( uint32_t flags ) const;
    90  virtual DbU::Unit getBottomEnclosure ( uint32_t flags ) const;
    91  virtual double getMinimalArea () const;
    92  // Predicates
    93  inline bool above ( const Layer* layer ) const;
    94  inline bool below ( const Layer* layer ) const;
    95  bool contains ( const Layer* layer ) const;
    96  bool intersect ( const Layer* layer ) const;
    97  inline bool isSymbolic () const;
    98  inline bool isBlockage () const;
    99  // Updators
    100  void setName ( const Name& name );
    101  inline void setSymbolic ( bool );
    102  inline void setBlockage ( bool );
    103  void setMinimalSize ( const DbU::Unit& minimalSize );
    104  void setMinimalSpacing ( const DbU::Unit& minimalSpacing );
    105  virtual void setEnclosure ( const BasicLayer* layer, DbU::Unit, uint32_t flags );
    106  virtual void setExtentionCap ( const BasicLayer* layer, DbU::Unit );
    107  virtual void setExtentionWidth ( const BasicLayer* layer, DbU::Unit );
    108  virtual void setMinimalArea ( double );
    109  // Hurricane Managment.
    110  virtual void _toJson ( JsonWriter* ) const;
    111  virtual string _getString () const;
    112  virtual Record* _getRecord () const;
    113  inline Layer* _getNextOfTechnologyLayerMap () const;
    114  inline void _setMask ( const Mask& mask );
    115  inline void _setExtractMask ( const Mask& extractMask );
    116  inline void _setNextOfTechnologyLayerMap ( Layer* layer );
    117  virtual void _onDbuChange ( float scale );
    118  static const Name& _sgetName ( const Layer* );
    119 
    120  private:
    121  // Internal: Attributes
    122  Technology* _technology;
    123  Name _name;
    124  Mask _mask;
    125  Mask _extractMask;
    126  DbU::Unit _minimalSize;
    127  DbU::Unit _minimalSpacing;
    128  Layer* _nextOfTechnologyLayerMap;
    129  bool _symbolic;
    130  bool _blockage;
    131  double _minimalArea;
    132 
    133  protected:
    134  // Internal: Constructors & Destructors.
    135  Layer ( Technology* technology
    136  , const Name& name
    137  , const DbU::Unit& minimalSize = 0
    138  , const DbU::Unit& minimalSpacing = 0
    139  , const DbU::Unit& pitch = 0
    140  );
    141  virtual void _postCreate ();
    142  virtual void _preDestroy ();
    143 
    144  public:
    145  struct CompareByMask : public binary_function<const Layer*,const Layer*,bool> {
    146  inline bool operator() ( const Layer* lhs, const Layer* rhs ) const;
    147  };
    148  };
    149 
    150 
    151 // Inline Functions.
    152  inline bool Layer::isSymbolic () const { return _symbolic; }
    153  inline bool Layer::isBlockage () const { return _blockage; }
    154  inline bool Layer::above ( const Layer* layer ) const { return _mask > layer->getMask(); }
    155  inline bool Layer::below ( const Layer* layer ) const { return _mask < layer->getMask(); }
    156  inline Technology* Layer::getTechnology () const { return _technology; }
    157  inline const Name& Layer::getName () const { return _name; }
    158  inline const Layer::Mask& Layer::getMask () const { return _mask; }
    159  inline const Layer::Mask& Layer::getExtractMask () const { return _extractMask; }
    160  inline const DbU::Unit& Layer::getMinimalSize () const { return _minimalSize; }
    161  inline const DbU::Unit& Layer::getMinimalSpacing () const { return _minimalSpacing; }
    162  inline void Layer::setSymbolic ( bool state ) { _symbolic = state; }
    163  inline void Layer::setBlockage ( bool state ) { _blockage = state; }
    164  inline Layer* Layer::_getNextOfTechnologyLayerMap () const { return _nextOfTechnologyLayerMap; }
    165  inline void Layer::_setMask ( const Mask& mask ) { _mask = mask; }
    166  inline void Layer::_setExtractMask ( const Mask& extractMask ) { _extractMask = extractMask; }
    167  inline void Layer::_setNextOfTechnologyLayerMap ( Layer* layer ) { _nextOfTechnologyLayerMap = layer; }
    168 
    169  inline bool Layer::CompareByMask::operator() ( const Layer* lhs, const Layer* rhs ) const
    170  { return (lhs?lhs->getMask():Layer::Mask()) < (rhs?rhs->getMask():Layer::Mask()); }
    171 
    172 
    173 // -------------------------------------------------------------------
    174 // Class : "Hurricane::JsonLayer".
    175 
    176  class JsonLayer : public JsonDBo {
    177  public:
    178  JsonLayer ( unsigned long flags );
    179  Technology* lookupTechnology ( JsonStack&, const string& fname ) const;
    180  };
    181 
    182 
    183 } // Hurricane namespace.
    184 
    185 
    186 INSPECTOR_P_SUPPORT(Hurricane::Layer);
    187 INSPECTOR_PR_SUPPORT(Hurricane::Layer::Mask);
    188 
    189 
    190 #endif // HURRICANE_LAYER_H
    void setName(const Name &name)
    bool intersect(const Layer *layer) const
    BasicLayer description (API)
    Definition: BasicLayer.h:44
    -
    Technology * getTechnology() const
    Definition: Layer.h:153
    -
    const DbU::Unit & getMinimalSpacing() const
    Definition: Layer.h:158
    +
    Technology * getTechnology() const
    Definition: Layer.h:156
    +
    const DbU::Unit & getMinimalSpacing() const
    Definition: Layer.h:161
    bool contains(const Layer *layer) const
    Name description (API)
    Definition: Name.h:35
    Layer * getCutBelow(bool useSymbolic=true) const
    virtual const Layer * getOpposite(const Layer *) const
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    Hurricane::Mask< unsigned long long > Mask
    Definition: Layer.h:65
    virtual void setEnclosure(const BasicLayer *layer, DbU::Unit, uint32_t flags)
    virtual void setExtentionWidth(const BasicLayer *layer, DbU::Unit)
    @@ -63,25 +63,25 @@ $(function() {
    void setMinimalSize(const DbU::Unit &minimalSize)
    virtual const Layer * getTop() const
    Layer description (API)
    Definition: Layer.h:52
    -
    const Mask & getMask() const
    Definition: Layer.h:155
    -
    bool above(const Layer *layer) const
    Definition: Layer.h:151
    -
    const Mask & getExtractMask() const
    Definition: Layer.h:156
    +
    const Mask & getMask() const
    Definition: Layer.h:158
    +
    bool above(const Layer *layer) const
    Definition: Layer.h:154
    +
    const Mask & getExtractMask() const
    Definition: Layer.h:159
    Layer * getCutAbove(bool useSymbolic=true) const
    void setMinimalSpacing(const DbU::Unit &minimalSpacing)
    -
    const Name & getName() const
    Definition: Layer.h:154
    +
    const Name & getName() const
    Definition: Layer.h:157
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    virtual const Layer * getBottom() const
    -
    const DbU::Unit & getMinimalSize() const
    Definition: Layer.h:157
    +
    const DbU::Unit & getMinimalSize() const
    Definition: Layer.h:160
    Layer * getMetalBelow(bool useSymbolic=true) const
    virtual void setExtentionCap(const BasicLayer *layer, DbU::Unit)
    Technological rules description (API).
    Definition: Technology.h:62
    -
    bool below(const Layer *layer) const
    Definition: Layer.h:152
    +
    bool below(const Layer *layer) const
    Definition: Layer.h:155


    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Layers_8h_source.html b/hurricane/doc/hurricane/html/Layers_8h_source.html index 291f7f45..6f7b5bb5 100644 --- a/hurricane/doc/hurricane/html/Layers_8h_source.html +++ b/hurricane/doc/hurricane/html/Layers_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Libraries_8h_source.html b/hurricane/doc/hurricane/html/Libraries_8h_source.html index ac9f0482..a720b489 100644 --- a/hurricane/doc/hurricane/html/Libraries_8h_source.html +++ b/hurricane/doc/hurricane/html/Libraries_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Library_8h_source.html b/hurricane/doc/hurricane/html/Library_8h_source.html index 9c415923..4c3e6a86 100644 --- a/hurricane/doc/hurricane/html/Library_8h_source.html +++ b/hurricane/doc/hurricane/html/Library_8h_source.html @@ -48,9 +48,9 @@ $(function() {
    Library description (API)
    Definition: Library.h:38
    Cells getCells() const
    Definition: Library.h:102
    Name description (API)
    Definition: Name.h:35
    -
    The model (API).
    Definition: Cell.h:66
    +
    The model (API).
    Definition: Cell.h:64
    Cell * getCell(const Name &name) const
    Definition: Library.h:101
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    DBo Inherit
    Definition: Library.h:44
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    void setName(const Name &name)
    @@ -66,7 +66,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/ListCollection_8h_source.html b/hurricane/doc/hurricane/html/ListCollection_8h_source.html index f1f97503..80e2097f 100644 --- a/hurricane/doc/hurricane/html/ListCollection_8h_source.html +++ b/hurricane/doc/hurricane/html/ListCollection_8h_source.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Locator_8h_source.html b/hurricane/doc/hurricane/html/Locator_8h_source.html index a47e0ada..bce75940 100644 --- a/hurricane/doc/hurricane/html/Locator_8h_source.html +++ b/hurricane/doc/hurricane/html/Locator_8h_source.html @@ -59,7 +59,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/MapCollection_8h_source.html b/hurricane/doc/hurricane/html/MapCollection_8h_source.html index 5f4b7b5d..228bae21 100644 --- a/hurricane/doc/hurricane/html/MapCollection_8h_source.html +++ b/hurricane/doc/hurricane/html/MapCollection_8h_source.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Name_8h_source.html b/hurricane/doc/hurricane/html/Name_8h_source.html index d51fc7c3..98f387b5 100644 --- a/hurricane/doc/hurricane/html/Name_8h_source.html +++ b/hurricane/doc/hurricane/html/Name_8h_source.html @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Names_8h_source.html b/hurricane/doc/hurricane/html/Names_8h_source.html index b28ffcb9..4ae9e003 100644 --- a/hurricane/doc/hurricane/html/Names_8h_source.html +++ b/hurricane/doc/hurricane/html/Names_8h_source.html @@ -50,7 +50,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Net_8h_source.html b/hurricane/doc/hurricane/html/Net_8h_source.html index f2c66aef..54327187 100644 --- a/hurricane/doc/hurricane/html/Net_8h_source.html +++ b/hurricane/doc/hurricane/html/Net_8h_source.html @@ -44,7 +44,7 @@ $(function() {
    Net.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Net.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_NET
    21 #define HURRICANE_NET
    22 
    23 #include <functional>
    24 #include "hurricane/Entity.h"
    25 #include "hurricane/Nets.h"
    26 #include "hurricane/Component.h"
    27 #include "hurricane/Rubbers.h"
    28 #include "hurricane/Rubber.h"
    29 #include "hurricane/RoutingPads.h"
    30 #include "hurricane/Plugs.h"
    31 #include "hurricane/Pins.h"
    32 #include "hurricane/Contacts.h"
    33 #include "hurricane/Segments.h"
    34 #include "hurricane/Verticals.h"
    35 #include "hurricane/Horizontals.h"
    36 #include "hurricane/Pads.h"
    37 #include "hurricane/IntrusiveSet.h"
    38 #include "hurricane/Path.h"
    39 #include "hurricane/NetAlias.h"
    40 
    41 namespace Hurricane {
    42 
    43 
    44 // ****************************************************************************************************
    45 // Net declaration
    46 // ****************************************************************************************************
    47 
    48 class Net : public Entity {
    49 // **********************
    50 
    51 // Types
    52 // *****
    53 
    54  public: typedef Entity Inherit;
    55 
    56  public: typedef unsigned Arity;
    57 
    58  public: class Type {
    59  // ***************
    60 
    61  public: enum Code {UNDEFINED=0, LOGICAL=1, CLOCK=2, POWER=3, GROUND=4, BLOCKAGE=5, FUSED=6};
    62 
    63  private: Code _code;
    64 
    65  public: Type(const Code& code = UNDEFINED);
    66  public: Type(const Type& type);
    67  public: Type(string);
    68 
    69  public: Type& operator=(const Type& type);
    70 
    71  public: operator const Code&() const {return _code;};
    72 
    73  public: const Code& getCode() const {return _code;};
    74 
    75  public: string _getTypeName() const { return _TName("Net::type"); };
    76  public: string _getString() const;
    77  public: Record* _getRecord() const;
    78 
    79  };
    80 
    81  public: class Direction {
    82  // ********************
    83 
    84  public: enum Code { DirIn = 0x0001
    85  , DirOut = 0x0002
    86  , DirUndefined = 0x0000
    87  , ConnTristate = 0x0100
    88  , ConnWiredOr = 0x0200
    90  , IN = DirIn
    91  , OUT = DirOut
    97  , DirMask = DirIn | DirOut | DirUndefined
    98  };
    99 
    100  private: Code _code;
    101 
    102  public: Direction(const Code& code = UNDEFINED);
    103  public: Direction(const Direction& direction);
    104  public: Direction(string);
    105 
    106  public: Direction& operator =(const Direction& direction);
    107  public: Direction& operator|=(const Direction& direction);
    108 
    109  public: operator const Code&() const {return _code;};
    110 
    111  public: const Code& getCode() const {return _code;};
    112 
    113  public: string _getTypeName() const { return _TName("Net::Direction"); };
    114  public: string _getString() const;
    115  public: Record* _getRecord() const;
    116 
    117  };
    118 
    119  class ComponentSet : public IntrusiveSet<Component> {
    120  // ************************************************
    121 
    122  public: typedef IntrusiveSet<Component> Inherit;
    123 
    124  public: ComponentSet();
    125 
    126  public: virtual unsigned _getHashValue(Component* component) const;
    127  public: virtual Component* _getNextElement(Component* component) const;
    128  public: virtual void _setNextElement(Component* component, Component* nextComponent) const;
    129 
    130  };
    131 
    132  class RubberSet : public IntrusiveSet<Rubber> {
    133  // ******************************************
    134 
    135  public: typedef IntrusiveSet<Rubber> Inherit;
    136 
    137  public: RubberSet();
    138 
    139  public: virtual unsigned _getHashValue(Rubber* rubber) const;
    140  public: virtual Rubber* _getNextElement(Rubber* rubber) const;
    141  public: virtual void _setNextElement(Rubber* rubber, Rubber* nextRubber) const;
    142 
    143  };
    144 
    145 // Attributes
    146 // **********
    147 
    148  private: Cell* _cell;
    149  private: Name _name;
    150  private: Arity _arity;
    151  private: bool _isGlobal;
    152  private: bool _isExternal;
    153  private: bool _isAutomatic;
    154  private: Type _type;
    155  private: Direction _direction;
    156  private: Point _position;
    157  private: ComponentSet _componentSet;
    158  private: RubberSet _rubberSet;
    159  private: Net* _nextOfCellNetMap;
    160  private: NetMainName _mainName;
    161 
    162 // Constructors
    163 // ************
    164 
    165  protected: Net(Cell* cell, const Name& name);
    166 
    167  public: static Net* create(Cell* cell, const Name& name);
    168 
    169 // Accessors
    170 // *********
    171 
    172  public: virtual Cell* getCell() const {return _cell;};
    173  public: virtual Box getBoundingBox() const;
    174  public: const Name& getName() const {return _name;};
    175  public: const NetMainName* getMainName() const { return &_mainName; }
    176  public: const Arity& getArity() const {return _arity;};
    177  public: const Type& getType() const {return _type;};
    178  public: const Direction& getDirection() const {return _direction;};
    179  public: const Point& getPosition() const {return _position;};
    180  public: const DbU::Unit& getX() const {return _position.getX();};
    181  public: const DbU::Unit& getY() const {return _position.getY();};
    182  public: Components getComponents() const {return _componentSet.getElements();};
    183  public: Rubbers getRubbers() const {return _rubberSet.getElements();};
    184  public: RoutingPads getRoutingPads() const;
    185  public: Plugs getPlugs() const;
    186  public: Pins getPins() const;
    187  public: Contacts getContacts() const;
    188  public: Segments getSegments() const;
    189  public: Verticals getVerticals() const;
    190  public: Horizontals getHorizontals() const;
    191  public: Pads getPads() const;
    192  public: Plugs getSlavePlugs() const;
    193  public: Plugs getConnectedSlavePlugs() const;
    194  public: Plugs getUnconnectedSlavePlugs() const;
    195  public: Aliases getAliases() const { return new AliasList(this); };
    196 
    197 // Filters
    198 // *******
    199 
    200  public: static NetFilter getIsCellNetFilter();
    201  public: static NetFilter getIsDeepNetFilter();
    202  public: static NetFilter getIsGlobalFilter();
    203  public: static NetFilter getIsExternalFilter();
    204  public: static NetFilter getIsInternalFilter();
    205  public: static NetFilter getIsClockFilter();
    206  public: static NetFilter getIsSupplyFilter();
    207  public: static NetFilter getIsPowerFilter();
    208  public: static NetFilter getIsGroundFilter();
    209 
    210 // Predicates
    211 // **********
    212 
    213  public: virtual bool isDeepNet () const {return false;};
    214  public: bool isGlobal () const {return _isGlobal;};
    215  public: bool isExternal () const {return _isExternal;};
    216  public: bool isAutomatic() const {return _isAutomatic;};
    217  public: bool isBlockage () const {return (_type == Type::BLOCKAGE);};
    218  public: bool isFused () const {return (_type == Type::FUSED);};
    219  public: bool isLogical () const {return (_type == Type::LOGICAL);};
    220  public: bool isClock () const {return (_type == Type::CLOCK);};
    221  public: bool isPower () const {return (_type == Type::POWER);};
    222  public: bool isGround () const {return (_type == Type::GROUND);};
    223  public: bool isSupply () const {return (isPower() || isGround());};
    224  public: bool hasAlias (const Name& name) const;
    225 
    226 // Updators
    227 // ********
    228 
    229  public: void setName(Name name);
    230  public: void setArity(const Arity& arity);
    231  public: void setGlobal(bool isGlobal);
    232  public: void setExternal(bool isExternal);
    233  public: void setAutomatic(bool isAutomatic);
    234  public: void setType(const Type& type);
    235  public: void setDirection(const Direction& direction);
    236  public: void setPosition(const Point& position);
    237  public: void setRoutingState(uint32_t state);
    238  public: void materialize();
    239  public: void unmaterialize();
    240  public: bool addAlias(const Name& name);
    241  public: bool removeAlias(const Name& name);
    242  public: void merge(Net* net);
    243  public: Net* getClone(Cell* cloneCell);
    244 
    245 // Others
    246 // ******
    247 
    248  protected: virtual void _postCreate();
    249  protected: virtual void _preDestroy();
    250 
    251  public: virtual void _toJson(JsonWriter*) const;
    252  public: virtual void _toJsonSignature(JsonWriter*) const;
    253  public: virtual void _toJsonCollections(JsonWriter*) const;
    254  public: virtual string _getTypeName() const {return _TName("Net");};
    255  public: virtual string _getString() const;
    256  public: virtual Record* _getRecord() const;
    257  public: NetMainName& _getMainName() { return _mainName; }
    258  public: ComponentSet& _getComponentSet() {return _componentSet;};
    259  public: RubberSet& _getRubberSet() {return _rubberSet;};
    260  public: Net* _getNextOfCellNetMap() const {return _nextOfCellNetMap;};
    261 
    262  public: void _setNextOfCellNetMap(Net* net) {_nextOfCellNetMap = net;};
    263 
    264  public: struct CompareByName {
    265  inline bool operator() ( const Net* lhs, const Net* rhs ) const { return lhs->getName() < rhs->getName(); }
    266  };
    267 
    268 };
    269 
    270 
    271 // -------------------------------------------------------------------
    272 // Class : "HookKey".
    273 
    274  class HookKey {
    275  public:
    276  inline HookKey ( unsigned int id, const std::string& tname );
    277  inline unsigned int id () const;
    278  inline std::string tname () const;
    279  private:
    280  unsigned int _id;
    281  std::string _tname;
    282  };
    283 
    284 
    285  inline HookKey::HookKey ( unsigned int id, const std::string& tname ) : _id(id), _tname(tname) { }
    286  inline unsigned int HookKey::id () const { return _id; }
    287  inline std::string HookKey::tname () const { return _tname; }
    288 
    289  inline bool operator< ( const HookKey& lhs, const HookKey& rhs )
    290  {
    291  if (lhs.id() != rhs.id()) return lhs.id() < rhs.id();
    292  return lhs.tname() < rhs.tname();
    293  }
    294 
    295 
    296 // -------------------------------------------------------------------
    297 // Class : "HookElement".
    298 
    299  class HookElement {
    300  public:
    301  enum Flags { OpenRingStart = (1<<0)
    302  , ClosedRing = (1<<1)
    303  };
    304  public:
    305  inline HookElement ( Hook*, unsigned long flags=0 );
    306  inline Hook* hook () const;
    307  inline HookElement* next () const;
    308  inline void setHook ( Hook* );
    309  inline void setNext ( HookElement* );
    310  inline unsigned long flags () const;
    311  inline HookElement& setFlags ( unsigned long mask );
    312  inline HookElement& resetFlags ( unsigned long mask );
    313  inline bool issetFlags ( unsigned long mask ) const;
    314  private:
    315  Hook* _hook;
    316  HookElement* _next;
    317  unsigned long _flags;
    318  };
    319 
    320 
    321  inline HookElement::HookElement ( Hook* hook, unsigned long flags ) : _hook(hook), _next(NULL), _flags(flags) { }
    322  inline Hook* HookElement::hook () const { return _hook; }
    323  inline HookElement* HookElement::next () const { return _next; }
    324  inline void HookElement::setHook ( Hook* hook ) { _hook = hook; }
    325  inline void HookElement::setNext ( HookElement* element ) { _next = element; }
    326  inline unsigned long HookElement::flags () const { return _flags; }
    327  inline HookElement& HookElement::setFlags ( unsigned long mask ) { _flags |= mask; return *this; }
    328  inline HookElement& HookElement::resetFlags ( unsigned long mask ) { _flags &= ~mask; return *this; }
    329  inline bool HookElement::issetFlags ( unsigned long mask ) const { return _flags & mask; }
    330 
    331 
    332  typedef map<HookKey,HookElement> HookLut;
    333 
    334 
    335 // -------------------------------------------------------------------
    336 // Class : "JsonNet".
    337 
    338  class JsonNet : public JsonEntity {
    339  public:
    340  static bool hookFromString ( std::string s, unsigned int& id, std::string& tname );
    341  static void initialize ();
    342  JsonNet ( unsigned long flags );
    343  virtual ~JsonNet ();
    344  virtual string getTypeName () const;
    345  virtual JsonNet* clone ( unsigned long ) const;
    346  virtual void toData ( JsonStack& );
    347  void addHookLink ( Hook*, unsigned int jsonId, const std::string& jsonNext );
    348  Hook* getHook ( unsigned int jsonId, const std::string& tname ) const;
    349  bool checkRings () const;
    350  void buildRings () const;
    351  inline void clearHookLinks ();
    352  protected:
    353  bool _autoMaterialize;
    354  Net* _net;
    355  HookLut _hooks;
    356  };
    357 
    358 
    359  inline void JsonNet::clearHookLinks () { _hooks.clear(); }
    360 
    361 
    362 } // Hurricane namespace.
    363 
    364 
    365 // -------------------------------------------------------------------
    366 // Inspector Support for : Net::Type::Code*".
    367 
    368 template<>
    369 inline std::string getString<const Hurricane::Net::Type::Code*>
    370  ( const Hurricane::Net::Type::Code* object )
    371  {
    372  switch ( *object ) {
    373  case Hurricane::Net::Type::UNDEFINED: return "UNDEFINED";
    374  case Hurricane::Net::Type::LOGICAL: return "LOGICAL";
    375  case Hurricane::Net::Type::CLOCK: return "CLOCK";
    376  case Hurricane::Net::Type::POWER: return "POWER";
    377  case Hurricane::Net::Type::GROUND: return "GROUND";
    378  case Hurricane::Net::Type::BLOCKAGE: return "BLOCKAGE";
    379  case Hurricane::Net::Type::FUSED: return "FUSED";
    380  }
    381  return "ABNORMAL";
    382  }
    383 
    384 template<>
    385 inline Hurricane::Record* getRecord<const Hurricane::Net::Type::Code*>
    386  ( const Hurricane::Net::Type::Code* object )
    387  {
    388  Hurricane::Record* record = new Hurricane::Record(getString(object));
    389  record->add(getSlot("Code", (unsigned int*)object));
    390  return record;
    391  }
    392 
    393 
    394 // -------------------------------------------------------------------
    395 // Inspector Support for : "const Net::Direction::Code*".
    396 
    397 template<>
    398 inline std::string getString<const Hurricane::Net::Direction::Code*>
    399  ( const Hurricane::Net::Direction::Code* object )
    400  {
    401  std::ostringstream s;
    402  s << (((*object) & Hurricane::Net::Direction::DirIn ) ? 'i' : '-');
    403  s << (((*object) & Hurricane::Net::Direction::DirOut ) ? 'o' : '-');
    404  s << (((*object) & Hurricane::Net::Direction::ConnTristate) ? 't' : '-');
    405  s << (((*object) & Hurricane::Net::Direction::ConnWiredOr ) ? 'w' : '-');
    406 
    407  switch ( (int)*object ) {
    408  case Hurricane::Net::Direction::UNDEFINED: s << " (UNDEFINED)"; break;
    409  case Hurricane::Net::Direction::IN: s << " (IN)"; break;
    410  case Hurricane::Net::Direction::OUT: s << " (OUT)"; break;
    411  case Hurricane::Net::Direction::INOUT: s << " (INOUT)"; break;
    412  case Hurricane::Net::Direction::TRISTATE: s << " (TRISTATE)"; break;
    413  case Hurricane::Net::Direction::TRANSCV: s << " (TRANSCV)"; break;
    414  case Hurricane::Net::Direction::WOR_OUT: s << " (WOR_OUT)"; break;
    415  case Hurricane::Net::Direction::WOR_INOUT: s << " (WOR_INOUT)"; break;
    416  }
    417  return s.str();
    418  }
    419 
    420 template<>
    421 inline Hurricane::Record* getRecord<const Hurricane::Net::Direction::Code*>
    422  ( const Hurricane::Net::Direction::Code* object )
    423  {
    424  Hurricane::Record* record = new Hurricane::Record(getString(object));
    425  record->add(getSlot("Code", (unsigned int*)object));
    426  return record;
    427  }
    428 
    429 
    430 INSPECTOR_P_SUPPORT(Hurricane::Net);
    431 INSPECTOR_P_SUPPORT(Hurricane::Net::ComponentSet);
    432 INSPECTOR_P_SUPPORT(Hurricane::Net::RubberSet);
    433 INSPECTOR_PR_SUPPORT(Hurricane::Net::Type);
    434 INSPECTOR_PR_SUPPORT(Hurricane::Net::Direction);
    435 IOSTREAM_POINTER_SUPPORT(Hurricane::Net::Type::Code);
    436 IOSTREAM_VALUE_SUPPORT(Hurricane::Net::Type::Code);
    437 IOSTREAM_POINTER_SUPPORT(Hurricane::Net::Direction::Code);
    438 IOSTREAM_VALUE_SUPPORT(Hurricane::Net::Direction::Code);
    439 
    440 
    441 namespace Hurricane {
    442 
    443 // Force SlotTemplate<> expansion on Net* type.
    444 // Because sometimes it didn't happens (?).
    445  const SlotTemplate<Net*> dummyNetSlot ( string("dummyNetSlot"), NULL );
    446 
    447 }
    448 
    449 #endif // HURRICANE_NET
    450 
    451 
    452 // ****************************************************************************************************
    453 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    454 // ****************************************************************************************************
    static NetFilter getIsGlobalFilter()
    +
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Net.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_NET
    21 #define HURRICANE_NET
    22 
    23 #include <functional>
    24 #include "hurricane/Entity.h"
    25 #include "hurricane/Nets.h"
    26 #include "hurricane/Component.h"
    27 #include "hurricane/Rubbers.h"
    28 #include "hurricane/Rubber.h"
    29 #include "hurricane/RoutingPads.h"
    30 #include "hurricane/Plugs.h"
    31 #include "hurricane/Pins.h"
    32 #include "hurricane/Contacts.h"
    33 #include "hurricane/Segments.h"
    34 #include "hurricane/Verticals.h"
    35 #include "hurricane/Horizontals.h"
    36 #include "hurricane/Pads.h"
    37 #include "hurricane/IntrusiveSet.h"
    38 #include "hurricane/Path.h"
    39 #include "hurricane/NetAlias.h"
    40 
    41 namespace Hurricane {
    42 
    43 
    44 // ****************************************************************************************************
    45 // Net declaration
    46 // ****************************************************************************************************
    47 
    48 class Net : public Entity {
    49 // **********************
    50 
    51 // Types
    52 // *****
    53 
    54  public: typedef Entity Inherit;
    55 
    56  public: typedef unsigned Arity;
    57 
    58  public: class Type {
    59  // ***************
    60 
    61  public: enum Code {UNDEFINED=0, LOGICAL=1, CLOCK=2, POWER=3, GROUND=4, BLOCKAGE=5, FUSED=6};
    62 
    63  private: Code _code;
    64 
    65  public: Type(const Code& code = UNDEFINED);
    66  public: Type(const Type& type);
    67  public: Type(string);
    68 
    69  public: Type& operator=(const Type& type);
    70 
    71  public: operator const Code&() const {return _code;};
    72 
    73  public: const Code& getCode() const {return _code;};
    74 
    75  public: string _getTypeName() const { return _TName("Net::type"); };
    76  public: string _getString() const;
    77  public: Record* _getRecord() const;
    78 
    79  };
    80 
    81  public: class Direction {
    82  // ********************
    83 
    84  public: enum Code { DirIn = 0x0001
    85  , DirOut = 0x0002
    86  , DirUndefined = 0x0000
    87  , ConnTristate = 0x0100
    88  , ConnWiredOr = 0x0200
    90  , IN = DirIn
    91  , OUT = DirOut
    97  , DirMask = DirIn | DirOut | DirUndefined
    98  };
    99 
    100  private: Code _code;
    101 
    102  public: Direction(const Code& code = UNDEFINED);
    103  public: Direction(const Direction& direction);
    104  public: Direction(string);
    105 
    106  public: Direction& operator =(const Direction& direction);
    107  public: Direction& operator|=(const Direction& direction);
    108 
    109  public: operator const Code&() const {return _code;};
    110 
    111  public: const Code& getCode() const {return _code;};
    112 
    113  public: string _getTypeName() const { return _TName("Net::Direction"); };
    114  public: string _getString() const;
    115  public: Record* _getRecord() const;
    116 
    117  };
    118 
    119  class ComponentSet : public IntrusiveSet<Component> {
    120  // ************************************************
    121 
    122  public: typedef IntrusiveSet<Component> Inherit;
    123 
    124  public: ComponentSet();
    125 
    126  public: virtual unsigned _getHashValue(Component* component) const;
    127  public: virtual Component* _getNextElement(Component* component) const;
    128  public: virtual void _setNextElement(Component* component, Component* nextComponent) const;
    129 
    130  };
    131 
    132  class RubberSet : public IntrusiveSet<Rubber> {
    133  // ******************************************
    134 
    135  public: typedef IntrusiveSet<Rubber> Inherit;
    136 
    137  public: RubberSet();
    138 
    139  public: virtual unsigned _getHashValue(Rubber* rubber) const;
    140  public: virtual Rubber* _getNextElement(Rubber* rubber) const;
    141  public: virtual void _setNextElement(Rubber* rubber, Rubber* nextRubber) const;
    142 
    143  };
    144 
    145 // Attributes
    146 // **********
    147 
    148  private: Cell* _cell;
    149  private: Name _name;
    150  private: Arity _arity;
    151  private: bool _isGlobal;
    152  private: bool _isExternal;
    153  private: bool _isAutomatic;
    154  private: Type _type;
    155  private: Direction _direction;
    156  private: Point _position;
    157  private: ComponentSet _componentSet;
    158  private: RubberSet _rubberSet;
    159  private: Net* _nextOfCellNetMap;
    160  private: NetMainName _mainName;
    161 
    162 // Constructors
    163 // ************
    164 
    165  protected: Net(Cell* cell, const Name& name);
    166 
    167  public: static Net* create(Cell* cell, const Name& name);
    168 
    169 // Accessors
    170 // *********
    171 
    172  public: virtual Cell* getCell() const {return _cell;};
    173  public: virtual Box getBoundingBox() const;
    174  public: const Name& getName() const {return _name;};
    175  public: const NetMainName* getMainName() const { return &_mainName; }
    176  public: const Arity& getArity() const {return _arity;};
    177  public: const Type& getType() const {return _type;};
    178  public: const Direction& getDirection() const {return _direction;};
    179  public: const Point& getPosition() const {return _position;};
    180  public: const DbU::Unit& getX() const {return _position.getX();};
    181  public: const DbU::Unit& getY() const {return _position.getY();};
    182  public: Components getComponents() const {return _componentSet.getElements();};
    183  public: Rubbers getRubbers() const {return _rubberSet.getElements();};
    184  public: RoutingPads getRoutingPads() const;
    185  public: Plugs getPlugs() const;
    186  public: Pins getPins() const;
    187  public: Contacts getContacts() const;
    188  public: Segments getSegments() const;
    189  public: Verticals getVerticals() const;
    190  public: Horizontals getHorizontals() const;
    191  public: Pads getPads() const;
    192  public: Plugs getSlavePlugs() const;
    193  public: Plugs getConnectedSlavePlugs() const;
    194  public: Plugs getUnconnectedSlavePlugs() const;
    195  public: Aliases getAliases() const { return new AliasList(this); };
    196 
    197 // Filters
    198 // *******
    199 
    200  public: static NetFilter getIsCellNetFilter();
    201  public: static NetFilter getIsDeepNetFilter();
    202  public: static NetFilter getIsGlobalFilter();
    203  public: static NetFilter getIsExternalFilter();
    204  public: static NetFilter getIsInternalFilter();
    205  public: static NetFilter getIsClockFilter();
    206  public: static NetFilter getIsSupplyFilter();
    207  public: static NetFilter getIsPowerFilter();
    208  public: static NetFilter getIsGroundFilter();
    209 
    210 // Predicates
    211 // **********
    212 
    213  public: virtual bool isDeepNet () const {return false;};
    214  public: bool isGlobal () const {return _isGlobal;};
    215  public: bool isExternal () const {return _isExternal;};
    216  public: bool isAutomatic() const {return _isAutomatic;};
    217  public: bool isBlockage () const {return (_type == Type::BLOCKAGE);};
    218  public: bool isFused () const {return (_type == Type::FUSED);};
    219  public: bool isLogical () const {return (_type == Type::LOGICAL);};
    220  public: bool isClock () const {return (_type == Type::CLOCK);};
    221  public: bool isPower () const {return (_type == Type::POWER);};
    222  public: bool isGround () const {return (_type == Type::GROUND);};
    223  public: bool isSupply () const {return (isPower() || isGround());};
    224  public: bool hasAlias (const Name& ) const;
    225  public: NetAliasHook* getAlias (const Name& ) const;
    226 
    227 // Updators
    228 // ********
    229 
    230  public: void setName(Name name);
    231  public: void setArity(const Arity& arity);
    232  public: void setGlobal(bool isGlobal);
    233  public: void setExternal(bool isExternal);
    234  public: void setAutomatic(bool isAutomatic);
    235  public: void setType(const Type& type);
    236  public: void setDirection(const Direction& direction);
    237  public: void setPosition(const Point& position);
    238  public: void setRoutingState(uint32_t state);
    239  public: void materialize();
    240  public: void unmaterialize();
    241  public: bool addAlias(const Name& name, bool isExternal=false);
    242  public: bool removeAlias(const Name& name);
    243  public: void merge(Net* net);
    244  public: Net* getClone(Cell* cloneCell);
    245 
    246 // Others
    247 // ******
    248 
    249  protected: virtual void _postCreate();
    250  protected: virtual void _preDestroy();
    251 
    252  public: virtual void _toJson(JsonWriter*) const;
    253  public: virtual void _toJsonSignature(JsonWriter*) const;
    254  public: virtual void _toJsonCollections(JsonWriter*) const;
    255  public: virtual string _getTypeName() const {return _TName("Net");};
    256  public: virtual string _getString() const;
    257  public: virtual Record* _getRecord() const;
    258  public: NetMainName& _getMainName() { return _mainName; }
    259  public: ComponentSet& _getComponentSet() {return _componentSet;};
    260  public: RubberSet& _getRubberSet() {return _rubberSet;};
    261  public: Net* _getNextOfCellNetMap() const {return _nextOfCellNetMap;};
    262 
    263  public: void _setNextOfCellNetMap(Net* net) {_nextOfCellNetMap = net;};
    264 
    265  public: struct CompareByName {
    266  inline bool operator() ( const Net* lhs, const Net* rhs ) const { return lhs->getName() < rhs->getName(); }
    267  };
    268 
    269 };
    270 
    271 
    272 // -------------------------------------------------------------------
    273 // Class : "HookKey".
    274 
    275  class HookKey {
    276  public:
    277  inline HookKey ( unsigned int id, const std::string& tname );
    278  inline unsigned int id () const;
    279  inline std::string tname () const;
    280  private:
    281  unsigned int _id;
    282  std::string _tname;
    283  };
    284 
    285 
    286  inline HookKey::HookKey ( unsigned int id, const std::string& tname ) : _id(id), _tname(tname) { }
    287  inline unsigned int HookKey::id () const { return _id; }
    288  inline std::string HookKey::tname () const { return _tname; }
    289 
    290  inline bool operator< ( const HookKey& lhs, const HookKey& rhs )
    291  {
    292  if (lhs.id() != rhs.id()) return lhs.id() < rhs.id();
    293  return lhs.tname() < rhs.tname();
    294  }
    295 
    296 
    297 // -------------------------------------------------------------------
    298 // Class : "HookElement".
    299 
    300  class HookElement {
    301  public:
    302  enum Flags { OpenRingStart = (1<<0)
    303  , ClosedRing = (1<<1)
    304  };
    305  public:
    306  inline HookElement ( Hook*, unsigned long flags=0 );
    307  inline Hook* hook () const;
    308  inline HookElement* next () const;
    309  inline void setHook ( Hook* );
    310  inline void setNext ( HookElement* );
    311  inline unsigned long flags () const;
    312  inline HookElement& setFlags ( unsigned long mask );
    313  inline HookElement& resetFlags ( unsigned long mask );
    314  inline bool issetFlags ( unsigned long mask ) const;
    315  private:
    316  Hook* _hook;
    317  HookElement* _next;
    318  unsigned long _flags;
    319  };
    320 
    321 
    322  inline HookElement::HookElement ( Hook* hook, unsigned long flags ) : _hook(hook), _next(NULL), _flags(flags) { }
    323  inline Hook* HookElement::hook () const { return _hook; }
    324  inline HookElement* HookElement::next () const { return _next; }
    325  inline void HookElement::setHook ( Hook* hook ) { _hook = hook; }
    326  inline void HookElement::setNext ( HookElement* element ) { _next = element; }
    327  inline unsigned long HookElement::flags () const { return _flags; }
    328  inline HookElement& HookElement::setFlags ( unsigned long mask ) { _flags |= mask; return *this; }
    329  inline HookElement& HookElement::resetFlags ( unsigned long mask ) { _flags &= ~mask; return *this; }
    330  inline bool HookElement::issetFlags ( unsigned long mask ) const { return _flags & mask; }
    331 
    332 
    333  typedef map<HookKey,HookElement> HookLut;
    334 
    335 
    336 // -------------------------------------------------------------------
    337 // Class : "JsonNet".
    338 
    339  class JsonNet : public JsonEntity {
    340  public:
    341  static bool hookFromString ( std::string s, unsigned int& id, std::string& tname );
    342  static void initialize ();
    343  JsonNet ( unsigned long flags );
    344  virtual ~JsonNet ();
    345  virtual string getTypeName () const;
    346  virtual JsonNet* clone ( unsigned long ) const;
    347  virtual void toData ( JsonStack& );
    348  void addHookLink ( Hook*, unsigned int jsonId, const std::string& jsonNext );
    349  Hook* getHook ( unsigned int jsonId, const std::string& tname ) const;
    350  bool checkRings () const;
    351  void buildRings () const;
    352  inline void clearHookLinks ();
    353  protected:
    354  bool _autoMaterialize;
    355  Net* _net;
    356  HookLut _hooks;
    357  };
    358 
    359 
    360  inline void JsonNet::clearHookLinks () { _hooks.clear(); }
    361 
    362 
    363 } // Hurricane namespace.
    364 
    365 
    366 // -------------------------------------------------------------------
    367 // Inspector Support for : Net::Type::Code*".
    368 
    369 template<>
    370 inline std::string getString<const Hurricane::Net::Type::Code*>
    371  ( const Hurricane::Net::Type::Code* object )
    372  {
    373  switch ( *object ) {
    374  case Hurricane::Net::Type::UNDEFINED: return "UNDEFINED";
    375  case Hurricane::Net::Type::LOGICAL: return "LOGICAL";
    376  case Hurricane::Net::Type::CLOCK: return "CLOCK";
    377  case Hurricane::Net::Type::POWER: return "POWER";
    378  case Hurricane::Net::Type::GROUND: return "GROUND";
    379  case Hurricane::Net::Type::BLOCKAGE: return "BLOCKAGE";
    380  case Hurricane::Net::Type::FUSED: return "FUSED";
    381  }
    382  return "ABNORMAL";
    383  }
    384 
    385 template<>
    386 inline Hurricane::Record* getRecord<const Hurricane::Net::Type::Code*>
    387  ( const Hurricane::Net::Type::Code* object )
    388  {
    389  Hurricane::Record* record = new Hurricane::Record(getString(object));
    390  record->add(getSlot("Code", (unsigned int*)object));
    391  return record;
    392  }
    393 
    394 
    395 // -------------------------------------------------------------------
    396 // Inspector Support for : "const Net::Direction::Code*".
    397 
    398 template<>
    399 inline std::string getString<const Hurricane::Net::Direction::Code*>
    400  ( const Hurricane::Net::Direction::Code* object )
    401  {
    402  std::ostringstream s;
    403  s << (((*object) & Hurricane::Net::Direction::DirIn ) ? 'i' : '-');
    404  s << (((*object) & Hurricane::Net::Direction::DirOut ) ? 'o' : '-');
    405  s << (((*object) & Hurricane::Net::Direction::ConnTristate) ? 't' : '-');
    406  s << (((*object) & Hurricane::Net::Direction::ConnWiredOr ) ? 'w' : '-');
    407 
    408  switch ( (int)*object ) {
    409  case Hurricane::Net::Direction::UNDEFINED: s << " (UNDEFINED)"; break;
    410  case Hurricane::Net::Direction::IN: s << " (IN)"; break;
    411  case Hurricane::Net::Direction::OUT: s << " (OUT)"; break;
    412  case Hurricane::Net::Direction::INOUT: s << " (INOUT)"; break;
    413  case Hurricane::Net::Direction::TRISTATE: s << " (TRISTATE)"; break;
    414  case Hurricane::Net::Direction::TRANSCV: s << " (TRANSCV)"; break;
    415  case Hurricane::Net::Direction::WOR_OUT: s << " (WOR_OUT)"; break;
    416  case Hurricane::Net::Direction::WOR_INOUT: s << " (WOR_INOUT)"; break;
    417  }
    418  return s.str();
    419  }
    420 
    421 template<>
    422 inline Hurricane::Record* getRecord<const Hurricane::Net::Direction::Code*>
    423  ( const Hurricane::Net::Direction::Code* object )
    424  {
    425  Hurricane::Record* record = new Hurricane::Record(getString(object));
    426  record->add(getSlot("Code", (unsigned int*)object));
    427  return record;
    428  }
    429 
    430 
    431 INSPECTOR_P_SUPPORT(Hurricane::Net);
    432 INSPECTOR_P_SUPPORT(Hurricane::Net::ComponentSet);
    433 INSPECTOR_P_SUPPORT(Hurricane::Net::RubberSet);
    434 INSPECTOR_PR_SUPPORT(Hurricane::Net::Type);
    435 INSPECTOR_PR_SUPPORT(Hurricane::Net::Direction);
    436 IOSTREAM_POINTER_SUPPORT(Hurricane::Net::Type::Code);
    437 IOSTREAM_VALUE_SUPPORT(Hurricane::Net::Type::Code);
    438 IOSTREAM_POINTER_SUPPORT(Hurricane::Net::Direction::Code);
    439 IOSTREAM_VALUE_SUPPORT(Hurricane::Net::Direction::Code);
    440 
    441 
    442 namespace Hurricane {
    443 
    444 // Force SlotTemplate<> expansion on Net* type.
    445 // Because sometimes it didn't happens (?).
    446  const SlotTemplate<Net*> dummyNetSlot ( string("dummyNetSlot"), NULL );
    447 
    448 }
    449 
    450 #endif // HURRICANE_NET
    451 
    452 
    453 // ****************************************************************************************************
    454 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    455 // ****************************************************************************************************
    static NetFilter getIsGlobalFilter()
    static NetFilter getIsExternalFilter()
    const Type & getType() const
    Definition: Net.h:177
    Definition: Net.h:61
    @@ -61,8 +61,8 @@ $(function() {
    bool isExternal() const
    Definition: Net.h:215
    Definition: Net.h:81
    GenericFilter< Net * > NetFilter
    Definition: Nets.h:51
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    The model (API).
    Definition: Cell.h:66
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    The model (API).
    Definition: Cell.h:64
    Point description (API)
    Definition: Point.h:32
    void setPosition(const Point &position)
    Definition: Net.h:61
    @@ -123,7 +123,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Nets_8h_source.html b/hurricane/doc/hurricane/html/Nets_8h_source.html index 16404e9d..50d02336 100644 --- a/hurricane/doc/hurricane/html/Nets_8h_source.html +++ b/hurricane/doc/hurricane/html/Nets_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Occurrence_8h_source.html b/hurricane/doc/hurricane/html/Occurrence_8h_source.html index 22c74e53..27cc18a4 100644 --- a/hurricane/doc/hurricane/html/Occurrence_8h_source.html +++ b/hurricane/doc/hurricane/html/Occurrence_8h_source.html @@ -45,7 +45,7 @@ $(function() {
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Occurrence.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_OCCURENCE
    21 #define HURRICANE_OCCURENCE
    22 
    23 #include "hurricane/Path.h"
    24 #include "hurricane/Name.h"
    25 #include "hurricane/Properties.h"
    26 
    27 namespace Hurricane {
    28 
    29 class Entity;
    30 class SharedPath;
    31 class Quark;
    32 class BasicLayer;
    33 
    34 
    35 // ****************************************************************************************************
    36 // Occurrence declaration
    37 // ****************************************************************************************************
    38 
    39 class Occurrence {
    40 // *************
    41 
    42 // Attributes
    43 // **********
    44 
    45  private: Entity* _entity;
    46  private: SharedPath* _sharedPath;
    47 
    48 // Constructors
    49 // ************
    50 
    51  public: Occurrence(const Entity* entity = NULL);
    52  public: Occurrence(const Entity* entity, const Path& path);
    53  public: Occurrence(const Occurrence& occurrence);
    54 
    55 // Operators
    56 // *********
    57 
    58  public: Occurrence& operator=(const Occurrence& occurrence);
    59 
    60  public: bool operator==(const Occurrence& occurrence) const;
    61  public: bool operator!=(const Occurrence& occurrence) const;
    62 
    63  public: bool operator<(const Occurrence& occurrence) const; // for stl set -> less predicate
    64 
    65 // Accessors
    66 // *********
    67 
    68  public: Entity* getEntity() const {return _entity;};
    69  public: Path getPath() const {return Path(_sharedPath);};
    70  public: Cell* getOwnerCell() const;
    71  public: Cell* getMasterCell() const;
    72  public: Property* getProperty(const Name& name) const;
    73  public: Properties getProperties() const;
    74  public: Occurrence getNetOccurrence() const;
    75  public: Box getBoundingBox() const;
    76  public: Box getBoundingBox(const BasicLayer*) const;
    77 
    78 // Predicates
    79 // **********
    80 
    81  public: bool isValid() const {return (_entity != NULL);};
    82  public: bool isBelowTerminalNetlist() const;
    83  public: bool hasProperty() const;
    84 
    85 // Updators
    86 // ********
    87 
    88  public: void makeInvalid();
    89  public: void put(Property* property);
    90  public: void remove(Property* property);
    91  public: void removeProperty(const Name& name);
    92  public: void clearProperties();
    93 
    94 // Others
    95 // ******
    96 
    97  public: string getName() const;
    98  public: string _getTypeName() const { return _TName("Occurrence"); };
    99  public: string _getString() const;
    100  public: string getCompactString() const;
    101  public: void toJson(JsonWriter*) const;
    102  public: Record* _getRecord() const;
    103  public: SharedPath* _getSharedPath() const {return _sharedPath;};
    104  public: Quark* _getQuark() const;
    105 
    106 };
    107 
    108 
    109 // ****************************************************************************************************
    110 // JsonOccurrence declaration
    111 // ****************************************************************************************************
    112 
    113 
    114 class JsonOccurrence : public JsonObject {
    115 // **********************************
    116 
    117  public: static void initialize();
    118  public: JsonOccurrence(unsigned long);
    119  public: virtual string getTypeName() const;
    120  public: virtual JsonOccurrence* clone(unsigned long) const;
    121  public: virtual void toData(JsonStack&);
    122 };
    123 
    124 } // End of Hurricane namespace.
    125 
    126 
    127 INSPECTOR_PR_SUPPORT(Hurricane::Occurrence);
    128 
    129 
    130 #endif // HURRICANE_OCCURENCE
    131 
    132 
    133 // ****************************************************************************************************
    134 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    135 // ****************************************************************************************************
    Entity * getEntity() const
    Definition: Occurrence.h:68
    -
    Path description (API)
    Definition: Path.h:37
    +
    Path description (API)
    Definition: Path.h:35
    Occurrence description (API)
    Definition: Occurrence.h:39
    void put(Property *property)
    Box getBoundingBox() const
    @@ -56,10 +56,10 @@ $(function() {
    Name description (API)
    Definition: Name.h:35
    Cell * getMasterCell() const
    bool hasProperty() const
    -
    The model (API).
    Definition: Cell.h:66
    +
    The model (API).
    Definition: Cell.h:64
    bool operator<(const Occurrence &occurrence) const
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    -
    Property description (API)
    Definition: Property.h:58
    +
    Property description (API)
    Definition: Property.h:56
    bool operator!=(const Occurrence &occurrence) const
    Cell * getOwnerCell() const
    Box description (API)
    Definition: Box.h:31
    @@ -76,7 +76,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Occurrences_8h_source.html b/hurricane/doc/hurricane/html/Occurrences_8h_source.html index b008e32c..b51404e9 100644 --- a/hurricane/doc/hurricane/html/Occurrences_8h_source.html +++ b/hurricane/doc/hurricane/html/Occurrences_8h_source.html @@ -49,7 +49,7 @@ $(function() {
    Generic Filter auto-pointer.
    Definition: Filter.h:27
    GenericLocator< Occurrence > OccurrenceLocator
    Definition: Occurrences.h:43
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    -
    Instance description (API)
    Definition: Instance.h:37
    +
    Instance description (API)
    Definition: Instance.h:35
    GenericFilter< Occurrence > OccurrenceFilter
    Definition: Occurrences.h:44
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    GenericCollection< Occurrence > Occurrences
    Definition: Occurrences.h:40
    @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Pad_8h_source.html b/hurricane/doc/hurricane/html/Pad_8h_source.html index ed8a5af7..b49088a0 100644 --- a/hurricane/doc/hurricane/html/Pad_8h_source.html +++ b/hurricane/doc/hurricane/html/Pad_8h_source.html @@ -50,7 +50,7 @@ $(function() {
    static Pad * create(Net *net, const Layer *layer, const Box &boundingBox)
    Component Inherit
    Definition: Pad.h:42
    Support for JSON export.
    Definition: JsonObject.h:83
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    Box description (API)
    Definition: Box.h:31
    Layer description (API)
    Definition: Layer.h:52
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Pads_8h_source.html b/hurricane/doc/hurricane/html/Pads_8h_source.html index e96d617d..90978acc 100644 --- a/hurricane/doc/hurricane/html/Pads_8h_source.html +++ b/hurricane/doc/hurricane/html/Pads_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Path_8h_source.html b/hurricane/doc/hurricane/html/Path_8h_source.html index 8efb59b9..491ec892 100644 --- a/hurricane/doc/hurricane/html/Path_8h_source.html +++ b/hurricane/doc/hurricane/html/Path_8h_source.html @@ -44,7 +44,7 @@ $(function() {
    Path.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Path.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_PATH
    21 #define HURRICANE_PATH
    22 
    23 #include "hurricane/Instances.h"
    24 #include "hurricane/Transformation.h"
    25 
    26 namespace Hurricane {
    27 
    28 class Cell;
    29 class SharedPath;
    30 
    31 
    32 
    33 // ****************************************************************************************************
    34 // Path declaration
    35 // ****************************************************************************************************
    36 
    37 class Path {
    38 // *******
    39 
    40 // Attributes
    41 // **********
    42 
    43  private: SharedPath* _sharedPath;
    44 
    45 // Constructors
    46 // ************
    47 
    48  public: Path(SharedPath* sharedPath = NULL);
    49  public: Path(Instance* instance);
    50  public: Path(Instance* headInstance, const Path& tailPath);
    51  public: Path(const Path& headPath, Instance* tailInstance);
    52  public: Path(Cell* cell, const string& pathName);
    53  public: Path(const Path& headPath, const Path& tailPath);
    54  public: Path(const Path& path);
    55 
    56 // Destructor
    57 // **********
    58 
    59  public: ~Path();
    60 
    61 // Operators
    62 // *********
    63 
    64  public: Path& operator=(const Path& path);
    65 
    66  public: bool operator==(const Path& path) const;
    67  public: bool operator!=(const Path& path) const;
    68 
    69  public: bool operator<(const Path& path) const; // for stl set -> less predicate
    70 
    71 // Accessors
    72 // *********
    73 
    74  public: static char getNameSeparator();
    75 
    76  public: Instance* getHeadInstance() const;
    77  public: Path getTailPath() const;
    78  public: Path getHeadPath() const;
    79  public: Instance* getTailInstance() const;
    80  public: string getName() const;
    81  public: Cell* getOwnerCell() const;
    82  public: Cell* getMasterCell() const;
    83  public: Instances getInstances() const;
    84  public: Transformation getTransformation(const Transformation& transformation = Transformation()) const;
    85 
    86 // Predicates
    87 // **********
    88 
    89  public: bool isEmpty() const;
    90 
    91 // Updators
    92 // ********
    93 
    94  public: void makeEmpty();
    95  public: static void setNameSeparator(char nameSeparator);
    96 
    97 // Others
    98 // ******
    99 
    100  public: string getCompactString() const;
    101  public: string getJsonString(unsigned long flags) const;
    102  public: string _getTypeName() const { return _TName("Occurrence"); };
    103  public: string _getString() const;
    104  public: Record* _getRecord() const;
    105 
    106  public: SharedPath* _getSharedPath() const {return _sharedPath;};
    107 
    108 };
    109 
    110 
    111 
    112 } // End of Hurricane namespace.
    113 
    114 
    115 INSPECTOR_PR_SUPPORT(Hurricane::Path);
    116 
    117 
    118 #endif // HURRICANE_PATH
    119 
    120 
    121 // ****************************************************************************************************
    122 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    123 // ****************************************************************************************************
    Path description (API)
    Definition: Path.h:37
    +
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Path.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #pragma once
    21 #include "hurricane/Instances.h"
    22 #include "hurricane/Transformation.h"
    23 
    24 namespace Hurricane {
    25 
    26 class Cell;
    27 class SharedPath;
    28 
    29 
    30 
    31 // ****************************************************************************************************
    32 // Path declaration
    33 // ****************************************************************************************************
    34 
    35 class Path {
    36 // *******
    37 
    38 // Attributes
    39 // **********
    40 
    41  private: SharedPath* _sharedPath;
    42 
    43 // Constructors
    44 // ************
    45 
    46  public: Path(SharedPath* sharedPath = NULL);
    47  public: Path(Instance* instance);
    48  public: Path(Instance* headInstance, const Path& tailPath);
    49  public: Path(const Path& headPath, Instance* tailInstance);
    50  public: Path(Cell* cell, const string& pathName);
    51  public: Path(const Path& headPath, const Path& tailPath);
    52  public: Path(const Path& path);
    53 
    54 // Destructor
    55 // **********
    56 
    57  public: ~Path();
    58 
    59 // Operators
    60 // *********
    61 
    62  public: Path& operator=(const Path& path);
    63 
    64  public: bool operator==(const Path& path) const;
    65  public: bool operator!=(const Path& path) const;
    66 
    67  public: bool operator<(const Path& path) const; // for stl set -> less predicate
    68 
    69 // Accessors
    70 // *********
    71 
    72  public: static char getNameSeparator();
    73 
    74  public: Instance* getHeadInstance() const;
    75  public: Path getTailPath() const;
    76  public: Path getHeadPath() const;
    77  public: Instance* getTailInstance() const;
    78  public: string getName() const;
    79  public: Cell* getOwnerCell() const;
    80  public: Cell* getMasterCell() const;
    81  public: Instances getInstances() const;
    82  public: Transformation getTransformation(const Transformation& transformation = Transformation()) const;
    83 
    84 // Predicates
    85 // **********
    86 
    87  public: bool isEmpty() const;
    88  public: int32_t contains(Instance*) const;
    89 
    90 // Updators
    91 // ********
    92 
    93  public: void makeEmpty();
    94  public: static void setNameSeparator(char nameSeparator);
    95 
    96 // Others
    97 // ******
    98 
    99  public: string getCompactString(bool showBrackets=true) const;
    100  public: string getJsonString(unsigned long flags) const;
    101  public: string _getTypeName() const { return _TName("Occurrence"); };
    102  public: string _getString() const;
    103  public: Record* _getRecord() const;
    104 
    105  public: SharedPath* _getSharedPath() const {return _sharedPath;};
    106 
    107 };
    108 
    109 
    110 
    111 } // End of Hurricane namespace.
    112 
    113 
    114 INSPECTOR_PR_SUPPORT(Hurricane::Path);
    115 
    116 
    117 // ****************************************************************************************************
    118 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    119 // ****************************************************************************************************
    Path description (API)
    Definition: Path.h:35
    static char getNameSeparator()
    Path getHeadPath() const
    Path & operator=(const Path &path)
    @@ -54,12 +54,12 @@ $(function() {
    Instance * getHeadInstance() const
    Transformation getTransformation(const Transformation &transformation=Transformation()) const
    bool operator==(const Path &path) const
    -
    The model (API).
    Definition: Cell.h:66
    +
    The model (API).
    Definition: Cell.h:64
    bool isEmpty() const
    Transformation description (API)
    Definition: Transformation.h:32
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    bool operator!=(const Path &path) const
    -
    Instance description (API)
    Definition: Instance.h:37
    +
    Instance description (API)
    Definition: Instance.h:35
    Cell * getMasterCell() const
    string getName() const
    Cell * getOwnerCell() const
    @@ -73,7 +73,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Pathes_8h_source.html b/hurricane/doc/hurricane/html/Pathes_8h_source.html index 8ed18bce..e1b98f35 100644 --- a/hurricane/doc/hurricane/html/Pathes_8h_source.html +++ b/hurricane/doc/hurricane/html/Pathes_8h_source.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/PhysicalRule_8h_source.html b/hurricane/doc/hurricane/html/PhysicalRule_8h_source.html index b122b8c7..e9b0b22b 100644 --- a/hurricane/doc/hurricane/html/PhysicalRule_8h_source.html +++ b/hurricane/doc/hurricane/html/PhysicalRule_8h_source.html @@ -44,11 +44,11 @@ $(function() {
    PhysicalRule.h
    -
    1 // -*- C++ -*-
    2 //
    3 // This file is part of the Coriolis Software.
    4 // Copyright (c) UPMC 2009-2018, All Rights Reserved
    5 //
    6 // +-----------------------------------------------------------------+
    7 // | C O R I O L I S |
    8 // | H u r r i c a n e A n a l o g |
    9 // | |
    10 // | Authors : Damien Dupuis |
    11 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    12 // | =============================================================== |
    13 // | C++ Header : "./hurricane/PhysicalRule.h" |
    14 // +-----------------------------------------------------------------+
    15 
    16 
    17 #pragma once
    18 #include <tuple>
    19 #include "hurricane/DbU.h"
    20 #include "hurricane/Rule.h"
    21 
    22 
    23 namespace Hurricane {
    24 
    25 
    26  class RuleStep {
    27  public:
    28  inline RuleStep ( Hurricane::DbU::Unit uValue );
    29  inline RuleStep ( Hurricane::DbU::Unit hValue, Hurricane::DbU::Unit vValue );
    30  inline Hurricane::DbU::Unit getValue () const;
    31  inline Hurricane::DbU::Unit getHValue () const;
    32  inline Hurricane::DbU::Unit getVValue () const;
    33  inline Hurricane::DbU::Unit getThreshold () const;
    34  inline void setThreshold ( Hurricane::DbU::Unit );
    35  public:
    36  std::string _getTypeName () const;
    37  std::string _getString () const;
    38  Record* _getRecord () const;
    39  private:
    40  Hurricane::DbU::Unit _hValue;
    41  Hurricane::DbU::Unit _vValue;
    42  Hurricane::DbU::Unit _threshold;
    43  };
    44 
    45 
    46  inline RuleStep::RuleStep ( Hurricane::DbU::Unit uValue )
    47  : _hValue (uValue)
    48  , _vValue (uValue)
    49  , _threshold(0)
    50  { }
    51 
    52  inline RuleStep::RuleStep ( Hurricane::DbU::Unit hValue, Hurricane::DbU::Unit vValue )
    53  : _hValue (hValue)
    54  , _vValue (vValue)
    55  , _threshold(0)
    56  { }
    57 
    58  inline Hurricane::DbU::Unit RuleStep::getValue () const { return _hValue; }
    59  inline Hurricane::DbU::Unit RuleStep::getHValue () const { return _hValue; }
    60  inline Hurricane::DbU::Unit RuleStep::getVValue () const { return _vValue; }
    61  inline Hurricane::DbU::Unit RuleStep::getThreshold () const { return _threshold; }
    62  inline void RuleStep::setThreshold ( Hurricane::DbU::Unit t ) { _threshold = t; }
    63 
    64 
    65  class PhysicalRule : public Rule {
    66  public:
    67  typedef Rule Super;
    68  typedef std::vector<RuleStep> Steps;
    69  public:
    70  inline PhysicalRule ( const Name& name, const std::string& reference );
    71  inline PhysicalRule ( const PhysicalRule& rule );
    72  virtual ~PhysicalRule ();
    73  inline bool isDouble () const;
    74  inline bool isDbU () const;
    75  inline bool isSymmetric () const;
    76  inline bool hasSteps () const;
    77  inline void setSymmetric ( bool );
    78  inline double getDoubleValue () const;
    79  inline DbU::Unit getValue ( Hurricane::DbU::Unit length=0, bool hDir=true ) const;
    80  inline void addValue ( double );
    81  inline void addValue ( Hurricane::DbU::Unit value
    82  , Hurricane::DbU::Unit maxLength );
    83  inline void addValue ( Hurricane::DbU::Unit hValue
    84  , Hurricane::DbU::Unit vValue
    85  , Hurricane::DbU::Unit maxLength );
    86  public:
    87  virtual std::string _getTypeName () const;
    88  virtual std::string _getString () const;
    89  virtual Record* _getRecord () const;
    90  public:
    91  inline void _addValue ( const RuleStep& );
    92  private:
    93  Steps _stepsValue;
    94  double _doubleValue;
    95  bool _symmetric;
    96  };
    97 
    98 
    99  inline PhysicalRule::PhysicalRule ( const Name& name
    100  , const std::string& reference )
    101  : Rule(name,reference)
    102  , _stepsValue ()
    103  , _doubleValue(0.0)
    104  , _symmetric (true)
    105  { }
    106 
    107 
    108  inline PhysicalRule::PhysicalRule ( const PhysicalRule& rule )
    109  : Rule(rule.getName(),rule.getReference())
    110  , _stepsValue (rule._stepsValue)
    111  , _doubleValue(rule._doubleValue)
    112  { }
    113 
    114 
    115  inline bool PhysicalRule::isDouble () const { return _doubleValue != 0; }
    116  inline bool PhysicalRule::isDbU () const { return not _stepsValue.empty(); }
    117  inline bool PhysicalRule::isSymmetric () const { return _symmetric; }
    118  inline bool PhysicalRule::hasSteps () const { return not _stepsValue.size() > 1; }
    119  inline double PhysicalRule::getDoubleValue () const { return _doubleValue; }
    120  inline void PhysicalRule::setSymmetric ( bool state ) { _symmetric = state; }
    121  inline void PhysicalRule::addValue ( double value ) { _doubleValue = value; }
    122 
    123 
    125  {
    126  if (_stepsValue.empty()) return 0;
    127  for ( const RuleStep& step : _stepsValue ) {
    128  if (length < step.getThreshold()) {
    129  return (hDir) ? step.getHValue() : step.getVValue();
    130  }
    131  }
    132  return (hDir) ? _stepsValue.back().getHValue() : _stepsValue.back().getVValue();;
    133  }
    134 
    135 
    137  {
    138  RuleStep step ( value );
    139  step.setThreshold( maxLength );
    140  _addValue( step );
    141  }
    142 
    143 
    145  {
    146  RuleStep step ( hValue, vValue );
    147  step.setThreshold( maxLength );
    148  _addValue( step );
    149  }
    150 
    151 
    152  inline void PhysicalRule::_addValue ( const RuleStep& step )
    153  {
    154  for ( auto istep = _stepsValue.begin() ; istep != _stepsValue.end() ; ++istep ) {
    155  if (step.getThreshold() < (*istep).getThreshold()) {
    156  _stepsValue.insert( istep, step );
    157  return;
    158  }
    159  }
    160  _stepsValue.push_back( step );
    161  }
    162 
    163 
    164 } // Hurricane namespace.
    165 
    166 
    167 INSPECTOR_P_SUPPORT(Hurricane::PhysicalRule);
    168 INSPECTOR_PR_SUPPORT(Hurricane::RuleStep);
    DbU::Unit getValue(Hurricane::DbU::Unit length=0, bool hDir=true) const
    Definition: PhysicalRule.h:124
    +
    1 // -*- C++ -*-
    2 //
    3 // This file is part of the Coriolis Software.
    4 // Copyright (c) UPMC 2009-2018, All Rights Reserved
    5 //
    6 // +-----------------------------------------------------------------+
    7 // | C O R I O L I S |
    8 // | H u r r i c a n e A n a l o g |
    9 // | |
    10 // | Authors : Damien Dupuis |
    11 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    12 // | =============================================================== |
    13 // | C++ Header : "./hurricane/PhysicalRule.h" |
    14 // +-----------------------------------------------------------------+
    15 
    16 
    17 #pragma once
    18 #include <tuple>
    19 #include "hurricane/DbU.h"
    20 #include "hurricane/Rule.h"
    21 
    22 
    23 namespace Hurricane {
    24 
    25 
    26  class RuleStep {
    27  public:
    28  inline RuleStep ( Hurricane::DbU::Unit uValue );
    29  inline RuleStep ( Hurricane::DbU::Unit hValue, Hurricane::DbU::Unit vValue );
    30  inline Hurricane::DbU::Unit getValue () const;
    31  inline Hurricane::DbU::Unit getHValue () const;
    32  inline Hurricane::DbU::Unit getVValue () const;
    33  inline Hurricane::DbU::Unit getThreshold () const;
    34  inline void setThreshold ( Hurricane::DbU::Unit );
    35  public:
    36  std::string _getTypeName () const;
    37  std::string _getString () const;
    38  Record* _getRecord () const;
    39  private:
    40  Hurricane::DbU::Unit _hValue;
    41  Hurricane::DbU::Unit _vValue;
    42  Hurricane::DbU::Unit _threshold;
    43  };
    44 
    45 
    46  inline RuleStep::RuleStep ( Hurricane::DbU::Unit uValue )
    47  : _hValue (uValue)
    48  , _vValue (uValue)
    49  , _threshold(0)
    50  { }
    51 
    52  inline RuleStep::RuleStep ( Hurricane::DbU::Unit hValue, Hurricane::DbU::Unit vValue )
    53  : _hValue (hValue)
    54  , _vValue (vValue)
    55  , _threshold(0)
    56  { }
    57 
    58  inline Hurricane::DbU::Unit RuleStep::getValue () const { return _hValue; }
    59  inline Hurricane::DbU::Unit RuleStep::getHValue () const { return _hValue; }
    60  inline Hurricane::DbU::Unit RuleStep::getVValue () const { return _vValue; }
    61  inline Hurricane::DbU::Unit RuleStep::getThreshold () const { return _threshold; }
    62  inline void RuleStep::setThreshold ( Hurricane::DbU::Unit t ) { _threshold = t; }
    63 
    64 
    65  class PhysicalRule : public Rule {
    66  public:
    67  typedef Rule Super;
    68  typedef std::vector<RuleStep> Steps;
    69  public:
    70  inline PhysicalRule ( const Name& name, const std::string& reference );
    71  inline PhysicalRule ( const PhysicalRule& rule );
    72  virtual ~PhysicalRule ();
    73  inline bool isDouble () const;
    74  inline bool isDbU () const;
    75  inline bool isSymmetric () const;
    76  inline bool hasSteps () const;
    77  inline void setSymmetric ( bool );
    78  inline double getDoubleValue () const;
    79  inline DbU::Unit getValue ( Hurricane::DbU::Unit length=0, bool hDir=true ) const;
    80  inline void addValue ( double );
    81  inline void addValue ( Hurricane::DbU::Unit value
    82  , Hurricane::DbU::Unit maxLength );
    83  inline void addValue ( Hurricane::DbU::Unit hValue
    84  , Hurricane::DbU::Unit vValue
    85  , Hurricane::DbU::Unit maxLength );
    86  public:
    87  virtual std::string _getTypeName () const;
    88  virtual std::string _getString () const;
    89  virtual Record* _getRecord () const;
    90  public:
    91  inline void _addValue ( const RuleStep& );
    92  private:
    93  Steps _stepsValue;
    94  double _doubleValue;
    95  bool _symmetric;
    96  };
    97 
    98 
    99  inline PhysicalRule::PhysicalRule ( const Name& name
    100  , const std::string& reference )
    101  : Rule(name,reference)
    102  , _stepsValue ()
    103  , _doubleValue(0.0)
    104  , _symmetric (true)
    105  { }
    106 
    107 
    108  inline PhysicalRule::PhysicalRule ( const PhysicalRule& rule )
    109  : Rule(rule.getName(),rule.getReference())
    110  , _stepsValue (rule._stepsValue)
    111  , _doubleValue(rule._doubleValue)
    112  { }
    113 
    114 
    115  inline bool PhysicalRule::isDouble () const { return _doubleValue != 0; }
    116  inline bool PhysicalRule::isDbU () const { return not _stepsValue.empty(); }
    117  inline bool PhysicalRule::isSymmetric () const { return _symmetric; }
    118  inline bool PhysicalRule::hasSteps () const { return not (_stepsValue.size() > 1); }
    119  inline double PhysicalRule::getDoubleValue () const { return _doubleValue; }
    120  inline void PhysicalRule::setSymmetric ( bool state ) { _symmetric = state; }
    121  inline void PhysicalRule::addValue ( double value ) { _doubleValue = value; }
    122 
    123 
    125  {
    126  if (_stepsValue.empty()) return 0;
    127  for ( const RuleStep& step : _stepsValue ) {
    128  if (length < step.getThreshold()) {
    129  return (hDir) ? step.getHValue() : step.getVValue();
    130  }
    131  }
    132  return (hDir) ? _stepsValue.back().getHValue() : _stepsValue.back().getVValue();;
    133  }
    134 
    135 
    137  {
    138  RuleStep step ( value );
    139  step.setThreshold( maxLength );
    140  _addValue( step );
    141  }
    142 
    143 
    145  {
    146  RuleStep step ( hValue, vValue );
    147  step.setThreshold( maxLength );
    148  _addValue( step );
    149  }
    150 
    151 
    152  inline void PhysicalRule::_addValue ( const RuleStep& step )
    153  {
    154  for ( auto istep = _stepsValue.begin() ; istep != _stepsValue.end() ; ++istep ) {
    155  if (step.getThreshold() < (*istep).getThreshold()) {
    156  _stepsValue.insert( istep, step );
    157  return;
    158  }
    159  }
    160  _stepsValue.push_back( step );
    161  }
    162 
    163 
    164 } // Hurricane namespace.
    165 
    166 
    167 INSPECTOR_P_SUPPORT(Hurricane::PhysicalRule);
    168 INSPECTOR_PR_SUPPORT(Hurricane::RuleStep);
    DbU::Unit getValue(Hurricane::DbU::Unit length=0, bool hDir=true) const
    Definition: PhysicalRule.h:124
    bool isSymmetric() const
    Definition: PhysicalRule.h:117
    double getDoubleValue() const
    Definition: PhysicalRule.h:119
    Name description (API)
    Definition: Name.h:35
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    bool hasSteps() const
    Definition: PhysicalRule.h:118
    void addValue(double)
    Definition: PhysicalRule.h:121
    bool isDbU() const
    Definition: PhysicalRule.h:116
    @@ -61,7 +61,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Pin_8h_source.html b/hurricane/doc/hurricane/html/Pin_8h_source.html index 142d2d76..e37c243d 100644 --- a/hurricane/doc/hurricane/html/Pin_8h_source.html +++ b/hurricane/doc/hurricane/html/Pin_8h_source.html @@ -44,11 +44,11 @@ $(function() {
    Pin.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Pin.h
    3 // Authors: C. Alexandre
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_PIN
    21 #define HURRICANE_PIN
    22 
    23 #include "hurricane/Contact.h"
    24 #include "hurricane/Pins.h"
    25 
    26 namespace Hurricane {
    27 
    28 
    29 
    30 // ****************************************************************************************************
    31 // Pin declaration
    32 // ****************************************************************************************************
    33 
    34 class Pin : public Contact {
    35 // ***********************
    36 
    37 // Types
    38 // *****
    39 
    40  public: typedef Contact Inherit;
    41 
    42  public: class AccessDirection {
    43  // **************************
    44 
    45  public: enum Code {UNDEFINED=0, NORTH=1, SOUTH=2, EAST=3, WEST=4};
    46 
    47  private: Code _code;
    48 
    49  public: AccessDirection(const Code& code = UNDEFINED);
    50  public: AccessDirection(const AccessDirection& accessDirection);
    51 
    52  public: AccessDirection& operator=(const AccessDirection& accessDirection);
    53 
    54  public: operator const Code&() const {return _code;};
    55 
    56  public: const Code& getCode() const {return _code;};
    57 
    58  public: string _getTypeName() const { return _TName("Pin::AccessDirection"); };
    59  public: string _getString() const;
    60  public: Record* _getRecord() const;
    61 
    62  };
    63 
    64  public: class PlacementStatus {
    65  // **************************
    66 
    67  public: enum Code {UNPLACED=0, PLACED=1, FIXED=2};
    68 
    69  private: Code _code;
    70 
    71  public: PlacementStatus(const Code& code = UNPLACED);
    72  public: PlacementStatus(const PlacementStatus& placementstatus);
    73 
    74  public: PlacementStatus& operator=(const PlacementStatus& placementstatus);
    75 
    76  public: operator const Code&() const {return _code;};
    77 
    78  public: const Code& getCode() const {return _code;};
    79 
    80  public: string _getTypeName() const { return _TName("Pin::PlacementStatus"); };
    81  public: string _getString() const;
    82  public: Record* _getRecord() const;
    83 
    84  };
    85 
    86 // Attributes
    87 // **********
    88 
    89  private: Name _name;
    90  private: AccessDirection _accessDirection;
    91  private: PlacementStatus _placementStatus;
    92  private: Pin* _nextOfCellPinMap;
    93 
    94 // Constructors
    95 // ************
    96 
    97  protected: Pin( Net* net
    98  , const Name& name
    99  , const AccessDirection& accessDirection
    100  , const PlacementStatus& placementStatus
    101  , const Layer* layer
    102  , const DbU::Unit& x
    103  , const DbU::Unit& y
    104  , const DbU::Unit& width = 0
    105  , const DbU::Unit& height = 0
    106  );
    107  public: static Pin* create( Net* net
    108  , const Name& name
    109  , const AccessDirection& accessDirection
    110  , const PlacementStatus& placementStatus
    111  , const Layer* layer
    112  , const DbU::Unit& x
    113  , const DbU::Unit& y
    114  , const DbU::Unit& width = 0
    115  , const DbU::Unit& height = 0
    116  );
    117 
    118 // Accessors
    119 // *********
    120 
    121  public: const Name& getName() const {return _name;};
    122  public: const AccessDirection& getAccessDirection() const {return _accessDirection;};
    123  public: const PlacementStatus& getPlacementStatus() const {return _placementStatus;};
    124 
    125 // Predicates
    126 // **********
    127 
    128  public: bool isUnplaced() const {return _placementStatus == PlacementStatus::UNPLACED;};
    129  public: bool isPlaced() const {return _placementStatus == PlacementStatus::PLACED;};
    130  public: bool isFixed() const {return _placementStatus == PlacementStatus::FIXED;};
    131 
    132 // Updators
    133 // ********
    134 
    135  public: void setPlacementStatus(const PlacementStatus& placementstatus);
    136 
    137 // Others
    138 // ******
    139 
    140  protected: virtual void _postCreate();
    141 
    142  protected: virtual void _preDestroy();
    143 
    144  public: virtual string _getTypeName() const {return _TName("Pin");};
    145  public: virtual string _getString() const;
    146  public: virtual Record* _getRecord() const;
    147 
    148  public: Pin* _getNextOfCellPinMap() const {return _nextOfCellPinMap;};
    149 
    150  public: void _setNextOfCellPinMap(Pin* pin) {_nextOfCellPinMap = pin;};
    151 
    152 };
    153 
    154 
    155 } // End of Hurricane namespace.
    156 
    157 
    158 INSPECTOR_P_SUPPORT(Hurricane::Pin);
    159 INSPECTOR_PR_SUPPORT(Hurricane::Pin::AccessDirection);
    160 INSPECTOR_PR_SUPPORT(Hurricane::Pin::PlacementStatus);
    161 
    162 
    163 #endif // HURRICANE_PIN
    164 
    165 // ****************************************************************************************************
    166 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    167 // ****************************************************************************************************
    Pin description (API)
    Definition: Pin.h:34
    +
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2020, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Christophe Alexandre |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/Commons.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 #pragma once
    32 #include "hurricane/Contact.h"
    33 #include "hurricane/Pins.h"
    34 
    35 namespace Hurricane {
    36 
    37 
    38 // -------------------------------------------------------------------
    39 // Class : "Hurricane::Pin".
    40 
    41  class Pin : public Contact {
    42  public:
    43  typedef Contact Inherit;
    44 
    45  public:
    46  class AccessDirection {
    47  public:
    48  enum Code { UNDEFINED=0, NORTH=1, SOUTH=2, EAST=3, WEST=4 };
    49  public:
    50  AccessDirection ( Code code=UNDEFINED );
    51  AccessDirection ( const AccessDirection& accessDirection );
    52  AccessDirection& operator= ( const AccessDirection& accessDirection );
    53  operator Code () const { return _code; };
    54  Code getCode () const { return _code; };
    55  std::string _getTypeName () const { return _TName("Pin::AccessDirection"); };
    56  std::string _getString () const;
    57  Record* _getRecord () const;
    58  private:
    59  Code _code;
    60  };
    61 
    62  public:
    63  class PlacementStatus {
    64  public:
    65  enum Code { UNPLACED=0, PLACED=1, FIXED=2 };
    66  public:
    67  PlacementStatus ( Code code=UNPLACED);
    68  PlacementStatus ( const PlacementStatus& placementstatus );
    69  PlacementStatus& operator= ( const PlacementStatus& placementstatus );
    70  operator Code () const { return _code; };
    71  Code getCode () const { return _code; };
    72  std::string _getTypeName () const { return _TName("Pin::PlacementStatus"); };
    73  std::string _getString () const;
    74  Record* _getRecord () const;
    75  private:
    76  Code _code;
    77  };
    78 
    79  protected:
    80  Pin ( Net*
    81  , const Name&
    82  , const AccessDirection&
    83  , const PlacementStatus&
    84  , const Layer*
    85  , DbU::Unit x
    86  , DbU::Unit y
    87  , DbU::Unit width
    88  , DbU::Unit height
    89  );
    90  public:
    91  static Pin* create ( Net*
    92  , const Name&
    93  , const AccessDirection&
    94  , const PlacementStatus&
    95  , const Layer*
    96  , DbU::Unit x
    97  , DbU::Unit y
    98  , DbU::Unit width =0
    99  , DbU::Unit height=0
    100  );
    101  public:
    102  const Name& getName () const { return _name; };
    103  const AccessDirection& getAccessDirection () const { return _accessDirection; };
    104  const PlacementStatus& getPlacementStatus () const { return _placementStatus; };
    105  bool isUnplaced () const { return _placementStatus == PlacementStatus::UNPLACED; };
    106  bool isPlaced () const { return _placementStatus == PlacementStatus::PLACED; };
    107  bool isFixed () const { return _placementStatus == PlacementStatus::FIXED; };
    108  void setPlacementStatus ( const PlacementStatus& );
    109  protected:
    110  virtual void _postCreate ();
    111  virtual void _preDestroy ();
    112  private:
    113  bool _postCheck ();
    114  public:
    115  virtual std::string _getTypeName () const {return _TName("Pin");};
    116  virtual std::string _getString () const;
    117  virtual Record* _getRecord () const;
    118  Pin* _getNextOfCellPinMap () const { return _nextOfCellPinMap; };
    119  void _setNextOfCellPinMap ( Pin* pin ) { _nextOfCellPinMap = pin; };
    120  private:
    121  Name _name;
    122  AccessDirection _accessDirection;
    123  PlacementStatus _placementStatus;
    124  Pin* _nextOfCellPinMap;
    125  };
    126 
    127 
    128 } // Hurricane namespace.
    129 
    130 
    131 INSPECTOR_P_SUPPORT(Hurricane::Pin);
    132 INSPECTOR_PR_SUPPORT(Hurricane::Pin::AccessDirection);
    133 INSPECTOR_PR_SUPPORT(Hurricane::Pin::PlacementStatus);
    Pin description (API)
    Definition: Pin.h:41
    Name description (API)
    Definition: Name.h:35
    -
    Contact description (API)
    Definition: Contact.h:33
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    Contact description (API)
    Definition: Contact.h:43
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    Layer description (API)
    Definition: Layer.h:52
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    Net description (API)
    Definition: Net.h:48
    @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Pins_8h_source.html b/hurricane/doc/hurricane/html/Pins_8h_source.html index ee4ce914..6bdf989a 100644 --- a/hurricane/doc/hurricane/html/Pins_8h_source.html +++ b/hurricane/doc/hurricane/html/Pins_8h_source.html @@ -50,7 +50,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Plug_8h_source.html b/hurricane/doc/hurricane/html/Plug_8h_source.html index 54bbf19f..0f1327f3 100644 --- a/hurricane/doc/hurricane/html/Plug_8h_source.html +++ b/hurricane/doc/hurricane/html/Plug_8h_source.html @@ -49,14 +49,14 @@ $(function() {
    Net * getMasterNet() const
    Definition: Plug.h:73
    Component description (API)
    Definition: Component.h:42
    Generic Filter auto-pointer.
    Definition: Filter.h:27
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    The model (API).
    Definition: Cell.h:66
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    The model (API).
    Definition: Cell.h:64
    Point description (API)
    Definition: Point.h:32
    Component Inherit
    Definition: Plug.h:43
    Instance * getInstance() const
    Definition: Plug.h:72
    void setNet(Net *net)
    Box description (API)
    Definition: Box.h:31
    -
    Instance description (API)
    Definition: Instance.h:37
    +
    Instance description (API)
    Definition: Instance.h:35
    static PlugFilter getIsUnconnectedFilter()
    Layer description (API)
    Definition: Layer.h:52
    bool isConnected() const
    Definition: Plug.h:84
    @@ -69,7 +69,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Plugs_8h_source.html b/hurricane/doc/hurricane/html/Plugs_8h_source.html index 25d1415f..bed6d24b 100644 --- a/hurricane/doc/hurricane/html/Plugs_8h_source.html +++ b/hurricane/doc/hurricane/html/Plugs_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Point_8h_source.html b/hurricane/doc/hurricane/html/Point_8h_source.html index 1d0ebd32..49c5cdaa 100644 --- a/hurricane/doc/hurricane/html/Point_8h_source.html +++ b/hurricane/doc/hurricane/html/Point_8h_source.html @@ -44,22 +44,22 @@ $(function() {
    Point.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Point.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_POINT
    21 #define HURRICANE_POINT
    22 
    23 #include "hurricane/DbU.h"
    24 
    25 namespace Hurricane {
    26 
    27 
    28 // ****************************************************************************************************
    29 // Point declaration
    30 // ****************************************************************************************************
    31 
    32 class Point {
    33 // ********
    34 
    35 // Attributes
    36 // **********
    37 
    38  private: DbU::Unit _x;
    39  private: DbU::Unit _y;
    40 
    41 // Constructors
    42 // ************
    43 
    44  public: Point();
    45 
    46  public: Point(const DbU::Unit& x, const DbU::Unit& y);
    47 
    48  public: Point(const Point& point);
    49 
    50 // Operators
    51 // *********
    52 
    53  public: Point& operator=(const Point& point);
    54 
    55  public: bool operator==(const Point& point) const;
    56  public: bool operator!=(const Point& point) const;
    57 
    58  public: Point operator+(const Point& point) const;
    59  public: Point operator-(const Point& point) const;
    60  public: Point& operator+=(const Point& point);
    61  public: Point& operator-=(const Point& point);
    62 
    63 // Accessors
    64 // *********
    65 
    66  public: const DbU::Unit& getX() const {return _x;};
    67  public: const DbU::Unit& getY() const {return _y;};
    68  public: DbU::Unit manhattanDistance(const Point pt) const
    69  { return abs(_x - pt.getX()) + abs(_y - pt.getY()); }
    70 
    71 // Updators
    72 // ********
    73 
    74  public: void setX(const DbU::Unit& x) {_x = x;};
    75  public: void setY(const DbU::Unit& y) {_y = y;};
    76  public: Point& translate(const DbU::Unit& dx, const DbU::Unit& dy);
    77  public: Point getTranslated(const DbU::Unit& dx, const DbU::Unit& dy) const;
    78 
    79 // Others
    80 // ******
    81 
    82  public: string _getTypeName() const { return _TName("Point"); };
    83  public: string _getString() const;
    84  public: Record* _getRecord() const;
    85  public: void toJson(JsonWriter*) const;
    86 
    87 };
    88 
    89 
    90 class JsonPoint : public JsonObject {
    91 // **********************************
    92 
    93  public: static void initialize();
    94  public: JsonPoint(unsigned long);
    95  public: virtual string getTypeName() const;
    96  public: virtual JsonPoint* clone(unsigned long) const;
    97  public: virtual void toData(JsonStack&);
    98 };
    99 
    100 
    101 } // End of Hurricane namespace.
    102 
    103 INSPECTOR_PR_SUPPORT(Hurricane::Point);
    104 
    105 
    106 #endif // HURRICANE_POINT
    107 
    108 
    109 // ****************************************************************************************************
    110 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    111 // ****************************************************************************************************
    Point & translate(const DbU::Unit &dx, const DbU::Unit &dy)
    +
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Point.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_POINT
    21 #define HURRICANE_POINT
    22 
    23 #include "hurricane/DbU.h"
    24 
    25 namespace Hurricane {
    26 
    27 
    28 // ****************************************************************************************************
    29 // Point declaration
    30 // ****************************************************************************************************
    31 
    32 class Point {
    33 // ********
    34 
    35 // Attributes
    36 // **********
    37 
    38  private: DbU::Unit _x;
    39  private: DbU::Unit _y;
    40 
    41 // Constructors
    42 // ************
    43 
    44  public: Point();
    45 
    46  public: Point(const DbU::Unit& x, const DbU::Unit& y);
    47 
    48  public: Point(const Point& point);
    49 
    50 // Operators
    51 // *********
    52 
    53  public: Point& operator=(const Point& point);
    54 
    55  public: bool operator==(const Point& point) const;
    56  public: bool operator!=(const Point& point) const;
    57 
    58  public: Point operator+(const Point& point) const;
    59  public: Point operator-(const Point& point) const;
    60  public: Point& operator+=(const Point& point);
    61  public: Point& operator-=(const Point& point);
    62 
    63 // Accessors
    64 // *********
    65 
    66  public: const DbU::Unit& getX() const {return _x;};
    67  public: const DbU::Unit& getY() const {return _y;};
    68  public: DbU::Unit manhattanDistance(const Point pt) const
    69  { return abs(_x - pt.getX()) + abs(_y - pt.getY()); }
    70 
    71 // Updators
    72 // ********
    73 
    74  public: void setX(DbU::Unit x) {_x = x;};
    75  public: void setY(DbU::Unit y) {_y = y;};
    76  public: Point& translate(const DbU::Unit& dx, const DbU::Unit& dy);
    77  public: Point getTranslated(const DbU::Unit& dx, const DbU::Unit& dy) const;
    78 
    79 // Others
    80 // ******
    81 
    82  public: string _getTypeName() const { return _TName("Point"); };
    83  public: string _getString() const;
    84  public: Record* _getRecord() const;
    85  public: void toJson(JsonWriter*) const;
    86 
    87 };
    88 
    89 
    90 class JsonPoint : public JsonObject {
    91 // **********************************
    92 
    93  public: static void initialize();
    94  public: JsonPoint(unsigned long);
    95  public: virtual string getTypeName() const;
    96  public: virtual JsonPoint* clone(unsigned long) const;
    97  public: virtual void toData(JsonStack&);
    98 };
    99 
    100 
    101 } // End of Hurricane namespace.
    102 
    103 INSPECTOR_PR_SUPPORT(Hurricane::Point);
    104 
    105 
    106 #endif // HURRICANE_POINT
    107 
    108 
    109 // ****************************************************************************************************
    110 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    111 // ****************************************************************************************************
    Point & translate(const DbU::Unit &dx, const DbU::Unit &dy)
    bool operator==(const Point &point) const
    Point & operator=(const Point &point)
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    Point description (API)
    Definition: Point.h:32
    bool operator!=(const Point &point) const
    +
    void setY(DbU::Unit y)
    Definition: Point.h:75
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    -
    void setY(const DbU::Unit &y)
    Definition: Point.h:75
    -
    void setX(const DbU::Unit &x)
    Definition: Point.h:74
    +
    void setX(DbU::Unit x)
    Definition: Point.h:74


    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Points_8h_source.html b/hurricane/doc/hurricane/html/Points_8h_source.html index 07d3aaac..8c593a8c 100644 --- a/hurricane/doc/hurricane/html/Points_8h_source.html +++ b/hurricane/doc/hurricane/html/Points_8h_source.html @@ -50,7 +50,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Polygon_8h_source.html b/hurricane/doc/hurricane/html/Polygon_8h_source.html index 139a357d..d9278ac9 100644 --- a/hurricane/doc/hurricane/html/Polygon_8h_source.html +++ b/hurricane/doc/hurricane/html/Polygon_8h_source.html @@ -46,7 +46,7 @@ $(function() {
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Jean-Paul Chaput |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/Polygon.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #ifndef HURRICANE_POLYGON_H
    33 #define HURRICANE_POLYGON_H
    34 
    35 #include "hurricane/Component.h"
    36 #include "hurricane/Polygons.h"
    37 
    38 
    39 namespace Hurricane {
    40 
    41  class Layer;
    42 
    43 
    44  class Polygon : public Component {
    45  public:
    46  typedef Component Super;
    47  public:
    48  static const uint32_t Above = (1<<0);
    49  static const uint32_t YSteps = (1<<1);
    50  static const uint32_t XSteps = (1<<2);
    51  static const uint32_t XIncrease = (1<<3);
    52  static const uint32_t YIncrease = (1<<4);
    53  static const uint32_t Horizontal = (1<<5);
    54  static const uint32_t Vertical = (1<<6);
    55 
    56  public:
    57  class Edge {
    58  public:
    59  Edge ( Point origin, Point extremity, uint32_t flags );
    60  inline size_t getSize () const;
    61  Point getPoint ( size_t i ) const;
    62  inline bool isPositiveSlope () const;
    63  inline bool isYIncrease () const;
    64  inline bool isXIncrease () const;
    65  inline bool isHV () const;
    66  inline bool isXSteps () const;
    67  inline bool isYSteps () const;
    68  void translate ( DbU::Unit dx, DbU::Unit dy );
    69  string _getTypeName () const;
    70  string _getString () const;
    71  Record* _getRecord () const;
    72  private:
    73  uint32_t _flags;
    74  DbU::Unit _xyOrigin;
    75  vector<DbU::Unit> _steps;
    76  };
    77 
    78  public:
    79  class Points_Manhattan : public PointHC {
    80  public:
    81  class Locator : public PointHL {
    82  public:
    83  Locator ( const Polygon* );
    84  inline Locator ( const Locator& );
    85  virtual Point getElement () const;
    86  virtual PointHL* getClone () const;
    87  virtual bool isValid () const;
    88  virtual void progress ();
    89  virtual string _getString () const;
    90  protected:
    91  const Polygon* _polygon;
    92  size_t _iEdge;
    93  size_t _iPoint;
    94  };
    95  public:
    96  inline Points_Manhattan ( const Polygon* );
    97  inline Points_Manhattan ( const Points_Manhattan& );
    98  virtual PointHC* getClone () const;
    99  virtual PointHL* getLocator () const;
    100  virtual string _getString () const;
    101  protected:
    102  const Polygon* _polygon;
    103  };
    104 
    105  public:
    106  static Polygon* create ( Net*, const Layer*, const std::vector<Point>& );
    107  static float getSlope ( const Point&, const Point& );
    108  public:
    109  virtual bool isNonRectangle () const;
    110  virtual bool isManhattanized () const;
    111  virtual DbU::Unit getX () const;
    112  virtual DbU::Unit getY () const;
    113  inline const vector<Point>& getPoints () const;
    114  inline const vector<Edge*>& getEdges () const;
    115  virtual size_t getPointsSize () const;
    116  virtual Point getPoint ( size_t ) const;
    117  virtual Box getBoundingBox () const;
    118  virtual Box getBoundingBox ( const BasicLayer* ) const;
    119  void getSubPolygons ( vector< vector<Point> >& ) const;
    120  virtual const Layer* getLayer () const;
    121  void setLayer ( const Layer* layer );
    122  virtual void translate ( const DbU::Unit& dx, const DbU::Unit& dy );
    123  void setPoints ( const vector<Point>& );
    124  static float getSign ( const vector<Point>&, size_t );
    125  float getSlope ( size_t i ) const;
    126  void manhattanize ();
    127  virtual Points getMContour () const;
    128  virtual void _toJson ( JsonWriter* ) const;
    129  static JsonObject* getJsonObject ( unsigned long flags );
    130  virtual string _getTypeName () const;
    131  virtual string _getString () const;
    132  virtual Record* _getRecord () const;
    133  protected:
    134  Polygon ( Net*, const Layer*, const std::vector<Point>& );
    135  ~Polygon ();
    136  private:
    137  const Layer* _layer;
    138  std::vector<Point> _points;
    139  std::vector<Edge*> _edges;
    140  };
    141 
    142 
    143  inline const vector<Polygon::Edge*>& Polygon::getEdges () const { return _edges; }
    144  inline const vector<Point>& Polygon::getPoints () const { return _points; }
    145 
    146  inline bool Polygon::Edge::isYIncrease () const { return (_flags & Polygon::YIncrease); }
    147  inline bool Polygon::Edge::isXIncrease () const { return (_flags & Polygon::XIncrease); }
    148  inline bool Polygon::Edge::isPositiveSlope () const { return not ( (_flags & Polygon::XIncrease) xor (_flags & Polygon::YIncrease) ); }
    149  inline bool Polygon::Edge::isHV () const { return (_flags & (Polygon::Horizontal|Polygon::Vertical)); }
    150  inline bool Polygon::Edge::isXSteps () const { return (_flags & Polygon::XSteps); }
    151  inline bool Polygon::Edge::isYSteps () const { return (_flags & Polygon::YSteps); }
    152  inline size_t Polygon::Edge::getSize () const { if (isHV() or (_steps.size() < 2)) return 1; return (_steps.size() - 1)*2; }
    153 
    154 
    155  inline Polygon::Points_Manhattan::Locator::Locator ( const Locator &locator )
    156  : PointHL ()
    157  , _polygon(locator._polygon)
    158  , _iEdge (locator._iEdge)
    159  , _iPoint (locator._iPoint)
    160  { }
    161 
    162 
    163  inline Polygon::Points_Manhattan::Points_Manhattan ( const Polygon* polygon )
    164  : PointHC ()
    165  , _polygon(polygon)
    166  { }
    167 
    168 
    169  inline Polygon::Points_Manhattan::Points_Manhattan ( const Points_Manhattan& other )
    170  : PointHC()
    171  , _polygon(other._polygon)
    172  { }
    173 
    174 
    175  class JsonPolygon : public JsonComponent {
    176  public:
    177  static void initialize ();
    178  JsonPolygon ( unsigned long flags );
    179  virtual string getTypeName () const;
    180  virtual JsonPolygon* clone ( unsigned long ) const;
    181  virtual void toData ( JsonStack& );
    182  };
    183 
    184 
    185 } // Hurricane namespace.
    186 
    187 
    188 INSPECTOR_P_SUPPORT(Hurricane::Polygon::Edge);
    189 INSPECTOR_P_SUPPORT(Hurricane::Polygon);
    190 
    191 #endif // HURRICANE_POLYGON_H
    Collection description (API)
    Definition: Collection.h:39
    Component description (API)
    Definition: Component.h:42
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    Point description (API)
    Definition: Point.h:32
    Horizontal description (API)
    Definition: Horizontal.h:36
    Vertical description (API)
    Definition: Vertical.h:36
    @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Properties_8h_source.html b/hurricane/doc/hurricane/html/Properties_8h_source.html index 628c9ae9..39f27125 100644 --- a/hurricane/doc/hurricane/html/Properties_8h_source.html +++ b/hurricane/doc/hurricane/html/Properties_8h_source.html @@ -47,7 +47,7 @@ $(function() {
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Properties.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_PROPERTIES
    21 #define HURRICANE_PROPERTIES
    22 
    23 #include "hurricane/Collection.h"
    24 
    25 namespace Hurricane {
    26 
    27 class Property;
    28 
    29 
    30 
    31 // ****************************************************************************************************
    32 // Properties declaration
    33 // ****************************************************************************************************
    34 
    36 
    37 
    38 
    39 // ****************************************************************************************************
    40 // PropertyLocator declaration
    41 // ****************************************************************************************************
    42 
    44 
    45 
    46 
    47 // ****************************************************************************************************
    48 // PropertyFilter declaration
    49 // ****************************************************************************************************
    50 
    52 
    53 
    54 
    55 // ****************************************************************************************************
    56 // for_each_property declaration
    57 // ****************************************************************************************************
    58 
    59 #define for_each_property(property, properties)\
    60 /**********************************************/\
    61 {\
    62  PropertyLocator _locator = properties.getLocator();\
    63  while (_locator.isValid()) {\
    64  Property* property = _locator.getElement();\
    65  _locator.progress();
    66 
    67 
    68 
    69 } // End of Hurricane namespace.
    70 
    71 #endif // HURRICANE_PROPERTIES
    72 
    73 
    74 // ****************************************************************************************************
    75 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    76 // ****************************************************************************************************
    Generic Locator auto-pointer.
    Definition: Locator.h:113
    Generic Filter auto-pointer.
    Definition: Filter.h:27
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    -
    Property description (API)
    Definition: Property.h:58
    +
    Property description (API)
    Definition: Property.h:56
    GenericFilter< Property * > PropertyFilter
    Definition: Properties.h:51
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    GenericCollection< Property * > Properties
    Definition: Properties.h:27
    @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Property_8h_source.html b/hurricane/doc/hurricane/html/Property_8h_source.html index 955c8f37..e547e7e9 100644 --- a/hurricane/doc/hurricane/html/Property_8h_source.html +++ b/hurricane/doc/hurricane/html/Property_8h_source.html @@ -44,29 +44,29 @@ $(function() {
    Property.h
    -
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Remy Escassut |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/Property.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #ifndef HURRICANE_PROPERTY_H
    33 #define HURRICANE_PROPERTY_H
    34 
    35 #include "hurricane/Name.h"
    36 #include "hurricane/Properties.h"
    37 #include "hurricane/DBo.h"
    38 #include "hurricane/Error.h"
    39 
    40 
    41 namespace Hurricane {
    42 
    43 
    44  extern const char* propertyTypeNameError;
    45 
    46 
    47 // -------------------------------------------------------------------
    48 // Classes : template enable/disable Json support.
    49 
    50  struct JsonEnabled { enum State { enabled=1 }; };
    51  struct JsonDisabled { enum State { enabled=0 }; };
    52 
    53 
    54 // -------------------------------------------------------------------
    55 // Class : "Hurricane::Property".
    56 
    57 
    58  class Property {
    59 
    60  public:
    61  // Static Method.
    62  template<typename DerivedProperty>
    63  static DerivedProperty* get ( const DBo* );
    64  static Name staticGetName ();
    65  // Constructor.
    66  template<typename DerivedProperty>
    67  static DerivedProperty* create ();
    68  template<typename DerivedProperty, typename Value>
    69  static DerivedProperty* create ( const Value& );
    70  // Destructor.
    71  virtual void destroy ();
    72  // Methods.
    73  virtual Name getName () const = 0;
    74  virtual void onCapturedBy ( DBo* owner ) = 0;
    75  virtual void onReleasedBy ( DBo* owner ) = 0;
    76  // Hurricane Managment.
    77  virtual bool hasJson () const;
    78  virtual void toJson ( JsonWriter*, const DBo* ) const;
    79  virtual string _getTypeName () const = 0;
    80  virtual string _getString () const;
    81  virtual Record* _getRecord () const;
    82 
    83  private:
    84  static Name _baseName;
    85  protected:
    86  // Internal: Constructors & Destructors.
    87  Property ();
    88  virtual ~Property ();
    89  virtual void _postCreate () {};
    90  virtual void _preDestroy () {};
    91  private:
    92  Property ( const Property& );
    93  Property& operator= ( const Property& );
    94  };
    95 
    96 
    97  template<typename DerivedProperty>
    98  DerivedProperty* Property::create ()
    99  {
    100  DerivedProperty* property = new DerivedProperty();
    101  property->_postCreate();
    102  return property;
    103  }
    104 
    105 
    106  template<typename DerivedProperty, typename Value>
    107  DerivedProperty* Property::create ( const Value& value )
    108  {
    109  DerivedProperty* property = new DerivedProperty(value);
    110  property->_postCreate();
    111  return property;
    112  }
    113 
    114 
    115  template<typename DerivedProperty>
    116  DerivedProperty* Property::get ( const DBo* object )
    117  {
    118  Property* property1 = object->getProperty ( DerivedProperty::staticGetName() );
    119  DerivedProperty* property2 = dynamic_cast<DerivedProperty*> ( property1 );
    120 
    121  if ( property1 && !property2 )
    122  throw Error ( propertyTypeNameError
    123  , getString(DerivedProperty::staticGetName()).c_str()
    124  , getString(object).c_str() );
    125 
    126  return property2;
    127  }
    128 
    129 
    130 // -------------------------------------------------------------------
    131 // Class : "Hurricane::PrivateProperty".
    132 
    133 
    134  class PrivateProperty : public Property {
    135 
    136  public:
    137  // Methods.
    138  inline DBo* getOwner () const;
    139  virtual void onCapturedBy ( DBo* owner );
    140  virtual void onReleasedBy ( DBo* owner );
    141  virtual void onNotOwned ();
    142  virtual string _getString () const;
    143  virtual Record* _getRecord () const;
    144 
    145  private:
    146  // Internal: Attributes.
    147  DBo* _owner;
    148  protected:
    149  // Internal: Constructor & Destructors.
    150  PrivateProperty ();
    151  virtual void _preDestroy ();
    152  };
    153 
    154 
    155 // Inline Functions.
    156  inline DBo* PrivateProperty::getOwner () const { return _owner; };
    157 
    158 
    159 // -------------------------------------------------------------------
    160 // Template Class : "Hurricane::StandardPrivateProperty".
    161 
    162 
    163  template<typename Value, typename JsonState=JsonDisabled>
    165  public:
    166  static Name staticGetName ();
    167  static Value* staticGetValue ( const DBo* );
    168  static StandardPrivateProperty* get ( const DBo*, bool create=false );
    169  // Constructors.
    170  static StandardPrivateProperty* create ();
    171  static StandardPrivateProperty* create ( const Value& );
    172  // Methods.
    173  virtual Name getName () const;
    174  Value& getValue () const;
    175  void setValue ( const Value& );
    176  virtual bool hasJson () const;
    177  virtual void toJson ( JsonWriter*, const DBo* ) const;
    178  virtual string _getTypeName () const;
    179  virtual string _getString () const;
    180  virtual Record* _getRecord () const;
    181  private:
    182  // Internal: Attributes.
    183  static Name _name;
    184  static DBo* _owner;
    185  static StandardPrivateProperty* _cache;
    186  mutable Value _value;
    187  protected:
    188  // Internal: Constructor.
    190  StandardPrivateProperty ( const Value& );
    191  public:
    192  class JsonProperty : public JsonObject {
    193  public:
    194  static void initialize ();
    195  JsonProperty ( unsigned long flags );
    196  virtual string getTypeName () const;
    197  virtual JsonProperty* clone ( unsigned long ) const;
    198  virtual void toData ( JsonStack& );
    199  };
    200  };
    201 
    202 
    203  template<typename Value, typename JsonState>
    205  : JsonObject(flags)
    206  {
    207  if (flags & JsonWriter::RegisterMode)
    208  cerr << "Registering JsonProperty" << endl;
    209  add( "_value", typeid(Value) );
    210  }
    211 
    212 
    213  template<typename Value, typename JsonState>
    214  string StandardPrivateProperty<Value,JsonState>::JsonProperty::getTypeName () const
    215  { return getString(StandardPrivateProperty<Value,JsonState>::staticGetName()); }
    216 
    217 
    218  template<typename Value, typename JsonState>
    219  void StandardPrivateProperty<Value,JsonState>::JsonProperty::initialize ()
    220  { JsonTypes::registerType( new JsonProperty (JsonWriter::RegisterMode) ); }
    221 
    222 
    223  template<typename Value, typename JsonState>
    224  typename StandardPrivateProperty<Value,JsonState>::JsonProperty*
    225  StandardPrivateProperty<Value,JsonState>::JsonProperty::clone ( unsigned long flags ) const
    226  { return new JsonProperty ( flags ); }
    227 
    228 
    229  template<typename Value, typename JsonState>
    230  void StandardPrivateProperty<Value,JsonState>::JsonProperty::toData ( JsonStack& stack )
    231  {
    232  check( stack, "JsonProperty::toData" );
    233 
    234  DBo* dbo = stack.back_dbo();
    235  Value value = get<string>(stack,"_value");
    236  StandardPrivateProperty<Value,JsonState>* property
    237  = StandardPrivateProperty<Value,JsonState>::create(value);
    238  if (dbo) dbo->put( property );
    239 
    240  update( stack, property );
    241  }
    242 
    243 
    244  template<typename Value, typename JsonState>
    245  DBo* StandardPrivateProperty<Value,JsonState>::_owner = NULL;
    246 
    247 
    248  template<typename Value, typename JsonState>
    249  StandardPrivateProperty<Value,JsonState>* StandardPrivateProperty<Value,JsonState>::_cache = NULL;
    250 
    251 
    252  template<typename Value, typename JsonState>
    253  Name StandardPrivateProperty<Value,JsonState>::staticGetName ()
    254  {
    255  return _name;
    256  }
    257 
    258 
    259  template<typename Value, typename JsonState>
    260  Value* StandardPrivateProperty<Value,JsonState>::staticGetValue ( const DBo* object )
    261  {
    262  if ( ( object == _owner ) || get(object) ) return _cache->getValue();
    263  return NULL;
    264  }
    265 
    266 
    267  template<typename Value, typename JsonState>
    268  StandardPrivateProperty<Value,JsonState>* StandardPrivateProperty<Value,JsonState>::create ()
    269  {
    270  _cache = new StandardPrivateProperty<Value>();
    271  _cache->_postCreate();
    272  return _cache;
    273  }
    274 
    275 
    276  template<typename Value, typename JsonState>
    277  StandardPrivateProperty<Value,JsonState>* StandardPrivateProperty<Value,JsonState>::create ( const Value& value )
    278  {
    279  _cache = new StandardPrivateProperty<Value>(value);
    280  _cache->_postCreate();
    281  return _cache;
    282  }
    283 
    284 
    285  template<typename Value, typename JsonState>
    286  StandardPrivateProperty<Value,JsonState>* StandardPrivateProperty<Value,JsonState>::get ( const DBo* object, bool create )
    287  {
    288  if ( object == _owner ) return _cache;
    289 
    290  Property* property = object->getProperty ( StandardPrivateProperty<Value>::staticGetName() );
    291  _cache = dynamic_cast<StandardPrivateProperty<Value>*> ( property );
    292 
    293  if ( !_cache ) {
    294  if ( property )
    295  throw Error ( propertyTypeNameError
    296  , getString(StandardPrivateProperty<Value>::staticGetName()).c_str()
    297  , getString(object).c_str() );
    298  else if ( create )
    299  const_cast<DBo*>(object)->put ( StandardPrivateProperty<Value>::create() );
    300  }
    301 
    302  return _cache;
    303  }
    304 
    305 
    306  template<typename Value, typename JsonState>
    307  StandardPrivateProperty<Value,JsonState>::StandardPrivateProperty ()
    308  : PrivateProperty(), _value()
    309  { }
    310 
    311 
    312  template<typename Value, typename JsonState>
    313  StandardPrivateProperty<Value,JsonState>::StandardPrivateProperty ( const Value& value )
    314  : PrivateProperty(), _value(value)
    315  { }
    316 
    317 
    318  template<typename Value, typename JsonState>
    319  Name StandardPrivateProperty<Value,JsonState>::getName() const
    320  {
    321  return staticGetName();
    322  }
    323 
    324 
    325  template<typename Value, typename JsonState>
    326  Value& StandardPrivateProperty<Value,JsonState>::getValue () const
    327  {
    328  return _value;
    329  }
    330 
    331 
    332  template<typename Value, typename JsonState>
    333  void StandardPrivateProperty<Value,JsonState>::setValue ( const Value& value )
    334  {
    335  _value = value;
    336  }
    337 
    338 
    339  template<typename Value, typename JsonState>
    340  bool StandardPrivateProperty<Value,JsonState>::hasJson () const
    341  {
    342  return JsonState::enabled;
    343  }
    344 
    345 
    346  template<typename Value, typename JsonState>
    347  void StandardPrivateProperty<Value,JsonState>::toJson ( JsonWriter* w, const DBo* ) const
    348  {
    349  w->startObject();
    350  std::string tname = getString(staticGetName());
    351  jsonWrite( w, "@typename", tname );
    352  jsonWrite( w, "_value", _value );
    353  w->endObject();
    354  }
    355 
    356 
    357  template<typename Value, typename JsonState>
    358  string StandardPrivateProperty<Value,JsonState>::_getTypeName () const
    359  {
    360  return _TName("StandardPrivateProperty");
    361  }
    362 
    363  template<typename Value, typename JsonState>
    364  string StandardPrivateProperty<Value,JsonState>::_getString () const
    365  {
    366  string s = PrivateProperty::_getString();
    367  s.insert(s.length() - 1, " " + getString<Value&>(_value));
    368  return s;
    369  }
    370 
    371  template<typename Value, typename JsonState>
    372  Record* StandardPrivateProperty<Value,JsonState>::_getRecord () const
    373  {
    374  Record* record = PrivateProperty::_getRecord();
    375  if (record) {
    376  record->add ( getSlot("_name" , staticGetName()) );
    377  record->add ( getSlot("_value" ,&_value) );
    378  record->add ( getSlot("JSON support", JsonState::enabled) );
    379  }
    380  return record;
    381  }
    382 
    383 
    384 // -------------------------------------------------------------------
    385 // Class : "Hurricane::SharedProperty".
    386 
    387 
    388  class SharedProperty : public Property {
    389  private:
    390  class Orphaned {
    391  public:
    392  inline Orphaned ( SharedProperty* );
    393  public:
    394  SharedProperty* _property;
    395  unsigned int _refcount;
    396  unsigned int _count;
    397  };
    398  public:
    399  typedef set<DBo*,DBo::CompareById> DBoSet;
    400  typedef map<string,Orphaned> OrphanedMap;
    401  public:
    402  static const OrphanedMap& getOrphaneds ();
    403  static SharedProperty* getOrphaned ( const string& );
    404  static void addOrphaned ( const string&, SharedProperty* );
    405  static void refOrphaned ( const string& );
    406  static void countOrphaned ( const string&, unsigned int );
    407  static void removeOrphaned ( const string& );
    408  static void clearOrphaneds ();
    409  public:
    410  inline DBos getOwners () const;
    411  virtual void onCapturedBy ( DBo* owner );
    412  virtual void onReleasedBy ( DBo* owner );
    413  virtual void onNotOwned ();
    414  void _erase ( DBo* owner );
    415  inline DBoSet& _getOwnerSet ();
    416  virtual string _getString () const;
    417  virtual Record* _getRecord () const;
    418  private:
    419  static OrphanedMap _orphaneds;
    420  private:
    421  DBoSet _ownerSet;
    422  protected:
    423  SharedProperty ();
    424  virtual void _preDestroy ();
    425  };
    426 
    427 
    428 // Inline Functions.
    429  inline SharedProperty::Orphaned::Orphaned ( SharedProperty* property )
    430  : _property(property), _refcount(0), _count(0)
    431  { }
    432 
    433  inline DBos SharedProperty::getOwners () const { return getCollection(_ownerSet); }
    434  inline SharedProperty::DBoSet& SharedProperty::_getOwnerSet () { return _ownerSet; }
    435 
    436 
    437 // -------------------------------------------------------------------
    438 // Template Class : "Hurricane::StandardSharedProperty".
    439 
    440 
    441  template<typename Value> class StandardSharedProperty : public SharedProperty {
    442 
    443  public:
    444  static Name staticGetName ();
    445  static Value* staticGetValue ( const DBo* );
    446  static StandardSharedProperty* get ( const DBo*, bool create=false );
    447  // Constructors.
    448  static StandardSharedProperty* create ();
    449  static StandardSharedProperty* create ( const Value& );
    450  // Methods.
    451  virtual Name getName () const;
    452  Value& getValue () const;
    453  void setValue ( const Value& );
    454  virtual string _getTypeName () const;
    455  virtual string _getString () const;
    456  virtual Record* _getRecord () const;
    457 
    458  private:
    459  // Internal: Attributes.
    460  static Name _name;
    461  static DBo* _owner;
    462  static StandardSharedProperty* _cache;
    463  mutable Value _value;
    464 
    465  protected:
    466  // Internal: Constructor.
    468  StandardSharedProperty ( const Value& );
    469  };
    470 
    471 
    472 // Template function members.
    473  template<typename Value>
    475 
    476 
    477  template<typename Value>
    479 
    480 
    481  template<typename Value>
    483  {
    484  return _name;
    485  }
    486 
    487 
    488  template<typename Value>
    489  Value* StandardSharedProperty<Value>::staticGetValue ( const DBo* object )
    490  {
    491  if ( ( object == _owner ) || get(object) ) return _cache->getValue();
    492  return NULL;
    493  }
    494 
    495 
    496  template<typename Value>
    497  StandardSharedProperty<Value>* StandardSharedProperty<Value>::create ()
    498  {
    499  _cache = new StandardSharedProperty<Value>();
    500  _cache->_postCreate();
    501  return _cache;
    502  }
    503 
    504 
    505  template<typename Value>
    506  StandardSharedProperty<Value>* StandardSharedProperty<Value>::create ( const Value& value )
    507  {
    508  _cache = new StandardPrivateProperty<Value>(value);
    509  _cache->_postCreate();
    510  return _cache;
    511  }
    512 
    513 
    514  template<typename Value>
    515  StandardSharedProperty<Value>* StandardSharedProperty<Value>::get ( const DBo* object, bool create )
    516  {
    517  if ( _owner == object ) return _cache;
    518 
    519  Property* property = object->getProperty ( StandardSharedProperty<Value>::staticGetName() );
    520  _cache = dynamic_cast<StandardSharedProperty<Value>*> ( property );
    521 
    522  if ( !_cache ) {
    523  if ( property )
    524  throw Error ( propertyTypeNameError
    525  , getString(StandardSharedProperty<Value>::staticGetName()).c_str()
    526  , getString(object).c_str() );
    527  else if ( create )
    528  const_cast<DBo*>(object)->put ( StandardSharedProperty<Value>::create() );
    529  }
    530 
    531  return _cache;
    532  }
    533 
    534 
    535  template<typename Value>
    536  StandardSharedProperty<Value>::StandardSharedProperty ()
    537  : SharedProperty(), _value()
    538  { }
    539 
    540 
    541  template<typename Value>
    542  StandardSharedProperty<Value>::StandardSharedProperty ( const Value& value )
    543  : SharedProperty(), _value(value)
    544  { }
    545 
    546 
    547  template<typename Value>
    548  Name StandardSharedProperty<Value>::getName() const
    549  {
    550  return staticGetName();
    551  }
    552 
    553 
    554  template<typename Value>
    555  Value& StandardSharedProperty<Value>::getValue() const
    556  {
    557  return _value;
    558  }
    559 
    560 
    561  template<typename Value>
    562  void StandardSharedProperty<Value>::setValue(const Value& value)
    563  {
    564  _value = value;
    565  }
    566 
    567 
    568  template<typename Value>
    569  string StandardSharedProperty<Value>::_getTypeName() const
    570  {
    571  return _TName("StandardSharedProperty");
    572  }
    573 
    574 
    575  template<typename Value>
    576  string StandardSharedProperty<Value>::_getString() const
    577  {
    578  string s = SharedProperty::_getString();
    579  s.insert(s.length() - 1, " " + getString(_value));
    580  return s;
    581  }
    582 
    583 
    584  template<typename Value>
    585  Record* StandardSharedProperty<Value>::_getRecord() const
    586  {
    587  Record* record = SharedProperty::_getRecord();
    588  if (record) {
    589  record->add ( getSlot("Name" , staticGetName()) );
    590  record->add ( getSlot("Value", &_value) );
    591  }
    592  return record;
    593  }
    594 
    595 
    596 } // Hurricane namespace.
    597 
    598 
    599 INSPECTOR_P_SUPPORT(Hurricane::Property);
    600 
    601 
    602 #endif // HURRICANE_PROPERTY_H
    PrivateProperty description (API)
    Definition: Property.h:134
    +
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2021, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Remy Escassut |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/Property.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #pragma once
    33 #include "hurricane/Name.h"
    34 #include "hurricane/Properties.h"
    35 #include "hurricane/DBo.h"
    36 #include "hurricane/Error.h"
    37 
    38 
    39 namespace Hurricane {
    40 
    41 
    42  extern const char* propertyTypeNameError;
    43 
    44 
    45 // -------------------------------------------------------------------
    46 // Classes : template enable/disable Json support.
    47 
    48  struct JsonEnabled { enum State { enabled=1 }; };
    49  struct JsonDisabled { enum State { enabled=0 }; };
    50 
    51 
    52 // -------------------------------------------------------------------
    53 // Class : "Hurricane::Property".
    54 
    55 
    56  class Property {
    57 
    58  public:
    59  // Static Method.
    60  template<typename DerivedProperty>
    61  static DerivedProperty* get ( const DBo* );
    62  static Name staticGetName ();
    63  // Constructor.
    64  template<typename DerivedProperty>
    65  static DerivedProperty* create ();
    66  template<typename DerivedProperty, typename Value>
    67  static DerivedProperty* create ( const Value& );
    68  // Destructor.
    69  virtual void destroy ();
    70  // Methods.
    71  virtual Name getName () const = 0;
    72  virtual void onCapturedBy ( DBo* owner ) = 0;
    73  virtual void onReleasedBy ( DBo* owner ) = 0;
    74  // Hurricane Managment.
    75  virtual bool hasJson () const;
    76  virtual void toJson ( JsonWriter*, const DBo* ) const;
    77  virtual string _getTypeName () const = 0;
    78  virtual string _getString () const;
    79  virtual Record* _getRecord () const;
    80 
    81  private:
    82  static Name _baseName;
    83  protected:
    84  // Internal: Constructors & Destructors.
    85  Property ();
    86  virtual ~Property ();
    87  virtual void _postCreate () {};
    88  virtual void _preDestroy () {};
    89  private:
    90  Property ( const Property& );
    91  Property& operator= ( const Property& );
    92  };
    93 
    94 
    95  template<typename DerivedProperty>
    96  DerivedProperty* Property::create ()
    97  {
    98  DerivedProperty* property = new DerivedProperty();
    99  property->_postCreate();
    100  return property;
    101  }
    102 
    103 
    104  template<typename DerivedProperty, typename Value>
    105  DerivedProperty* Property::create ( const Value& value )
    106  {
    107  DerivedProperty* property = new DerivedProperty(value);
    108  property->_postCreate();
    109  return property;
    110  }
    111 
    112 
    113  template<typename DerivedProperty>
    114  DerivedProperty* Property::get ( const DBo* object )
    115  {
    116  Property* property1 = object->getProperty ( DerivedProperty::staticGetName() );
    117  DerivedProperty* property2 = dynamic_cast<DerivedProperty*> ( property1 );
    118 
    119  if ( property1 && !property2 )
    120  throw Error ( propertyTypeNameError
    121  , getString(DerivedProperty::staticGetName()).c_str()
    122  , getString(object).c_str() );
    123 
    124  return property2;
    125  }
    126 
    127 
    128 // -------------------------------------------------------------------
    129 // Class : "Hurricane::PrivateProperty".
    130 
    131 
    132  class PrivateProperty : public Property {
    133 
    134  public:
    135  // Methods.
    136  inline DBo* getOwner () const;
    137  virtual void onCapturedBy ( DBo* owner );
    138  virtual void onReleasedBy ( DBo* owner );
    139  virtual void onNotOwned ();
    140  virtual string _getString () const;
    141  virtual Record* _getRecord () const;
    142 
    143  private:
    144  // Internal: Attributes.
    145  DBo* _owner;
    146  protected:
    147  // Internal: Constructor & Destructors.
    148  PrivateProperty ();
    149  virtual void _preDestroy ();
    150  };
    151 
    152 
    153 // Inline Functions.
    154  inline DBo* PrivateProperty::getOwner () const { return _owner; };
    155 
    156 
    157 // -------------------------------------------------------------------
    158 // Template Class : "Hurricane::StandardPrivateProperty".
    159 
    160 
    161  template<typename Value, typename JsonState=JsonDisabled>
    163  public:
    164  static Name staticGetName ();
    165  static Value* staticGetValue ( const DBo* );
    166  static StandardPrivateProperty* get ( const DBo*, bool create=false );
    167  // Constructors.
    168  static StandardPrivateProperty* create ();
    169  static StandardPrivateProperty* create ( const Value& );
    170  // Methods.
    171  virtual Name getName () const;
    172  Value& getValue () const;
    173  void setValue ( const Value& );
    174  virtual bool hasJson () const;
    175  virtual void toJson ( JsonWriter*, const DBo* ) const;
    176  virtual string _getTypeName () const;
    177  virtual string _getString () const;
    178  virtual Record* _getRecord () const;
    179  private:
    180  // Internal: Attributes.
    181  static Name _name;
    182  static DBo* _owner;
    183  static StandardPrivateProperty* _cache;
    184  mutable Value _value;
    185  protected:
    186  // Internal: Constructor.
    188  StandardPrivateProperty ( const Value& );
    189  public:
    190  class JsonProperty : public JsonObject {
    191  public:
    192  static void initialize ();
    193  JsonProperty ( unsigned long flags );
    194  virtual string getTypeName () const;
    195  virtual JsonProperty* clone ( unsigned long ) const;
    196  virtual void toData ( JsonStack& );
    197  };
    198  };
    199 
    200 
    201  template<typename Value, typename JsonState>
    203  : JsonObject(flags)
    204  {
    205  if (flags & JsonWriter::RegisterMode)
    206  cerr << "Registering JsonProperty" << endl;
    207  add( "_value", typeid(Value) );
    208  }
    209 
    210 
    211  template<typename Value, typename JsonState>
    212  string StandardPrivateProperty<Value,JsonState>::JsonProperty::getTypeName () const
    213  { return getString(StandardPrivateProperty<Value,JsonState>::staticGetName()); }
    214 
    215 
    216  template<typename Value, typename JsonState>
    217  void StandardPrivateProperty<Value,JsonState>::JsonProperty::initialize ()
    218  { JsonTypes::registerType( new JsonProperty (JsonWriter::RegisterMode) ); }
    219 
    220 
    221  template<typename Value, typename JsonState>
    222  typename StandardPrivateProperty<Value,JsonState>::JsonProperty*
    223  StandardPrivateProperty<Value,JsonState>::JsonProperty::clone ( unsigned long flags ) const
    224  { return new JsonProperty ( flags ); }
    225 
    226 
    227  template<typename Value, typename JsonState>
    228  void StandardPrivateProperty<Value,JsonState>::JsonProperty::toData ( JsonStack& stack )
    229  {
    230  check( stack, "JsonProperty::toData" );
    231 
    232  DBo* dbo = stack.back_dbo();
    233  Value value = get<string>(stack,"_value");
    234  StandardPrivateProperty<Value,JsonState>* property
    235  = StandardPrivateProperty<Value,JsonState>::create(value);
    236  if (dbo) dbo->put( property );
    237 
    238  update( stack, property );
    239  }
    240 
    241 
    242  template<typename Value, typename JsonState>
    243  DBo* StandardPrivateProperty<Value,JsonState>::_owner = NULL;
    244 
    245 
    246  template<typename Value, typename JsonState>
    247  StandardPrivateProperty<Value,JsonState>* StandardPrivateProperty<Value,JsonState>::_cache = NULL;
    248 
    249 
    250  template<typename Value, typename JsonState>
    251  Name StandardPrivateProperty<Value,JsonState>::staticGetName ()
    252  {
    253  return _name;
    254  }
    255 
    256 
    257  template<typename Value, typename JsonState>
    258  Value* StandardPrivateProperty<Value,JsonState>::staticGetValue ( const DBo* object )
    259  {
    260  if ( ( object == _owner ) || get(object) ) return _cache->getValue();
    261  return NULL;
    262  }
    263 
    264 
    265  template<typename Value, typename JsonState>
    266  StandardPrivateProperty<Value,JsonState>* StandardPrivateProperty<Value,JsonState>::create ()
    267  {
    268  _cache = new StandardPrivateProperty<Value>();
    269  _cache->_postCreate();
    270  return _cache;
    271  }
    272 
    273 
    274  template<typename Value, typename JsonState>
    275  StandardPrivateProperty<Value,JsonState>* StandardPrivateProperty<Value,JsonState>::create ( const Value& value )
    276  {
    277  _cache = new StandardPrivateProperty<Value>(value);
    278  _cache->_postCreate();
    279  return _cache;
    280  }
    281 
    282 
    283  template<typename Value, typename JsonState>
    284  StandardPrivateProperty<Value,JsonState>* StandardPrivateProperty<Value,JsonState>::get ( const DBo* object, bool create )
    285  {
    286  if ( object == _owner ) return _cache;
    287 
    288  Property* property = object->getProperty ( StandardPrivateProperty<Value>::staticGetName() );
    289  _cache = dynamic_cast<StandardPrivateProperty<Value>*> ( property );
    290 
    291  if ( !_cache ) {
    292  if ( property )
    293  throw Error ( propertyTypeNameError
    294  , getString(StandardPrivateProperty<Value>::staticGetName()).c_str()
    295  , getString(object).c_str() );
    296  else if ( create )
    297  const_cast<DBo*>(object)->put ( StandardPrivateProperty<Value>::create() );
    298  }
    299 
    300  return _cache;
    301  }
    302 
    303 
    304  template<typename Value, typename JsonState>
    305  StandardPrivateProperty<Value,JsonState>::StandardPrivateProperty ()
    306  : PrivateProperty(), _value()
    307  { }
    308 
    309 
    310  template<typename Value, typename JsonState>
    311  StandardPrivateProperty<Value,JsonState>::StandardPrivateProperty ( const Value& value )
    312  : PrivateProperty(), _value(value)
    313  { }
    314 
    315 
    316  template<typename Value, typename JsonState>
    317  Name StandardPrivateProperty<Value,JsonState>::getName() const
    318  {
    319  return staticGetName();
    320  }
    321 
    322 
    323  template<typename Value, typename JsonState>
    324  Value& StandardPrivateProperty<Value,JsonState>::getValue () const
    325  {
    326  return _value;
    327  }
    328 
    329 
    330  template<typename Value, typename JsonState>
    331  void StandardPrivateProperty<Value,JsonState>::setValue ( const Value& value )
    332  {
    333  _value = value;
    334  }
    335 
    336 
    337  template<typename Value, typename JsonState>
    338  bool StandardPrivateProperty<Value,JsonState>::hasJson () const
    339  {
    340  return JsonState::enabled;
    341  }
    342 
    343 
    344  template<typename Value, typename JsonState>
    345  void StandardPrivateProperty<Value,JsonState>::toJson ( JsonWriter* w, const DBo* ) const
    346  {
    347  w->startObject();
    348  std::string tname = getString(staticGetName());
    349  jsonWrite( w, "@typename", tname );
    350  jsonWrite( w, "_value", _value );
    351  w->endObject();
    352  }
    353 
    354 
    355  template<typename Value, typename JsonState>
    356  string StandardPrivateProperty<Value,JsonState>::_getTypeName () const
    357  {
    358  return _TName("StandardPrivateProperty");
    359  }
    360 
    361  template<typename Value, typename JsonState>
    362  string StandardPrivateProperty<Value,JsonState>::_getString () const
    363  {
    364  string s = PrivateProperty::_getString();
    365  s.insert(s.length() - 1, " " + getString<Value&>(_value));
    366  return s;
    367  }
    368 
    369  template<typename Value, typename JsonState>
    370  Record* StandardPrivateProperty<Value,JsonState>::_getRecord () const
    371  {
    372  Record* record = PrivateProperty::_getRecord();
    373  if (record) {
    374  record->add ( getSlot("_name" , staticGetName()) );
    375  record->add ( getSlot("_value" ,&_value) );
    376  record->add ( getSlot("JSON support", JsonState::enabled) );
    377  }
    378  return record;
    379  }
    380 
    381 
    382 // -------------------------------------------------------------------
    383 // Class : "Hurricane::SharedProperty".
    384 
    385 
    386  class SharedProperty : public Property {
    387  private:
    388  class Orphaned {
    389  public:
    390  inline Orphaned ( SharedProperty* );
    391  public:
    392  SharedProperty* _property;
    393  unsigned int _refcount;
    394  unsigned int _count;
    395  };
    396  public:
    397  typedef set<DBo*,DBo::CompareById> DBoSet;
    398  typedef map<string,Orphaned> OrphanedMap;
    399  public:
    400  static const OrphanedMap& getOrphaneds ();
    401  static SharedProperty* getOrphaned ( const string& );
    402  static void addOrphaned ( const string&, SharedProperty* );
    403  static void refOrphaned ( const string& );
    404  static void countOrphaned ( const string&, unsigned int );
    405  static void removeOrphaned ( const string& );
    406  static void clearOrphaneds ();
    407  public:
    408  inline DBos getOwners () const;
    409  virtual void onCapturedBy ( DBo* owner );
    410  virtual void onReleasedBy ( DBo* owner );
    411  virtual void onNotOwned ();
    412  void _erase ( DBo* owner );
    413  inline DBoSet& _getOwnerSet ();
    414  virtual string _getString () const;
    415  virtual Record* _getRecord () const;
    416  private:
    417  static OrphanedMap _orphaneds;
    418  private:
    419  DBoSet _ownerSet;
    420  protected:
    421  SharedProperty ();
    422  virtual void _preDestroy ();
    423  };
    424 
    425 
    426 // Inline Functions.
    427  inline SharedProperty::Orphaned::Orphaned ( SharedProperty* property )
    428  : _property(property), _refcount(0), _count(0)
    429  { }
    430 
    431  inline DBos SharedProperty::getOwners () const { return getCollection(_ownerSet); }
    432  inline SharedProperty::DBoSet& SharedProperty::_getOwnerSet () { return _ownerSet; }
    433 
    434 
    435 // -------------------------------------------------------------------
    436 // Template Class : "Hurricane::StandardSharedProperty".
    437 
    438 
    439  template<typename Value> class StandardSharedProperty : public SharedProperty {
    440 
    441  public:
    442  static Name staticGetName ();
    443  static Value* staticGetValue ( const DBo* );
    444  static StandardSharedProperty* get ( const DBo*, bool create=false );
    445  // Constructors.
    446  static StandardSharedProperty* create ();
    447  static StandardSharedProperty* create ( const Value& );
    448  // Methods.
    449  virtual Name getName () const;
    450  Value& getValue () const;
    451  void setValue ( const Value& );
    452  virtual string _getTypeName () const;
    453  virtual string _getString () const;
    454  virtual Record* _getRecord () const;
    455 
    456  private:
    457  // Internal: Attributes.
    458  static Name _name;
    459  static DBo* _owner;
    460  static StandardSharedProperty* _cache;
    461  mutable Value _value;
    462 
    463  protected:
    464  // Internal: Constructor.
    466  StandardSharedProperty ( const Value& );
    467  };
    468 
    469 
    470 // Template function members.
    471  template<typename Value>
    473 
    474 
    475  template<typename Value>
    477 
    478 
    479  template<typename Value>
    481  {
    482  return _name;
    483  }
    484 
    485 
    486  template<typename Value>
    487  Value* StandardSharedProperty<Value>::staticGetValue ( const DBo* object )
    488  {
    489  if ( ( object == _owner ) || get(object) ) return _cache->getValue();
    490  return NULL;
    491  }
    492 
    493 
    494  template<typename Value>
    495  StandardSharedProperty<Value>* StandardSharedProperty<Value>::create ()
    496  {
    497  _cache = new StandardSharedProperty<Value>();
    498  _cache->_postCreate();
    499  return _cache;
    500  }
    501 
    502 
    503  template<typename Value>
    504  StandardSharedProperty<Value>* StandardSharedProperty<Value>::create ( const Value& value )
    505  {
    506  _cache = new StandardPrivateProperty<Value>(value);
    507  _cache->_postCreate();
    508  return _cache;
    509  }
    510 
    511 
    512  template<typename Value>
    513  StandardSharedProperty<Value>* StandardSharedProperty<Value>::get ( const DBo* object, bool create )
    514  {
    515  if ( _owner == object ) return _cache;
    516 
    517  Property* property = object->getProperty ( StandardSharedProperty<Value>::staticGetName() );
    518  _cache = dynamic_cast<StandardSharedProperty<Value>*> ( property );
    519 
    520  if ( !_cache ) {
    521  if ( property )
    522  throw Error ( propertyTypeNameError
    523  , getString(StandardSharedProperty<Value>::staticGetName()).c_str()
    524  , getString(object).c_str() );
    525  else if ( create )
    526  const_cast<DBo*>(object)->put ( StandardSharedProperty<Value>::create() );
    527  }
    528 
    529  return _cache;
    530  }
    531 
    532 
    533  template<typename Value>
    534  StandardSharedProperty<Value>::StandardSharedProperty ()
    535  : SharedProperty(), _value()
    536  { }
    537 
    538 
    539  template<typename Value>
    540  StandardSharedProperty<Value>::StandardSharedProperty ( const Value& value )
    541  : SharedProperty(), _value(value)
    542  { }
    543 
    544 
    545  template<typename Value>
    546  Name StandardSharedProperty<Value>::getName() const
    547  {
    548  return staticGetName();
    549  }
    550 
    551 
    552  template<typename Value>
    553  Value& StandardSharedProperty<Value>::getValue() const
    554  {
    555  return _value;
    556  }
    557 
    558 
    559  template<typename Value>
    560  void StandardSharedProperty<Value>::setValue(const Value& value)
    561  {
    562  _value = value;
    563  }
    564 
    565 
    566  template<typename Value>
    567  string StandardSharedProperty<Value>::_getTypeName() const
    568  {
    569  return _TName("StandardSharedProperty");
    570  }
    571 
    572 
    573  template<typename Value>
    574  string StandardSharedProperty<Value>::_getString() const
    575  {
    576  string s = SharedProperty::_getString();
    577  s.insert(s.length() - 1, " " + getString(_value));
    578  return s;
    579  }
    580 
    581 
    582  template<typename Value>
    583  Record* StandardSharedProperty<Value>::_getRecord() const
    584  {
    585  Record* record = SharedProperty::_getRecord();
    586  if (record) {
    587  record->add ( getSlot("Name" , staticGetName()) );
    588  record->add ( getSlot("Value", &_value) );
    589  }
    590  return record;
    591  }
    592 
    593 
    594 } // Hurricane namespace.
    595 
    596 
    597 INSPECTOR_P_SUPPORT(Hurricane::Property);
    PrivateProperty description (API)
    Definition: Property.h:132
    virtual void onReleasedBy(DBo *owner)=0
    -
    DBo * getOwner() const
    Definition: Property.h:156
    +
    DBo * getOwner() const
    Definition: Property.h:154
    Support for JSON export.
    Definition: JsonObject.h:83
    virtual void destroy()
    Name description (API)
    Definition: Name.h:35
    virtual void onCapturedBy(DBo *owner)=0
    -
    SharedProperty description (API)
    Definition: Property.h:388
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    SharedProperty description (API)
    Definition: Property.h:386
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    JSON Parser Stack.
    Definition: JsonObject.h:249
    -
    Property description (API)
    Definition: Property.h:58
    -
    StandardPrivateProperty description (API)
    Definition: Property.h:164
    +
    Property description (API)
    Definition: Property.h:56
    +
    StandardPrivateProperty description (API)
    Definition: Property.h:162
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    GenericCollection< DBo * > DBos
    Definition: DBos.h:27
    virtual Name getName() const =0
    -
    StandardSharedProperty description (API)
    Definition: Property.h:441
    +
    StandardSharedProperty description (API)
    Definition: Property.h:439


    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/QuadTree_8h_source.html b/hurricane/doc/hurricane/html/QuadTree_8h_source.html index 77b13ac2..fdf5f0a7 100644 --- a/hurricane/doc/hurricane/html/QuadTree_8h_source.html +++ b/hurricane/doc/hurricane/html/QuadTree_8h_source.html @@ -44,8 +44,8 @@ $(function() {
    QuadTree.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/QuadTree.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #pragma once
    21 #include "hurricane/Box.h"
    22 #include "hurricane/Gos.h"
    23 #include "hurricane/IntrusiveSet.h"
    24 
    25 namespace Hurricane {
    26 
    27 
    28 
    29 // ****************************************************************************************************
    30 // QuadTree declaration
    31 // ****************************************************************************************************
    32 
    33 class QuadTree {
    34 // Types
    35 // *****
    36 
    37  public: class GoSet : public IntrusiveSet<Go> {
    38  // *******************************************
    39 
    40  public: typedef IntrusiveSet<Go> Inherit;
    41 
    42  public: GoSet();
    43 
    44  public: virtual unsigned _getHashValue(Go* go) const;
    45  public: virtual Go* _getNextElement(Go* go) const;
    46  public: virtual void _setNextElement(Go* go, Go* nextGo) const;
    47 
    48  };
    49 
    50 // Attributes
    51 // **********
    52 
    53  private: QuadTree* _parent;
    54  private: DbU::Unit _x;
    55  private: DbU::Unit _y;
    56  private: Box _boundingBox;
    57  private: unsigned _size;
    58  private: GoSet _goSet;
    59  private: QuadTree* _ulChild; // Upper Left Child
    60  private: QuadTree* _urChild; // Upper Right Child
    61  private: QuadTree* _llChild; // Lower Left Child
    62  private: QuadTree* _lrChild; // Lower Right Child
    63 
    64 // Constructors
    65 // ************
    66 
    67  public: QuadTree();
    68 
    69  private: QuadTree(QuadTree* parent);
    70 
    71  private: QuadTree(const QuadTree& quadTree); // not implemented to forbid copy construction
    72 
    73 // Destructor
    74 // **********
    75 
    76  public: ~QuadTree();
    77 
    78 // Operators
    79 // *********
    80 
    81  private: QuadTree& operator=(const QuadTree& quadTree); // not implemented to forbid assignment
    82 
    83 // Accessors
    84 // *********
    85 
    86  //public: static size_t getLocatorAllocateds ();
    87  public: const Box& getBoundingBox() const;
    88  public: Gos getGos() const;
    89  public: Gos getGosUnder(const Box& area, DbU::Unit threshold=0) const;
    90 
    91 // Predicates
    92 // **********
    93 
    94  public: bool isEmpty() const {return (_size == 0);};
    95 
    96 // Updators
    97 // ********
    98 
    99  public: void insert(Go* go);
    100  public: void remove(Go* go);
    101 
    102 // Others
    103 // ******
    104 
    105  public: string _getTypeName() const { return _TName("QuadTree"); };
    106  public: string _getString() const;
    107  public: Record* _getRecord() const;
    108 
    109  public: GoSet& _getGoSet() {return _goSet;};
    110  public: QuadTree* _getDeepestChild(const Box& box);
    111  public: QuadTree* _getFirstQuadTree() const;
    112  public: QuadTree* _getFirstQuadTree(const Box& area) const;
    113  public: QuadTree* _getNextQuadTree();
    114  public: QuadTree* _getNextQuadTree(const Box& area);
    115 
    116  public: bool _hasBeenExploded() const {return (_ulChild != NULL);};
    117 
    118  public: void _explode();
    119  public: void _implode();
    120 
    121 };
    122 
    123 
    124 } // End of Hurricane namespace.
    125 
    126 
    127 INSPECTOR_P_SUPPORT(Hurricane::QuadTree);
    128 INSPECTOR_P_SUPPORT(Hurricane::QuadTree::GoSet);
    129 
    130 
    131 // ****************************************************************************************************
    132 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    133 // ****************************************************************************************************
    Go description (API)
    Definition: Go.h:36
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    1 // ****************************************************************************************************
    2 // File: ./hurricane/QuadTree.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #pragma once
    21 #include "hurricane/Box.h"
    22 #include "hurricane/Gos.h"
    23 #include "hurricane/IntrusiveSet.h"
    24 
    25 namespace Hurricane {
    26 
    27 
    28 
    29 // ****************************************************************************************************
    30 // QuadTree declaration
    31 // ****************************************************************************************************
    32 
    33 class QuadTree {
    34 // Types
    35 // *****
    36 
    37  public: class GoSet : public IntrusiveSet<Go> {
    38  // *******************************************
    39 
    40  public: typedef IntrusiveSet<Go> Inherit;
    41 
    42  public: GoSet();
    43 
    44  public: virtual unsigned _getHashValue(Go* go) const;
    45  public: virtual Go* _getNextElement(Go* go) const;
    46  public: virtual void _setNextElement(Go* go, Go* nextGo) const;
    47 
    48  };
    49 
    50 // Attributes
    51 // **********
    52 
    53  private: QuadTree* _parent;
    54  private: DbU::Unit _x;
    55  private: DbU::Unit _y;
    56  private: Box _boundingBox;
    57  private: unsigned _size;
    58  private: GoSet _goSet;
    59  private: QuadTree* _ulChild; // Upper Left Child
    60  private: QuadTree* _urChild; // Upper Right Child
    61  private: QuadTree* _llChild; // Lower Left Child
    62  private: QuadTree* _lrChild; // Lower Right Child
    63 
    64 // Constructors
    65 // ************
    66 
    67  public: QuadTree();
    68 
    69  private: QuadTree(QuadTree* parent);
    70 
    71  private: QuadTree(const QuadTree& quadTree); // not implemented to forbid copy construction
    72 
    73 // Destructor
    74 // **********
    75 
    76  public: ~QuadTree();
    77 
    78 // Operators
    79 // *********
    80 
    81  private: QuadTree& operator=(const QuadTree& quadTree); // not implemented to forbid assignment
    82 
    83 // Accessors
    84 // *********
    85 
    86  //public: static size_t getLocatorAllocateds ();
    87  public: const Box& getBoundingBox() const;
    88  public: Gos getGos() const;
    89  public: Gos getGosUnder(const Box& area, DbU::Unit threshold=0) const;
    90 
    91 // Predicates
    92 // **********
    93 
    94  public: bool isEmpty() const {return (_size == 0);};
    95 
    96 // Updators
    97 // ********
    98 
    99  public: void insert(Go* go);
    100  public: void remove(Go* go);
    101 
    102 // Others
    103 // ******
    104 
    105  public: string _getTypeName() const { return _TName("QuadTree"); };
    106  public: string _getString() const;
    107  public: Record* _getRecord() const;
    108 
    109  public: GoSet& _getGoSet() {return _goSet;};
    110  public: QuadTree* _getDeepestChild(const Box& box);
    111  public: QuadTree* _getFirstQuadTree() const;
    112  public: QuadTree* _getFirstQuadTree(const Box& area) const;
    113  public: QuadTree* _getNextQuadTree();
    114  public: QuadTree* _getNextQuadTree(const Box& area);
    115 
    116  public: bool _hasBeenExploded() const {return (_ulChild != NULL);};
    117 
    118  public: void _explode();
    119  public: void _implode();
    120 
    121 };
    122 
    123 
    124 } // End of Hurricane namespace.
    125 
    126 
    127 INSPECTOR_P_SUPPORT(Hurricane::QuadTree);
    128 INSPECTOR_P_SUPPORT(Hurricane::QuadTree::GoSet);
    129 
    130 
    131 // ****************************************************************************************************
    132 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    133 // ****************************************************************************************************
    Go description (API)
    Definition: Go.h:34
    +
    std::int64_t Unit
    Definition: DbU.h:67
    bool isEmpty() const
    Definition: QuadTree.h:94
    Gos getGos() const
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Quark_8h_source.html b/hurricane/doc/hurricane/html/Quark_8h_source.html index 95ae4c0f..6fddb491 100644 --- a/hurricane/doc/hurricane/html/Quark_8h_source.html +++ b/hurricane/doc/hurricane/html/Quark_8h_source.html @@ -46,7 +46,7 @@ $(function() {
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Quark.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_QUARK
    21 #define HURRICANE_QUARK
    22 
    23 #include "hurricane/DBo.h"
    24 #include "hurricane/Quarks.h"
    25 #include "hurricane/Occurrence.h"
    26 
    27 namespace Hurricane {
    28 
    29 
    30 
    31 // ****************************************************************************************************
    32 // Quark declaration
    33 // ****************************************************************************************************
    34 
    35 class Quark : public DBo {
    36 // *********************
    37 
    38 // Types
    39 // *****
    40 
    41  public: typedef DBo Inherit;
    42 
    43 // Attributes
    44 // **********
    45 
    46  private: Occurrence _occurrence;
    47  private: Quark* _nextOfSharedPathQuarkMap;
    48 
    49 // Constructors
    50 // ************
    51 
    52  protected: Quark(const Occurrence& occurrence);
    53 
    54 // Accessors
    55 // *********
    56 
    57  public: const Occurrence& getOccurrence() const {return _occurrence;};
    58 
    59 // Others
    60 // ******
    61 
    62  public: static Quark* _create(const Occurrence& occurrence);
    63  protected: virtual void _postCreate();
    64 
    65  protected: virtual void _preDestroy();
    66 
    67  public: virtual string _getTypeName() const {return _TName("Quark");};
    68  public: virtual string _getString() const;
    69  public: virtual Record* _getRecord() const;
    70  public: Quark* _getNextOfSharedPathQuarkMap() const {return _nextOfSharedPathQuarkMap;};
    71 
    72  public: void _setNextOfSharedPathQuarkMap(Quark* quark) {_nextOfSharedPathQuarkMap = quark;};
    73 
    74 };
    75 
    76 
    77 } // End of Hurricane namespace.
    78 
    79 
    80 INSPECTOR_P_SUPPORT(Hurricane::Quark);
    81 
    82 
    83 #endif // HURRICANE_QUARK
    84 
    85 
    86 // ****************************************************************************************************
    87 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    88 // ****************************************************************************************************
    Occurrence description (API)
    Definition: Occurrence.h:39
    Quark description (API)
    Definition: Quark.h:35
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    const Occurrence & getOccurrence() const
    Definition: Quark.h:57
    @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Quarks_8h_source.html b/hurricane/doc/hurricane/html/Quarks_8h_source.html index ce9f791e..b6013fae 100644 --- a/hurricane/doc/hurricane/html/Quarks_8h_source.html +++ b/hurricane/doc/hurricane/html/Quarks_8h_source.html @@ -50,7 +50,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Query_8h_source.html b/hurricane/doc/hurricane/html/Query_8h_source.html index f84633e1..8a1f0270 100644 --- a/hurricane/doc/hurricane/html/Query_8h_source.html +++ b/hurricane/doc/hurricane/html/Query_8h_source.html @@ -44,62 +44,62 @@ $(function() {
    Query.h
    -
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Jean-Paul CHAPUT |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/Query.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #pragma once
    33 #include <vector>
    34 #include "hurricane/Commons.h"
    35 #include "hurricane/Box.h"
    36 #include "hurricane/Transformation.h"
    37 #include "hurricane/Cell.h"
    38 #include "hurricane/Instance.h"
    39 
    40 
    41 namespace Hurricane {
    42 
    43  class BasicLayer;
    44  class Go;
    45  class QueryStack;
    46 
    47 
    48 // -------------------------------------------------------------------
    49 // Slave Class : "QueryState".
    50 
    51  class QueryState {
    52  private:
    53  inline QueryState ( Locator<Instance*>* locator );
    54  inline QueryState ( Locator<Instance*>* locator
    55  , const Box& area
    56  , const Transformation& transformation
    57  , const Path& path
    58  );
    59  QueryState ( const QueryState& );
    60  QueryState& operator= ( const QueryState& );
    61  inline ~QueryState ();
    62  private:
    63  Locator<Instance*>* _locator;
    64  Box _area;
    65  Transformation _transformation;
    66  Path _path;
    67 
    68  friend class QueryStack;
    69  };
    70 
    71 
    72 // QueryState Inline Functions.
    73 
    74 
    75  inline QueryState::QueryState ( Locator<Instance*>* locator )
    76  : _locator (locator)
    77  , _area ()
    78  , _transformation()
    79  , _path ()
    80  { }
    81 
    82 
    83  inline QueryState::QueryState ( Locator<Instance*>* locator
    84  , const Box& area
    85  , const Transformation& transformation
    86  , const Path& path
    87  )
    88  : _locator (locator)
    89  , _area (area)
    90  , _transformation(transformation)
    91  , _path (path)
    92  { }
    93 
    94 
    95  inline QueryState::~QueryState ()
    96  {
    97  if ( _locator ) delete _locator;
    98  }
    99 
    100 
    101 // -------------------------------------------------------------------
    102 // Class : "QueryStack".
    103 
    104 
    105  class QueryStack : public vector<QueryState*> {
    106  public:
    107  // Constructor & destructor.
    108  QueryStack ();
    109  ~QueryStack ();
    110  // Accessors.
    111  inline Cell* getTopCell ();
    112  inline const Box& getTopArea () const;
    113  inline const Transformation& getTopTransformation () const;
    114  inline unsigned int getStartLevel () const;
    115  inline unsigned int getStopLevel () const;
    116  inline Cell* getMasterCell ();
    117  inline Instance* getInstance ();
    118  inline const Box& getArea () const;
    119  inline DbU::Unit getThreshold () const;
    120  inline const Transformation& getTransformation () const;
    121  inline const Path& getPath () const;
    122  //inline const Tabulation& getTab () const;
    123  // Modifiers.
    124  inline void setTopCell ( Cell* cell );
    125  inline void setTopArea ( const Box& area );
    126  inline void setTopTransformation ( const Transformation& transformation );
    127  inline void setThreshold ( DbU::Unit threshold );
    128  inline void setStartLevel ( unsigned int level );
    129  inline void setStopLevel ( unsigned int level );
    130  inline void init ();
    131  inline void updateTransformation ();
    132  inline bool levelDown ();
    133  inline void levelUp ();
    134  inline void levelProgress ();
    135  inline bool levelCompleted ();
    136  inline void progress ( bool init=false );
    137 
    138  protected:
    139  // Internal: Attributes.
    140  // Tabulation _tab;
    141  Cell* _topCell;
    142  Box _topArea;
    143  DbU::Unit _threshold;
    144  Transformation _topTransformation;
    145  unsigned int _startLevel;
    146  unsigned int _stopLevel;
    147 
    148  private:
    149  // Internal: Constructors.
    150  QueryStack ( const QueryStack& );
    151  QueryStack& operator= ( const QueryStack& );
    152  };
    153 
    154 
    155 // QueryStack Inline Functions.
    156 
    157 
    158  inline Cell* QueryStack::getTopCell () { return _topCell; }
    159  inline const Box& QueryStack::getTopArea () const { return _topArea; }
    160  inline const Transformation& QueryStack::getTopTransformation () const { return _topTransformation; }
    161  inline DbU::Unit QueryStack::getThreshold () const { return _threshold; }
    162  inline unsigned int QueryStack::getStartLevel () const { return _startLevel; }
    163  inline unsigned int QueryStack::getStopLevel () const { return _stopLevel; }
    164  inline const Box& QueryStack::getArea () const { return back()->_area; }
    165  inline const Transformation& QueryStack::getTransformation () const { return back()->_transformation; }
    166  inline const Path& QueryStack::getPath () const { return back()->_path; }
    167 //inline const Tabulation& QueryStack::getTab () const { return _tab; }
    168 
    169 
    170  inline Instance* QueryStack::getInstance ()
    171  {
    172  if ( levelCompleted() ) return NULL;
    173  return back()->_locator->getElement();
    174  }
    175 
    176 
    177  inline Cell* QueryStack::getMasterCell ()
    178  {
    179  if ( size() == 1 ) return _topCell;
    180  if ( !getInstance() ) return NULL;
    181  return getInstance()->getMasterCell();
    182  }
    183 
    184 
    185  inline void QueryStack::setTopCell ( Cell* cell ) { _topCell = cell; }
    186  inline void QueryStack::setTopArea ( const Box& area ) { _topArea = area; }
    187  inline void QueryStack::setTopTransformation ( const Transformation& transformation ) { _topTransformation = transformation; }
    188  inline void QueryStack::setThreshold ( DbU::Unit threshold ) { _threshold = threshold; }
    189  inline void QueryStack::setStartLevel ( unsigned int level ) { _startLevel = level; }
    190  inline void QueryStack::setStopLevel ( unsigned int level ) { _stopLevel = level; }
    191 
    192 
    193  inline void QueryStack::init ()
    194  {
    195  while ( !empty() ) levelUp();
    196 
    197  push_back ( new QueryState(NULL,_topArea,_topTransformation,Path()) );
    198  //_tab++;
    199 
    200  progress ( true );
    201  }
    202 
    203 
    204  inline void QueryStack::updateTransformation ()
    205  {
    206  QueryState* child = *(rbegin() );
    207  QueryState* parent = *(rbegin()+1);
    208  Instance* instance = child->_locator->getElement();
    209 
    210  //cerr << "Processing " << instance << endl;
    211 
    212  child->_area = parent->_area;
    213  child->_transformation = instance->getTransformation ();
    214 
    215  instance->getTransformation().getInvert().applyOn ( child->_area );
    216  parent->_transformation.applyOn ( child->_transformation );
    217 
    218  //child->_path = Path ( Path(parent->_path,instance->getCell()->getShuntedPath()) , instance );
    219  child->_path = Path ( parent->_path, instance );
    220  }
    221 
    222 
    223  inline bool QueryStack::levelDown ()
    224  {
    225  if ( size() > _stopLevel ) return false;
    226 
    227  //cerr << "QueryStack::levelDown(): t:" << DbU::getValueString(getThreshold()) << endl;
    228  Locator<Instance*>* locator =
    229  getMasterCell()->getInstancesUnder(getArea(),getThreshold()).getLocator();
    230 
    231  if ( locator->isValid() ) {
    232  push_back ( new QueryState ( locator ) );
    233 
    234  updateTransformation ();
    235  //_tab++;
    236 
    237  return true;
    238  } else
    239  delete locator;
    240 
    241  //cerr << " Aborting level down" << endl;
    242  return false;
    243  }
    244 
    245 
    246  inline void QueryStack::levelUp ()
    247  {
    248  delete back ();
    249  pop_back ();
    250  //_tab--;
    251  }
    252 
    253 
    254  inline bool QueryStack::levelCompleted ()
    255  {
    256  if ( !back()->_locator || !back()->_locator->isValid () ) return true;
    257  return false;
    258  }
    259 
    260 
    261  inline void QueryStack::levelProgress ()
    262  {
    263  if ( levelCompleted() ) return;
    264 
    265  back()->_locator->progress ();
    266  if ( !back()->_locator->isValid() ) return;
    267 
    268  updateTransformation ();
    269  }
    270 
    271 
    272  inline void QueryStack::progress ( bool init )
    273  {
    274  if ( !init ) levelProgress ();
    275  else {
    276  if ( !levelDown() && ( size() > _startLevel ) )
    277  return;
    278  }
    279 
    280  while ( !empty() ) {
    281  if ( levelCompleted() ) {
    282  levelUp ();
    283  } else {
    284  if ( levelDown() ) continue;
    285  }
    286 
    287  if ( size() > _startLevel ) return;
    288  if ( empty() ) break;
    289  levelProgress ();
    290  }
    291  }
    292 
    293 
    294 // -------------------------------------------------------------------
    295 // Class : "Query".
    296 
    297  class Query {
    298  public:
    299  typedef Hurricane::Mask<int> Mask;
    300  public:
    301  // Types.
    305  , DoMarkers = 8
    306  , DoRubbers = 16
    310  | DoComponents
    311  | DoMarkers
    312  | DoRubbers
    314  };
    315  public:
    316  // Constructors & Destructors.
    317  Query ();
    318  virtual ~Query ();
    319  // Accessors.
    320  inline unsigned int getStartLevel () const;
    321  inline unsigned int getStopLevel () const;
    322  inline size_t getDepth () const;
    323  inline const Transformation& getTransformation () const;
    324  inline const Box& getArea () const;
    325  inline DbU::Unit getThreshold () const;
    326  inline const BasicLayer* getBasicLayer () const;
    327  inline Cell* getMasterCell ();
    328  inline Instance* getInstance ();
    329  inline Path getPath () const;
    330  //inline const Tabulation& getTab () const;
    331  virtual bool hasGoCallback () const;
    332  virtual bool hasMarkerCallback () const;
    333  virtual bool hasRubberCallback () const;
    334  virtual bool hasExtensionGoCallback () const;
    335  virtual bool hasMasterCellCallback () const;
    336  virtual void goCallback ( Go* ) = 0;
    337  virtual void markerCallback ( Marker* );
    338  virtual void rubberCallback ( Rubber* );
    339  virtual void extensionGoCallback ( Go* ) = 0;
    340  virtual void masterCellCallback () = 0;
    341  // Modifiers.
    342  void setQuery ( Cell* cell
    343  , const Box& area
    344  , const Transformation& transformation
    345  , const BasicLayer* basicLayer
    346  , ExtensionSlice::Mask extensionMask
    347  , Mask filter
    348  , DbU::Unit threshold=0
    349  );
    350  inline void setCell ( Cell* cell );
    351  inline void setArea ( const Box& area );
    352  inline void setThreshold ( DbU::Unit threshold );
    353  inline void setTransformation ( const Transformation& transformation );
    354  virtual void setBasicLayer ( const BasicLayer* basicLayer );
    355  inline void setExtensionMask ( ExtensionSlice::Mask mode );
    356  inline void setFilter ( Mask mode );
    357  inline void setStartLevel ( unsigned int level );
    358  inline void setStopLevel ( unsigned int level );
    359  virtual void doQuery ();
    360 
    361  protected:
    362  // Internal: Attributes.
    363  QueryStack _stack;
    364  const BasicLayer* _basicLayer;
    365  ExtensionSlice::Mask _extensionMask;
    366  Mask _filter;
    367  };
    368 
    369 
    370 // Query Inline Functions.
    371 
    372  inline void Query::setCell ( Cell* cell ) { _stack.setTopCell(cell); }
    373  inline void Query::setArea ( const Box& area ) { _stack.setTopArea(area); }
    374  inline void Query::setThreshold ( DbU::Unit threshold ) { _stack.setThreshold(threshold); }
    375  inline void Query::setTransformation ( const Transformation& transformation ) { _stack.setTopTransformation(transformation); }
    376  inline void Query::setFilter ( Mask filter ) { _filter = filter; }
    377  inline void Query::setExtensionMask ( ExtensionSlice::Mask mask ) { _extensionMask = mask; }
    378  inline void Query::setStartLevel ( unsigned int level ) { _stack.setStartLevel(level); }
    379  inline void Query::setStopLevel ( unsigned int level ) { _stack.setStopLevel(level); }
    380 
    381  inline unsigned int Query::getStartLevel () const { return _stack.getStartLevel(); }
    382  inline unsigned int Query::getStopLevel () const { return _stack.getStopLevel(); }
    383  inline size_t Query::getDepth () const { return _stack.size(); }
    384  inline const Box& Query::getArea () const { return _stack.getArea(); }
    385  inline const Transformation& Query::getTransformation () const { return _stack.getTransformation(); }
    386  inline Path Query::getPath () const { return _stack.getPath(); }
    387  inline const BasicLayer* Query::getBasicLayer () const { return _basicLayer; }
    388  inline Cell* Query::getMasterCell () { return _stack.getMasterCell(); }
    389  inline Instance* Query::getInstance () { return _stack.getInstance(); }
    390 //inline const Tabulation& Query::getTab () const { return _stack.getTab(); }
    391 
    392 
    393 } // Hurricane namespace.
    Path description (API)
    Definition: Path.h:37
    -
    Definition: Query.h:304
    -
    Go description (API)
    Definition: Go.h:36
    -
    unsigned int getStopLevel() const
    Definition: Query.h:382
    +
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Jean-Paul CHAPUT |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/Query.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #pragma once
    33 #include <vector>
    34 #include <iomanip>
    35 #include "hurricane/Commons.h"
    36 #include "hurricane/Box.h"
    37 #include "hurricane/Transformation.h"
    38 #include "hurricane/Cell.h"
    39 #include "hurricane/Instance.h"
    40 
    41 
    42 namespace Hurricane {
    43 
    44  class BasicLayer;
    45  class Go;
    46  class QueryStack;
    47 
    48 
    49 // -------------------------------------------------------------------
    50 // Slave Class : "QueryState".
    51 
    52  class QueryState {
    53  private:
    54  inline QueryState ( Locator<Instance*>* locator );
    55  inline QueryState ( Locator<Instance*>* locator
    56  , const Box& area
    57  , const Transformation& transformation
    58  , const Path& path
    59  );
    60  QueryState ( const QueryState& );
    61  QueryState& operator= ( const QueryState& );
    62  inline ~QueryState ();
    63  private:
    64  Locator<Instance*>* _locator;
    65  Box _area;
    66  Transformation _transformation;
    67  Path _path;
    68 
    69  friend class QueryStack;
    70  };
    71 
    72 
    73 // QueryState Inline Functions.
    74 
    75 
    76  inline QueryState::QueryState ( Locator<Instance*>* locator )
    77  : _locator (locator)
    78  , _area ()
    79  , _transformation()
    80  , _path ()
    81  { }
    82 
    83 
    84  inline QueryState::QueryState ( Locator<Instance*>* locator
    85  , const Box& area
    86  , const Transformation& transformation
    87  , const Path& path
    88  )
    89  : _locator (locator)
    90  , _area (area)
    91  , _transformation(transformation)
    92  , _path (path)
    93  { }
    94 
    95 
    96  inline QueryState::~QueryState ()
    97  {
    98  if ( _locator ) delete _locator;
    99  }
    100 
    101 
    102 // -------------------------------------------------------------------
    103 // Class : "QueryStack".
    104 
    105 
    106  class QueryStack : public vector<QueryState*> {
    107  public:
    108  // Constructor & destructor.
    109  QueryStack ();
    110  ~QueryStack ();
    111  // Accessors.
    112  inline Cell* getTopCell ();
    113  inline const Box& getTopArea () const;
    114  inline const Transformation& getTopTransformation () const;
    115  inline unsigned int getStartLevel () const;
    116  inline unsigned int getStopLevel () const;
    117  inline Cell::Flags getStopCellFlags () const;
    118  inline Cell* getMasterCell ();
    119  inline Instance* getInstance ();
    120  inline const Box& getArea () const;
    121  inline DbU::Unit getThreshold () const;
    122  inline const Transformation& getTransformation () const;
    123  inline const Path& getPath () const;
    124  //inline const Tabulation& getTab () const;
    125  // Modifiers.
    126  inline void setTopCell ( Cell* cell );
    127  inline void setTopArea ( const Box& area );
    128  inline void setTopTransformation ( const Transformation& transformation );
    129  inline void setThreshold ( DbU::Unit threshold );
    130  inline void setStartLevel ( unsigned int level );
    131  inline void setStopLevel ( unsigned int level );
    132  inline void setStopCellFlags ( Cell::Flags );
    133  inline void init ();
    134  inline void updateTransformation ();
    135  inline bool levelDown ();
    136  inline void levelUp ();
    137  inline void levelProgress ();
    138  inline bool levelCompleted ();
    139  inline void progress ( bool init=false );
    140  inline size_t getInstanceCount () const;
    141 
    142  protected:
    143  // Internal: Attributes.
    144  // Tabulation _tab;
    145  Cell* _topCell;
    146  Box _topArea;
    147  DbU::Unit _threshold;
    148  Transformation _topTransformation;
    149  unsigned int _startLevel;
    150  unsigned int _stopLevel;
    151  Cell::Flags _stopCellFlags;
    152  size_t _instanceCount;
    153 
    154  private:
    155  // Internal: Constructors.
    156  QueryStack ( const QueryStack& );
    157  QueryStack& operator= ( const QueryStack& );
    158  };
    159 
    160 
    161 // QueryStack Inline Functions.
    162 
    163 
    164  inline Cell* QueryStack::getTopCell () { return _topCell; }
    165  inline const Box& QueryStack::getTopArea () const { return _topArea; }
    166  inline const Transformation& QueryStack::getTopTransformation () const { return _topTransformation; }
    167  inline DbU::Unit QueryStack::getThreshold () const { return _threshold; }
    168  inline unsigned int QueryStack::getStartLevel () const { return _startLevel; }
    169  inline unsigned int QueryStack::getStopLevel () const { return _stopLevel; }
    170  inline Cell::Flags QueryStack::getStopCellFlags () const { return _stopCellFlags; }
    171  inline const Box& QueryStack::getArea () const { return back()->_area; }
    172  inline const Transformation& QueryStack::getTransformation () const { return back()->_transformation; }
    173  inline const Path& QueryStack::getPath () const { return back()->_path; }
    174 //inline const Tabulation& QueryStack::getTab () const { return _tab; }
    175  inline size_t QueryStack::getInstanceCount () const { return _instanceCount; }
    176 
    177 
    178  inline Instance* QueryStack::getInstance ()
    179  {
    180  if ( levelCompleted() ) return NULL;
    181  return back()->_locator->getElement();
    182  }
    183 
    184 
    185  inline Cell* QueryStack::getMasterCell ()
    186  {
    187  if ( size() == 1 ) return _topCell;
    188  if ( !getInstance() ) return NULL;
    189  return getInstance()->getMasterCell();
    190  }
    191 
    192 
    193  inline void QueryStack::setTopCell ( Cell* cell ) { _topCell = cell; }
    194  inline void QueryStack::setTopArea ( const Box& area ) { _topArea = area; }
    195  inline void QueryStack::setTopTransformation ( const Transformation& transformation ) { _topTransformation = transformation; }
    196  inline void QueryStack::setThreshold ( DbU::Unit threshold ) { _threshold = threshold; }
    197  inline void QueryStack::setStartLevel ( unsigned int level ) { _startLevel = level; }
    198  inline void QueryStack::setStopLevel ( unsigned int level ) { _stopLevel = level; }
    199  inline void QueryStack::setStopCellFlags ( Cell::Flags flags ) { _stopCellFlags = flags; }
    200 
    201 
    202  inline void QueryStack::init ()
    203  {
    204  _instanceCount = 0;
    205  while (not empty()) levelUp();
    206 
    207  push_back( new QueryState(NULL,_topArea,_topTransformation,Path()) );
    208  //_tab++;
    209 
    210  progress( true );
    211  }
    212 
    213 
    214  inline void QueryStack::updateTransformation ()
    215  {
    216  QueryState* child = *(rbegin() );
    217  QueryState* parent = *(rbegin()+1);
    218  Instance* instance = child->_locator->getElement();
    219 
    220  //cerr << "Processing " << instance << endl;
    221 
    222  child->_area = parent->_area;
    223  child->_transformation = instance->getTransformation ();
    224 
    225  instance->getTransformation().getInvert().applyOn ( child->_area );
    226  parent->_transformation.applyOn ( child->_transformation );
    227 
    228  //child->_path = Path ( Path(parent->_path,instance->getCell()->getShuntedPath()) , instance );
    229  child->_path = Path ( parent->_path, instance );
    230  //cerr << "QueryStack::updateTransformation() " << child->_path << endl;
    231  }
    232 
    233 
    234  inline bool QueryStack::levelDown ()
    235  {
    236  if (size() > _stopLevel) return false;
    237  if (getMasterCell()->getFlags().isset(_stopCellFlags)) return false;
    238 
    239  //cerr << "QueryStack::levelDown(): t:" << DbU::getValueString(getThreshold()) << endl;
    240  Locator<Instance*>* locator =
    241  getMasterCell()->getInstancesUnder(getArea(),getThreshold()).getLocator();
    242 
    243  if ( locator->isValid() ) {
    244  push_back ( new QueryState ( locator ) );
    245 
    246  updateTransformation ();
    247  //_tab++;
    248 
    249  return true;
    250  } else
    251  delete locator;
    252 
    253  //cerr << " Aborting level down" << endl;
    254  return false;
    255  }
    256 
    257 
    258  inline void QueryStack::levelUp ()
    259  {
    260  delete back ();
    261  pop_back ();
    262  //_tab--;
    263  }
    264 
    265 
    266  inline bool QueryStack::levelCompleted ()
    267  {
    268  if ( !back()->_locator || !back()->_locator->isValid () ) return true;
    269  return false;
    270  }
    271 
    272 
    273  inline void QueryStack::levelProgress ()
    274  {
    275  if (levelCompleted()) return;
    276 
    277  back()->_locator->progress();
    278  if (not back()->_locator->isValid()) return;
    279 
    280  //cerr << " stack:" << std::setw(3) << _instanceCount << ":" << getPath() << endl;
    281  ++_instanceCount;
    282  updateTransformation();
    283  }
    284 
    285 
    286  inline void QueryStack::progress ( bool init )
    287  {
    288  if (not init) levelProgress ();
    289  else {
    290  if (not levelDown() and (size() > _startLevel))
    291  return;
    292  }
    293 
    294  while (not empty()) {
    295  if (levelCompleted()) {
    296  levelUp ();
    297  } else {
    298  if (levelDown()) continue;
    299  }
    300 
    301  if (size() > _startLevel) return;
    302  if (empty()) break;
    303  levelProgress();
    304  }
    305  }
    306 
    307 
    308 // -------------------------------------------------------------------
    309 // Class : "Query".
    310 
    311  class Query {
    312  public:
    313  typedef Hurricane::Mask<int> Mask;
    314  public:
    315  // Types.
    319  , DoMarkers = 8
    320  , DoRubbers = 16
    324  | DoComponents
    325  | DoMarkers
    326  | DoRubbers
    328  };
    329  public:
    330  // Constructors & Destructors.
    331  Query ();
    332  virtual ~Query ();
    333  // Accessors.
    334  inline unsigned int getStartLevel () const;
    335  inline unsigned int getStopLevel () const;
    336  inline Cell::Flags getStopCellFlags () const;
    337  inline size_t getDepth () const;
    338  inline const Transformation& getTransformation () const;
    339  inline const Box& getArea () const;
    340  inline DbU::Unit getThreshold () const;
    341  inline const BasicLayer* getBasicLayer () const;
    342  inline Cell* getMasterCell ();
    343  inline Instance* getInstance ();
    344  inline Path getPath () const;
    345  //inline const Tabulation& getTab () const;
    346  virtual bool hasGoCallback () const;
    347  virtual bool hasMarkerCallback () const;
    348  virtual bool hasRubberCallback () const;
    349  virtual bool hasExtensionGoCallback () const;
    350  virtual bool hasMasterCellCallback () const;
    351  virtual void goCallback ( Go* ) = 0;
    352  virtual void markerCallback ( Marker* );
    353  virtual void rubberCallback ( Rubber* );
    354  virtual void extensionGoCallback ( Go* ) = 0;
    355  virtual void masterCellCallback () = 0;
    356  // Modifiers.
    357  void setQuery ( Cell* cell
    358  , const Box& area
    359  , const Transformation& transformation
    360  , const BasicLayer* basicLayer
    361  , ExtensionSlice::Mask extensionMask
    362  , Mask filter
    363  , DbU::Unit threshold=0
    364  );
    365  inline void setCell ( Cell* cell );
    366  inline void setArea ( const Box& area );
    367  inline void setThreshold ( DbU::Unit threshold );
    368  inline void setTransformation ( const Transformation& transformation );
    369  virtual void setBasicLayer ( const BasicLayer* basicLayer );
    370  inline void setExtensionMask ( ExtensionSlice::Mask mode );
    371  inline void setFilter ( Mask mode );
    372  inline void setStartLevel ( unsigned int level );
    373  inline void setStopLevel ( unsigned int level );
    374  inline void setStopCellFlags ( Cell::Flags );
    375  virtual void doQuery ();
    376 
    377  protected:
    378  // Internal: Attributes.
    379  QueryStack _stack;
    380  const BasicLayer* _basicLayer;
    381  ExtensionSlice::Mask _extensionMask;
    382  Mask _filter;
    383  };
    384 
    385 
    386 // Query Inline Functions.
    387 
    388  inline void Query::setCell ( Cell* cell ) { _stack.setTopCell(cell); }
    389  inline void Query::setArea ( const Box& area ) { _stack.setTopArea(area); }
    390  inline void Query::setThreshold ( DbU::Unit threshold ) { _stack.setThreshold(threshold); }
    391  inline void Query::setTransformation ( const Transformation& transformation ) { _stack.setTopTransformation(transformation); }
    392  inline void Query::setFilter ( Mask filter ) { _filter = filter; }
    393  inline void Query::setExtensionMask ( ExtensionSlice::Mask mask ) { _extensionMask = mask; }
    394  inline void Query::setStartLevel ( unsigned int level ) { _stack.setStartLevel(level); }
    395  inline void Query::setStopLevel ( unsigned int level ) { _stack.setStopLevel(level); }
    396  inline void Query::setStopCellFlags ( Cell::Flags flags ) { _stack.setStopCellFlags(flags); }
    397 
    398  inline unsigned int Query::getStartLevel () const { return _stack.getStartLevel(); }
    399  inline unsigned int Query::getStopLevel () const { return _stack.getStopLevel(); }
    400  inline Cell::Flags Query::getStopCellFlags () const { return _stack.getStopCellFlags(); }
    401  inline size_t Query::getDepth () const { return _stack.size(); }
    402  inline const Box& Query::getArea () const { return _stack.getArea(); }
    403  inline const Transformation& Query::getTransformation () const { return _stack.getTransformation(); }
    404  inline Path Query::getPath () const { return _stack.getPath(); }
    405  inline const BasicLayer* Query::getBasicLayer () const { return _basicLayer; }
    406  inline Cell* Query::getMasterCell () { return _stack.getMasterCell(); }
    407  inline Instance* Query::getInstance () { return _stack.getInstance(); }
    408 //inline const Tabulation& Query::getTab () const { return _stack.getTab(); }
    409 
    410 
    411 } // Hurricane namespace.
    Path description (API)
    Definition: Path.h:35
    +
    Definition: Query.h:318
    +
    Go description (API)
    Definition: Go.h:34
    +
    unsigned int getStopLevel() const
    Definition: Query.h:399
    BasicLayer description (API)
    Definition: BasicLayer.h:44
    -
    void setStartLevel(unsigned int level)
    Definition: Query.h:378
    -
    const Box & getArea() const
    Definition: Query.h:384
    -
    Definition: Query.h:307
    -
    Instance * getInstance()
    Definition: Query.h:389
    -
    Query description (API)
    Definition: Query.h:297
    +
    void setStartLevel(unsigned int level)
    Definition: Query.h:394
    +
    const Box & getArea() const
    Definition: Query.h:402
    +
    Definition: Query.h:321
    +
    Instance * getInstance()
    Definition: Query.h:407
    +
    Query description (API)
    Definition: Query.h:311
    virtual void setBasicLayer(const BasicLayer *basicLayer)
    virtual ~Query()
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    The model (API).
    Definition: Cell.h:66
    -
    Definition: Query.h:303
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    The model (API).
    Definition: Cell.h:64
    +
    Definition: Query.h:317
    virtual void markerCallback(Marker *)
    -
    void setArea(const Box &area)
    Definition: Query.h:373
    +
    void setArea(const Box &area)
    Definition: Query.h:389
    virtual bool hasGoCallback() const
    void setQuery(Cell *cell, const Box &area, const Transformation &transformation, const BasicLayer *basicLayer, ExtensionSlice::Mask extensionMask, Mask filter, DbU::Unit threshold=0)
    -
    Definition: Query.h:305
    -
    unsigned int getStartLevel() const
    Definition: Query.h:381
    -
    void setStopLevel(unsigned int level)
    Definition: Query.h:379
    +
    Definition: Query.h:319
    +
    unsigned int getStartLevel() const
    Definition: Query.h:398
    +
    void setStopLevel(unsigned int level)
    Definition: Query.h:395
    Transformation description (API)
    Definition: Transformation.h:32
    -
    size_t getDepth() const
    Definition: Query.h:383
    +
    size_t getDepth() const
    Definition: Query.h:401
    virtual void rubberCallback(Rubber *)
    -
    void setFilter(Mask mode)
    Definition: Query.h:376
    -
    Definition: Query.h:306
    -
    Path getPath() const
    Definition: Query.h:386
    +
    void setFilter(Mask mode)
    Definition: Query.h:392
    +
    Definition: Query.h:320
    +
    Path getPath() const
    Definition: Query.h:404
    Box description (API)
    Definition: Box.h:31
    -
    Instance description (API)
    Definition: Instance.h:37
    -
    void setCell(Cell *cell)
    Definition: Query.h:372
    +
    Instance description (API)
    Definition: Instance.h:35
    +
    void setCell(Cell *cell)
    Definition: Query.h:388
    virtual bool hasMarkerCallback() const
    -
    const BasicLayer * getBasicLayer() const
    Definition: Query.h:387
    +
    const BasicLayer * getBasicLayer() const
    Definition: Query.h:405
    virtual bool hasExtensionGoCallback() const
    virtual void masterCellCallback()=0
    virtual void extensionGoCallback(Go *)=0
    -
    Cell * getMasterCell()
    Definition: Query.h:388
    +
    Cell * getMasterCell()
    Definition: Query.h:406
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    -
    void setTransformation(const Transformation &transformation)
    Definition: Query.h:375
    +
    void setTransformation(const Transformation &transformation)
    Definition: Query.h:391
    virtual void doQuery()
    virtual void goCallback(Go *)=0
    -
    Definition: Query.h:302
    -
    QueryFilter
    Definition: Query.h:302
    +
    Definition: Query.h:316
    +
    QueryFilter
    Definition: Query.h:316
    virtual bool hasRubberCallback() const
    -
    void setExtensionMask(ExtensionSlice::Mask mode)
    Definition: Query.h:377
    +
    void setExtensionMask(ExtensionSlice::Mask mode)
    Definition: Query.h:393
    virtual bool hasMasterCellCallback() const
    Rubber description (API)
    Definition: Rubber.h:36
    -
    Definition: Query.h:308
    -
    const Transformation & getTransformation() const
    Definition: Query.h:385
    +
    Definition: Query.h:322
    +
    const Transformation & getTransformation() const
    Definition: Query.h:403


    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/RegularLayer_8h_source.html b/hurricane/doc/hurricane/html/RegularLayer_8h_source.html index 56d9c0d3..13cbc580 100644 --- a/hurricane/doc/hurricane/html/RegularLayer_8h_source.html +++ b/hurricane/doc/hurricane/html/RegularLayer_8h_source.html @@ -47,8 +47,8 @@ $(function() {
    1 
    2 // -*- C++ -*-
    3 //
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify
    9 // it under the terms of the GNU Lesser General Public License as
    10 // published by the Free Software Foundation, either version 3 of the
    11 // License, or (at your option) any later version.
    12 //
    13 // Hurricane is distributed in the hope that it will be useful, but
    14 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    15 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    16 // General Public License for more details.
    17 //
    18 // You should have received a copy of the Lesser GNU General Public
    19 // License along with Hurricane. If not, see
    20 // <http://www.gnu.org/licenses/>.
    21 //
    22 // +-----------------------------------------------------------------+
    23 // | H U R R I C A N E |
    24 // | V L S I B a c k e n d D a t a - B a s e |
    25 // | |
    26 // | Author : Jean-Paul Chaput |
    27 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    28 // | =============================================================== |
    29 // | C++ Header : "./hurricane/RegularLayer.h" |
    30 // +-----------------------------------------------------------------+
    31 
    32 
    33 #ifndef HURRICANE_REGULAR_LAYER_H
    34 #define HURRICANE_REGULAR_LAYER_H
    35 
    36 #include "hurricane/Layer.h"
    37 #include "hurricane/RegularLayers.h"
    38 
    39 
    40 namespace Hurricane {
    41 
    42 // -------------------------------------------------------------------
    43 // Class : "Hurricane::RegularLayer".
    44 
    45  class RegularLayer : public Layer {
    46  public:
    47  typedef Layer Super;
    48 
    49  public:
    50  // Constructor.
    51  static RegularLayer* create ( Technology* technology
    52  , const Name& name
    53  , BasicLayer* layer
    54  );
    55  // Accessors.
    56  virtual BasicLayers getBasicLayers () const;
    57  inline BasicLayer* getBasicLayer () const;
    58  virtual const Layer* getBlockageLayer () const;
    59  virtual const Layer* getTop () const;
    60  virtual const Layer* getBottom () const;
    61  virtual const Layer* getOpposite ( const Layer* ) const;
    62  virtual DbU::Unit getEnclosure ( uint32_t flags=0 ) const;
    63  virtual DbU::Unit getExtentionCap () const;
    64  virtual DbU::Unit getExtentionWidth () const;
    65  virtual DbU::Unit getEnclosure ( const BasicLayer* layer, uint32_t flags=0 ) const;
    66  virtual DbU::Unit getExtentionCap ( const BasicLayer* layer ) const;
    67  virtual DbU::Unit getExtentionWidth ( const BasicLayer* layer ) const;
    68  // Updators
    69  void setBasicLayer ( BasicLayer* layer );
    70  virtual void setEnclosure ( const BasicLayer* layer, DbU::Unit enclosure, uint32_t flags=0 );
    71  virtual void setExtentionCap ( const BasicLayer* layer, DbU::Unit cap );
    72  virtual void setExtentionWidth ( const BasicLayer* layer, DbU::Unit width );
    73  // Hurricane Managment.
    74  virtual void _toJson ( JsonWriter* ) const;
    75  virtual void _onDbuChange ( float scale );
    76  virtual string _getTypeName () const;
    77  virtual string _getString () const;
    78  virtual Record* _getRecord () const;
    79 
    80  private:
    81  // Internal: Attributes
    82  BasicLayer* _basicLayer;
    83  DbU::Unit _enclosure;
    84  DbU::Unit _extentionCap;
    85  DbU::Unit _extentionWidth;
    86 
    87  protected:
    88  // Internal: Constructors & Destructors.
    89  RegularLayer ( Technology* technology
    90  , const Name& name
    91  );
    92  };
    93 
    94 
    95 // Inline Functions.
    96  inline BasicLayer* RegularLayer::getBasicLayer () const { return _basicLayer; }
    97 
    98 
    99 // -------------------------------------------------------------------
    100 // Class : "Hurricane::JsonRegularLayer".
    101 
    102  class JsonRegularLayer : public JsonLayer {
    103  public:
    104  static void initialize ();
    105  JsonRegularLayer ( unsigned long flags );
    106  ~JsonRegularLayer ();
    107  virtual string getTypeName () const;
    108  virtual JsonRegularLayer* clone ( unsigned long ) const;
    109  virtual void toData ( JsonStack& );
    110  };
    111 
    112 
    113 } // Hurricane namespace.
    114 
    115 INSPECTOR_P_SUPPORT(Hurricane::RegularLayer);
    116 
    117 #endif // HURRICANE_REGULAR_LAYER_H
    RegularLayer description (API)
    Definition: RegularLayer.h:45
    BasicLayer description (API)
    Definition: BasicLayer.h:44
    Name description (API)
    Definition: Name.h:35
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    BasicLayer * getBasicLayer() const
    Definition: RegularLayer.h:96
    static RegularLayer * create(Technology *technology, const Name &name, BasicLayer *layer)
    JSON Parser Stack.
    Definition: JsonObject.h:249
    @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Relation_8h_source.html b/hurricane/doc/hurricane/html/Relation_8h_source.html index 5a105440..79b1fb85 100644 --- a/hurricane/doc/hurricane/html/Relation_8h_source.html +++ b/hurricane/doc/hurricane/html/Relation_8h_source.html @@ -47,8 +47,8 @@ $(function() {
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Relation.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_RELATION_H
    21 #define HURRICANE_RELATION_H
    22 
    23 #include "hurricane/Property.h"
    24 
    25 namespace Hurricane {
    26 
    27 
    28 
    29 // ****************************************************************************************************
    30 // Relation declaration
    31 // ****************************************************************************************************
    32 
    33 class Relation : public SharedProperty {
    34 // ***********************************
    35 
    36 // Types
    37 // *****
    38 
    39  public: typedef SharedProperty Inherit;
    40 
    41 // Attributes
    42 // **********
    43 
    44  private: DBo* _masterOwner;
    45 
    46 // Constructors
    47 // ************
    48 
    49  protected: Relation(DBo* masterOwner);
    50 
    51 // Accessors
    52 // *********
    53 
    54  public: DBo* getMasterOwner() const {return _masterOwner;};
    55  public: DBos getSlaveOwners() const;
    56 
    57 // Managers
    58 // ********
    59 
    60  public: virtual void onReleasedBy(DBo* owner);
    61 
    62 // Others
    63 // ******
    64 
    65  public: void _setMasterOwner(DBo* owner) {_masterOwner=owner; }
    66  protected: virtual void _postCreate();
    67 
    68  public: virtual string _getTypeName() const {return _TName("Relation");};
    69  public: virtual string _getString() const;
    70  public: virtual Record* _getRecord() const;
    71 
    72 };
    73 
    74 
    75 
    76 // ****************************************************************************************************
    77 // StandardRelation declaration
    78 // ****************************************************************************************************
    79 
    80 class StandardRelation : public Relation {
    81 // *************************************
    82 
    83 // Types
    84 // *****
    85 
    86  public: typedef Relation Inherit;
    87 
    88 // Attributes
    89 // **********
    90 
    91  private: Name _name;
    92 
    93 // Constructors
    94 // ************
    95 
    96  protected: StandardRelation(DBo* masterOwner, const Name& name);
    97 
    98  public: static StandardRelation* create(DBo* masterOwner, const Name& name);
    99 
    100 // Accessors
    101 // *********
    102 
    103  public: virtual Name getName() const {return _name;};
    104 
    105 // Others
    106 // ******
    107 
    108  public: virtual string _getTypeName() const {return _TName("StandardRelation");};
    109  public: virtual string _getString() const;
    110  public: virtual Record* _getRecord() const;
    111 
    112 };
    113 
    114 
    115 } // End of Hurricane namespace.
    116 
    117 
    118 #endif // HURRICANE_RELATION
    119 
    120 
    121 // ****************************************************************************************************
    122 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    123 // ****************************************************************************************************
    Relation description (API)
    Definition: Relation.h:33
    StandardRelation description (API)
    Definition: Relation.h:80
    Name description (API)
    Definition: Name.h:35
    -
    SharedProperty description (API)
    Definition: Property.h:388
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    SharedProperty description (API)
    Definition: Property.h:386
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/RoutingPad_8h_source.html b/hurricane/doc/hurricane/html/RoutingPad_8h_source.html index 8f0a0d71..c1bd1313 100644 --- a/hurricane/doc/hurricane/html/RoutingPad_8h_source.html +++ b/hurricane/doc/hurricane/html/RoutingPad_8h_source.html @@ -50,13 +50,13 @@ $(function() {
    BasicLayer description (API)
    Definition: BasicLayer.h:44
    virtual DbU::Unit getX() const
    Definition: RoutingPad.h:55
    -
    Pin description (API)
    Definition: Pin.h:34
    +
    Pin description (API)
    Definition: Pin.h:41
    DbU::Unit getSourceY() const
    virtual DbU::Unit getY() const
    Component description (API)
    Definition: Component.h:42
    Definition: RoutingPad.h:53
    Flags
    Definition: RoutingPad.h:51
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    Point description (API)
    Definition: Point.h:32
    virtual const Layer * getLayer() const
    bool isEmpty() const
    @@ -90,7 +90,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Rubber_8h_source.html b/hurricane/doc/hurricane/html/Rubber_8h_source.html index f146bcc1..0228cf7f 100644 --- a/hurricane/doc/hurricane/html/Rubber_8h_source.html +++ b/hurricane/doc/hurricane/html/Rubber_8h_source.html @@ -44,16 +44,16 @@ $(function() {
    Rubber.h
    -
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Rubber.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_RUBBER_H
    21 #define HURRICANE_RUBBER_H
    22 
    23 #include "hurricane/Go.h"
    24 #include "hurricane/Hooks.h"
    25 #include "hurricane/Rubbers.h"
    26 
    27 namespace Hurricane {
    28 
    29 class Net;
    30 
    31 
    32 // ****************************************************************************************************
    33 // Rubber declaration
    34 // ****************************************************************************************************
    35 
    36 class Rubber : public Go {
    37 // *********************
    38 
    39 // Types
    40 // *****
    41 
    42  public: typedef Go Inherit;
    43 
    44 
    45 // Attributes
    46 // **********
    47 
    48  private: Net* _net;
    49  private: Hook* _hook;
    50  private: unsigned _count;
    51  private: Box _boundingBox;
    52  private: Rubber* _nextOfNetRubberSet;
    53 
    54 // Constructors
    55 // ************
    56 
    57  protected: Rubber(Net* net, Hook* hook);
    58 
    59 // Destructor
    60 // **********
    61 
    62  public: virtual void destroy();
    63 
    64 // Accessors
    65 // *********
    66 
    67  public: virtual Cell* getCell() const;
    68  public: Net* getNet() const {return _net;};
    69  public: Hook* getHook() const {return _hook;};
    70  public: unsigned getCount() const {return _count;};
    71  public: Point getCenter() const;
    72  public: Point getBarycenter() const;
    73  public: virtual Box getBoundingBox() const;
    74  public: Hooks getHooks() const;
    75 
    76 // Updators
    77 // ********
    78 
    79  public: virtual void materialize();
    80  public: virtual void unmaterialize();
    81  public: virtual void translate(const DbU::Unit& dx, const DbU::Unit& dy);
    82  public: virtual void invalidate(bool propagateFlag = true);
    83 
    84 // Others
    85 // ******
    86 
    87  public: static Rubber* _create(Hook* hook);
    88  protected: virtual void _postCreate();
    89 
    90  public: void _destroy();
    91  protected: virtual void _preDestroy();
    92 
    93  public: virtual string _getTypeName() const {return _TName("Rubber");};
    94  public: virtual string _getString() const;
    95  public: virtual Record* _getRecord() const;
    96  public: Rubber* _getNextOfNetRubberSet() const {return _nextOfNetRubberSet;};
    97 
    98  public: void _setNet(Net* net);
    99  public: void _setHook(Hook* hook);
    100  public: void _setNextOfNetRubberSet(Rubber* rubber) {_nextOfNetRubberSet = rubber;};
    101 
    102  public: void _capture();
    103  public: void _release();
    104 
    105 };
    106 
    107 
    108 } // End of Hurricane namespace.
    109 
    110 
    111 INSPECTOR_P_SUPPORT(Hurricane::Rubber);
    112 
    113 
    114 #endif // HURRICANE_RUBBER_H
    115 
    116 
    117 // ****************************************************************************************************
    118 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    119 // ****************************************************************************************************
    Go description (API)
    Definition: Go.h:36
    +
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Rubber.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_RUBBER_H
    21 #define HURRICANE_RUBBER_H
    22 
    23 #include "hurricane/Go.h"
    24 #include "hurricane/Hooks.h"
    25 #include "hurricane/Rubbers.h"
    26 
    27 namespace Hurricane {
    28 
    29 class Net;
    30 
    31 
    32 // ****************************************************************************************************
    33 // Rubber declaration
    34 // ****************************************************************************************************
    35 
    36 class Rubber : public Go {
    37 // *********************
    38 
    39 // Types
    40 // *****
    41 
    42  public: typedef Go Inherit;
    43 
    44 
    45 // Attributes
    46 // **********
    47 
    48  private: Net* _net;
    49  private: Hook* _hook;
    50  private: unsigned _count;
    51  private: Box _boundingBox;
    52  private: Rubber* _nextOfNetRubberSet;
    53 
    54 // Constructors
    55 // ************
    56 
    57  protected: Rubber(Net* net, Hook* hook);
    58 
    59 // Destructor
    60 // **********
    61 
    62  public: virtual void destroy();
    63 
    64 // Accessors
    65 // *********
    66 
    67  public: virtual Cell* getCell() const;
    68  public: Net* getNet() const {return _net;};
    69  public: Hook* getHook() const {return _hook;};
    70  public: unsigned getCount() const {return _count;};
    71  public: Point getCenter() const;
    72  public: Point getBarycenter() const;
    73  public: virtual Box getBoundingBox() const;
    74  public: Hooks getHooks() const;
    75 
    76 // Updators
    77 // ********
    78 
    79  public: virtual void materialize();
    80  public: virtual void unmaterialize();
    81  public: virtual void translate(const DbU::Unit& dx, const DbU::Unit& dy);
    82  public: virtual void invalidate(bool propagateFlag = true);
    83 
    84 // Others
    85 // ******
    86 
    87  public: static Rubber* _create(Hook* hook);
    88  protected: virtual void _postCreate();
    89 
    90  public: void _destroy();
    91  protected: virtual void _preDestroy();
    92 
    93  public: virtual string _getTypeName() const {return _TName("Rubber");};
    94  public: virtual string _getString() const;
    95  public: virtual Record* _getRecord() const;
    96  public: Rubber* _getNextOfNetRubberSet() const {return _nextOfNetRubberSet;};
    97 
    98  public: void _setNet(Net* net);
    99  public: void _setHook(Hook* hook);
    100  public: void _setNextOfNetRubberSet(Rubber* rubber) {_nextOfNetRubberSet = rubber;};
    101 
    102  public: void _capture();
    103  public: void _release();
    104 
    105 };
    106 
    107 
    108 } // End of Hurricane namespace.
    109 
    110 
    111 INSPECTOR_P_SUPPORT(Hurricane::Rubber);
    112 
    113 
    114 #endif // HURRICANE_RUBBER_H
    115 
    116 
    117 // ****************************************************************************************************
    118 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    119 // ****************************************************************************************************
    Go description (API)
    Definition: Go.h:34
    Hooks getHooks() const
    Hook * getHook() const
    Definition: Rubber.h:69
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    Net * getNet() const
    Definition: Rubber.h:68
    Point getCenter() const
    -
    The model (API).
    Definition: Cell.h:66
    +
    The model (API).
    Definition: Cell.h:64
    Point description (API)
    Definition: Point.h:32
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    -
    Hook description (API)
    Definition: Hook.h:36
    +
    Hook description (API)
    Definition: Hook.h:34
    Box description (API)
    Definition: Box.h:31
    unsigned getCount() const
    Definition: Rubber.h:70
    Go Inherit
    Definition: Rubber.h:42
    @@ -65,7 +65,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Rubbers_8h_source.html b/hurricane/doc/hurricane/html/Rubbers_8h_source.html index c7f72fc9..8be6df72 100644 --- a/hurricane/doc/hurricane/html/Rubbers_8h_source.html +++ b/hurricane/doc/hurricane/html/Rubbers_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Segment_8h_source.html b/hurricane/doc/hurricane/html/Segment_8h_source.html index 8adb91d3..42153dfb 100644 --- a/hurricane/doc/hurricane/html/Segment_8h_source.html +++ b/hurricane/doc/hurricane/html/Segment_8h_source.html @@ -55,13 +55,13 @@ $(function() {
    void setLayer(const Layer *layer)
    Hook * getSourceHook()
    Definition: Segment.h:102
    Component * getSource() const
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    Definition: Segment.h:59
    Point description (API)
    Definition: Point.h:32
    Generic Collection auto-pointer.
    Definition: Collection.h:28
    virtual DbU::Unit getSourceY() const =0
    -
    Hook description (API)
    Definition: Hook.h:36
    +
    Hook description (API)
    Definition: Hook.h:34
    Layer description (API)
    Definition: Layer.h:52
    Segment description (API)
    Definition: Segment.h:33
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    @@ -80,7 +80,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Segments_8h_source.html b/hurricane/doc/hurricane/html/Segments_8h_source.html index 298b7459..95c95ad6 100644 --- a/hurricane/doc/hurricane/html/Segments_8h_source.html +++ b/hurricane/doc/hurricane/html/Segments_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/SetCollection_8h_source.html b/hurricane/doc/hurricane/html/SetCollection_8h_source.html index b1bbcdf6..2159d242 100644 --- a/hurricane/doc/hurricane/html/SetCollection_8h_source.html +++ b/hurricane/doc/hurricane/html/SetCollection_8h_source.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Slice_8h_source.html b/hurricane/doc/hurricane/html/Slice_8h_source.html index 9e2ec095..12f670d4 100644 --- a/hurricane/doc/hurricane/html/Slice_8h_source.html +++ b/hurricane/doc/hurricane/html/Slice_8h_source.html @@ -46,8 +46,8 @@ $(function() {
    1 // ****************************************************************************************************
    2 // File: ./hurricane/Slice.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #pragma once
    21 #include "hurricane/QuadTree.h"
    22 #include "hurricane/Components.h"
    23 #include "hurricane/Markers.h"
    24 #include "hurricane/Transformation.h"
    25 
    26 namespace Hurricane {
    27 
    28 class Cell;
    29 class Layer;
    30 class BasicLayer;
    31 
    32 
    33 
    34 // ****************************************************************************************************
    35 // Slice declaration
    36 // ****************************************************************************************************
    37 
    38 class Slice {
    39 // ********
    40 
    41 // Attributes
    42 // **********
    43 
    44  private: Cell* _cell;
    45  private: const Layer* _layer;
    46  private: QuadTree _quadTree;
    47  private: Slice* _nextOfCellSliceMap;
    48 
    49 // Constructors
    50 // ************
    51 
    52  protected: Slice(Cell* cell, const Layer* layer);
    53 
    54  private: Slice(const Slice& slice); // not implemented to forbid copy construction
    55 
    56 // Destructor
    57 // **********
    58 
    59  protected: ~Slice();
    60 
    61 // Operators
    62 // *********
    63 
    64  private: Slice& operator=(const Slice& slice); // not implemented to forbid assignment
    65 
    66 // Accessors
    67 // *********
    68 
    69  public: Cell* getCell() const {return _cell;};
    70  public: const Layer* getLayer() const {return _layer;};
    71  public: const Box& getBoundingBox() const {return _quadTree.getBoundingBox();};
    72  public: Gos getGos() const {return _quadTree.getGos();};
    73  public: Gos getGosUnder(const Box& area, DbU::Unit threshold=0) const {return _quadTree.getGosUnder(area,threshold);};
    74  public: Components getComponents() const;
    75  public: Components getComponentsUnder(const Box& area, DbU::Unit threshold=0) const;
    76  public: Markers getMarkers() const;
    77  public: Markers getMarkersUnder(const Box& area) const;
    78 
    79 // Predicates
    80 // **********
    81 
    82  public: bool isEmpty() const {return _quadTree.isEmpty();};
    83 
    84 // Others
    85 // ******
    86 
    87  public: static Slice* _create(Cell* cell, const Layer* layer);
    88 
    89  public: void _destroy();
    90 
    91  public: string _getTypeName() const { return _TName("Slice"); };
    92  public: string _getString() const;
    93  public: Record* _getRecord() const;
    94  public: QuadTree* _getQuadTree() {return &_quadTree;};
    95  public: Slice* _getNextOfCellSliceMap() const {return _nextOfCellSliceMap;};
    96 
    97  public: void _setNextOfCellSliceMap(Slice* slice) {_nextOfCellSliceMap = slice;};
    98 
    99 };
    100 
    101 
    102 } // End of Hurricane namespace.
    103 
    104 
    105 INSPECTOR_P_SUPPORT(Hurricane::Slice);
    106 
    107 
    108 // ****************************************************************************************************
    109 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    110 // ****************************************************************************************************
    Components getComponentsUnder(const Box &area, DbU::Unit threshold=0) const
    const Box & getBoundingBox() const
    Definition: Slice.h:71
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    The model (API).
    Definition: Cell.h:66
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    The model (API).
    Definition: Cell.h:64
    bool isEmpty() const
    Definition: QuadTree.h:94
    Gos getGos() const
    Definition: Slice.h:72
    Gos getGos() const
    @@ -68,7 +68,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Slices_8h_source.html b/hurricane/doc/hurricane/html/Slices_8h_source.html index 6394ade7..99eff06a 100644 --- a/hurricane/doc/hurricane/html/Slices_8h_source.html +++ b/hurricane/doc/hurricane/html/Slices_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Tabulation_8h_source.html b/hurricane/doc/hurricane/html/Tabulation_8h_source.html index 47b393fb..12be7474 100644 --- a/hurricane/doc/hurricane/html/Tabulation_8h_source.html +++ b/hurricane/doc/hurricane/html/Tabulation_8h_source.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Technology_8h_source.html b/hurricane/doc/hurricane/html/Technology_8h_source.html index f51c017f..66d8a9d3 100644 --- a/hurricane/doc/hurricane/html/Technology_8h_source.html +++ b/hurricane/doc/hurricane/html/Technology_8h_source.html @@ -56,7 +56,7 @@ $(function() {
    Name description (API)
    Definition: Name.h:35
    PhysicalRule * getUnitRule(std::string ruleName) const
    ViaLayers getViaLayers() const
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    bool isMetal(const Layer *) const
    Definition: Technology.h:200
    Hurricane::Mask< unsigned long long > Mask
    Definition: Layer.h:65
    Layers getLayers() const
    Definition: Technology.h:204
    @@ -65,7 +65,7 @@ $(function() {
    The whole DataBase (API).
    Definition: DataBase.h:40
    Layer * getCutBelow(const Layer *, bool useSymbolic=true) const
    Layer description (API)
    Definition: Layer.h:52
    -
    const Mask & getMask() const
    Definition: Layer.h:155
    +
    const Mask & getMask() const
    Definition: Layer.h:158
    DataBase * getDataBase() const
    Definition: Technology.h:201
    Layer * getNthMetal(int) const
    Define a rule for the technology (API).
    Definition: PhysicalRule.h:65
    @@ -83,7 +83,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Transformation_8h_source.html b/hurricane/doc/hurricane/html/Transformation_8h_source.html index 669c5b20..e9a75668 100644 --- a/hurricane/doc/hurricane/html/Transformation_8h_source.html +++ b/hurricane/doc/hurricane/html/Transformation_8h_source.html @@ -51,7 +51,7 @@ $(function() {
    const DbU::Unit & getTy() const
    Definition: Transformation.h:89
    DbU::Unit getY(const DbU::Unit &x, const DbU::Unit &y) const
    void applyOn(DbU::Unit &x, DbU::Unit &y) const
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    Transformation getTransformation(const Transformation &transformation) const
    Point description (API)
    Definition: Point.h:32
    const Orientation & getOrientation() const
    Definition: Transformation.h:91
    @@ -73,7 +73,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/TransistorLayer_8h_source.html b/hurricane/doc/hurricane/html/TransistorLayer_8h_source.html index 8c682bd5..78c63a1a 100644 --- a/hurricane/doc/hurricane/html/TransistorLayer_8h_source.html +++ b/hurricane/doc/hurricane/html/TransistorLayer_8h_source.html @@ -46,8 +46,8 @@ $(function() {
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Jean-Paul Chaput |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/TransistorLayer.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #ifndef HURRICANE_TRANSISTOR_LAYER_H
    33 #define HURRICANE_TRANSISTOR_LAYER_H
    34 
    35 #include <vector>
    36 
    37 #include "hurricane/Layer.h"
    38 #include "hurricane/TransistorLayers.h"
    39 
    40 
    41 namespace Hurricane {
    42 
    43 // -------------------------------------------------------------------
    44 // Class : "Hurricane::TransistorLayer".
    45 
    46  class TransistorLayer : public Layer {
    47  public:
    48  typedef Layer Super;
    49 
    50  public:
    51  // Constructor.
    52  static TransistorLayer* create ( Technology* technology
    53  , const Name& name
    54  , BasicLayer* gateLayer
    55  , BasicLayer* activeLayer
    56  , BasicLayer* diffusionLayer
    57  , BasicLayer* wellLayer
    58  );
    59  // Accessors.
    60  virtual BasicLayers getBasicLayers () const;
    61  virtual DbU::Unit getExtentionCap () const;
    62  virtual DbU::Unit getExtentionWidth () const;
    63  virtual DbU::Unit getExtentionCap ( const BasicLayer* layer ) const;
    64  virtual DbU::Unit getExtentionWidth ( const BasicLayer* layer ) const;
    65  // Updators.
    66  virtual void setExtentionCap ( const BasicLayer* layer, DbU::Unit cap );
    67  virtual void setExtentionWidth ( const BasicLayer* layer, DbU::Unit width );
    68  // Hurricane Managment.
    69  virtual void _toJson ( JsonWriter* ) const;
    70  virtual void _onDbuChange ( float scale );
    71  virtual string _getTypeName () const;
    72  virtual string _getString () const;
    73  virtual Record* _getRecord () const;
    74 
    75  private:
    76  // Internal: Attributes
    77  vector<BasicLayer*> _basicLayers;
    78  vector<DbU::Unit> _extentionCaps;
    79  vector<DbU::Unit> _extentionWidths;
    80  DbU::Unit _maximalExtentionCap;
    81  DbU::Unit _maximalExtentionWidth;
    82 
    83  protected:
    84  // Internal: Constructors & Destructors.
    85  TransistorLayer ( Technology* technology
    86  , const Name& name
    87  , BasicLayer* gateLayer
    88  , BasicLayer* activeLayer
    89  , BasicLayer* diffusionLayer
    90  , BasicLayer* wellLayer
    91  );
    92  };
    93 
    94 
    95 // -------------------------------------------------------------------
    96 // Class : "Hurricane::JsonTransistorLayer".
    97 
    98  class JsonTransistorLayer : public JsonLayer {
    99  public:
    100  static void initialize ();
    101  JsonTransistorLayer ( unsigned long flags );
    102  ~JsonTransistorLayer ();
    103  virtual string getTypeName () const;
    104  virtual JsonTransistorLayer* clone ( unsigned long ) const;
    105  virtual void toData ( JsonStack& );
    106  };
    107 
    108 
    109 } // End of Hurricane namespace.
    110 
    111 
    112 INSPECTOR_P_SUPPORT(Hurricane::TransistorLayer);
    113 
    114 
    115 # endif
    BasicLayer description (API)
    Definition: BasicLayer.h:44
    Name description (API)
    Definition: Name.h:35
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    TransistorLayer description (API)
    Definition: TransistorLayer.h:46
    JSON Parser Stack.
    Definition: JsonObject.h:249
    static TransistorLayer * create(Technology *technology, const Name &name, BasicLayer *gateLayer, BasicLayer *activeLayer, BasicLayer *diffusionLayer, BasicLayer *wellLayer)
    @@ -59,7 +59,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/UpdateSession_8h_source.html b/hurricane/doc/hurricane/html/UpdateSession_8h_source.html index 765d0517..f555390c 100644 --- a/hurricane/doc/hurricane/html/UpdateSession_8h_source.html +++ b/hurricane/doc/hurricane/html/UpdateSession_8h_source.html @@ -45,8 +45,8 @@ $(function() {
    1 // ****************************************************************************************************
    2 // File: ./hurricane/UpdateSession.h
    3 // Authors: R. Escassut
    4 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    5 //
    6 // This file is part of Hurricane.
    7 //
    8 // Hurricane is free software: you can redistribute it and/or modify it under the terms of the GNU
    9 // Lesser General Public License as published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
    13 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    14 // General Public License for more details.
    15 //
    16 // You should have received a copy of the Lesser GNU General Public License along with Hurricane. If
    17 // not, see <http://www.gnu.org/licenses/>.
    18 // ****************************************************************************************************
    19 
    20 #ifndef HURRICANE_UPDATE_SESSION
    21 #define HURRICANE_UPDATE_SESSION
    22 
    23 #include "hurricane/Property.h"
    24 
    25 namespace Hurricane {
    26 
    27 class Go;
    28 
    29 
    30 
    31 // ****************************************************************************************************
    32 // UpdateSession declaration
    33 // ****************************************************************************************************
    34 
    35 class UpdateSession : public SharedProperty {
    36 // ****************************************
    37 
    38 // Types
    39 // *****
    40 
    41  public: typedef SharedProperty Inherit;
    42 
    43 // Constructors
    44 // ************
    45 
    46  protected: UpdateSession();
    47 
    48  public: virtual void destroy();
    49 
    50 // Accessors
    51 // *********
    52 
    53  public: static const Name& getPropertyName();
    54  public: virtual Name getName() const {return getPropertyName();};
    55 
    56 // Managers
    57 // ********
    58 
    59  public: virtual void onCapturedBy(DBo* owner);
    60  public: virtual void onNotOwned();
    61 
    62 // Ohers
    63 // *****
    64 
    65  public: static UpdateSession* _create();
    66  protected: virtual void _postCreate();
    67 
    68  public: void _destroy();
    69  protected: virtual void _preDestroy();
    70 
    71  public: virtual string _getTypeName() const {return _TName("UpdateSession");};
    72  public: virtual string _getString() const;
    73  public: virtual Record* _getRecord() const;
    74 
    75  public: static void open();
    76  public: static void close();
    77  public: static void reset();
    78  public: static size_t getStackSize();
    79 
    80 
    81 };
    82 
    83 
    84 // ****************************************************************************************************
    85 // Generic functions
    86 // ****************************************************************************************************
    87 
    88 //void openUpdateSession();
    89 //
    90 //void closeUpdateSession();
    91 //
    92 
    93 
    94 } // End of Hurricane namespace.
    95 
    96 
    97 #endif // HURRICANE_UPDATE_SESSION
    98 
    99 
    100 // ****************************************************************************************************
    101 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    102 // ****************************************************************************************************
    Name description (API)
    Definition: Name.h:35
    -
    SharedProperty description (API)
    Definition: Property.h:388
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    SharedProperty description (API)
    Definition: Property.h:386
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    UpdateSession description (API)
    Definition: UpdateSession.h:35
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/VectorCollection_8h_source.html b/hurricane/doc/hurricane/html/VectorCollection_8h_source.html index 502c0000..b4346fe0 100644 --- a/hurricane/doc/hurricane/html/VectorCollection_8h_source.html +++ b/hurricane/doc/hurricane/html/VectorCollection_8h_source.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Vertical_8h_source.html b/hurricane/doc/hurricane/html/Vertical_8h_source.html index 3ff235e5..9a02a759 100644 --- a/hurricane/doc/hurricane/html/Vertical_8h_source.html +++ b/hurricane/doc/hurricane/html/Vertical_8h_source.html @@ -49,7 +49,7 @@ $(function() {
    const DbU::Unit & getDySource() const
    Definition: Vertical.h:92
    Support for JSON export.
    Definition: JsonObject.h:83
    Segment Inherit
    Definition: Vertical.h:42
    -
    std::int64_t Unit
    Definition: DbU.h:70
    +
    std::int64_t Unit
    Definition: DbU.h:67
    Point description (API)
    Definition: Point.h:32
    Vertical description (API)
    Definition: Vertical.h:36
    Box description (API)
    Definition: Box.h:31
    @@ -65,7 +65,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Verticals_8h_source.html b/hurricane/doc/hurricane/html/Verticals_8h_source.html index b81878ed..4e7b5516 100644 --- a/hurricane/doc/hurricane/html/Verticals_8h_source.html +++ b/hurricane/doc/hurricane/html/Verticals_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/ViaLayer_8h_source.html b/hurricane/doc/hurricane/html/ViaLayer_8h_source.html index e6036780..df371e51 100644 --- a/hurricane/doc/hurricane/html/ViaLayer_8h_source.html +++ b/hurricane/doc/hurricane/html/ViaLayer_8h_source.html @@ -46,8 +46,8 @@ $(function() {
    1 // -*- C++ -*-
    2 //
    3 // Copyright (c) BULL S.A. 2000-2018, All Rights Reserved
    4 //
    5 // This file is part of Hurricane.
    6 //
    7 // Hurricane is free software: you can redistribute it and/or modify
    8 // it under the terms of the GNU Lesser General Public License as
    9 // published by the Free Software Foundation, either version 3 of the
    10 // License, or (at your option) any later version.
    11 //
    12 // Hurricane is distributed in the hope that it will be useful, but
    13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN-
    14 // TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Lesser GNU
    15 // General Public License for more details.
    16 //
    17 // You should have received a copy of the Lesser GNU General Public
    18 // License along with Hurricane. If not, see
    19 // <http://www.gnu.org/licenses/>.
    20 //
    21 // +-----------------------------------------------------------------+
    22 // | H U R R I C A N E |
    23 // | V L S I B a c k e n d D a t a - B a s e |
    24 // | |
    25 // | Author : Jean-Paul Chaput |
    26 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    27 // | =============================================================== |
    28 // | C++ Header : "./hurricane/ViaLayer.h" |
    29 // +-----------------------------------------------------------------+
    30 
    31 
    32 #ifndef HURRICANE_VIA_LAYER_H
    33 #define HURRICANE_VIA_LAYER_H
    34 
    35 #include <vector>
    36 
    37 #include "hurricane/Layer.h"
    38 #include "hurricane/ViaLayers.h"
    39 
    40 
    41 namespace Hurricane {
    42 
    43 // -------------------------------------------------------------------
    44 // Class : "Hurricane::ViaLayer".
    45 
    46  class ViaLayer : public Layer {
    47  public:
    48  typedef Layer Super;
    49 
    50  public:
    51  // Constructor.
    52  static ViaLayer* create ( Technology* technology
    53  , const Name& name
    54  , BasicLayer* bottomLayer
    55  , BasicLayer* cutLayer
    56  , BasicLayer* topLayer
    57  );
    58  // Accessors.
    59  virtual BasicLayers getBasicLayers () const;
    60  virtual const Layer* getCut () const;
    61  virtual const Layer* getTop () const;
    62  virtual const Layer* getBottom () const;
    63  virtual const Layer* getOpposite ( const Layer* ) const;
    64  virtual DbU::Unit getEnclosure ( uint32_t flags ) const;
    65  virtual DbU::Unit getEnclosure ( const BasicLayer* layer, uint32_t flags ) const;
    66  virtual DbU::Unit getTopEnclosure ( uint32_t flags ) const;
    67  virtual DbU::Unit getBottomEnclosure ( uint32_t flags ) const;
    68  // Updators.
    69  virtual void setEnclosure ( const BasicLayer* layer, DbU::Unit enclosure, uint32_t flags );
    70  // Hurricane Managment.
    71  virtual void _toJson ( JsonWriter* ) const;
    72  virtual void _onDbuChange ( float scale );
    73  virtual string _getTypeName () const;
    74  virtual string _getString () const;
    75  virtual Record* _getRecord () const;
    76 
    77  private:
    78  // Internal: Attributes
    79  vector<BasicLayer*> _basicLayers;
    80  vector< pair<DbU::Unit,DbU::Unit> > _enclosures;
    81  DbU::Unit _maximalEnclosure;
    82 
    83  protected:
    84  // Internal: Constructors & Destructors.
    85  ViaLayer ( Technology* technology
    86  , const Name& name
    87  , BasicLayer* bottomLayer
    88  , BasicLayer* cutLayer
    89  , BasicLayer* topLayer
    90  );
    91  };
    92 
    93 
    94 // -------------------------------------------------------------------
    95 // Class : "Hurricane::JsonViaLayer".
    96 
    97  class JsonViaLayer : public JsonLayer {
    98  public:
    99  static void initialize ();
    100  JsonViaLayer ( unsigned long flags );
    101  ~JsonViaLayer ();
    102  virtual string getTypeName () const;
    103  virtual JsonViaLayer* clone ( unsigned long ) const;
    104  virtual void toData ( JsonStack& );
    105  };
    106 
    107 
    108 } // End of Hurricane namespace.
    109 
    110 
    111 INSPECTOR_P_SUPPORT(Hurricane::ViaLayer);
    112 
    113 
    114 # endif
    BasicLayer description (API)
    Definition: BasicLayer.h:44
    Name description (API)
    Definition: Name.h:35
    -
    std::int64_t Unit
    Definition: DbU.h:70
    -
    DataBase object root class (API).
    Definition: DBo.h:47
    +
    std::int64_t Unit
    Definition: DbU.h:67
    +
    DataBase object root class (API).
    Definition: DBo.h:45
    JSON Parser Stack.
    Definition: JsonObject.h:249
    Layer description (API)
    Definition: Layer.h:52
    The namespace dedicated to Hurricane.
    Definition: Generalities.dox:5
    @@ -59,7 +59,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/Warning_8h_source.html b/hurricane/doc/hurricane/html/Warning_8h_source.html index a82c2e04..db944850 100644 --- a/hurricane/doc/hurricane/html/Warning_8h_source.html +++ b/hurricane/doc/hurricane/html/Warning_8h_source.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/annotated.html b/hurricane/doc/hurricane/html/annotated.html index 3befeba8..717ff6cd 100644 --- a/hurricane/doc/hurricane/html/annotated.html +++ b/hurricane/doc/hurricane/html/annotated.html @@ -135,7 +135,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classEntity_1_1CompareById.html b/hurricane/doc/hurricane/html/classEntity_1_1CompareById.html index 048e92e8..3120f8fe 100644 --- a/hurricane/doc/hurricane/html/classEntity_1_1CompareById.html +++ b/hurricane/doc/hurricane/html/classEntity_1_1CompareById.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer-members.html index 7a216fc1..e79987b7 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer-members.html @@ -51,7 +51,7 @@ $(function() { below(const Layer *layer) constHurricane::Layerinline clearProperties()Hurricane::DBo contains(const Layer *layer) constHurricane::Layer - create(Technology *technology, const Name &name, const Material &material, unsigned gds2Layer, unsigned gds2Datatype, const DbU::Unit &minimalSize=0, const DbU::Unit &minimalSpacing=0)Hurricane::BasicLayerstatic + create(Technology *technology, const Name &name, const Material &material, unsigned gds2Layer=0, unsigned gds2Datatype=0, const DbU::Unit &minimalSize=0, const DbU::Unit &minimalSpacing=0)Hurricane::BasicLayerstatic destroy()Hurricane::DBovirtual getCutAbove(bool useSymbolic=true) constHurricane::Layer getCutBelow(bool useSymbolic=true) constHurricane::Layer @@ -87,7 +87,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer.html b/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer.html index 84a5f254..f8fb972f 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer.html @@ -140,8 +140,8 @@ Public Member Functions - - + +

    Static Public Member Functions

    static BasicLayercreate (Technology *technology, const Name &name, const Material &material, unsigned gds2Layer, unsigned gds2Datatype, const DbU::Unit &minimalSize=0, const DbU::Unit &minimalSpacing=0)
     
    static BasicLayercreate (Technology *technology, const Name &name, const Material &material, unsigned gds2Layer=0, unsigned gds2Datatype=0, const DbU::Unit &minimalSize=0, const DbU::Unit &minimalSpacing=0)
     
    @@ -154,8 +154,8 @@ Additional Inherited Members

    For a more complete description of the Layers object, please refer to Layer Introduction.

    For purpose of BasicLayers, also see BasicLayer::Material.

    Member Function Documentation

    - -

    ◆ create()

    + +

    ◆ create()

    @@ -185,13 +185,13 @@ Additional Inherited Members
    - + - + @@ -338,7 +338,7 @@ Additional Inherited Members

    Additional Inherited Members

    unsigned gds2Layer, gds2Layer = 0,
    unsigned gds2Datatype, gds2Datatype = 0,
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer_1_1Material-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer_1_1Material-members.html index bf3228ab..0319353e 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer_1_1Material-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer_1_1Material-members.html @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer_1_1Material.html b/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer_1_1Material.html index eaf89c39..5a7f88e8 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer_1_1Material.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1BasicLayer_1_1Material.html @@ -123,7 +123,7 @@ Public Types
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Box-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Box-members.html index 16084ae4..b270b918 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Box-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Box-members.html @@ -91,7 +91,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Box.html b/hurricane/doc/hurricane/html/classHurricane_1_1Box.html index c896fa11..2dce4ae4 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Box.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Box.html @@ -1104,7 +1104,7 @@ Remark on Modifiers
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Cell-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Cell-members.html index 994833ac..3500b19e 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Cell-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Cell-members.html @@ -63,11 +63,11 @@ $(function() { getInternalNets() constHurricane::Cell getLibrary() constHurricane::Cellinline getName() constHurricane::Cellinline - getNet(const Name &name) constHurricane::Cell + getNet(const Name &name, bool useAlias=true) constHurricane::Cell getNets() constHurricane::Cellinline getNonTerminalNetlistInstanceOccurrences(const Instance *topInstance=NULL) constHurricane::Cell getOccurrences(unsigned searchDepth=std::numeric_limits< unsigned int >::max()) constHurricane::Cell - getOccurrencesUnder(const Box &area, unsigned searchDepth=std::numeric_limits< unsigned int >::max()) constHurricane::Cell + getOccurrencesUnder(const Box &area, unsigned searchDepth=std::numeric_limits< unsigned int >::max(), DbU::Unit threshold=0) constHurricane::Cell getProperties() constHurricane::DBo getProperty(const Name &) constHurricane::DBo getRubbers() constHurricane::Cell @@ -91,7 +91,7 @@ $(function() { removeProperty(const Name &)Hurricane::DBo setAbutmentBox(const Box &abutmentBox)Hurricane::Cell setName(const Name &name)Hurricane::Cell - setTerminalNetlist(bool isTerminalNetlist)Hurricane::Cellinline + setTerminalNetlist(bool state)Hurricane::Cellinline uniquify(unsigned int depth=std::numeric_limits< unsigned int >::max())Hurricane::Cell unmaterialize()Hurricane::Cell
    @@ -99,7 +99,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Cell.html b/hurricane/doc/hurricane/html/classHurricane_1_1Cell.html index f0eff3ac..202a80b2 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Cell.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Cell.html @@ -75,8 +75,8 @@ Public Member Functions   Instances getSlaveInstances () const   -NetgetNet (const Name &name) const -  +NetgetNet (const Name &name, bool useAlias=true) const +  Nets getNets () const   Nets getGlobalNets () const @@ -103,8 +103,8 @@ Public Member Functions   Occurrences getOccurrences (unsigned searchDepth=std::numeric_limits< unsigned int >::max()) const   -Occurrences getOccurrencesUnder (const Box &area, unsigned searchDepth=std::numeric_limits< unsigned int >::max()) const -  +Occurrences getOccurrencesUnder (const Box &area, unsigned searchDepth=std::numeric_limits< unsigned int >::max(), DbU::Unit threshold=0) const +  Occurrences getTerminalInstanceOccurrences () const   Occurrences getTerminalNetlistInstanceOccurrences (const Instance *topInstance=NULL) const @@ -129,8 +129,8 @@ Public Member Functions   void setAbutmentBox (const Box &abutmentBox)   -void setTerminalNetlist (bool isTerminalNetlist) -  +void setTerminalNetlist (bool state) +  void materialize ()   void unmaterialize () @@ -375,8 +375,8 @@ Layout vs. Netlist Cell Hierarchy
    - -

    ◆ getNet()

    + +

    ◆ getNet()

    @@ -385,8 +385,18 @@ Layout vs. Netlist Cell Hierarchy Net * Hurricane::Cell::getNet ( const Name &  - name) - const + name, + + + + + bool  + useAlias = true  + + + + ) + const
    @@ -663,8 +673,8 @@ Layout vs. Netlist Cell Hierarchy
    - -

    ◆ getOccurrencesUnder()

    + +

    ◆ getOccurrencesUnder()

    @@ -679,7 +689,13 @@ Layout vs. Netlist Cell Hierarchy unsigned  - searchDepth = std::numeric_limits<unsigned int>::max()  + searchDepth = std::numeric_limits<unsigned int>::max(), + + + + + DbU::Unit  + threshold = 0  @@ -845,8 +861,6 @@ Layout vs. Netlist Cell Hierarchy

    Returns true if the Cell is marked as terminal for the netlist hierarchy. A terminal netlist cell may, however contains further level of physical (layout) instances. This is a state that can be set or unset.

    -

    Referenced by setTerminalNetlist().

    -
    @@ -943,8 +957,8 @@ Layout vs. Netlist Cell Hierarchy
    - -

    ◆ setTerminalNetlist()

    + +

    ◆ setTerminalNetlist()

    @@ -968,8 +982,6 @@ Layout vs. Netlist Cell Hierarchy

    sets Cell netlist terminal status to state.

    -

    References isTerminalNetlist().

    -
    @@ -1063,7 +1075,7 @@ Layout vs. Netlist Cell Hierarchy
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Collection-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Collection-members.html index 250d7087..24425c54 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Collection-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Collection-members.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Collection.html b/hurricane/doc/hurricane/html/classHurricane_1_1Collection.html index 73b9a0a4..143d6502 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Collection.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Collection.html @@ -376,7 +376,7 @@ template<class SubType >

    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Component-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Component-members.html index 2dbe19ed..44cf0264 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Component-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Component-members.html @@ -78,7 +78,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Component.html b/hurricane/doc/hurricane/html/classHurricane_1_1Component.html index 66e67599..1bfd54e7 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Component.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Component.html @@ -504,7 +504,7 @@ Predefined filters
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Component_1_1BodyHook-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Component_1_1BodyHook-members.html index d058946c..9a98dc4d 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Component_1_1BodyHook-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Component_1_1BodyHook-members.html @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Component_1_1BodyHook.html b/hurricane/doc/hurricane/html/classHurricane_1_1Component_1_1BodyHook.html index a6b87348..99c2bb4e 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Component_1_1BodyHook.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Component_1_1BodyHook.html @@ -91,7 +91,7 @@ Additional Inherited Members
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Contact-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Contact-members.html index 0c4acdfa..4a925048 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Contact-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Contact-members.html @@ -49,8 +49,8 @@ $(function() { - - + + @@ -58,41 +58,41 @@ $(function() { - - + + - + - + - - - - - - - - - - - + + + + + + + + + + +
    autoMaterializationIsDisabled()Hurricane::Gostatic
    clearProperties()Hurricane::DBo
    create(Net *net, const Layer *layer, const DbU::Unit &x, const DbU::Unit &y, const DbU::Unit &width=0, const DbU::Unit &height=0)Hurricane::Contactstatic
    create(Component *anchor, const Layer *layer, const DbU::Unit &dx, const DbU::Unit &dy, const DbU::Unit &width=0, const DbU::Unit &height=0)Hurricane::Contactstatic
    create(Net *net, const Layer *layer, DbU::Unit x, DbU::Unit y, DbU::Unit width=0, DbU::Unit height=0)Hurricane::Contactstatic
    create(Component *anchor, const Layer *layer, DbU::Unit dx, DbU::Unit dy, DbU::Unit width=0, DbU::Unit height=0)Hurricane::Contactstatic
    destroy()Hurricane::DBovirtual
    disableAutoMaterialization()Hurricane::Gostatic
    enableAutoMaterialization()Hurricane::Gostatic
    getAnchorHook()Hurricane::Contactinline
    getBodyHook()Hurricane::Componentinline
    getConnexComponents() constHurricane::Component
    getDx() constHurricane::Contactinline
    getDy() constHurricane::Contactinline
    getDx() constHurricane::Contactinline
    getDy() constHurricane::Contactinline
    getHalfHeight() constHurricane::Contactinline
    getHalfWidth() constHurricane::Contactinline
    getHeight() constHurricane::Contactinline
    getHeight() constHurricane::Contactinline
    getIsUnderFilter(const Box &area)Hurricane::Componentstatic
    getNet() constHurricane::Componentinline
    getProperties() constHurricane::DBo
    getProperty(const Name &) constHurricane::DBo
    getRubber() constHurricane::Componentinline
    getSlaveComponents() constHurricane::Component
    getWidth() constHurricane::Contactinline
    getWidth() constHurricane::Contactinline
    hasProperty() constHurricane::DBoinline
    Inherit typedefHurricane::Contact
    isMaterialized() constHurricane::Goinline
    put(Property *)Hurricane::DBo
    remove(Property *)Hurricane::DBo
    removeProperty(const Name &)Hurricane::DBo
    setDx(const DbU::Unit &dx)Hurricane::Contact
    setDy(const DbU::Unit &dy)Hurricane::Contact
    setHeight(const DbU::Unit &height)Hurricane::Contact
    setLayer(const Layer *layer)Hurricane::Contact
    setOffset(const DbU::Unit &dx, const DbU::Unit &dy)Hurricane::Contact
    setPosition(const DbU::Unit &x, const DbU::Unit &y)Hurricane::Contact
    setPosition(const Point &position)Hurricane::Contact
    setSizes(const DbU::Unit &width, const DbU::Unit &height)Hurricane::Contact
    setWidth(const DbU::Unit &width)Hurricane::Contact
    setX(const DbU::Unit &x)Hurricane::Contact
    setY(const DbU::Unit &y)Hurricane::Contact
    setDx(DbU::Unit)Hurricane::Contact
    setDy(DbU::Unit)Hurricane::Contact
    setHeight(DbU::Unit)Hurricane::Contact
    setLayer(const Layer *)Hurricane::Contact
    setOffset(DbU::Unit dx, DbU::Unit dy)Hurricane::Contact
    setPosition(DbU::Unit x, DbU::Unit y)Hurricane::Contact
    setPosition(const Point &)Hurricane::Contact
    setSizes(DbU::Unit width, DbU::Unit height)Hurricane::Contact
    setWidth(DbU::Unit)Hurricane::Contact
    setX(DbU::Unit)Hurricane::Contact
    setY(DbU::Unit)Hurricane::Contact


    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Contact.html b/hurricane/doc/hurricane/html/classHurricane_1_1Contact.html index 892557b1..10c41542 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Contact.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Contact.html @@ -85,40 +85,40 @@ Public Member Functions   ComponentgetAnchor () const   -const DbU::UnitgetDx () const -  -const DbU::UnitgetDy () const -  -const DbU::UnitgetWidth () const -  +DbU::Unit getDx () const +  +DbU::Unit getDy () const +  +DbU::Unit getWidth () const +  DbU::Unit getHalfWidth () const   -const DbU::UnitgetHeight () const -  +DbU::Unit getHeight () const +  DbU::Unit getHalfHeight () const   -void setLayer (const Layer *layer) -  -void setWidth (const DbU::Unit &width) -  -void setHeight (const DbU::Unit &height) -  -void setSizes (const DbU::Unit &width, const DbU::Unit &height) -  -void setX (const DbU::Unit &x) -  -void setY (const DbU::Unit &y) -  -void setPosition (const DbU::Unit &x, const DbU::Unit &y) -  -void setPosition (const Point &position) -  -void setDx (const DbU::Unit &dx) -  -void setDy (const DbU::Unit &dy) -  -void setOffset (const DbU::Unit &dx, const DbU::Unit &dy) -  +void setLayer (const Layer *) +  +void setWidth (DbU::Unit) +  +void setHeight (DbU::Unit) +  +void setSizes (DbU::Unit width, DbU::Unit height) +  +void setX (DbU::Unit) +  +void setY (DbU::Unit) +  +void setPosition (DbU::Unit x, DbU::Unit y) +  +void setPosition (const Point &) +  +void setDx (DbU::Unit) +  +void setDy (DbU::Unit) +  +void setOffset (DbU::Unit dx, DbU::Unit dy) +  - Public Member Functions inherited from Hurricane::Component NetgetNet () const   @@ -153,10 +153,10 @@ Public Member Functions - - - - + + + + @@ -190,8 +190,8 @@ Introduction

    Member Function Documentation

    - -

    ◆ create() [1/2]

    + +

    ◆ create() [1/2]

    @@ -214,25 +214,25 @@ Introduction
    - + - + - + - + @@ -252,8 +252,8 @@ Introduction - -

    ◆ create() [2/2]

    + +

    ◆ create() [2/2]

    @@ -276,25 +276,25 @@ Introduction
    - + - + - + - + @@ -359,8 +359,8 @@ Introduction - -

    ◆ getDx()

    + +

    ◆ getDx()

    @@ -369,7 +369,7 @@ Introduction

    Static Public Member Functions

    static Contactcreate (Net *net, const Layer *layer, const DbU::Unit &x, const DbU::Unit &y, const DbU::Unit &width=0, const DbU::Unit &height=0)
     
    static Contactcreate (Component *anchor, const Layer *layer, const DbU::Unit &dx, const DbU::Unit &dy, const DbU::Unit &width=0, const DbU::Unit &height=0)
     
    static Contactcreate (Net *net, const Layer *layer, DbU::Unit x, DbU::Unit y, DbU::Unit width=0, DbU::Unit height=0)
     
    static Contactcreate (Component *anchor, const Layer *layer, DbU::Unit dx, DbU::Unit dy, DbU::Unit width=0, DbU::Unit height=0)
     
    - Static Public Member Functions inherited from Hurricane::Component
    static ComponentFilter getIsUnderFilter (const Box &area)
     
    const DbU::UnitDbU::Unit  x,
    const DbU::UnitDbU::Unit  y,
    const DbU::UnitDbU::Unit  width = 0,
    const DbU::UnitDbU::Unit  height = 0 
    const DbU::UnitDbU::Unit  dx,
    const DbU::UnitDbU::Unit  dy,
    const DbU::UnitDbU::Unit  width = 0,
    const DbU::UnitDbU::Unit  height = 0 
    - + @@ -386,8 +386,8 @@ Introduction - -

    ◆ getDy()

    + +

    ◆ getDy()

    @@ -396,7 +396,7 @@ Introduction

    const DbU::Unit & Hurricane::Contact::getDx DbU::Unit Hurricane::Contact::getDx ( ) const - + @@ -413,8 +413,8 @@ Introduction - -

    ◆ getWidth()

    + +

    ◆ getWidth()

    @@ -423,7 +423,7 @@ Introduction

    const DbU::Unit & Hurricane::Contact::getDy DbU::Unit Hurricane::Contact::getDy ( ) const - + @@ -465,8 +465,8 @@ Introduction - -

    ◆ getHeight()

    + +

    ◆ getHeight()

    @@ -475,7 +475,7 @@ Introduction

    const DbU::Unit & Hurricane::Contact::getWidth DbU::Unit Hurricane::Contact::getWidth ( ) const - + @@ -517,8 +517,8 @@ Introduction - -

    ◆ setLayer()

    + +

    ◆ setLayer()

    @@ -536,8 +536,8 @@ Introduction
    - -

    ◆ setWidth()

    + +

    ◆ setWidth()

    @@ -545,7 +545,7 @@ Introduction
    - + @@ -555,8 +555,8 @@ Introduction - -

    ◆ setHeight()

    + +

    ◆ setHeight()

    @@ -564,7 +564,7 @@ Introduction
    - + @@ -574,8 +574,8 @@ Introduction - -

    ◆ setSizes()

    + +

    ◆ setSizes()

    @@ -583,13 +583,13 @@ Introduction
    - + - + @@ -603,8 +603,8 @@ Introduction - -

    ◆ setX()

    + +

    ◆ setX()

    @@ -612,7 +612,7 @@ Introduction
    - + @@ -622,8 +622,8 @@ Introduction - -

    ◆ setY()

    + +

    ◆ setY()

    @@ -631,7 +631,7 @@ Introduction
    - + @@ -641,8 +641,8 @@ Introduction - -

    ◆ setPosition() [1/2]

    + +

    ◆ setPosition() [1/2]

    @@ -650,13 +650,13 @@ Introduction
    - + - + @@ -670,8 +670,8 @@ Introduction - -

    ◆ setPosition() [2/2]

    + +

    ◆ setPosition() [2/2]

    @@ -689,8 +689,8 @@ Introduction
    - -

    ◆ setDx()

    + +

    ◆ setDx()

    @@ -698,7 +698,7 @@ Introduction
    - + @@ -709,8 +709,8 @@ Introduction - -

    ◆ setDy()

    + +

    ◆ setDy()

    @@ -718,7 +718,7 @@ Introduction
    - + @@ -729,8 +729,8 @@ Introduction - -

    ◆ setOffset()

    + +

    ◆ setOffset()

    @@ -738,13 +738,13 @@ Introduction
    - + - + @@ -768,7 +768,7 @@ Introduction
    const DbU::Unit & Hurricane::Contact::getHeight DbU::Unit Hurricane::Contact::getHeight ( ) const
    void Hurricane::Contact::setWidth (const DbU::UnitDbU::Unit  width)
    void Hurricane::Contact::setHeight (const DbU::UnitDbU::Unit  height)
    void Hurricane::Contact::setSizes (const DbU::UnitDbU::Unit  width,
    const DbU::UnitDbU::Unit  height 
    void Hurricane::Contact::setX (const DbU::UnitDbU::Unit  x)
    void Hurricane::Contact::setY (const DbU::UnitDbU::Unit  y)
    void Hurricane::Contact::setPosition (const DbU::UnitDbU::Unit  x,
    const DbU::UnitDbU::Unit  y 
    void Hurricane::Contact::setDx (const DbU::UnitDbU::Unit  dx)
    void Hurricane::Contact::setDy (const DbU::UnitDbU::Unit  dy)
    void Hurricane::Contact::setOffset (const DbU::UnitDbU::Unit  dx,
    const DbU::UnitDbU::Unit  dy 
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1ContactLayer-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1ContactLayer-members.html index ffdb567d..648ab5c2 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1ContactLayer-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1ContactLayer-members.html @@ -84,7 +84,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1ContactLayer.html b/hurricane/doc/hurricane/html/classHurricane_1_1ContactLayer.html index d4e618b8..bce5daaa 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1ContactLayer.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1ContactLayer.html @@ -225,7 +225,7 @@ Additional Inherited Members
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Contact_1_1AnchorHook-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Contact_1_1AnchorHook-members.html index 57290f2c..b7d5823d 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Contact_1_1AnchorHook-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Contact_1_1AnchorHook-members.html @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Contact_1_1AnchorHook.html b/hurricane/doc/hurricane/html/classHurricane_1_1Contact_1_1AnchorHook.html index 5c2d0a3c..0f7f68e3 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Contact_1_1AnchorHook.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Contact_1_1AnchorHook.html @@ -92,7 +92,7 @@ Additional Inherited Members
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1DBo-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1DBo-members.html index b87650b6..ccdb2c2f 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1DBo-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1DBo-members.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1DBo.html b/hurricane/doc/hurricane/html/classHurricane_1_1DBo.html index 848112e9..c37344c8 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1DBo.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1DBo.html @@ -317,7 +317,7 @@ Remark
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1DataBase-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1DataBase-members.html index a327b519..6acedca4 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1DataBase-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1DataBase-members.html @@ -64,7 +64,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1DataBase.html b/hurricane/doc/hurricane/html/classHurricane_1_1DataBase.html index c7a8fa38..9784361a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1DataBase.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1DataBase.html @@ -213,7 +213,7 @@ Static Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1DbU-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1DbU-members.html index 6e26a37a..b2291e46 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1DbU-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1DbU-members.html @@ -98,7 +98,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1DbU.html b/hurricane/doc/hurricane/html/classHurricane_1_1DbU.html index 9dce0023..b8b34202 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1DbU.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1DbU.html @@ -168,7 +168,7 @@ Static Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1DebugSession-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1DebugSession-members.html index ca54bf3c..7b0fa191 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1DebugSession-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1DebugSession-members.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1DebugSession.html b/hurricane/doc/hurricane/html/classHurricane_1_1DebugSession.html index 1c96dbea..75cb0a3a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1DebugSession.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1DebugSession.html @@ -378,7 +378,7 @@ Trace Levels
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Diagonal-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Diagonal-members.html index 044d8372..5ca356f4 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Diagonal-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Diagonal-members.html @@ -75,7 +75,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Diagonal.html b/hurricane/doc/hurricane/html/classHurricane_1_1Diagonal.html index ed81c24d..2d5a9c78 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Diagonal.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Diagonal.html @@ -212,7 +212,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1DiffusionLayer-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1DiffusionLayer-members.html index 60b49165..85400bbe 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1DiffusionLayer-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1DiffusionLayer-members.html @@ -83,7 +83,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1DiffusionLayer.html b/hurricane/doc/hurricane/html/classHurricane_1_1DiffusionLayer.html index 942f6deb..bd89f211 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1DiffusionLayer.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1DiffusionLayer.html @@ -211,7 +211,7 @@ Additional Inherited Members
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Entity-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Entity-members.html index 2bbf6392..fe03959c 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Entity-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Entity-members.html @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Entity.html b/hurricane/doc/hurricane/html/classHurricane_1_1Entity.html index 305eb4ba..0ca056ec 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Entity.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Entity.html @@ -174,7 +174,7 @@ Unique Identifier
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Error-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Error-members.html index 5c70c30d..0379c525 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Error-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Error-members.html @@ -66,7 +66,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Error.html b/hurricane/doc/hurricane/html/classHurricane_1_1Error.html index e60aea0d..b34f2d8a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Error.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Error.html @@ -345,7 +345,7 @@ Printing format
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Exception-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Exception-members.html index 75f1022d..80d30760 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Exception-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Exception-members.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Exception.html b/hurricane/doc/hurricane/html/classHurricane_1_1Exception.html index eb0893a2..7f302a8a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Exception.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Exception.html @@ -234,7 +234,7 @@ Example
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Filter-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Filter-members.html index 7985b417..d56eee75 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Filter-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Filter-members.html @@ -55,7 +55,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Filter.html b/hurricane/doc/hurricane/html/classHurricane_1_1Filter.html index 5f8cf0cc..2cab7143 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Filter.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Filter.html @@ -185,7 +185,7 @@ template<class Type>

    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1GenericCollection-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1GenericCollection-members.html index fa0019f5..765d8b2a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1GenericCollection-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1GenericCollection-members.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1GenericCollection.html b/hurricane/doc/hurricane/html/classHurricane_1_1GenericCollection.html index cb8dc255..555bf317 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1GenericCollection.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1GenericCollection.html @@ -188,7 +188,7 @@ template<class Type>

    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1GenericFilter-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1GenericFilter-members.html index adb41664..155cd1b3 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1GenericFilter-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1GenericFilter-members.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1GenericFilter.html b/hurricane/doc/hurricane/html/classHurricane_1_1GenericFilter.html index d11a0bb5..e490d0c7 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1GenericFilter.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1GenericFilter.html @@ -178,7 +178,7 @@ template<class Type >

    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1GenericLocator-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1GenericLocator-members.html index 43a662d3..eaee6ef6 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1GenericLocator-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1GenericLocator-members.html @@ -55,7 +55,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1GenericLocator.html b/hurricane/doc/hurricane/html/classHurricane_1_1GenericLocator.html index 69bf73fb..7d01e084 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1GenericLocator.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1GenericLocator.html @@ -175,7 +175,7 @@ template<class Type>

    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Go-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Go-members.html index ef0b1b4d..84948881 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Go-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Go-members.html @@ -70,7 +70,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Go.html b/hurricane/doc/hurricane/html/classHurricane_1_1Go.html index 615fc6d4..8545355a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Go.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Go.html @@ -333,7 +333,7 @@ Construction and destruction

    It is within this function that the object captures or not the current update session, which involves its future re-materialization when the time commes.

    It is also within this function that all objects, whose geometry will be affected directly or indirectly by the object change, must be invalidated. The flag <propagateFlag> allows to limit the propagation in some cases (i.e. when the contact size changes, objects anchored on it are not affected and there is no need to invalidate them).

    An already dematerialized object must not be taken in count in the current update session, but its propagation, if required, must be systematically executed.

    -
    Sample: We give as an example the implementation for the instances :
    void Instance::invalidate ( bool propagateFlag )
    {
    Inherit::invalidate(false);
    if (propagateFlag) {
    forEach(Plug*, iplug, GetConnectedPlugs()) {
    iplug->invalidate(true);
    }
    }
    }
    void Component::invalidate ( bool propagateFlag )
    {
    Inherit::invalidate(false);
    if (propagateFlag) {
    forEach(Component*, icomponent, GetSlaveComponents()) {
    icomponent->invalidate(false);
    }
    }
    }
    void Contact::setLayer ( Layer* layer )
    {
    if (!layer) throw Error("Can't set layer : null layer");
    if (layer != _layer) {
    // we do the change only if necessary
    invalidate(false); // done before the modification
    _layer = layer;
    }
    }
    void Instance::setTransformation(const Transformation& transformation)
    {
    if (transformation != _transformation) {
    // we do the change only if necessary
    invalidate(true); // done before the modification
    _transformation = transformation;
    }
    }
    +
    Sample: We give as an example the implementation for the instances :
    void Instance::invalidate ( bool propagateFlag )
    {
    Inherit::invalidate(false);
    if (propagateFlag) {
    forEach(Plug*, iplug, GetConnectedPlugs()) {
    iplug->invalidate(true);
    }
    }
    }
    void Component::invalidate ( bool propagateFlag )
    {
    Inherit::invalidate(false);
    if (propagateFlag) {
    forEach(Component*, icomponent, GetSlaveComponents()) {
    icomponent->invalidate(false);
    }
    }
    }
    void Contact::setLayer ( Layer* layer )
    {
    if (!layer) throw Error("Can't set layer : null layer");
    if (layer != _layer) {
    // we do the change only if necessary
    invalidate(false); // done before the modification
    _layer = layer;
    }
    }
    void Instance::setTransformation(const Transformation& transformation)
    {
    if (transformation != _transformation) {
    // we do the change only if necessary
    invalidate(true); // done before the modification
    _transformation = transformation;
    }
    }
    @@ -386,7 +386,7 @@ Construction and destruction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Hook-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Hook-members.html index c04808c7..dd3c985c 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Hook-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Hook-members.html @@ -65,7 +65,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Hook.html b/hurricane/doc/hurricane/html/classHurricane_1_1Hook.html index 36375aad..fbe905f9 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Hook.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Hook.html @@ -421,7 +421,7 @@ Of course the search is done in the natural forward direction (else it would be
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Horizontal-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Horizontal-members.html index 6b8a3366..d543532a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Horizontal-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Horizontal-members.html @@ -92,7 +92,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Horizontal.html b/hurricane/doc/hurricane/html/classHurricane_1_1Horizontal.html index 146d1780..b77bee47 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Horizontal.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Horizontal.html @@ -419,7 +419,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1HyperNet-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1HyperNet-members.html index 5983dad9..4decd035 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1HyperNet-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1HyperNet-members.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1HyperNet.html b/hurricane/doc/hurricane/html/classHurricane_1_1HyperNet.html index feb7dcd5..dab578e7 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1HyperNet.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1HyperNet.html @@ -234,7 +234,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Initializer-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Initializer-members.html index dfe3a6ca..c4fb9d70 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Initializer-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Initializer-members.html @@ -53,7 +53,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Initializer.html b/hurricane/doc/hurricane/html/classHurricane_1_1Initializer.html index c0512f6f..7f2f29dd 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Initializer.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Initializer.html @@ -105,7 +105,7 @@ template<typename T >

    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Instance-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Instance-members.html index dc02aac0..7c4af248 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Instance-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Instance-members.html @@ -82,7 +82,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Instance.html b/hurricane/doc/hurricane/html/classHurricane_1_1Instance.html index 717e6b6f..0b3fb768 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Instance.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Instance.html @@ -646,7 +646,7 @@ Instance Destruction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Instance_1_1PlacementStatus-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Instance_1_1PlacementStatus-members.html index 5e2a1abc..bbff8627 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Instance_1_1PlacementStatus-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Instance_1_1PlacementStatus-members.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Instance_1_1PlacementStatus.html b/hurricane/doc/hurricane/html/classHurricane_1_1Instance_1_1PlacementStatus.html index 06794e07..972071f3 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Instance_1_1PlacementStatus.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Instance_1_1PlacementStatus.html @@ -209,7 +209,7 @@ Instance Placement Status
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Interruption-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Interruption-members.html index 30115b71..f909311d 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Interruption-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Interruption-members.html @@ -61,7 +61,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Interruption.html b/hurricane/doc/hurricane/html/classHurricane_1_1Interruption.html index d54fd66d..433b80d4 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Interruption.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Interruption.html @@ -188,7 +188,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Interval-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Interval-members.html index 2da49e51..46216053 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Interval-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Interval-members.html @@ -79,7 +79,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Interval.html b/hurricane/doc/hurricane/html/classHurricane_1_1Interval.html index 8e165bc7..6d91248a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Interval.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Interval.html @@ -737,7 +737,7 @@ Remark
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1JsonObject-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1JsonObject-members.html index 406846fa..cb63debf 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1JsonObject-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1JsonObject-members.html @@ -76,7 +76,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1JsonObject.html b/hurricane/doc/hurricane/html/classHurricane_1_1JsonObject.html index 15f502d9..b0b38cf4 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1JsonObject.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1JsonObject.html @@ -917,7 +917,7 @@ template<typename T >

    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1JsonStack-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1JsonStack-members.html index 1b6be332..c28aea90 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1JsonStack-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1JsonStack-members.html @@ -65,7 +65,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1JsonStack.html b/hurricane/doc/hurricane/html/classHurricane_1_1JsonStack.html index 0b38dcae..b2758be6 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1JsonStack.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1JsonStack.html @@ -528,7 +528,7 @@ template<typename T >

    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Layer-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Layer-members.html index 48132d8c..de476f4f 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Layer-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Layer-members.html @@ -85,7 +85,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Layer.html b/hurricane/doc/hurricane/html/classHurricane_1_1Layer.html index 7e40d213..adc0e431 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Layer.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Layer.html @@ -834,7 +834,7 @@ Looking Up a Layer from a Mask
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Library-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Library-members.html index 01ba7da2..4334979e 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Library-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Library-members.html @@ -71,7 +71,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Library.html b/hurricane/doc/hurricane/html/classHurricane_1_1Library.html index b24ac8ac..9669cccf 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Library.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Library.html @@ -421,7 +421,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1ListCollection-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1ListCollection-members.html index 0d42ed5c..b0bfa642 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1ListCollection-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1ListCollection-members.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1ListCollection.html b/hurricane/doc/hurricane/html/classHurricane_1_1ListCollection.html index 92338ab0..bc8654ec 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1ListCollection.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1ListCollection.html @@ -120,7 +120,7 @@ template<class Element >

    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Locator-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Locator-members.html index 89f26f0b..f220d36a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Locator-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Locator-members.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Locator.html b/hurricane/doc/hurricane/html/classHurricane_1_1Locator.html index 726a02a6..6c867429 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Locator.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Locator.html @@ -211,7 +211,7 @@ template<class Type>

    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1MapCollection-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1MapCollection-members.html index 98d405c3..85c44345 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1MapCollection-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1MapCollection-members.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1MapCollection.html b/hurricane/doc/hurricane/html/classHurricane_1_1MapCollection.html index 371d248c..74750abd 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1MapCollection.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1MapCollection.html @@ -120,7 +120,7 @@ template<class Key , class Element , class Compare = less<Key>> - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Name-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Name-members.html index 49329e47..f4f42911 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Name-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Name-members.html @@ -66,7 +66,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Name.html b/hurricane/doc/hurricane/html/classHurricane_1_1Name.html index c3d045c7..35e35f0f 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Name.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Name.html @@ -363,7 +363,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Net-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Net-members.html index 398f20f5..9f7af5ec 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Net-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Net-members.html @@ -103,7 +103,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Net.html b/hurricane/doc/hurricane/html/classHurricane_1_1Net.html index 06452bbf..88a5ff04 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Net.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Net.html @@ -1168,7 +1168,7 @@ Once the merger done the net <net> is definitively deleted. I
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Direction-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Direction-members.html index 422461a2..5d6c95ad 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Direction-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Direction-members.html @@ -66,7 +66,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Direction.html b/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Direction.html index 3c5ac529..d2d7aa5a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Direction.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Direction.html @@ -135,7 +135,7 @@ Public Types
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Type-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Type-members.html index eec3a6a4..6ecb5c15 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Type-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Type-members.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Type.html b/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Type.html index c1972432..d310cfc0 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Type.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Net_1_1Type.html @@ -103,7 +103,7 @@ Public Types
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1NotFilter-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1NotFilter-members.html index 7c9dcd35..aa80cea3 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1NotFilter-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1NotFilter-members.html @@ -55,7 +55,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1NotFilter.html b/hurricane/doc/hurricane/html/classHurricane_1_1NotFilter.html index b3015eb5..c2e20212 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1NotFilter.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1NotFilter.html @@ -146,7 +146,7 @@ template<class Type>

    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Occurrence-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Occurrence-members.html index b0a2cdae..8a9f19b9 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Occurrence-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Occurrence-members.html @@ -72,7 +72,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Occurrence.html b/hurricane/doc/hurricane/html/classHurricane_1_1Occurrence.html index ca3a51c1..ca2af92b 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Occurrence.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Occurrence.html @@ -538,7 +538,7 @@ Remarks
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Pad-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Pad-members.html index dbe65e09..03fda935 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Pad-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Pad-members.html @@ -74,7 +74,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Pad.html b/hurricane/doc/hurricane/html/classHurricane_1_1Pad.html index b8962eaf..35a8f405 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Pad.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Pad.html @@ -198,7 +198,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Path-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Path-members.html index b6fa9231..9e828a71 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Path-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Path-members.html @@ -75,7 +75,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Path.html b/hurricane/doc/hurricane/html/classHurricane_1_1Path.html index 997951af..ed809a1d 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Path.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Path.html @@ -605,7 +605,7 @@ Remarks
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1PhysicalRule-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1PhysicalRule-members.html index 0f4c4d90..a2f9b5f0 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1PhysicalRule-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1PhysicalRule-members.html @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1PhysicalRule.html b/hurricane/doc/hurricane/html/classHurricane_1_1PhysicalRule.html index f8c691d4..2aef0199 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1PhysicalRule.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1PhysicalRule.html @@ -417,7 +417,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Pin-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Pin-members.html index 02ff8ee5..7bb49747 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Pin-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Pin-members.html @@ -49,8 +49,8 @@ $(function() { - - + + @@ -58,40 +58,40 @@ $(function() { - - + + - + - + - - - - - - - - - - - + + + + + + + + + + +
    autoMaterializationIsDisabled()Hurricane::Gostatic
    clearProperties()Hurricane::DBo
    Hurricane::Contact::create(Net *net, const Layer *layer, const DbU::Unit &x, const DbU::Unit &y, const DbU::Unit &width=0, const DbU::Unit &height=0)Hurricane::Contactstatic
    Hurricane::Contact::create(Component *anchor, const Layer *layer, const DbU::Unit &dx, const DbU::Unit &dy, const DbU::Unit &width=0, const DbU::Unit &height=0)Hurricane::Contactstatic
    Hurricane::Contact::create(Net *net, const Layer *layer, DbU::Unit x, DbU::Unit y, DbU::Unit width=0, DbU::Unit height=0)Hurricane::Contactstatic
    Hurricane::Contact::create(Component *anchor, const Layer *layer, DbU::Unit dx, DbU::Unit dy, DbU::Unit width=0, DbU::Unit height=0)Hurricane::Contactstatic
    destroy()Hurricane::DBovirtual
    disableAutoMaterialization()Hurricane::Gostatic
    enableAutoMaterialization()Hurricane::Gostatic
    getAnchorHook()Hurricane::Contactinline
    getBodyHook()Hurricane::Componentinline
    getConnexComponents() constHurricane::Component
    getDx() constHurricane::Contactinline
    getDy() constHurricane::Contactinline
    getDx() constHurricane::Contactinline
    getDy() constHurricane::Contactinline
    getHalfHeight() constHurricane::Contactinline
    getHalfWidth() constHurricane::Contactinline
    getHeight() constHurricane::Contactinline
    getHeight() constHurricane::Contactinline
    getIsUnderFilter(const Box &area)Hurricane::Componentstatic
    getNet() constHurricane::Componentinline
    getProperties() constHurricane::DBo
    getProperty(const Name &) constHurricane::DBo
    getRubber() constHurricane::Componentinline
    getSlaveComponents() constHurricane::Component
    getWidth() constHurricane::Contactinline
    getWidth() constHurricane::Contactinline
    hasProperty() constHurricane::DBoinline
    isMaterialized() constHurricane::Goinline
    put(Property *)Hurricane::DBo
    remove(Property *)Hurricane::DBo
    removeProperty(const Name &)Hurricane::DBo
    setDx(const DbU::Unit &dx)Hurricane::Contact
    setDy(const DbU::Unit &dy)Hurricane::Contact
    setHeight(const DbU::Unit &height)Hurricane::Contact
    setLayer(const Layer *layer)Hurricane::Contact
    setOffset(const DbU::Unit &dx, const DbU::Unit &dy)Hurricane::Contact
    setPosition(const DbU::Unit &x, const DbU::Unit &y)Hurricane::Contact
    setPosition(const Point &position)Hurricane::Contact
    setSizes(const DbU::Unit &width, const DbU::Unit &height)Hurricane::Contact
    setWidth(const DbU::Unit &width)Hurricane::Contact
    setX(const DbU::Unit &x)Hurricane::Contact
    setY(const DbU::Unit &y)Hurricane::Contact
    setDx(DbU::Unit)Hurricane::Contact
    setDy(DbU::Unit)Hurricane::Contact
    setHeight(DbU::Unit)Hurricane::Contact
    setLayer(const Layer *)Hurricane::Contact
    setOffset(DbU::Unit dx, DbU::Unit dy)Hurricane::Contact
    setPosition(DbU::Unit x, DbU::Unit y)Hurricane::Contact
    setPosition(const Point &)Hurricane::Contact
    setSizes(DbU::Unit width, DbU::Unit height)Hurricane::Contact
    setWidth(DbU::Unit)Hurricane::Contact
    setX(DbU::Unit)Hurricane::Contact
    setY(DbU::Unit)Hurricane::Contact


    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Pin.html b/hurricane/doc/hurricane/html/classHurricane_1_1Pin.html index d3a37ff4..dfae0c9a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Pin.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Pin.html @@ -75,40 +75,40 @@ Additional Inherited Members   ComponentgetAnchor () const   -const DbU::UnitgetDx () const -  -const DbU::UnitgetDy () const -  -const DbU::UnitgetWidth () const -  +DbU::Unit getDx () const +  +DbU::Unit getDy () const +  +DbU::Unit getWidth () const +  DbU::Unit getHalfWidth () const   -const DbU::UnitgetHeight () const -  +DbU::Unit getHeight () const +  DbU::Unit getHalfHeight () const   -void setLayer (const Layer *layer) -  -void setWidth (const DbU::Unit &width) -  -void setHeight (const DbU::Unit &height) -  -void setSizes (const DbU::Unit &width, const DbU::Unit &height) -  -void setX (const DbU::Unit &x) -  -void setY (const DbU::Unit &y) -  -void setPosition (const DbU::Unit &x, const DbU::Unit &y) -  -void setPosition (const Point &position) -  -void setDx (const DbU::Unit &dx) -  -void setDy (const DbU::Unit &dy) -  -void setOffset (const DbU::Unit &dx, const DbU::Unit &dy) -  +void setLayer (const Layer *) +  +void setWidth (DbU::Unit) +  +void setHeight (DbU::Unit) +  +void setSizes (DbU::Unit width, DbU::Unit height) +  +void setX (DbU::Unit) +  +void setY (DbU::Unit) +  +void setPosition (DbU::Unit x, DbU::Unit y) +  +void setPosition (const Point &) +  +void setDx (DbU::Unit) +  +void setDy (DbU::Unit) +  +void setOffset (DbU::Unit dx, DbU::Unit dy) +  - Public Member Functions inherited from Hurricane::Component NetgetNet () const   @@ -141,10 +141,10 @@ Additional Inherited Members void clearProperties ()   - Static Public Member Functions inherited from Hurricane::Contact -static Contactcreate (Net *net, const Layer *layer, const DbU::Unit &x, const DbU::Unit &y, const DbU::Unit &width=0, const DbU::Unit &height=0) -  -static Contactcreate (Component *anchor, const Layer *layer, const DbU::Unit &dx, const DbU::Unit &dy, const DbU::Unit &width=0, const DbU::Unit &height=0) -  +static Contactcreate (Net *net, const Layer *layer, DbU::Unit x, DbU::Unit y, DbU::Unit width=0, DbU::Unit height=0) +  +static Contactcreate (Component *anchor, const Layer *layer, DbU::Unit dx, DbU::Unit dy, DbU::Unit width=0, DbU::Unit height=0) +  - Static Public Member Functions inherited from Hurricane::Component static ComponentFilter getIsUnderFilter (const Box &area)   @@ -166,7 +166,7 @@ Additional Inherited Members
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Plug-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Plug-members.html index 7ef0bc5f..1ade893a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Plug-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Plug-members.html @@ -77,7 +77,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Plug.html b/hurricane/doc/hurricane/html/classHurricane_1_1Plug.html index 5aa5bde7..c5d70fd0 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Plug.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Plug.html @@ -327,7 +327,7 @@ Predefined filters
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Point-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Point-members.html index bbcb73c4..8e5039f4 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Point-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Point-members.html @@ -53,15 +53,15 @@ $(function() { Point()Hurricane::Point Point(const DbU::Unit &x, const DbU::Unit &y)Hurricane::Point Point(const Point &point)Hurricane::Point - setX(const DbU::Unit &x)Hurricane::Pointinline - setY(const DbU::Unit &y)Hurricane::Pointinline + setX(DbU::Unit x)Hurricane::Pointinline + setY(DbU::Unit y)Hurricane::Pointinline translate(const DbU::Unit &dx, const DbU::Unit &dy)Hurricane::Point


    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Point.html b/hurricane/doc/hurricane/html/classHurricane_1_1Point.html index ee04c626..65207397 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Point.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Point.html @@ -65,10 +65,10 @@ Public Member Functions   bool operator!= (const Point &point) const   -void setX (const DbU::Unit &x) -  -void setY (const DbU::Unit &y) -  +void setX (DbU::Unit x) +  +void setY (DbU::Unit y) +  Pointtranslate (const DbU::Unit &dx, const DbU::Unit &dy)   @@ -199,8 +199,8 @@ Public Member Functions
    - -

    ◆ setX()

    + +

    ◆ setX()

    @@ -211,7 +211,7 @@ Public Member Functions void Hurricane::Point::setX ( - const DbU::Unit &  + DbU::Unit  x) @@ -226,8 +226,8 @@ Public Member Functions
    - -

    ◆ setY()

    + +

    ◆ setY()

    @@ -238,7 +238,7 @@ Public Member Functions void Hurricane::Point::setY ( - const DbU::Unit &  + DbU::Unit  y) @@ -291,7 +291,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Polygon-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Polygon-members.html index 1bd67737..aeb36ffd 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Polygon-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Polygon-members.html @@ -75,7 +75,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Polygon.html b/hurricane/doc/hurricane/html/classHurricane_1_1Polygon.html index 72d2d323..5b4eaed4 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Polygon.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Polygon.html @@ -200,7 +200,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1PrivateProperty-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1PrivateProperty-members.html index e3e35170..4bf056b5 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1PrivateProperty-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1PrivateProperty-members.html @@ -55,7 +55,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1PrivateProperty.html b/hurricane/doc/hurricane/html/classHurricane_1_1PrivateProperty.html index b865deee..7c2e4d40 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1PrivateProperty.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1PrivateProperty.html @@ -121,7 +121,7 @@ Destruction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Property-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Property-members.html index d335763a..1a6e00c4 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Property-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Property-members.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Property.html b/hurricane/doc/hurricane/html/classHurricane_1_1Property.html index e2943286..db6ca2d7 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Property.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Property.html @@ -258,7 +258,7 @@ Remarks
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1QuadTree-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1QuadTree-members.html index d8f29acd..9e9f6371 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1QuadTree-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1QuadTree-members.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1QuadTree.html b/hurricane/doc/hurricane/html/classHurricane_1_1QuadTree.html index 8ad9b75a..1e47b956 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1QuadTree.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1QuadTree.html @@ -260,7 +260,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Quark-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Quark-members.html index 95c7ae36..864b5d55 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Quark-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Quark-members.html @@ -61,7 +61,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Quark.html b/hurricane/doc/hurricane/html/classHurricane_1_1Quark.html index 788378a9..35abb78a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Quark.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Quark.html @@ -136,7 +136,7 @@ Example
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Query-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Query-members.html index 384c6287..f4d9b5d1 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Query-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Query-members.html @@ -91,7 +91,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Query.html b/hurricane/doc/hurricane/html/classHurricane_1_1Query.html index 4fbfe953..d0adbdd8 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Query.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Query.html @@ -1056,7 +1056,7 @@ secQueryParameters
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1RegularLayer-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1RegularLayer-members.html index ab543db7..7e362f73 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1RegularLayer-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1RegularLayer-members.html @@ -80,7 +80,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1RegularLayer.html b/hurricane/doc/hurricane/html/classHurricane_1_1RegularLayer.html index fda79f0d..089f2628 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1RegularLayer.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1RegularLayer.html @@ -222,7 +222,7 @@ RegularLayer::getOpposite()
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Relation-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Relation-members.html index af674428..bf9d3e8f 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Relation-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Relation-members.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Relation.html b/hurricane/doc/hurricane/html/classHurricane_1_1Relation.html index 4e7aa32a..69b6cc98 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Relation.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Relation.html @@ -78,7 +78,7 @@ Additional Inherited Members
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1RoutingPad-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1RoutingPad-members.html index 4bd06c7e..3ea92e52 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1RoutingPad-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1RoutingPad-members.html @@ -98,7 +98,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1RoutingPad.html b/hurricane/doc/hurricane/html/classHurricane_1_1RoutingPad.html index 623596e1..fc752f8c 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1RoutingPad.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1RoutingPad.html @@ -721,7 +721,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Rubber-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Rubber-members.html index 7f99060d..f4818542 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Rubber-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Rubber-members.html @@ -69,7 +69,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Rubber.html b/hurricane/doc/hurricane/html/classHurricane_1_1Rubber.html index 7fa59927..1c855eaa 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Rubber.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Rubber.html @@ -257,7 +257,7 @@ Constructors & Destructors
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Segment-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Segment-members.html index ed5c3d5e..271b93d7 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Segment-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Segment-members.html @@ -93,7 +93,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Segment.html b/hurricane/doc/hurricane/html/classHurricane_1_1Segment.html index f347cdc0..93b9ab3b 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Segment.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Segment.html @@ -644,7 +644,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1SourceHook-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1SourceHook-members.html index 4262371d..14e9bf79 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1SourceHook-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1SourceHook-members.html @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1SourceHook.html b/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1SourceHook.html index 6f42632f..384a6c2f 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1SourceHook.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1SourceHook.html @@ -91,7 +91,7 @@ Additional Inherited Members
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1TargetHook-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1TargetHook-members.html index 05d3275e..74d99b59 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1TargetHook-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1TargetHook-members.html @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1TargetHook.html b/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1TargetHook.html index 9d4b2eb8..f9a5083e 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1TargetHook.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Segment_1_1TargetHook.html @@ -91,7 +91,7 @@ Additional Inherited Members
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1SetCollection-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1SetCollection-members.html index 390a9fe3..bcc537ce 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1SetCollection-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1SetCollection-members.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1SetCollection.html b/hurricane/doc/hurricane/html/classHurricane_1_1SetCollection.html index 4525a33b..f8506f28 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1SetCollection.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1SetCollection.html @@ -120,7 +120,7 @@ template<class Element , class Compare = less<Element>>

    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1SharedProperty-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1SharedProperty-members.html index 9a49e39b..50eea8c2 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1SharedProperty-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1SharedProperty-members.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1SharedProperty.html b/hurricane/doc/hurricane/html/classHurricane_1_1SharedProperty.html index 9eff7fc4..3d02b804 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1SharedProperty.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1SharedProperty.html @@ -89,7 +89,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Slice-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Slice-members.html index 6990916e..708959d9 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Slice-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Slice-members.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Slice.html b/hurricane/doc/hurricane/html/classHurricane_1_1Slice.html index e2412274..e4ec3cf5 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Slice.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Slice.html @@ -243,7 +243,7 @@ Example
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1StandardPrivateProperty-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1StandardPrivateProperty-members.html index d3cb573c..ff4dfa97 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1StandardPrivateProperty-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1StandardPrivateProperty-members.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1StandardPrivateProperty.html b/hurricane/doc/hurricane/html/classHurricane_1_1StandardPrivateProperty.html index 13def639..969154ec 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1StandardPrivateProperty.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1StandardPrivateProperty.html @@ -84,7 +84,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1StandardRelation-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1StandardRelation-members.html index 30057b19..740669ef 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1StandardRelation-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1StandardRelation-members.html @@ -53,7 +53,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1StandardRelation.html b/hurricane/doc/hurricane/html/classHurricane_1_1StandardRelation.html index 5beb3d5f..a9c68147 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1StandardRelation.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1StandardRelation.html @@ -76,7 +76,7 @@ Additional Inherited Members
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1StandardSharedProperty-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1StandardSharedProperty-members.html index 7f3d4ba8..9681a560 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1StandardSharedProperty-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1StandardSharedProperty-members.html @@ -53,7 +53,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1StandardSharedProperty.html b/hurricane/doc/hurricane/html/classHurricane_1_1StandardSharedProperty.html index 050b66e8..84563b5a 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1StandardSharedProperty.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1StandardSharedProperty.html @@ -81,7 +81,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1SubSetCollection-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1SubSetCollection-members.html index 824119d5..2fbfdac0 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1SubSetCollection-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1SubSetCollection-members.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1SubSetCollection.html b/hurricane/doc/hurricane/html/classHurricane_1_1SubSetCollection.html index 473ed54a..07ec7a0d 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1SubSetCollection.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1SubSetCollection.html @@ -165,7 +165,7 @@ template<class Type >

    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1SubTypeCollection-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1SubTypeCollection-members.html index 06aa0283..9303546f 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1SubTypeCollection-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1SubTypeCollection-members.html @@ -61,7 +61,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1SubTypeCollection.html b/hurricane/doc/hurricane/html/classHurricane_1_1SubTypeCollection.html index 4ca2ed72..00b0d1c3 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1SubTypeCollection.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1SubTypeCollection.html @@ -184,7 +184,7 @@ template<class Type , class SubType >
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Tabulation-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Tabulation-members.html index 66cede94..cebd0fe3 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Tabulation-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Tabulation-members.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Tabulation.html b/hurricane/doc/hurricane/html/classHurricane_1_1Tabulation.html index 9735df45..43f7e707 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Tabulation.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Tabulation.html @@ -243,7 +243,7 @@ Remark
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Technology-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Technology-members.html index d299f3e7..4bb59806 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Technology-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Technology-members.html @@ -89,7 +89,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Technology.html b/hurricane/doc/hurricane/html/classHurricane_1_1Technology.html index 23954f4b..f5cb323d 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Technology.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Technology.html @@ -986,7 +986,7 @@ Using PhysicalRules
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Transformation-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Transformation-members.html index d998bcec..5e8b0ae7 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Transformation-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Transformation-members.html @@ -81,7 +81,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Transformation.html b/hurricane/doc/hurricane/html/classHurricane_1_1Transformation.html index ddbe4ec2..2f2ae9aa 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Transformation.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Transformation.html @@ -840,7 +840,7 @@ Transformers
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Transformation_1_1Orientation-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Transformation_1_1Orientation-members.html index 9fbfc5f4..ad1f14df 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Transformation_1_1Orientation-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Transformation_1_1Orientation-members.html @@ -52,7 +52,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Transformation_1_1Orientation.html b/hurricane/doc/hurricane/html/classHurricane_1_1Transformation_1_1Orientation.html index 2d974cfc..cf5a8602 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Transformation_1_1Orientation.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Transformation_1_1Orientation.html @@ -106,7 +106,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1TransistorLayer-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1TransistorLayer-members.html index 45116dfb..31e34dbd 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1TransistorLayer-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1TransistorLayer-members.html @@ -83,7 +83,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1TransistorLayer.html b/hurricane/doc/hurricane/html/classHurricane_1_1TransistorLayer.html index daae6376..1c9d175b 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1TransistorLayer.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1TransistorLayer.html @@ -217,7 +217,7 @@ Additional Inherited Members
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1UpdateSession-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1UpdateSession-members.html index 5fb158d0..c3e2aeb4 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1UpdateSession-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1UpdateSession-members.html @@ -52,7 +52,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1UpdateSession.html b/hurricane/doc/hurricane/html/classHurricane_1_1UpdateSession.html index 99475653..f67d9117 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1UpdateSession.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1UpdateSession.html @@ -87,7 +87,7 @@ Update Session Mechanism
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1VectorCollection-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1VectorCollection-members.html index 4ef2ea92..64c0be23 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1VectorCollection-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1VectorCollection-members.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1VectorCollection.html b/hurricane/doc/hurricane/html/classHurricane_1_1VectorCollection.html index a8c0ee7a..cf229b40 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1VectorCollection.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1VectorCollection.html @@ -120,7 +120,7 @@ template<class Element >
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Vertical-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Vertical-members.html index 1cbfc8ce..b73b8286 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Vertical-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Vertical-members.html @@ -92,7 +92,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Vertical.html b/hurricane/doc/hurricane/html/classHurricane_1_1Vertical.html index 55fdb465..27be134c 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Vertical.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Vertical.html @@ -420,7 +420,7 @@ Introduction
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1ViaLayer-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1ViaLayer-members.html index 179f3896..200ef502 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1ViaLayer-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1ViaLayer-members.html @@ -81,7 +81,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1ViaLayer.html b/hurricane/doc/hurricane/html/classHurricane_1_1ViaLayer.html index 88ae5a5c..f0e02a72 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1ViaLayer.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1ViaLayer.html @@ -207,7 +207,7 @@ ViaLayer::getOpposite()
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Warning-members.html b/hurricane/doc/hurricane/html/classHurricane_1_1Warning-members.html index 39982793..afe671fa 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Warning-members.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Warning-members.html @@ -65,7 +65,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classHurricane_1_1Warning.html b/hurricane/doc/hurricane/html/classHurricane_1_1Warning.html index 1315d737..9b179a4d 100644 --- a/hurricane/doc/hurricane/html/classHurricane_1_1Warning.html +++ b/hurricane/doc/hurricane/html/classHurricane_1_1Warning.html @@ -317,7 +317,7 @@ Remark
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/classes.html b/hurricane/doc/hurricane/html/classes.html index eca36f9d..a86ef367 100644 --- a/hurricane/doc/hurricane/html/classes.html +++ b/hurricane/doc/hurricane/html/classes.html @@ -136,7 +136,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/clasststream-members.html b/hurricane/doc/hurricane/html/clasststream-members.html index 701e24d3..9de91103 100644 --- a/hurricane/doc/hurricane/html/clasststream-members.html +++ b/hurricane/doc/hurricane/html/clasststream-members.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/clasststream.html b/hurricane/doc/hurricane/html/clasststream.html index bc2df946..333efac0 100644 --- a/hurricane/doc/hurricane/html/clasststream.html +++ b/hurricane/doc/hurricane/html/clasststream.html @@ -404,7 +404,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/dir_2450e9a649c497a3424377400b95054f.html b/hurricane/doc/hurricane/html/dir_2450e9a649c497a3424377400b95054f.html index b38eea60..ee02fba0 100644 --- a/hurricane/doc/hurricane/html/dir_2450e9a649c497a3424377400b95054f.html +++ b/hurricane/doc/hurricane/html/dir_2450e9a649c497a3424377400b95054f.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/hurricane/doc/hurricane/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html index 2925f164..322b0d4b 100644 --- a/hurricane/doc/hurricane/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ b/hurricane/doc/hurricane/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/dir_84a91669594ac5e20f6d730a15331f7a.html b/hurricane/doc/hurricane/html/dir_84a91669594ac5e20f6d730a15331f7a.html index 001dee0c..2da9e9de 100644 --- a/hurricane/doc/hurricane/html/dir_84a91669594ac5e20f6d730a15331f7a.html +++ b/hurricane/doc/hurricane/html/dir_84a91669594ac5e20f6d730a15331f7a.html @@ -53,7 +53,7 @@ Directories
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/files.html b/hurricane/doc/hurricane/html/files.html index 8d443218..b824a326 100644 --- a/hurricane/doc/hurricane/html/files.html +++ b/hurricane/doc/hurricane/html/files.html @@ -139,7 +139,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions.html b/hurricane/doc/hurricane/html/functions.html index 57019ef4..293142bf 100644 --- a/hurricane/doc/hurricane/html/functions.html +++ b/hurricane/doc/hurricane/html/functions.html @@ -87,7 +87,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_0x7e.html b/hurricane/doc/hurricane/html/functions_0x7e.html index 609952bc..0c314dbf 100644 --- a/hurricane/doc/hurricane/html/functions_0x7e.html +++ b/hurricane/doc/hurricane/html/functions_0x7e.html @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_b.html b/hurricane/doc/hurricane/html/functions_b.html index b6417bf4..8f225bf2 100644 --- a/hurricane/doc/hurricane/html/functions_b.html +++ b/hurricane/doc/hurricane/html/functions_b.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_c.html b/hurricane/doc/hurricane/html/functions_c.html index a239ad12..51366189 100644 --- a/hurricane/doc/hurricane/html/functions_c.html +++ b/hurricane/doc/hurricane/html/functions_c.html @@ -82,9 +82,9 @@ $(function() { : Hurricane::JsonObject
  • create() -: Hurricane::BasicLayer +: Hurricane::BasicLayer , Hurricane::Cell -, Hurricane::Contact +, Hurricane::Contact , Hurricane::ContactLayer , Hurricane::DataBase , Hurricane::Diagonal @@ -111,7 +111,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_d.html b/hurricane/doc/hurricane/html/functions_d.html index 7104fc6c..9e907cb1 100644 --- a/hurricane/doc/hurricane/html/functions_d.html +++ b/hurricane/doc/hurricane/html/functions_d.html @@ -94,7 +94,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_e.html b/hurricane/doc/hurricane/html/functions_e.html index e650876d..581601e4 100644 --- a/hurricane/doc/hurricane/html/functions_e.html +++ b/hurricane/doc/hurricane/html/functions_e.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_enum.html b/hurricane/doc/hurricane/html/functions_enum.html index d24334a1..55cece1b 100644 --- a/hurricane/doc/hurricane/html/functions_enum.html +++ b/hurricane/doc/hurricane/html/functions_enum.html @@ -64,7 +64,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_eval.html b/hurricane/doc/hurricane/html/functions_eval.html index 981f6e40..6351dece 100644 --- a/hurricane/doc/hurricane/html/functions_eval.html +++ b/hurricane/doc/hurricane/html/functions_eval.html @@ -276,7 +276,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_f.html b/hurricane/doc/hurricane/html/functions_f.html index 97095670..ba39bb78 100644 --- a/hurricane/doc/hurricane/html/functions_f.html +++ b/hurricane/doc/hurricane/html/functions_f.html @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func.html b/hurricane/doc/hurricane/html/functions_func.html index 12fe304f..0d58e31a 100644 --- a/hurricane/doc/hurricane/html/functions_func.html +++ b/hurricane/doc/hurricane/html/functions_func.html @@ -81,7 +81,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_0x7e.html b/hurricane/doc/hurricane/html/functions_func_0x7e.html index 72717d5b..6ebbd9f7 100644 --- a/hurricane/doc/hurricane/html/functions_func_0x7e.html +++ b/hurricane/doc/hurricane/html/functions_func_0x7e.html @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_b.html b/hurricane/doc/hurricane/html/functions_func_b.html index 11c8fce2..03ff1529 100644 --- a/hurricane/doc/hurricane/html/functions_func_b.html +++ b/hurricane/doc/hurricane/html/functions_func_b.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_c.html b/hurricane/doc/hurricane/html/functions_func_c.html index 208890ab..ba06c878 100644 --- a/hurricane/doc/hurricane/html/functions_func_c.html +++ b/hurricane/doc/hurricane/html/functions_func_c.html @@ -64,9 +64,9 @@ $(function() { : Hurricane::JsonObject
  • create() -: Hurricane::BasicLayer +: Hurricane::BasicLayer , Hurricane::Cell -, Hurricane::Contact +, Hurricane::Contact , Hurricane::ContactLayer , Hurricane::DataBase , Hurricane::Diagonal @@ -90,7 +90,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_d.html b/hurricane/doc/hurricane/html/functions_func_d.html index bc540afa..785b3414 100644 --- a/hurricane/doc/hurricane/html/functions_func_d.html +++ b/hurricane/doc/hurricane/html/functions_func_d.html @@ -61,7 +61,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_e.html b/hurricane/doc/hurricane/html/functions_func_e.html index 10c7f022..66d33ced 100644 --- a/hurricane/doc/hurricane/html/functions_func_e.html +++ b/hurricane/doc/hurricane/html/functions_func_e.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_f.html b/hurricane/doc/hurricane/html/functions_func_f.html index 60d44a75..5896adf4 100644 --- a/hurricane/doc/hurricane/html/functions_func_f.html +++ b/hurricane/doc/hurricane/html/functions_func_f.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_g.html b/hurricane/doc/hurricane/html/functions_func_g.html index 06906cbd..637b5cf9 100644 --- a/hurricane/doc/hurricane/html/functions_func_g.html +++ b/hurricane/doc/hurricane/html/functions_func_g.html @@ -182,7 +182,7 @@ $(function() { : Hurricane::PhysicalRule
  • getDx() -: Hurricane::Contact +: Hurricane::Contact , Hurricane::Transformation
  • getDxSource() @@ -192,7 +192,7 @@ $(function() { : Hurricane::Horizontal
  • getDy() -: Hurricane::Contact +: Hurricane::Contact , Hurricane::Transformation
  • getDySource() @@ -253,7 +253,7 @@ $(function() {
  • getHeight() : Hurricane::Box -, Hurricane::Contact +, Hurricane::Contact
  • getHook() : Hurricane::Rubber @@ -397,7 +397,7 @@ $(function() { : Hurricane::Path
  • getNet() -: Hurricane::Cell +: Hurricane::Cell , Hurricane::Component , Hurricane::Rubber
  • @@ -436,7 +436,7 @@ $(function() { : Hurricane::Cell
  • getOccurrencesUnder() -: Hurricane::Cell +: Hurricane::Cell
  • getOnCustomGrid() : Hurricane::DbU @@ -707,7 +707,7 @@ $(function() {
  • getWidth() : Hurricane::Box -, Hurricane::Contact +, Hurricane::Contact , Hurricane::Segment
  • getX() @@ -752,7 +752,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_h.html b/hurricane/doc/hurricane/html/functions_func_h.html index 5815f6a6..a5ce0d73 100644 --- a/hurricane/doc/hurricane/html/functions_func_h.html +++ b/hurricane/doc/hurricane/html/functions_func_h.html @@ -79,7 +79,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_i.html b/hurricane/doc/hurricane/html/functions_func_i.html index 9aa71955..b0e6c93f 100644 --- a/hurricane/doc/hurricane/html/functions_func_i.html +++ b/hurricane/doc/hurricane/html/functions_func_i.html @@ -169,7 +169,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_j.html b/hurricane/doc/hurricane/html/functions_func_j.html index 8e1ab6d8..6febcf33 100644 --- a/hurricane/doc/hurricane/html/functions_func_j.html +++ b/hurricane/doc/hurricane/html/functions_func_j.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_l.html b/hurricane/doc/hurricane/html/functions_func_l.html index c828599b..114fdea9 100644 --- a/hurricane/doc/hurricane/html/functions_func_l.html +++ b/hurricane/doc/hurricane/html/functions_func_l.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_m.html b/hurricane/doc/hurricane/html/functions_func_m.html index 327fe4da..94f26fad 100644 --- a/hurricane/doc/hurricane/html/functions_func_m.html +++ b/hurricane/doc/hurricane/html/functions_func_m.html @@ -69,7 +69,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_n.html b/hurricane/doc/hurricane/html/functions_func_n.html index c3bd415b..91a31d59 100644 --- a/hurricane/doc/hurricane/html/functions_func_n.html +++ b/hurricane/doc/hurricane/html/functions_func_n.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_o.html b/hurricane/doc/hurricane/html/functions_func_o.html index 5da1bf89..e6a4cb7b 100644 --- a/hurricane/doc/hurricane/html/functions_func_o.html +++ b/hurricane/doc/hurricane/html/functions_func_o.html @@ -116,7 +116,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_p.html b/hurricane/doc/hurricane/html/functions_func_p.html index 8661d52f..872325e9 100644 --- a/hurricane/doc/hurricane/html/functions_func_p.html +++ b/hurricane/doc/hurricane/html/functions_func_p.html @@ -79,7 +79,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_q.html b/hurricane/doc/hurricane/html/functions_func_q.html index a689d23d..c1dcdd70 100644 --- a/hurricane/doc/hurricane/html/functions_func_q.html +++ b/hurricane/doc/hurricane/html/functions_func_q.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_r.html b/hurricane/doc/hurricane/html/functions_func_r.html index 6ff15e52..6c374412 100644 --- a/hurricane/doc/hurricane/html/functions_func_r.html +++ b/hurricane/doc/hurricane/html/functions_func_r.html @@ -67,7 +67,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_s.html b/hurricane/doc/hurricane/html/functions_func_s.html index b8b824be..4522cbae 100644 --- a/hurricane/doc/hurricane/html/functions_func_s.html +++ b/hurricane/doc/hurricane/html/functions_func_s.html @@ -64,10 +64,10 @@ $(function() { : Hurricane::Net
  • setDx() -: Hurricane::Contact +: Hurricane::Contact
  • setDy() -: Hurricane::Contact +: Hurricane::Contact
  • setEnclosure() : Hurricane::Layer @@ -100,13 +100,13 @@ $(function() { : Hurricane::DbU
  • setHeight() -: Hurricane::Contact +: Hurricane::Contact
  • setHtmlTranslator() : Hurricane::Exception
  • setLayer() -: Hurricane::Contact +: Hurricane::Contact , Hurricane::Segment
  • setLevel() @@ -146,13 +146,13 @@ $(function() { : Hurricane::JsonObject
  • setOffset() -: Hurricane::Contact +: Hurricane::Contact
  • setOnBestComponent() : Hurricane::RoutingPad
  • setPosition() -: Hurricane::Contact +: Hurricane::Contact , Hurricane::Net
  • setPrecision() @@ -168,7 +168,7 @@ $(function() { : Hurricane::DbU
  • setSizes() -: Hurricane::Contact +: Hurricane::Contact
  • setStartLevel() : Hurricane::Query @@ -189,7 +189,7 @@ $(function() { : Hurricane::PhysicalRule
  • setTerminalNetlist() -: Hurricane::Cell +: Hurricane::Cell
  • setTextTranslator() : Hurricane::Exception @@ -202,18 +202,18 @@ $(function() { : Hurricane::Net
  • setWidth() -: Hurricane::Contact +: Hurricane::Contact , Hurricane::Segment
  • setX() -: Hurricane::Contact -, Hurricane::Point +: Hurricane::Contact +, Hurricane::Point , Hurricane::Vertical
  • setY() -: Hurricane::Contact +: Hurricane::Contact , Hurricane::Horizontal -, Hurricane::Point +, Hurricane::Point
  • size() : Hurricane::JsonStack @@ -230,7 +230,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_t.html b/hurricane/doc/hurricane/html/functions_func_t.html index 5b1787d7..e734ebcf 100644 --- a/hurricane/doc/hurricane/html/functions_func_t.html +++ b/hurricane/doc/hurricane/html/functions_func_t.html @@ -84,7 +84,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_u.html b/hurricane/doc/hurricane/html/functions_func_u.html index 7b616c64..5ec4f938 100644 --- a/hurricane/doc/hurricane/html/functions_func_u.html +++ b/hurricane/doc/hurricane/html/functions_func_u.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_v.html b/hurricane/doc/hurricane/html/functions_func_v.html index a62ee4eb..545d168b 100644 --- a/hurricane/doc/hurricane/html/functions_func_v.html +++ b/hurricane/doc/hurricane/html/functions_func_v.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_func_w.html b/hurricane/doc/hurricane/html/functions_func_w.html index 595fe2a6..d9f4af42 100644 --- a/hurricane/doc/hurricane/html/functions_func_w.html +++ b/hurricane/doc/hurricane/html/functions_func_w.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_g.html b/hurricane/doc/hurricane/html/functions_g.html index ce9b92d0..bf53b72e 100644 --- a/hurricane/doc/hurricane/html/functions_g.html +++ b/hurricane/doc/hurricane/html/functions_g.html @@ -182,7 +182,7 @@ $(function() { : Hurricane::PhysicalRule
  • getDx() -: Hurricane::Contact +: Hurricane::Contact , Hurricane::Transformation
  • getDxSource() @@ -192,7 +192,7 @@ $(function() { : Hurricane::Horizontal
  • getDy() -: Hurricane::Contact +: Hurricane::Contact , Hurricane::Transformation
  • getDySource() @@ -253,7 +253,7 @@ $(function() {
  • getHeight() : Hurricane::Box -, Hurricane::Contact +, Hurricane::Contact
  • getHook() : Hurricane::Rubber @@ -397,7 +397,7 @@ $(function() { : Hurricane::Path
  • getNet() -: Hurricane::Cell +: Hurricane::Cell , Hurricane::Component , Hurricane::Rubber
  • @@ -436,7 +436,7 @@ $(function() { : Hurricane::Cell
  • getOccurrencesUnder() -: Hurricane::Cell +: Hurricane::Cell
  • getOnCustomGrid() : Hurricane::DbU @@ -707,7 +707,7 @@ $(function() {
  • getWidth() : Hurricane::Box -, Hurricane::Contact +, Hurricane::Contact , Hurricane::Segment
  • getX() @@ -758,7 +758,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_h.html b/hurricane/doc/hurricane/html/functions_h.html index dee57eed..6cea6c77 100644 --- a/hurricane/doc/hurricane/html/functions_h.html +++ b/hurricane/doc/hurricane/html/functions_h.html @@ -82,7 +82,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_i.html b/hurricane/doc/hurricane/html/functions_i.html index d2d4f150..a2ee8c69 100644 --- a/hurricane/doc/hurricane/html/functions_i.html +++ b/hurricane/doc/hurricane/html/functions_i.html @@ -193,7 +193,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_j.html b/hurricane/doc/hurricane/html/functions_j.html index f9b96e3d..b2d55a80 100644 --- a/hurricane/doc/hurricane/html/functions_j.html +++ b/hurricane/doc/hurricane/html/functions_j.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_k.html b/hurricane/doc/hurricane/html/functions_k.html index 466fca08..a9cae238 100644 --- a/hurricane/doc/hurricane/html/functions_k.html +++ b/hurricane/doc/hurricane/html/functions_k.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_l.html b/hurricane/doc/hurricane/html/functions_l.html index b4e80a29..54869122 100644 --- a/hurricane/doc/hurricane/html/functions_l.html +++ b/hurricane/doc/hurricane/html/functions_l.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_m.html b/hurricane/doc/hurricane/html/functions_m.html index 20b55789..5c3de108 100644 --- a/hurricane/doc/hurricane/html/functions_m.html +++ b/hurricane/doc/hurricane/html/functions_m.html @@ -81,7 +81,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_n.html b/hurricane/doc/hurricane/html/functions_n.html index 0d1e06fe..54be9140 100644 --- a/hurricane/doc/hurricane/html/functions_n.html +++ b/hurricane/doc/hurricane/html/functions_n.html @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_o.html b/hurricane/doc/hurricane/html/functions_o.html index bbb37f01..5c258770 100644 --- a/hurricane/doc/hurricane/html/functions_o.html +++ b/hurricane/doc/hurricane/html/functions_o.html @@ -122,7 +122,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_p.html b/hurricane/doc/hurricane/html/functions_p.html index 9f6aef4d..2ad4b2f2 100644 --- a/hurricane/doc/hurricane/html/functions_p.html +++ b/hurricane/doc/hurricane/html/functions_p.html @@ -97,7 +97,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_q.html b/hurricane/doc/hurricane/html/functions_q.html index 518e1668..a3206091 100644 --- a/hurricane/doc/hurricane/html/functions_q.html +++ b/hurricane/doc/hurricane/html/functions_q.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_r.html b/hurricane/doc/hurricane/html/functions_r.html index f4b75534..81e00297 100644 --- a/hurricane/doc/hurricane/html/functions_r.html +++ b/hurricane/doc/hurricane/html/functions_r.html @@ -67,7 +67,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_s.html b/hurricane/doc/hurricane/html/functions_s.html index 646ce91c..a5c51dff 100644 --- a/hurricane/doc/hurricane/html/functions_s.html +++ b/hurricane/doc/hurricane/html/functions_s.html @@ -64,10 +64,10 @@ $(function() { : Hurricane::Net
  • setDx() -: Hurricane::Contact +: Hurricane::Contact
  • setDy() -: Hurricane::Contact +: Hurricane::Contact
  • setEnclosure() : Hurricane::Layer @@ -100,13 +100,13 @@ $(function() { : Hurricane::DbU
  • setHeight() -: Hurricane::Contact +: Hurricane::Contact
  • setHtmlTranslator() : Hurricane::Exception
  • setLayer() -: Hurricane::Contact +: Hurricane::Contact , Hurricane::Segment
  • setLevel() @@ -146,13 +146,13 @@ $(function() { : Hurricane::JsonObject
  • setOffset() -: Hurricane::Contact +: Hurricane::Contact
  • setOnBestComponent() : Hurricane::RoutingPad
  • setPosition() -: Hurricane::Contact +: Hurricane::Contact , Hurricane::Net
  • setPrecision() @@ -168,7 +168,7 @@ $(function() { : Hurricane::DbU
  • setSizes() -: Hurricane::Contact +: Hurricane::Contact
  • setStartLevel() : Hurricane::Query @@ -189,7 +189,7 @@ $(function() { : Hurricane::PhysicalRule
  • setTerminalNetlist() -: Hurricane::Cell +: Hurricane::Cell
  • setTextTranslator() : Hurricane::Exception @@ -202,18 +202,18 @@ $(function() { : Hurricane::Net
  • setWidth() -: Hurricane::Contact +: Hurricane::Contact , Hurricane::Segment
  • setX() -: Hurricane::Contact -, Hurricane::Point +: Hurricane::Contact +, Hurricane::Point , Hurricane::Vertical
  • setY() -: Hurricane::Contact +: Hurricane::Contact , Hurricane::Horizontal -, Hurricane::Point +, Hurricane::Point
  • ShowWarning : Hurricane::RoutingPad @@ -249,7 +249,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_t.html b/hurricane/doc/hurricane/html/functions_t.html index 40440a4f..6d11f4a9 100644 --- a/hurricane/doc/hurricane/html/functions_t.html +++ b/hurricane/doc/hurricane/html/functions_t.html @@ -90,7 +90,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_type.html b/hurricane/doc/hurricane/html/functions_type.html index da89f21d..d476d7b3 100644 --- a/hurricane/doc/hurricane/html/functions_type.html +++ b/hurricane/doc/hurricane/html/functions_type.html @@ -71,7 +71,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_u.html b/hurricane/doc/hurricane/html/functions_u.html index 6be75952..b9087348 100644 --- a/hurricane/doc/hurricane/html/functions_u.html +++ b/hurricane/doc/hurricane/html/functions_u.html @@ -73,7 +73,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_v.html b/hurricane/doc/hurricane/html/functions_v.html index 1361209f..2dfb5974 100644 --- a/hurricane/doc/hurricane/html/functions_v.html +++ b/hurricane/doc/hurricane/html/functions_v.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/functions_w.html b/hurricane/doc/hurricane/html/functions_w.html index af4f17b4..12f50a02 100644 --- a/hurricane/doc/hurricane/html/functions_w.html +++ b/hurricane/doc/hurricane/html/functions_w.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/graph_legend.html b/hurricane/doc/hurricane/html/graph_legend.html index 3f42a067..114a9e4b 100644 --- a/hurricane/doc/hurricane/html/graph_legend.html +++ b/hurricane/doc/hurricane/html/graph_legend.html @@ -74,7 +74,7 @@ A yellow dashed arrow denotes a relation between a template instance and the tem
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/group__DbUGroup.html b/hurricane/doc/hurricane/html/group__DbUGroup.html index 3f4975f6..080dae9c 100644 --- a/hurricane/doc/hurricane/html/group__DbUGroup.html +++ b/hurricane/doc/hurricane/html/group__DbUGroup.html @@ -1293,7 +1293,7 @@ Translators
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/group__Generalities.html b/hurricane/doc/hurricane/html/group__Generalities.html index 52e27af7..ad7f080b 100644 --- a/hurricane/doc/hurricane/html/group__Generalities.html +++ b/hurricane/doc/hurricane/html/group__Generalities.html @@ -155,7 +155,7 @@ Remarks
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/group__JsonSupport.html b/hurricane/doc/hurricane/html/group__JsonSupport.html index 23250a00..69de0472 100644 --- a/hurricane/doc/hurricane/html/group__JsonSupport.html +++ b/hurricane/doc/hurricane/html/group__JsonSupport.html @@ -117,7 +117,7 @@ JsonObject Life Cycle
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/group__grpSynthHierarchy.html b/hurricane/doc/hurricane/html/group__grpSynthHierarchy.html index 3c186059..e6690512 100644 --- a/hurricane/doc/hurricane/html/group__grpSynthHierarchy.html +++ b/hurricane/doc/hurricane/html/group__grpSynthHierarchy.html @@ -238,7 +238,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/hierarchy.html b/hurricane/doc/hurricane/html/hierarchy.html index bc981bcc..c2e95400 100644 --- a/hurricane/doc/hurricane/html/hierarchy.html +++ b/hurricane/doc/hurricane/html/hierarchy.html @@ -144,7 +144,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/hurricane.tag b/hurricane/doc/hurricane/html/hurricane.tag index d859829c..142029da 100644 --- a/hurricane/doc/hurricane/html/hurricane.tag +++ b/hurricane/doc/hurricane/html/hurricane.tag @@ -42,8 +42,8 @@ static BasicLayer * create classHurricane_1_1BasicLayer.html - a76ccb64abaaf9c834c8ee8f010d5d24f - (Technology *technology, const Name &name, const Material &material, unsigned gds2Layer, unsigned gds2Datatype, const DbU::Unit &minimalSize=0, const DbU::Unit &minimalSpacing=0) + aecdcb9bef9b3c1c2bcb6d4513e1ca657 + (Technology *technology, const Name &name, const Material &material, unsigned gds2Layer=0, unsigned gds2Datatype=0, const DbU::Unit &minimalSize=0, const DbU::Unit &minimalSpacing=0) @@ -380,8 +380,8 @@ Net * getNet classHurricane_1_1Cell.html - a63cb19881279b5af0a4e7dae707ef1bd - (const Name &name) const + a70f06abd224895aeeeeb042365dbf48a + (const Name &name, bool useAlias=true) const Nets @@ -478,8 +478,8 @@ Occurrences getOccurrencesUnder classHurricane_1_1Cell.html - a7fb09c8e350923c47ce4c4407bdb00ce - (const Box &area, unsigned searchDepth=std::numeric_limits< unsigned int >::max()) const + aee27efc0497992f811c9812ffa272a5a + (const Box &area, unsigned searchDepth=std::numeric_limits< unsigned int >::max(), DbU::Unit threshold=0) const Occurrences @@ -569,8 +569,8 @@ void setTerminalNetlist classHurricane_1_1Cell.html - a15958b25e911e8f5543557b6deea5618 - (bool isTerminalNetlist) + a47ce34631bb9f6862caa13e5b25a4d8f + (bool state) void @@ -987,24 +987,24 @@ () const - const DbU::Unit & + DbU::Unit getDx classHurricane_1_1Contact.html - acf8405f74b97239ea74ec629d0b4e194 + a8a5c4475668b6c6730ed5265e5447553 () const - const DbU::Unit & + DbU::Unit getDy classHurricane_1_1Contact.html - aa7bc32ab9211fd5f6ad3aacdf1214f20 + af674c59fcaf1f5214d54a558fe30e41a () const - const DbU::Unit & + DbU::Unit getWidth classHurricane_1_1Contact.html - a28bd18de9ca6e5cf2b77fce5e22af43a + a794ce7c3aa5ffe894c1231f7c5ac3c52 () const @@ -1015,10 +1015,10 @@ () const - const DbU::Unit & + DbU::Unit getHeight classHurricane_1_1Contact.html - adf6487485a4f48bd15aa6f9a8ac5fd27 + a07a4ecc7ea2479e2d63f5f31d9325dde () const @@ -1032,92 +1032,92 @@ void setLayer classHurricane_1_1Contact.html - a147644849f33bc4d58b6b997543c8306 - (const Layer *layer) + aec627634d5b6cfc5079a02b1b518b50e + (const Layer *) void setWidth classHurricane_1_1Contact.html - aae6d5c96862fd6c834ff4abd61edc86f - (const DbU::Unit &width) + a08d14ce6cdf3696e472f4a621b936afe + (DbU::Unit) void setHeight classHurricane_1_1Contact.html - a2fc2e7c85dc5495810544c48bb604712 - (const DbU::Unit &height) + a6480b6a75cc098d3227f27080a2cb42b + (DbU::Unit) void setSizes classHurricane_1_1Contact.html - aa18aa1e78eba9f4c10ece0e20683faf5 - (const DbU::Unit &width, const DbU::Unit &height) + a1bded13596d448c6bb9c93271fffe5fd + (DbU::Unit width, DbU::Unit height) void setX classHurricane_1_1Contact.html - a181436f128b65467e1ab94ffcb0c345b - (const DbU::Unit &x) + a5b2338675993259feabb641fd9a1996e + (DbU::Unit) void setY classHurricane_1_1Contact.html - a455b8925aae10157c9143b58a3a52e57 - (const DbU::Unit &y) + a232a49a5dd180e9ff8dfb2bd2a67f2cd + (DbU::Unit) void setPosition classHurricane_1_1Contact.html - afac88ee8442e3e943a24bb526057851a - (const DbU::Unit &x, const DbU::Unit &y) + ae44d4d7655428705f13dca34c7167690 + (DbU::Unit x, DbU::Unit y) void setPosition classHurricane_1_1Contact.html - ad3ff25d47d1c00c53bb07bb0ff4067f1 - (const Point &position) + aedcc63fe54538939c03fe81a16b0bae0 + (const Point &) void setDx classHurricane_1_1Contact.html - a6ee60b9d228fe5487bf73dc396b94706 - (const DbU::Unit &dx) + a82f29c6b48b0c5a51fe3c1678d71876c + (DbU::Unit) void setDy classHurricane_1_1Contact.html - a32ee96c21115ee9d197bc505fd48e37d - (const DbU::Unit &dy) + ac5dadc06ae38c1ff287f031864f58850 + (DbU::Unit) void setOffset classHurricane_1_1Contact.html - a41ba972136e77d768f58ad0407d18f8e - (const DbU::Unit &dx, const DbU::Unit &dy) + a5c8cb75debcbe10aedc092e2089a975c + (DbU::Unit dx, DbU::Unit dy) static Contact * create classHurricane_1_1Contact.html - a5402fec0518c81d35fbec2c2b2ec0f8f - (Net *net, const Layer *layer, const DbU::Unit &x, const DbU::Unit &y, const DbU::Unit &width=0, const DbU::Unit &height=0) + ab66989c2dce4d398f1f7647aca50d983 + (Net *net, const Layer *layer, DbU::Unit x, DbU::Unit y, DbU::Unit width=0, DbU::Unit height=0) static Contact * create classHurricane_1_1Contact.html - a6645345f819cb4769fac075a0b1ea028 - (Component *anchor, const Layer *layer, const DbU::Unit &dx, const DbU::Unit &dy, const DbU::Unit &width=0, const DbU::Unit &height=0) + a2e555edb8984b599c391f16db105c1f5 + (Component *anchor, const Layer *layer, DbU::Unit dx, DbU::Unit dy, DbU::Unit width=0, DbU::Unit height=0) secContactIntro @@ -4791,15 +4791,15 @@ void setX classHurricane_1_1Point.html - a713ba6d38358fc1820371f74647b4214 - (const DbU::Unit &x) + adebab98c82f881b1d2e1e7680a907830 + (DbU::Unit x) void setY classHurricane_1_1Point.html - a5b5c5811c3e354235142eacffc2d887e - (const DbU::Unit &y) + a14a51f177d298ccccb25066c0298a268 + (DbU::Unit y) Point & diff --git a/hurricane/doc/hurricane/html/index.html b/hurricane/doc/hurricane/html/index.html index 7010045f..d8c7be1a 100644 --- a/hurricane/doc/hurricane/html/index.html +++ b/hurricane/doc/hurricane/html/index.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/modules.html b/hurricane/doc/hurricane/html/modules.html index abcf96a4..19bad9ff 100644 --- a/hurricane/doc/hurricane/html/modules.html +++ b/hurricane/doc/hurricane/html/modules.html @@ -53,7 +53,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/namespaceHurricane.html b/hurricane/doc/hurricane/html/namespaceHurricane.html index 70b6f58f..e051109e 100644 --- a/hurricane/doc/hurricane/html/namespaceHurricane.html +++ b/hurricane/doc/hurricane/html/namespaceHurricane.html @@ -1381,7 +1381,7 @@ Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/namespacemembers.html b/hurricane/doc/hurricane/html/namespacemembers.html index dcfb5819..9de2be67 100644 --- a/hurricane/doc/hurricane/html/namespacemembers.html +++ b/hurricane/doc/hurricane/html/namespacemembers.html @@ -285,7 +285,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/namespacemembers_func.html b/hurricane/doc/hurricane/html/namespacemembers_func.html index a1928e94..1bcf64e2 100644 --- a/hurricane/doc/hurricane/html/namespacemembers_func.html +++ b/hurricane/doc/hurricane/html/namespacemembers_func.html @@ -46,7 +46,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/namespacemembers_type.html b/hurricane/doc/hurricane/html/namespacemembers_type.html index e39007da..9575299b 100644 --- a/hurricane/doc/hurricane/html/namespacemembers_type.html +++ b/hurricane/doc/hurricane/html/namespacemembers_type.html @@ -282,7 +282,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/html/namespaces.html b/hurricane/doc/hurricane/html/namespaces.html index 93c4b251..fb2005bf 100644 --- a/hurricane/doc/hurricane/html/namespaces.html +++ b/hurricane/doc/hurricane/html/namespaces.html @@ -50,7 +50,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/hurricane/latex/classHurricane_1_1BasicLayer.tex b/hurricane/doc/hurricane/latex/classHurricane_1_1BasicLayer.tex index bcf37818..714be111 100644 --- a/hurricane/doc/hurricane/latex/classHurricane_1_1BasicLayer.tex +++ b/hurricane/doc/hurricane/latex/classHurricane_1_1BasicLayer.tex @@ -33,7 +33,7 @@ void \mbox{\hyperlink{classHurricane_1_1BasicLayer_aa5aa1e1079c14d7e9c05799d14e7 \subsection*{Static Public Member Functions} \begin{DoxyCompactItemize} \item -static \mbox{\hyperlink{classHurricane_1_1BasicLayer}{Basic\+Layer}} $\ast$ \mbox{\hyperlink{classHurricane_1_1BasicLayer_a76ccb64abaaf9c834c8ee8f010d5d24f}{create}} (\mbox{\hyperlink{classHurricane_1_1Technology}{Technology}} $\ast$technology, const \mbox{\hyperlink{classHurricane_1_1Name}{Name}} \&name, const \mbox{\hyperlink{classHurricane_1_1BasicLayer_1_1Material}{Material}} \&material, unsigned gds2\+Layer, unsigned gds2\+Datatype, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&minimal\+Size=0, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&minimal\+Spacing=0) +static \mbox{\hyperlink{classHurricane_1_1BasicLayer}{Basic\+Layer}} $\ast$ \mbox{\hyperlink{classHurricane_1_1BasicLayer_aecdcb9bef9b3c1c2bcb6d4513e1ca657}{create}} (\mbox{\hyperlink{classHurricane_1_1Technology}{Technology}} $\ast$technology, const \mbox{\hyperlink{classHurricane_1_1Name}{Name}} \&name, const \mbox{\hyperlink{classHurricane_1_1BasicLayer_1_1Material}{Material}} \&material, unsigned gds2\+Layer=0, unsigned gds2\+Datatype=0, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&minimal\+Size=0, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&minimal\+Spacing=0) \end{DoxyCompactItemize} \subsection*{Additional Inherited Members} @@ -46,11 +46,11 @@ For a more complete description of the Layers object, please refer to \mbox{\hyp For purpose of Basic\+Layers, also see \mbox{\hyperlink{classHurricane_1_1BasicLayer_1_1Material}{Basic\+Layer\+::\+Material}}. \subsection{Member Function Documentation} -\mbox{\Hypertarget{classHurricane_1_1BasicLayer_a76ccb64abaaf9c834c8ee8f010d5d24f}\label{classHurricane_1_1BasicLayer_a76ccb64abaaf9c834c8ee8f010d5d24f}} +\mbox{\Hypertarget{classHurricane_1_1BasicLayer_aecdcb9bef9b3c1c2bcb6d4513e1ca657}\label{classHurricane_1_1BasicLayer_aecdcb9bef9b3c1c2bcb6d4513e1ca657}} \index{Hurricane\+::\+Basic\+Layer@{Hurricane\+::\+Basic\+Layer}!create@{create}} \index{create@{create}!Hurricane\+::\+Basic\+Layer@{Hurricane\+::\+Basic\+Layer}} \subsubsection{\texorpdfstring{create()}{create()}} -{\footnotesize\ttfamily \mbox{\hyperlink{classHurricane_1_1BasicLayer}{Basic\+Layer}} $\ast$ Hurricane\+::\+Basic\+Layer\+::create (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classHurricane_1_1Technology}{Technology}} $\ast$}]{technology, }\item[{const \mbox{\hyperlink{classHurricane_1_1Name}{Name}} \&}]{name, }\item[{const \mbox{\hyperlink{classHurricane_1_1BasicLayer_1_1Material}{Material}} \&}]{material, }\item[{unsigned}]{gds2\+Layer, }\item[{unsigned}]{gds2\+Datatype, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{minimal\+Size = {\ttfamily 0}, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{minimal\+Spacing = {\ttfamily 0} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} +{\footnotesize\ttfamily \mbox{\hyperlink{classHurricane_1_1BasicLayer}{Basic\+Layer}} $\ast$ Hurricane\+::\+Basic\+Layer\+::create (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classHurricane_1_1Technology}{Technology}} $\ast$}]{technology, }\item[{const \mbox{\hyperlink{classHurricane_1_1Name}{Name}} \&}]{name, }\item[{const \mbox{\hyperlink{classHurricane_1_1BasicLayer_1_1Material}{Material}} \&}]{material, }\item[{unsigned}]{gds2\+Layer = {\ttfamily 0}, }\item[{unsigned}]{gds2\+Datatype = {\ttfamily 0}, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{minimal\+Size = {\ttfamily 0}, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{minimal\+Spacing = {\ttfamily 0} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} creates and returns a new basic layer named {\ttfamily $<$name$>$}, of type {\ttfamily $<$material$>$} for the given technology (some geometrical characteristics can also be specified). diff --git a/hurricane/doc/hurricane/latex/classHurricane_1_1Cell.tex b/hurricane/doc/hurricane/latex/classHurricane_1_1Cell.tex index 6391c570..ba06131c 100644 --- a/hurricane/doc/hurricane/latex/classHurricane_1_1Cell.tex +++ b/hurricane/doc/hurricane/latex/classHurricane_1_1Cell.tex @@ -29,7 +29,7 @@ const \mbox{\hyperlink{classHurricane_1_1Name}{Name}} \& \mbox{\hyperlink{classH \item \mbox{\hyperlink{namespaceHurricane_ac9436b03a2926f34ad6863deae2baadc}{Instances}} \mbox{\hyperlink{classHurricane_1_1Cell_a7e51bee5db73dd44f788e591a5c175c8}{get\+Slave\+Instances}} () const \item -\mbox{\hyperlink{classHurricane_1_1Net}{Net}} $\ast$ \mbox{\hyperlink{classHurricane_1_1Cell_a63cb19881279b5af0a4e7dae707ef1bd}{get\+Net}} (const \mbox{\hyperlink{classHurricane_1_1Name}{Name}} \&name) const +\mbox{\hyperlink{classHurricane_1_1Net}{Net}} $\ast$ \mbox{\hyperlink{classHurricane_1_1Cell_a70f06abd224895aeeeeb042365dbf48a}{get\+Net}} (const \mbox{\hyperlink{classHurricane_1_1Name}{Name}} \&name, bool use\+Alias=true) const \item \mbox{\hyperlink{namespaceHurricane_a3404a8b17130a1824f4a281704b04df7}{Nets}} \mbox{\hyperlink{classHurricane_1_1Cell_a8b4728abe83e9ec21d7bee1154218279}{get\+Nets}} () const \item @@ -57,7 +57,7 @@ const \mbox{\hyperlink{classHurricane_1_1Name}{Name}} \& \mbox{\hyperlink{classH \item \mbox{\hyperlink{namespaceHurricane_a1912927c128eee859af62dbe4cbe0a6b}{Occurrences}} \mbox{\hyperlink{classHurricane_1_1Cell_ab5bbab0a59106855d61deb94805e6115}{get\+Occurrences}} (unsigned search\+Depth=std\+::numeric\+\_\+limits$<$ unsigned int $>$\+::max()) const \item -\mbox{\hyperlink{namespaceHurricane_a1912927c128eee859af62dbe4cbe0a6b}{Occurrences}} \mbox{\hyperlink{classHurricane_1_1Cell_a7fb09c8e350923c47ce4c4407bdb00ce}{get\+Occurrences\+Under}} (const \mbox{\hyperlink{classHurricane_1_1Box}{Box}} \&area, unsigned search\+Depth=std\+::numeric\+\_\+limits$<$ unsigned int $>$\+::max()) const +\mbox{\hyperlink{namespaceHurricane_a1912927c128eee859af62dbe4cbe0a6b}{Occurrences}} \mbox{\hyperlink{classHurricane_1_1Cell_aee27efc0497992f811c9812ffa272a5a}{get\+Occurrences\+Under}} (const \mbox{\hyperlink{classHurricane_1_1Box}{Box}} \&area, unsigned search\+Depth=std\+::numeric\+\_\+limits$<$ unsigned int $>$\+::max(), \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} threshold=0) const \item \mbox{\hyperlink{namespaceHurricane_a1912927c128eee859af62dbe4cbe0a6b}{Occurrences}} \mbox{\hyperlink{classHurricane_1_1Cell_a30b71d9a35ff4e0b59b98ef515f26fc0}{get\+Terminal\+Instance\+Occurrences}} () const \item @@ -83,7 +83,7 @@ void \mbox{\hyperlink{classHurricane_1_1Cell_ad2c9face922062664110c66ee205eab2}{ \item void \mbox{\hyperlink{classHurricane_1_1Cell_ab1949e2b708f0bd2d215ab90cfe864e0}{set\+Abutment\+Box}} (const \mbox{\hyperlink{classHurricane_1_1Box}{Box}} \&abutment\+Box) \item -void \mbox{\hyperlink{classHurricane_1_1Cell_a15958b25e911e8f5543557b6deea5618}{set\+Terminal\+Netlist}} (bool \mbox{\hyperlink{classHurricane_1_1Cell_a6fe2b5a80d4b344733416b25ea559497}{is\+Terminal\+Netlist}}) +void \mbox{\hyperlink{classHurricane_1_1Cell_a47ce34631bb9f6862caa13e5b25a4d8f}{set\+Terminal\+Netlist}} (bool state) \item void \mbox{\hyperlink{classHurricane_1_1Cell_affefc597317063857f4904d4b16d5d4f}{materialize}} () \item @@ -169,11 +169,11 @@ Returns the collection of all instances of the \mbox{\hyperlink{classHurricane_1 \subsubsection{\texorpdfstring{get\+Slave\+Instances()}{getSlaveInstances()}} {\footnotesize\ttfamily \mbox{\hyperlink{namespaceHurricane_ac9436b03a2926f34ad6863deae2baadc}{Instances}} Hurricane\+::\+Cell\+::get\+Slave\+Instances (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} -Returns the \mbox{\hyperlink{classHurricane_1_1Collection}{Collection}} of instances whose master is this \mbox{\hyperlink{classHurricane_1_1Cell}{Cell}}. \mbox{\Hypertarget{classHurricane_1_1Cell_a63cb19881279b5af0a4e7dae707ef1bd}\label{classHurricane_1_1Cell_a63cb19881279b5af0a4e7dae707ef1bd}} +Returns the \mbox{\hyperlink{classHurricane_1_1Collection}{Collection}} of instances whose master is this \mbox{\hyperlink{classHurricane_1_1Cell}{Cell}}. \mbox{\Hypertarget{classHurricane_1_1Cell_a70f06abd224895aeeeeb042365dbf48a}\label{classHurricane_1_1Cell_a70f06abd224895aeeeeb042365dbf48a}} \index{Hurricane\+::\+Cell@{Hurricane\+::\+Cell}!get\+Net@{get\+Net}} \index{get\+Net@{get\+Net}!Hurricane\+::\+Cell@{Hurricane\+::\+Cell}} \subsubsection{\texorpdfstring{get\+Net()}{getNet()}} -{\footnotesize\ttfamily \mbox{\hyperlink{classHurricane_1_1Net}{Net}} $\ast$ Hurricane\+::\+Cell\+::get\+Net (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classHurricane_1_1Name}{Name}} \&}]{name }\end{DoxyParamCaption}) const} +{\footnotesize\ttfamily \mbox{\hyperlink{classHurricane_1_1Net}{Net}} $\ast$ Hurricane\+::\+Cell\+::get\+Net (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classHurricane_1_1Name}{Name}} \&}]{name, }\item[{bool}]{use\+Alias = {\ttfamily true} }\end{DoxyParamCaption}) const} Returns the \mbox{\hyperlink{classHurricane_1_1Net}{Net}} of name {\itshape name} if it exists, else {\ttfamily N\+U\+LL}. \mbox{\Hypertarget{classHurricane_1_1Cell_a8b4728abe83e9ec21d7bee1154218279}\label{classHurricane_1_1Cell_a8b4728abe83e9ec21d7bee1154218279}} \index{Hurricane\+::\+Cell@{Hurricane\+::\+Cell}!get\+Nets@{get\+Nets}} @@ -268,11 +268,11 @@ Returns the \mbox{\hyperlink{classHurricane_1_1Collection}{Collection}} of all O \begin{DoxyRemark}{Remarks} The search depth is decremented each time a hirearchical level is crossed. The search ends when depth becomes null (the value {\ttfamily I\+N\+F\+I\+N\+I\+TE} is equal to {\ttfamily }(unsigned)-\/1) . \end{DoxyRemark} -\mbox{\Hypertarget{classHurricane_1_1Cell_a7fb09c8e350923c47ce4c4407bdb00ce}\label{classHurricane_1_1Cell_a7fb09c8e350923c47ce4c4407bdb00ce}} +\mbox{\Hypertarget{classHurricane_1_1Cell_aee27efc0497992f811c9812ffa272a5a}\label{classHurricane_1_1Cell_aee27efc0497992f811c9812ffa272a5a}} \index{Hurricane\+::\+Cell@{Hurricane\+::\+Cell}!get\+Occurrences\+Under@{get\+Occurrences\+Under}} \index{get\+Occurrences\+Under@{get\+Occurrences\+Under}!Hurricane\+::\+Cell@{Hurricane\+::\+Cell}} \subsubsection{\texorpdfstring{get\+Occurrences\+Under()}{getOccurrencesUnder()}} -{\footnotesize\ttfamily \mbox{\hyperlink{namespaceHurricane_a1912927c128eee859af62dbe4cbe0a6b}{Occurrences}} Hurricane\+::\+Cell\+::get\+Occurrences\+Under (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classHurricane_1_1Box}{Box}} \&}]{area, }\item[{unsigned}]{search\+Depth = {\ttfamily std\+:\+:numeric\+\_\+limits$<$unsigned~int$>$\+:\+:max()} }\end{DoxyParamCaption}) const} +{\footnotesize\ttfamily \mbox{\hyperlink{namespaceHurricane_a1912927c128eee859af62dbe4cbe0a6b}{Occurrences}} Hurricane\+::\+Cell\+::get\+Occurrences\+Under (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classHurricane_1_1Box}{Box}} \&}]{area, }\item[{unsigned}]{search\+Depth = {\ttfamily std\+:\+:numeric\+\_\+limits$<$unsigned~int$>$\+:\+:max()}, }\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{threshold = {\ttfamily 0} }\end{DoxyParamCaption}) const} Returns the \mbox{\hyperlink{classHurricane_1_1Collection}{Collection}} of all Occurrences belonging to this \mbox{\hyperlink{classHurricane_1_1Cell}{Cell}} and intersecting the given rectangular area. @@ -324,11 +324,7 @@ Returns {\bfseries true} if the cell contains no instances. This is a layout lea \subsubsection{\texorpdfstring{is\+Terminal\+Netlist()}{isTerminalNetlist()}} {\footnotesize\ttfamily bool Hurricane\+::\+Cell\+::is\+Terminal\+Netlist (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} -Returns {\bfseries true} if the \mbox{\hyperlink{classHurricane_1_1Cell}{Cell}} is marked as terminal for the {\itshape netlist} hierarchy. A terminal {\itshape netlist} cell may, however contains further level of physical (layout) instances. This is a state that can be set or unset. - -Referenced by set\+Terminal\+Netlist(). - -\mbox{\Hypertarget{classHurricane_1_1Cell_a6c2f2fd9f6f6e0578937a90c0c37a507}\label{classHurricane_1_1Cell_a6c2f2fd9f6f6e0578937a90c0c37a507}} +Returns {\bfseries true} if the \mbox{\hyperlink{classHurricane_1_1Cell}{Cell}} is marked as terminal for the {\itshape netlist} hierarchy. A terminal {\itshape netlist} cell may, however contains further level of physical (layout) instances. This is a state that can be set or unset. \mbox{\Hypertarget{classHurricane_1_1Cell_a6c2f2fd9f6f6e0578937a90c0c37a507}\label{classHurricane_1_1Cell_a6c2f2fd9f6f6e0578937a90c0c37a507}} \index{Hurricane\+::\+Cell@{Hurricane\+::\+Cell}!is\+Unique@{is\+Unique}} \index{is\+Unique@{is\+Unique}!Hurricane\+::\+Cell@{Hurricane\+::\+Cell}} \subsubsection{\texorpdfstring{is\+Unique()}{isUnique()}} @@ -368,17 +364,13 @@ sets \mbox{\hyperlink{classHurricane_1_1Cell}{Cell}} abutment box. \begin{DoxyRemark}{Remarks} At the \mbox{\hyperlink{classHurricane_1_1Cell}{Cell}} creation the abutment box is empty. This one must be set through this function. It is possible also, once fixed, to reset it to empty (undefined) by passing an empty \mbox{\hyperlink{classHurricane_1_1Box}{Box}} as argument. \end{DoxyRemark} -\mbox{\Hypertarget{classHurricane_1_1Cell_a15958b25e911e8f5543557b6deea5618}\label{classHurricane_1_1Cell_a15958b25e911e8f5543557b6deea5618}} +\mbox{\Hypertarget{classHurricane_1_1Cell_a47ce34631bb9f6862caa13e5b25a4d8f}\label{classHurricane_1_1Cell_a47ce34631bb9f6862caa13e5b25a4d8f}} \index{Hurricane\+::\+Cell@{Hurricane\+::\+Cell}!set\+Terminal\+Netlist@{set\+Terminal\+Netlist}} \index{set\+Terminal\+Netlist@{set\+Terminal\+Netlist}!Hurricane\+::\+Cell@{Hurricane\+::\+Cell}} \subsubsection{\texorpdfstring{set\+Terminal\+Netlist()}{setTerminalNetlist()}} {\footnotesize\ttfamily void Hurricane\+::\+Cell\+::set\+Terminal\+Netlist (\begin{DoxyParamCaption}\item[{bool}]{state }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} -sets \mbox{\hyperlink{classHurricane_1_1Cell}{Cell}} {\itshape netlist} terminal status to {\itshape state}. - -References is\+Terminal\+Netlist(). - -\mbox{\Hypertarget{classHurricane_1_1Cell_affefc597317063857f4904d4b16d5d4f}\label{classHurricane_1_1Cell_affefc597317063857f4904d4b16d5d4f}} +sets \mbox{\hyperlink{classHurricane_1_1Cell}{Cell}} {\itshape netlist} terminal status to {\itshape state}. \mbox{\Hypertarget{classHurricane_1_1Cell_affefc597317063857f4904d4b16d5d4f}\label{classHurricane_1_1Cell_affefc597317063857f4904d4b16d5d4f}} \index{Hurricane\+::\+Cell@{Hurricane\+::\+Cell}!materialize@{materialize}} \index{materialize@{materialize}!Hurricane\+::\+Cell@{Hurricane\+::\+Cell}} \subsubsection{\texorpdfstring{materialize()}{materialize()}} diff --git a/hurricane/doc/hurricane/latex/classHurricane_1_1Contact.tex b/hurricane/doc/hurricane/latex/classHurricane_1_1Contact.tex index 8fa445a2..3cb33d43 100644 --- a/hurricane/doc/hurricane/latex/classHurricane_1_1Contact.tex +++ b/hurricane/doc/hurricane/latex/classHurricane_1_1Contact.tex @@ -31,46 +31,46 @@ typedef \mbox{\hyperlink{classHurricane_1_1Component}{Component}} \mbox{\hyperli \item \mbox{\hyperlink{classHurricane_1_1Component}{Component}} $\ast$ \mbox{\hyperlink{classHurricane_1_1Contact_ab0b327b306bf7ebda634f59d8d0cfd8f}{get\+Anchor}} () const \item -const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \& \mbox{\hyperlink{classHurricane_1_1Contact_acf8405f74b97239ea74ec629d0b4e194}{get\+Dx}} () const +\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \mbox{\hyperlink{classHurricane_1_1Contact_a8a5c4475668b6c6730ed5265e5447553}{get\+Dx}} () const \item -const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \& \mbox{\hyperlink{classHurricane_1_1Contact_aa7bc32ab9211fd5f6ad3aacdf1214f20}{get\+Dy}} () const +\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \mbox{\hyperlink{classHurricane_1_1Contact_af674c59fcaf1f5214d54a558fe30e41a}{get\+Dy}} () const \item -const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \& \mbox{\hyperlink{classHurricane_1_1Contact_a28bd18de9ca6e5cf2b77fce5e22af43a}{get\+Width}} () const +\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \mbox{\hyperlink{classHurricane_1_1Contact_a794ce7c3aa5ffe894c1231f7c5ac3c52}{get\+Width}} () const \item \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \mbox{\hyperlink{classHurricane_1_1Contact_a4a5136f4e8299435e50db7da28172ca1}{get\+Half\+Width}} () const \item -const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \& \mbox{\hyperlink{classHurricane_1_1Contact_adf6487485a4f48bd15aa6f9a8ac5fd27}{get\+Height}} () const +\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \mbox{\hyperlink{classHurricane_1_1Contact_a07a4ecc7ea2479e2d63f5f31d9325dde}{get\+Height}} () const \item \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \mbox{\hyperlink{classHurricane_1_1Contact_aebd3ff8e1368617ab750b20ae9ffb59b}{get\+Half\+Height}} () const \item -void \mbox{\hyperlink{classHurricane_1_1Contact_a147644849f33bc4d58b6b997543c8306}{set\+Layer}} (const \mbox{\hyperlink{classHurricane_1_1Layer}{Layer}} $\ast$layer) +void \mbox{\hyperlink{classHurricane_1_1Contact_aec627634d5b6cfc5079a02b1b518b50e}{set\+Layer}} (const \mbox{\hyperlink{classHurricane_1_1Layer}{Layer}} $\ast$) \item -void \mbox{\hyperlink{classHurricane_1_1Contact_aae6d5c96862fd6c834ff4abd61edc86f}{set\+Width}} (const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&width) +void \mbox{\hyperlink{classHurricane_1_1Contact_a08d14ce6cdf3696e472f4a621b936afe}{set\+Width}} (\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}) \item -void \mbox{\hyperlink{classHurricane_1_1Contact_a2fc2e7c85dc5495810544c48bb604712}{set\+Height}} (const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&height) +void \mbox{\hyperlink{classHurricane_1_1Contact_a6480b6a75cc098d3227f27080a2cb42b}{set\+Height}} (\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}) \item -void \mbox{\hyperlink{classHurricane_1_1Contact_aa18aa1e78eba9f4c10ece0e20683faf5}{set\+Sizes}} (const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&width, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&height) +void \mbox{\hyperlink{classHurricane_1_1Contact_a1bded13596d448c6bb9c93271fffe5fd}{set\+Sizes}} (\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} width, \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} height) \item -void \mbox{\hyperlink{classHurricane_1_1Contact_a181436f128b65467e1ab94ffcb0c345b}{setX}} (const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&x) +void \mbox{\hyperlink{classHurricane_1_1Contact_a5b2338675993259feabb641fd9a1996e}{setX}} (\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}) \item -void \mbox{\hyperlink{classHurricane_1_1Contact_a455b8925aae10157c9143b58a3a52e57}{setY}} (const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&y) +void \mbox{\hyperlink{classHurricane_1_1Contact_a232a49a5dd180e9ff8dfb2bd2a67f2cd}{setY}} (\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}) \item -void \mbox{\hyperlink{classHurricane_1_1Contact_afac88ee8442e3e943a24bb526057851a}{set\+Position}} (const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&x, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&y) +void \mbox{\hyperlink{classHurricane_1_1Contact_ae44d4d7655428705f13dca34c7167690}{set\+Position}} (\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} x, \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} y) \item -void \mbox{\hyperlink{classHurricane_1_1Contact_ad3ff25d47d1c00c53bb07bb0ff4067f1}{set\+Position}} (const \mbox{\hyperlink{classHurricane_1_1Point}{Point}} \&position) +void \mbox{\hyperlink{classHurricane_1_1Contact_aedcc63fe54538939c03fe81a16b0bae0}{set\+Position}} (const \mbox{\hyperlink{classHurricane_1_1Point}{Point}} \&) \item -void \mbox{\hyperlink{classHurricane_1_1Contact_a6ee60b9d228fe5487bf73dc396b94706}{set\+Dx}} (const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&dx) +void \mbox{\hyperlink{classHurricane_1_1Contact_a82f29c6b48b0c5a51fe3c1678d71876c}{set\+Dx}} (\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}) \item -void \mbox{\hyperlink{classHurricane_1_1Contact_a32ee96c21115ee9d197bc505fd48e37d}{set\+Dy}} (const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&dy) +void \mbox{\hyperlink{classHurricane_1_1Contact_ac5dadc06ae38c1ff287f031864f58850}{set\+Dy}} (\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}) \item -void \mbox{\hyperlink{classHurricane_1_1Contact_a41ba972136e77d768f58ad0407d18f8e}{set\+Offset}} (const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&dx, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&dy) +void \mbox{\hyperlink{classHurricane_1_1Contact_a5c8cb75debcbe10aedc092e2089a975c}{set\+Offset}} (\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} dx, \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} dy) \end{DoxyCompactItemize} \subsection*{Static Public Member Functions} \begin{DoxyCompactItemize} \item -static \mbox{\hyperlink{classHurricane_1_1Contact}{Contact}} $\ast$ \mbox{\hyperlink{classHurricane_1_1Contact_a5402fec0518c81d35fbec2c2b2ec0f8f}{create}} (\mbox{\hyperlink{classHurricane_1_1Net}{Net}} $\ast$net, const \mbox{\hyperlink{classHurricane_1_1Layer}{Layer}} $\ast$layer, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&x, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&y, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&width=0, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&height=0) +static \mbox{\hyperlink{classHurricane_1_1Contact}{Contact}} $\ast$ \mbox{\hyperlink{classHurricane_1_1Contact_ab66989c2dce4d398f1f7647aca50d983}{create}} (\mbox{\hyperlink{classHurricane_1_1Net}{Net}} $\ast$net, const \mbox{\hyperlink{classHurricane_1_1Layer}{Layer}} $\ast$layer, \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} x, \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} y, \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} width=0, \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} height=0) \item -static \mbox{\hyperlink{classHurricane_1_1Contact}{Contact}} $\ast$ \mbox{\hyperlink{classHurricane_1_1Contact_a6645345f819cb4769fac075a0b1ea028}{create}} (\mbox{\hyperlink{classHurricane_1_1Component}{Component}} $\ast$anchor, const \mbox{\hyperlink{classHurricane_1_1Layer}{Layer}} $\ast$layer, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&dx, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&dy, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&width=0, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&height=0) +static \mbox{\hyperlink{classHurricane_1_1Contact}{Contact}} $\ast$ \mbox{\hyperlink{classHurricane_1_1Contact_a2e555edb8984b599c391f16db105c1f5}{create}} (\mbox{\hyperlink{classHurricane_1_1Component}{Component}} $\ast$anchor, const \mbox{\hyperlink{classHurricane_1_1Layer}{Layer}} $\ast$layer, \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} dx, \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} dy, \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} width=0, \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} height=0) \end{DoxyCompactItemize} @@ -90,22 +90,22 @@ Contacts are objects representing contact points within a net. A contact may hav Useful for calling upon methods of the base class without knowing it. \subsection{Member Function Documentation} -\mbox{\Hypertarget{classHurricane_1_1Contact_a5402fec0518c81d35fbec2c2b2ec0f8f}\label{classHurricane_1_1Contact_a5402fec0518c81d35fbec2c2b2ec0f8f}} +\mbox{\Hypertarget{classHurricane_1_1Contact_ab66989c2dce4d398f1f7647aca50d983}\label{classHurricane_1_1Contact_ab66989c2dce4d398f1f7647aca50d983}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!create@{create}} \index{create@{create}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{create()}{create()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} -{\footnotesize\ttfamily \mbox{\hyperlink{classHurricane_1_1Contact}{Contact}} $\ast$ Hurricane\+::\+Contact\+::create (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classHurricane_1_1Net}{Net}} $\ast$}]{net, }\item[{const \mbox{\hyperlink{classHurricane_1_1Layer}{Layer}} $\ast$}]{layer, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{x, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{y, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{width = {\ttfamily 0}, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{height = {\ttfamily 0} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} +{\footnotesize\ttfamily \mbox{\hyperlink{classHurricane_1_1Contact}{Contact}} $\ast$ Hurricane\+::\+Contact\+::create (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classHurricane_1_1Net}{Net}} $\ast$}]{net, }\item[{const \mbox{\hyperlink{classHurricane_1_1Layer}{Layer}} $\ast$}]{layer, }\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{x, }\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{y, }\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{width = {\ttfamily 0}, }\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{height = {\ttfamily 0} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} creates and returns a new contact belonging to the net {\ttfamily $<$net$>$}, on the layer {\ttfamily $<$layer$>$}, of size {\ttfamily $<$width$>$} and {\ttfamily $<$height$>$} and located at the absolute coordinates {\ttfamily $<$x$>$} and {\ttfamily $<$y$>$}. \begin{DoxyParagraph}{Caution\+: Throws an exception if the layer or the net is null. } \end{DoxyParagraph} -\mbox{\Hypertarget{classHurricane_1_1Contact_a6645345f819cb4769fac075a0b1ea028}\label{classHurricane_1_1Contact_a6645345f819cb4769fac075a0b1ea028}} +\mbox{\Hypertarget{classHurricane_1_1Contact_a2e555edb8984b599c391f16db105c1f5}\label{classHurricane_1_1Contact_a2e555edb8984b599c391f16db105c1f5}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!create@{create}} \index{create@{create}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{create()}{create()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} -{\footnotesize\ttfamily \mbox{\hyperlink{classHurricane_1_1Contact}{Contact}} $\ast$ Hurricane\+::\+Contact\+::create (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classHurricane_1_1Component}{Component}} $\ast$}]{anchor, }\item[{const \mbox{\hyperlink{classHurricane_1_1Layer}{Layer}} $\ast$}]{layer, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{dx, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{dy, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{width = {\ttfamily 0}, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{height = {\ttfamily 0} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} +{\footnotesize\ttfamily \mbox{\hyperlink{classHurricane_1_1Contact}{Contact}} $\ast$ Hurricane\+::\+Contact\+::create (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{classHurricane_1_1Component}{Component}} $\ast$}]{anchor, }\item[{const \mbox{\hyperlink{classHurricane_1_1Layer}{Layer}} $\ast$}]{layer, }\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{dx, }\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{dy, }\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{width = {\ttfamily 0}, }\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{height = {\ttfamily 0} }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [static]}} creates and returns a new contact on the layer {\ttfamily $<$layer$>$}, of size {\ttfamily $<$width$>$} and {\ttfamily $<$height$>$} attached upon the component {\ttfamily $<$anchor$>$} through an offset defined by {\ttfamily $<$dx$>$} et {\ttfamily $<$dy$>$}. @@ -127,33 +127,33 @@ The new contact belongs to the anchor\textquotesingle{}s net. \subsubsection{\texorpdfstring{get\+Anchor()}{getAnchor()}} {\footnotesize\ttfamily \mbox{\hyperlink{classHurricane_1_1Component}{Component}} $\ast$ Hurricane\+::\+Contact\+::get\+Anchor (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const} -The anchor hook of the contact being a slave one, it may have a master hook representing the body of the anchor on which it is attached. This method returns the owner of this master hook if it exists else N\+U\+LL (either the contact is an absolute one (its anchor hook is not inserted in a ring) or this ring doesn\textquotesingle{}t contain a master hook (lowly probable, transitory)). \mbox{\Hypertarget{classHurricane_1_1Contact_acf8405f74b97239ea74ec629d0b4e194}\label{classHurricane_1_1Contact_acf8405f74b97239ea74ec629d0b4e194}} +The anchor hook of the contact being a slave one, it may have a master hook representing the body of the anchor on which it is attached. This method returns the owner of this master hook if it exists else N\+U\+LL (either the contact is an absolute one (its anchor hook is not inserted in a ring) or this ring doesn\textquotesingle{}t contain a master hook (lowly probable, transitory)). \mbox{\Hypertarget{classHurricane_1_1Contact_a8a5c4475668b6c6730ed5265e5447553}\label{classHurricane_1_1Contact_a8a5c4475668b6c6730ed5265e5447553}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!get\+Dx@{get\+Dx}} \index{get\+Dx@{get\+Dx}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{get\+Dx()}{getDx()}} -{\footnotesize\ttfamily const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \& Hurricane\+::\+Contact\+::get\+Dx (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} +{\footnotesize\ttfamily \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} Hurricane\+::\+Contact\+::get\+Dx (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} {\bfseries Returns\+:} the relative abscissa of the contact. \begin{DoxyRemark}{Remarks} If you want to get the absolute one use the member function get\+X() defined at the \mbox{\hyperlink{classHurricane_1_1Component}{Component}} level. \end{DoxyRemark} -\mbox{\Hypertarget{classHurricane_1_1Contact_aa7bc32ab9211fd5f6ad3aacdf1214f20}\label{classHurricane_1_1Contact_aa7bc32ab9211fd5f6ad3aacdf1214f20}} +\mbox{\Hypertarget{classHurricane_1_1Contact_af674c59fcaf1f5214d54a558fe30e41a}\label{classHurricane_1_1Contact_af674c59fcaf1f5214d54a558fe30e41a}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!get\+Dy@{get\+Dy}} \index{get\+Dy@{get\+Dy}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{get\+Dy()}{getDy()}} -{\footnotesize\ttfamily const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \& Hurricane\+::\+Contact\+::get\+Dy (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} +{\footnotesize\ttfamily \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} Hurricane\+::\+Contact\+::get\+Dy (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} {\bfseries Returns\+:} the relative ordinate of the contact. \begin{DoxyRemark}{Remarks} If you want to get the absolute one use the member function get\+Y() defined at the \mbox{\hyperlink{classHurricane_1_1Component}{Component}} level. \end{DoxyRemark} -\mbox{\Hypertarget{classHurricane_1_1Contact_a28bd18de9ca6e5cf2b77fce5e22af43a}\label{classHurricane_1_1Contact_a28bd18de9ca6e5cf2b77fce5e22af43a}} +\mbox{\Hypertarget{classHurricane_1_1Contact_a794ce7c3aa5ffe894c1231f7c5ac3c52}\label{classHurricane_1_1Contact_a794ce7c3aa5ffe894c1231f7c5ac3c52}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!get\+Width@{get\+Width}} \index{get\+Width@{get\+Width}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{get\+Width()}{getWidth()}} -{\footnotesize\ttfamily const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \& Hurricane\+::\+Contact\+::get\+Width (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} +{\footnotesize\ttfamily \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} Hurricane\+::\+Contact\+::get\+Width (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} {\bfseries Returns\+:} the contact width. \mbox{\Hypertarget{classHurricane_1_1Contact_a4a5136f4e8299435e50db7da28172ca1}\label{classHurricane_1_1Contact_a4a5136f4e8299435e50db7da28172ca1}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!get\+Half\+Width@{get\+Half\+Width}} @@ -161,11 +161,11 @@ If you want to get the absolute one use the member function get\+Y() defined at \subsubsection{\texorpdfstring{get\+Half\+Width()}{getHalfWidth()}} {\footnotesize\ttfamily \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} Hurricane\+::\+Contact\+::get\+Half\+Width (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} -{\bfseries Returns\+:} the contact half width. \mbox{\Hypertarget{classHurricane_1_1Contact_adf6487485a4f48bd15aa6f9a8ac5fd27}\label{classHurricane_1_1Contact_adf6487485a4f48bd15aa6f9a8ac5fd27}} +{\bfseries Returns\+:} the contact half width. \mbox{\Hypertarget{classHurricane_1_1Contact_a07a4ecc7ea2479e2d63f5f31d9325dde}\label{classHurricane_1_1Contact_a07a4ecc7ea2479e2d63f5f31d9325dde}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!get\+Height@{get\+Height}} \index{get\+Height@{get\+Height}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{get\+Height()}{getHeight()}} -{\footnotesize\ttfamily const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \& Hurricane\+::\+Contact\+::get\+Height (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} +{\footnotesize\ttfamily \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} Hurricane\+::\+Contact\+::get\+Height (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} {\bfseries Returns\+:} the contact height. \mbox{\Hypertarget{classHurricane_1_1Contact_aebd3ff8e1368617ab750b20ae9ffb59b}\label{classHurricane_1_1Contact_aebd3ff8e1368617ab750b20ae9ffb59b}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!get\+Half\+Height@{get\+Half\+Height}} @@ -173,81 +173,81 @@ If you want to get the absolute one use the member function get\+Y() defined at \subsubsection{\texorpdfstring{get\+Half\+Height()}{getHalfHeight()}} {\footnotesize\ttfamily \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} Hurricane\+::\+Contact\+::get\+Half\+Height (\begin{DoxyParamCaption}{ }\end{DoxyParamCaption}) const\hspace{0.3cm}{\ttfamily [inline]}} -{\bfseries Returns\+:} the contact half height. \mbox{\Hypertarget{classHurricane_1_1Contact_a147644849f33bc4d58b6b997543c8306}\label{classHurricane_1_1Contact_a147644849f33bc4d58b6b997543c8306}} +{\bfseries Returns\+:} the contact half height. \mbox{\Hypertarget{classHurricane_1_1Contact_aec627634d5b6cfc5079a02b1b518b50e}\label{classHurricane_1_1Contact_aec627634d5b6cfc5079a02b1b518b50e}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!set\+Layer@{set\+Layer}} \index{set\+Layer@{set\+Layer}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{set\+Layer()}{setLayer()}} {\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Layer (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classHurricane_1_1Layer}{Layer}} $\ast$}]{layer }\end{DoxyParamCaption})} -sets the contact layer. \mbox{\Hypertarget{classHurricane_1_1Contact_aae6d5c96862fd6c834ff4abd61edc86f}\label{classHurricane_1_1Contact_aae6d5c96862fd6c834ff4abd61edc86f}} +sets the contact layer. \mbox{\Hypertarget{classHurricane_1_1Contact_a08d14ce6cdf3696e472f4a621b936afe}\label{classHurricane_1_1Contact_a08d14ce6cdf3696e472f4a621b936afe}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!set\+Width@{set\+Width}} \index{set\+Width@{set\+Width}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{set\+Width()}{setWidth()}} -{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Width (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{width }\end{DoxyParamCaption})} +{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Width (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{width }\end{DoxyParamCaption})} -sets the contact width. \mbox{\Hypertarget{classHurricane_1_1Contact_a2fc2e7c85dc5495810544c48bb604712}\label{classHurricane_1_1Contact_a2fc2e7c85dc5495810544c48bb604712}} +sets the contact width. \mbox{\Hypertarget{classHurricane_1_1Contact_a6480b6a75cc098d3227f27080a2cb42b}\label{classHurricane_1_1Contact_a6480b6a75cc098d3227f27080a2cb42b}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!set\+Height@{set\+Height}} \index{set\+Height@{set\+Height}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{set\+Height()}{setHeight()}} -{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Height (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{height }\end{DoxyParamCaption})} +{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Height (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{height }\end{DoxyParamCaption})} -sets the contact height. \mbox{\Hypertarget{classHurricane_1_1Contact_aa18aa1e78eba9f4c10ece0e20683faf5}\label{classHurricane_1_1Contact_aa18aa1e78eba9f4c10ece0e20683faf5}} +sets the contact height. \mbox{\Hypertarget{classHurricane_1_1Contact_a1bded13596d448c6bb9c93271fffe5fd}\label{classHurricane_1_1Contact_a1bded13596d448c6bb9c93271fffe5fd}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!set\+Sizes@{set\+Sizes}} \index{set\+Sizes@{set\+Sizes}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{set\+Sizes()}{setSizes()}} -{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Sizes (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{width, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{height }\end{DoxyParamCaption})} +{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Sizes (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{width, }\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{height }\end{DoxyParamCaption})} -sets both contact width and height. \mbox{\Hypertarget{classHurricane_1_1Contact_a181436f128b65467e1ab94ffcb0c345b}\label{classHurricane_1_1Contact_a181436f128b65467e1ab94ffcb0c345b}} +sets both contact width and height. \mbox{\Hypertarget{classHurricane_1_1Contact_a5b2338675993259feabb641fd9a1996e}\label{classHurricane_1_1Contact_a5b2338675993259feabb641fd9a1996e}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!setX@{setX}} \index{setX@{setX}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{set\+X()}{setX()}} -{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::setX (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{x }\end{DoxyParamCaption})} +{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::setX (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{x }\end{DoxyParamCaption})} -Allows to change the absolute abscissa of the contact (if it has a location relative to an other component, only relative position to this last is accordingly changed). \mbox{\Hypertarget{classHurricane_1_1Contact_a455b8925aae10157c9143b58a3a52e57}\label{classHurricane_1_1Contact_a455b8925aae10157c9143b58a3a52e57}} +Allows to change the absolute abscissa of the contact (if it has a location relative to an other component, only relative position to this last is accordingly changed). \mbox{\Hypertarget{classHurricane_1_1Contact_a232a49a5dd180e9ff8dfb2bd2a67f2cd}\label{classHurricane_1_1Contact_a232a49a5dd180e9ff8dfb2bd2a67f2cd}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!setY@{setY}} \index{setY@{setY}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{set\+Y()}{setY()}} -{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::setY (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{y }\end{DoxyParamCaption})} +{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::setY (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{y }\end{DoxyParamCaption})} -Allows to change the absolute ordinate of the contact (if it has a location relative to an other component, only relative position to this last is accordingly changed). \mbox{\Hypertarget{classHurricane_1_1Contact_afac88ee8442e3e943a24bb526057851a}\label{classHurricane_1_1Contact_afac88ee8442e3e943a24bb526057851a}} +Allows to change the absolute ordinate of the contact (if it has a location relative to an other component, only relative position to this last is accordingly changed). \mbox{\Hypertarget{classHurricane_1_1Contact_ae44d4d7655428705f13dca34c7167690}\label{classHurricane_1_1Contact_ae44d4d7655428705f13dca34c7167690}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!set\+Position@{set\+Position}} \index{set\+Position@{set\+Position}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{set\+Position()}{setPosition()}\hspace{0.1cm}{\footnotesize\ttfamily [1/2]}} -{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Position (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{x, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{y }\end{DoxyParamCaption})} +{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Position (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{x, }\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{y }\end{DoxyParamCaption})} -No description. \mbox{\Hypertarget{classHurricane_1_1Contact_ad3ff25d47d1c00c53bb07bb0ff4067f1}\label{classHurricane_1_1Contact_ad3ff25d47d1c00c53bb07bb0ff4067f1}} +No description. \mbox{\Hypertarget{classHurricane_1_1Contact_aedcc63fe54538939c03fe81a16b0bae0}\label{classHurricane_1_1Contact_aedcc63fe54538939c03fe81a16b0bae0}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!set\+Position@{set\+Position}} \index{set\+Position@{set\+Position}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{set\+Position()}{setPosition()}\hspace{0.1cm}{\footnotesize\ttfamily [2/2]}} {\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Position (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classHurricane_1_1Point}{Point}} \&}]{position }\end{DoxyParamCaption})} -Allows to change the absolute location of the contact (if it has a location relative to an other component, only relative position to this last is accordingly changed). \mbox{\Hypertarget{classHurricane_1_1Contact_a6ee60b9d228fe5487bf73dc396b94706}\label{classHurricane_1_1Contact_a6ee60b9d228fe5487bf73dc396b94706}} +Allows to change the absolute location of the contact (if it has a location relative to an other component, only relative position to this last is accordingly changed). \mbox{\Hypertarget{classHurricane_1_1Contact_a82f29c6b48b0c5a51fe3c1678d71876c}\label{classHurricane_1_1Contact_a82f29c6b48b0c5a51fe3c1678d71876c}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!set\+Dx@{set\+Dx}} \index{set\+Dx@{set\+Dx}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{set\+Dx()}{setDx()}} -{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Dx (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{dx }\end{DoxyParamCaption})} +{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Dx (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{dx }\end{DoxyParamCaption})} Allows to change the horizontal offset of the contact. \begin{DoxyRemark}{Remarks} If the contact is absolute, this amounts to change its absolute abscissa. \end{DoxyRemark} -\mbox{\Hypertarget{classHurricane_1_1Contact_a32ee96c21115ee9d197bc505fd48e37d}\label{classHurricane_1_1Contact_a32ee96c21115ee9d197bc505fd48e37d}} +\mbox{\Hypertarget{classHurricane_1_1Contact_ac5dadc06ae38c1ff287f031864f58850}\label{classHurricane_1_1Contact_ac5dadc06ae38c1ff287f031864f58850}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!set\+Dy@{set\+Dy}} \index{set\+Dy@{set\+Dy}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{set\+Dy()}{setDy()}} -{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Dy (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{dy }\end{DoxyParamCaption})} +{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Dy (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{dy }\end{DoxyParamCaption})} Allows to change the vertical offset of the contact. \begin{DoxyRemark}{Remarks} If the contact is absolute, this amounts to change its absolute ordinate. \end{DoxyRemark} -\mbox{\Hypertarget{classHurricane_1_1Contact_a41ba972136e77d768f58ad0407d18f8e}\label{classHurricane_1_1Contact_a41ba972136e77d768f58ad0407d18f8e}} +\mbox{\Hypertarget{classHurricane_1_1Contact_a5c8cb75debcbe10aedc092e2089a975c}\label{classHurricane_1_1Contact_a5c8cb75debcbe10aedc092e2089a975c}} \index{Hurricane\+::\+Contact@{Hurricane\+::\+Contact}!set\+Offset@{set\+Offset}} \index{set\+Offset@{set\+Offset}!Hurricane\+::\+Contact@{Hurricane\+::\+Contact}} \subsubsection{\texorpdfstring{set\+Offset()}{setOffset()}} -{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Offset (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{dx, }\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{dy }\end{DoxyParamCaption})} +{\footnotesize\ttfamily void Hurricane\+::\+Contact\+::set\+Offset (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{dx, }\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{dy }\end{DoxyParamCaption})} Allows to change the offset of the contact. diff --git a/hurricane/doc/hurricane/latex/classHurricane_1_1Go.tex b/hurricane/doc/hurricane/latex/classHurricane_1_1Go.tex index 90d8308c..ac16522d 100644 --- a/hurricane/doc/hurricane/latex/classHurricane_1_1Go.tex +++ b/hurricane/doc/hurricane/latex/classHurricane_1_1Go.tex @@ -198,7 +198,7 @@ An already dematerialized object must not be taken in count in the current updat \end{DoxyCode} \begin{DoxyCode} -\textcolor{keywordtype}{void} \mbox{\hyperlink{classHurricane_1_1Contact_a147644849f33bc4d58b6b997543c8306}{Contact::setLayer}} ( Layer* layer ) +\textcolor{keywordtype}{void} \mbox{\hyperlink{classHurricane_1_1Contact_aec627634d5b6cfc5079a02b1b518b50e}{Contact::setLayer}} ( Layer* layer ) \{ \textcolor{keywordflow}{if} (!layer) \textcolor{keywordflow}{throw} Error(\textcolor{stringliteral}{"Can't set layer : null layer"}); diff --git a/hurricane/doc/hurricane/latex/classHurricane_1_1Point.tex b/hurricane/doc/hurricane/latex/classHurricane_1_1Point.tex index 2c32fb0e..b60bd714 100644 --- a/hurricane/doc/hurricane/latex/classHurricane_1_1Point.tex +++ b/hurricane/doc/hurricane/latex/classHurricane_1_1Point.tex @@ -20,9 +20,9 @@ bool \mbox{\hyperlink{classHurricane_1_1Point_a2aeb5fe96fbe9324dcbc90d41ad70fb9} \item bool \mbox{\hyperlink{classHurricane_1_1Point_ac6a0b7107f04913b78f96afa69e68d86}{operator!=}} (const \mbox{\hyperlink{classHurricane_1_1Point}{Point}} \&point) const \item -void \mbox{\hyperlink{classHurricane_1_1Point_a713ba6d38358fc1820371f74647b4214}{setX}} (const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&x) +void \mbox{\hyperlink{classHurricane_1_1Point_adebab98c82f881b1d2e1e7680a907830}{setX}} (\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} x) \item -void \mbox{\hyperlink{classHurricane_1_1Point_a5b5c5811c3e354235142eacffc2d887e}{setY}} (const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&y) +void \mbox{\hyperlink{classHurricane_1_1Point_a14a51f177d298ccccb25066c0298a268}{setY}} (\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} y) \item \mbox{\hyperlink{classHurricane_1_1Point}{Point}} \& \mbox{\hyperlink{classHurricane_1_1Point_a86d908d60346bc15f1af4e96eddbdb19}{translate}} (const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&dx, const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&dy) \end{DoxyCompactItemize} @@ -71,17 +71,17 @@ Equality operator. \mbox{\Hypertarget{classHurricane_1_1Point_ac6a0b7107f04913b7 \subsubsection{\texorpdfstring{operator"!=()}{operator!=()}} {\footnotesize\ttfamily bool Hurricane\+::\+Point\+::operator!= (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{classHurricane_1_1Point}{Point}} \&}]{point }\end{DoxyParamCaption}) const} -Difference operator. \mbox{\Hypertarget{classHurricane_1_1Point_a713ba6d38358fc1820371f74647b4214}\label{classHurricane_1_1Point_a713ba6d38358fc1820371f74647b4214}} +Difference operator. \mbox{\Hypertarget{classHurricane_1_1Point_adebab98c82f881b1d2e1e7680a907830}\label{classHurricane_1_1Point_adebab98c82f881b1d2e1e7680a907830}} \index{Hurricane\+::\+Point@{Hurricane\+::\+Point}!setX@{setX}} \index{setX@{setX}!Hurricane\+::\+Point@{Hurricane\+::\+Point}} \subsubsection{\texorpdfstring{set\+X()}{setX()}} -{\footnotesize\ttfamily void Hurricane\+::\+Point\+::setX (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{x }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} +{\footnotesize\ttfamily void Hurricane\+::\+Point\+::setX (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{x }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} -Modifies point abscissa. \mbox{\Hypertarget{classHurricane_1_1Point_a5b5c5811c3e354235142eacffc2d887e}\label{classHurricane_1_1Point_a5b5c5811c3e354235142eacffc2d887e}} +Modifies point abscissa. \mbox{\Hypertarget{classHurricane_1_1Point_a14a51f177d298ccccb25066c0298a268}\label{classHurricane_1_1Point_a14a51f177d298ccccb25066c0298a268}} \index{Hurricane\+::\+Point@{Hurricane\+::\+Point}!setY@{setY}} \index{setY@{setY}!Hurricane\+::\+Point@{Hurricane\+::\+Point}} \subsubsection{\texorpdfstring{set\+Y()}{setY()}} -{\footnotesize\ttfamily void Hurricane\+::\+Point\+::setY (\begin{DoxyParamCaption}\item[{const \mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}} \&}]{y }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} +{\footnotesize\ttfamily void Hurricane\+::\+Point\+::setY (\begin{DoxyParamCaption}\item[{\mbox{\hyperlink{group__DbUGroup_ga4fbfa3e8c89347af76c9628ea06c4146}{Db\+U\+::\+Unit}}}]{y }\end{DoxyParamCaption})\hspace{0.3cm}{\ttfamily [inline]}} Modifies point ordinate. \mbox{\Hypertarget{classHurricane_1_1Point_a86d908d60346bc15f1af4e96eddbdb19}\label{classHurricane_1_1Point_a86d908d60346bc15f1af4e96eddbdb19}} \index{Hurricane\+::\+Point@{Hurricane\+::\+Point}!translate@{translate}} diff --git a/hurricane/doc/hurricane/latex/refman.tex b/hurricane/doc/hurricane/latex/refman.tex index 52adcda3..5c3c4667 100644 --- a/hurricane/doc/hurricane/latex/refman.tex +++ b/hurricane/doc/hurricane/latex/refman.tex @@ -34,7 +34,7 @@ \vspace*{1cm} {\large Generated by Doxygen 1.8.14}\\ \vspace*{0.5cm} - {\small Thu Nov 12 2020 13:58:48}\\ + {\small Fri Oct 1 2021 19:23:10}\\ \end{center} \end{titlepage} diff --git a/hurricane/doc/viewer/html/CellImage_8h_source.html b/hurricane/doc/viewer/html/CellImage_8h_source.html index 1c9c8a68..827811d7 100644 --- a/hurricane/doc/viewer/html/CellImage_8h_source.html +++ b/hurricane/doc/viewer/html/CellImage_8h_source.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/CellPrinter_8h_source.html b/hurricane/doc/viewer/html/CellPrinter_8h_source.html index 994e3c98..d5993198 100644 --- a/hurricane/doc/viewer/html/CellPrinter_8h_source.html +++ b/hurricane/doc/viewer/html/CellPrinter_8h_source.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/CellViewer_8h_source.html b/hurricane/doc/viewer/html/CellViewer_8h_source.html index 4102c188..0bd09bbf 100644 --- a/hurricane/doc/viewer/html/CellViewer_8h_source.html +++ b/hurricane/doc/viewer/html/CellViewer_8h_source.html @@ -72,7 +72,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/CellWidget_8h_source.html b/hurricane/doc/viewer/html/CellWidget_8h_source.html index 46fa168d..a08acc42 100644 --- a/hurricane/doc/viewer/html/CellWidget_8h_source.html +++ b/hurricane/doc/viewer/html/CellWidget_8h_source.html @@ -44,7 +44,7 @@ $(function() {
    CellWidget.h
    -
    1 // -*- C++ -*-
    2 //
    3 // This file is part of the Coriolis Software.
    4 // Copyright (c) UPMC/LIP6 2008-2018, All Rights Reserved
    5 //
    6 // +-----------------------------------------------------------------+
    7 // | C O R I O L I S |
    8 // | V L S I B a c k e n d D a t a - B a s e |
    9 // | |
    10 // | Author : Jean-Paul CHAPUT |
    11 // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
    12 // | =============================================================== |
    13 // | C++ Header : "./hurricane/viewer/CellWidget.h" |
    14 // +-----------------------------------------------------------------+
    15 
    16 
    17 #pragma once
    18 #include <math.h>
    19 #include <vector>
    20 #include <functional>
    21 #include <memory>
    22 #include <boost/function.hpp>
    23 #include <QWidget>
    24 #include <QPixmap>
    25 #include <QPainter>
    26 #include <QPrinter>
    27 #include <QImage>
    28 #include <QRect>
    29 #include <QPoint>
    30 class QCursor;
    31 class QShowEvent;
    32 class QResizeEvent;
    33 class QMouseEvent;
    34 class QKeyEvent;
    35 class QAction;
    36 
    37 #include "hurricane/Timer.h"
    38 #include "hurricane/Commons.h"
    39 #include "hurricane/Warning.h"
    40 #include "hurricane/Point.h"
    41 #include "hurricane/Box.h"
    42 #include "hurricane/Transformation.h"
    43 #include "hurricane/Query.h"
    44 #include "hurricane/viewer/DisplayStyle.h"
    45 #include "hurricane/viewer/CellWidgets.h"
    46 #include "hurricane/viewer/Selector.h"
    47 #include "hurricane/viewer/SelectorCriterion.h"
    48 #include "hurricane/viewer/Ruler.h"
    49 
    50 
    51 namespace Hurricane {
    52 
    53  using std::vector;
    54  using std::unary_function;
    55  using std::shared_ptr;
    56 
    57  class Technology;
    58  class BasicLayer;
    59  class Go;
    60  class Net;
    61  class Cell;
    62  class Instance;
    63  class Slice;
    64  class Segment;
    65  class Contact;
    66  class Pad;
    67  class Selector;
    68  class PaletteWidget;
    69  class Command;
    70 //class MapView;
    71 
    72  enum UpdateState { ExternalEmit = 0
    73  , InternalEmit
    74  , InternalReceive
    75  };
    76 
    77 
    78 // -------------------------------------------------------------------
    79 // Class : "Hurricane::CellWidget".
    80 
    81 
    82  class CellWidget : public QWidget {
    83  Q_OBJECT;
    84 
    85  private:
    86  class DrawingPlanes;
    87  public:
    88  class State;
    89  typedef void ( DrawExtensionGo_t )( CellWidget*
    90  , const Go*
    91  , const BasicLayer*
    92  , const Box&
    93  , const Transformation&
    94  );
    95  typedef void ( InitExtensionGo_t )( CellWidget* );
    96  typedef boost::function< void(QPainter&) > PainterCb_t;
    97  enum RubberShape { Centric=1, Barycentric, Steiner };
    98  enum TextFlag { Bold =0x0001
    99  , BigFont =0x0002
    100  , Reverse =0x0004
    101  , Frame =0x0008
    102  , Rounded =0x0010
    103  , Center =0x0020
    104  , Left =0x0040
    105  , Right =0x0080
    106  , Top =0x0100
    107  };
    108  enum Flag { NoFlags =0x0000
    109  , NoResetCommands=0x0001
    110  };
    111  public:
    113  public:
    114  // Constructor & Destructor.
    115  CellWidget ( QWidget* parent=NULL );
    116  virtual ~CellWidget ();
    117  // Accessors.
    118  // MapView* getMapView () { return _mapView; };
    119  void setCell ( Cell*, Path topPath=Path(), unsigned int flags=NoFlags );
    120  inline Cell* getCell () const;
    121  inline Cell* getTopCell () const;
    122  inline Path getTopPath () const;
    123  inline shared_ptr<State>& getState ();
    124  inline shared_ptr<State> getStateClone ();
    125  inline PaletteWidget* getPalette ();
    126  inline Occurrences getOccurrencesUnder ( const QRect& ) const;
    127  Occurrences getOccurrencesUnder ( const Box& ) const;
    128  inline SelectorSet& getSelectorSet ();
    129  inline RulerSet& getRulerSet ();
    130  inline RubberShape getRubberShape () const;
    131  inline int getStartLevel () const;
    132  inline int getStopLevel () const;
    133  inline Query::Mask getQueryFilter () const ;
    134  void bindToPalette ( PaletteWidget* );
    135  void detachFromPalette ();
    136  void detach ( Selector*);
    137  void bindCommand ( Command* );
    138  void unbindCommand ( Command* );
    139  void resetCommands ();
    140  inline void setActiveCommand ( Command* );
    141  inline Command* getActiveCommand () const;
    142  Command* getCommand ( const std::string& ) const;
    143  inline void resetActiveCommand ();
    144  inline void setCursorStep ( DbU::Unit );
    145  inline void setRealSnapGridStep ( DbU::Unit step );
    146  inline unsigned int getDbuMode () const;
    147  inline bool gridMode () const;
    148  inline bool symbolicMode () const;
    149  inline bool physicalMode () const;
    150  inline DbU::UnitPower getUnitPower () const;
    151  inline bool showBoundaries () const;
    152  inline bool showSelection () const;
    153  inline bool cumulativeSelection () const;
    154  inline void setDbuMode ( int );
    155  inline void setUnitPower ( DbU::UnitPower );
    156  inline void setRubberShape ( RubberShape );
    157  inline void setStartLevel ( int );
    158  inline void setStopLevel ( int );
    159  inline void setQueryFilter ( Query::Mask );
    160  inline bool timeout ( const char*, const Timer&, double timeout, bool& timedout ) const;
    161  // Painter control & Hurricane objects drawing primitives.
    162  inline void setEnableRedrawInterrupt ( bool );
    163  inline void addDrawExtensionGo ( const Name&, InitExtensionGo_t*, DrawExtensionGo_t* );
    164  inline void copyDrawExtensionGos ( const CellWidget* );
    165  inline QPainter& getPainter ( size_t plane=PlaneId::Working );
    166  inline const DisplayStyle::HSVr& getDarkening () const;
    167  inline void copyToPrinter ( int xpaper, int ypaper, QPrinter*, PainterCb_t& );
    168  inline void copyToImage ( QImage*, PainterCb_t& );
    169  inline const float& getScale () const;
    170  inline const QPoint& getMousePosition () const;
    171  inline void updateMousePosition ();
    172  void setLayerVisible ( const Name& layer, bool visible );
    173  bool isLayerVisible ( const Name& );
    174  bool isDrawable ( const Name& );
    175  bool isDrawableLayer ( const Name& );
    176  bool isDrawableExtension ( const Name& );
    177  bool isSelectable ( const Name& ) const;
    178  bool isSelectable ( const Layer* ) const;
    179  bool isPrinter () const;
    180  void setPrinter ( bool );
    181  inline void setDarkening ( const DisplayStyle::HSVr& );
    182  inline void setPen ( const QPen& , size_t plane=PlaneId::Working );
    183  void drawBox ( DbU::Unit, DbU::Unit, DbU::Unit, DbU::Unit );
    184  void drawBox ( const Box& );
    185  void drawBoxBorder ( const Box& );
    186  void drawLine ( DbU::Unit, DbU::Unit, DbU::Unit, DbU::Unit, bool mode=true );
    187  void drawLine ( const Point&, const Point&, bool mode=true );
    188  void drawText ( const Point&, const char*, unsigned int flags=0, int angle=0 );
    189  void drawGrid ( QRect );
    190  void drawSpot ();
    191  void drawRuler ( shared_ptr<Ruler> );
    192  void drawRulers ( QRect );
    193  void drawDisplayText ( const QRect& , const char*, unsigned int flags=0 );
    194  void drawDisplayText ( const QPoint&, const char*, unsigned int flags=0, int angle=0 );
    195  void drawScreenPolygon ( const QPoint*, int count, size_t plane=PlaneId::Working );
    196  void drawScreenPolygon ( const QPolygon&, size_t plane=PlaneId::Working );
    197  void drawScreenLine ( const QPoint&, const QPoint&, size_t plane=PlaneId::Working, bool mode=true );
    198  void drawScreenRect ( const QPoint&, const QPoint&, size_t plane=PlaneId::Working );
    199  void drawScreenRect ( const QRect& , size_t plane=PlaneId::Working );
    200  void drawScreenPolyline ( const QPoint*, int, int, size_t plane=PlaneId::Working );
    201  // Geometric conversions.
    202  inline DbU::Unit toDbu ( float ) const;
    203  QRect dbuToScreenRect ( DbU::Unit x1, DbU::Unit y1, DbU::Unit x2, DbU::Unit y2, bool usePoint=true ) const;
    204  QRect dbuToScreenRect ( const Box& box , bool usePoint=true ) const;
    205  inline int dbuToScreenX ( DbU::Unit x ) const;
    206  inline int dbuToScreenY ( DbU::Unit y ) const;
    207  inline int dbuToScreenLength ( DbU::Unit length ) const;
    208  inline QPoint dbuToScreenPoint ( DbU::Unit x, DbU::Unit y ) const;
    209  inline QPoint dbuToScreenPoint ( const Point& point ) const;
    210  inline DbU::Unit screenToDbuLength ( int length ) const;
    211  inline DbU::Unit screenToDbuX ( int x ) const;
    212  inline DbU::Unit screenToDbuY ( int y ) const;
    213  inline Point screenToDbuPoint ( const QPoint& point ) const;
    214  inline Box screenToDbuBox ( const QRect& rect ) const;
    215  inline Box& pixelInflate ( Box&, int pixels ) const;
    216  inline Point getTopLeft () const;
    217  inline Box getVisibleArea () const;
    218  Box computeVisibleArea ( float scale ) const;
    219  Box computeVisibleArea ( float scale, const Point& topLeft ) const;
    220  Box computeVisibleArea ( const Box&, float& scale ) const;
    221  inline DbU::Unit cursorStep () const;
    222  inline bool _underDetailedGridThreshold() const;
    223  inline DbU::Unit _snapGridStep () const;
    224  inline DbU::Unit _onSnapGrid ( DbU::Unit ) const;
    225  inline Point _onSnapGrid ( const Point& ) const;
    226  inline DbU::Unit _onCursorGrid ( DbU::Unit ) const;
    227  inline Point _onCursorGrid ( const Point& ) const;
    228  // Qt QWidget Functions Overloads.
    229  void pushCursor ( Qt::CursorShape cursor );
    230  void popCursor ();
    231  virtual QSize minimumSizeHint () const;
    232  virtual void showEvent ( QShowEvent* );
    233  virtual void resizeEvent ( QResizeEvent* );
    234  virtual void wheelEvent ( QWheelEvent* );
    235  virtual void keyPressEvent ( QKeyEvent* );
    236  virtual void keyReleaseEvent ( QKeyEvent* );
    237  virtual void mouseMoveEvent ( QMouseEvent* );
    238  virtual void mousePressEvent ( QMouseEvent* );
    239  virtual void mouseReleaseEvent ( QMouseEvent* );
    240  signals:
    241  void cellChanged ( Cell* );
    242  void cellPreModificated ();
    243  void cellPostModificated ();
    244  void stateChanged ( shared_ptr<CellWidget::State>& );
    245  void styleChanged ();
    246  void queryFilterChanged ();
    247  void dbuModeChanged ( unsigned int mode, DbU::UnitPower );
    248  void updatePalette ( Cell* );
    249  void mousePositionChanged ( const Point& position );
    250  void selectionModeChanged ();
    251  void selectionChanged ( const SelectorSet& );
    252  void selectionToggled ( Selector* );
    253  void unlinkSelector ( Selector* );
    254  void showBoundariesToggled ( bool );
    255  protected:
    256  virtual void paintEvent ( QPaintEvent* );
    257  public slots:
    258  // Qt QWidget Slots Overload & CellWidget Specifics.
    259  void setState ( shared_ptr<CellWidget::State>&
    260  , unsigned int flags=NoFlags );
    261  inline void openRefreshSession ();
    262  inline void closeRefreshSession ();
    263  inline DrawingPlanes& getDrawingPlanes ();
    264  // void select ( const Net* );
    265  void select ( Occurrence );
    266  bool isSelected ( Occurrence );
    267  void selectOccurrencesUnder ( Box selectArea );
    268  // void unselect ( const Net* );
    269  void unselect ( Occurrence );
    270  void unselectAll ();
    271  void toggleSelection ( Occurrence );
    272  void setShowSelection ( bool state );
    273  void setCumulativeSelection ( bool state );
    274  // void _select ( const Net* );
    275  // void _unselect ( const Net* );
    276  // void _selectOccurrencesUnder ( Box selectArea );
    277  void _unselectAll ();
    278  inline void addRuler ( const Point&, const Point& );
    279  inline void addRuler ( shared_ptr<Ruler> );
    280  inline void clearRulers ();
    281  void changeQueryFilter ();
    282  void rubberChange ();
    283  void changeDbuMode ( unsigned int mode, DbU::UnitPower );
    284  void setStyle ( int id );
    285  void updatePalette ();
    286  void cellPreModificate ();
    287  void cellPostModificate ();
    288  inline void refresh ();
    289  void _redraw ( QRect redrawArea );
    290  inline void redrawSelection ();
    291  void redrawSelection ( QRect redrawArea );
    292  void goLeft ( int dx = 0 );
    293  void goRight ( int dx = 0 );
    294  void goUp ( int dy = 0 );
    295  void goDown ( int dy = 0 );
    296  void fitToContents ( bool historyEnable=true );
    297  void fitToNet ( const Net*, bool historyEnable=true );
    298  void setScale ( float );
    299  void scaleHistoryUp ();
    300  void scaleHistoryDown ();
    301  // void setGridMode ();
    302  // void setSymbolicMode ();
    303  // void setPhysicalMode ( DbU::UnitPower );
    304  void setShowBoundaries ( bool state );
    305  void reframe ();
    306  void reframe ( const Box& box, bool historyEnable=true );
    307  void displayReframe ();
    308  void _goLeft ( int dx );
    309  void _goRight ( int dx );
    310  void _goUp ( int dy );
    311  void _goDown ( int dy );
    312  void _refresh ();
    313  std::string _getString () const;
    314 
    315  private:
    316  class Spot {
    317  public:
    318  Spot ( CellWidget* );
    319  void setRestore ( bool );
    320  inline void setShowSpot ( bool );
    321  inline const QPoint& getSpotPoint () const;
    322  void restore ();
    323  QPoint computeSpotPoint ( const QPoint& );
    324  void moveTo ( const QPoint& );
    325  private:
    326  CellWidget* _cellWidget;
    327  QPoint _spotPoint;
    328  bool _restore;
    329  bool _showSpot;
    330  };
    331 
    332  private:
    333  class RedrawEvent {
    334  public:
    335  enum EventType { GoLeft = 1
    336  , GoRight = 2
    337  , GoUp = 3
    338  , GoDown = 4
    339  , Refresh = 5
    340  };
    341  public:
    342  RedrawEvent ( EventType, int shift, CellWidget* );
    343  inline EventType getType () const;
    344  inline int getShift () const;
    345  private:
    346  EventType _type;
    347  int _shift;
    348  };
    349 
    350  private:
    351  class RedrawManager {
    352  public:
    353  inline RedrawManager ( CellWidget* );
    354  ~RedrawManager ();
    355  void goLeft ( int );
    356  void goRight ( int );
    357  void goUp ( int );
    358  void goDown ( int );
    359  void refresh ();
    360  void process ();
    361  inline void stopProcessing ();
    362  inline bool isProcessing () const;
    363  inline bool interrupted () const;
    364  inline size_t getPendings () const;
    365  inline void openRefreshSession ();
    366  inline void closeRefreshSession ();
    367  private:
    368  CellWidget* _widget;
    369  list<RedrawEvent*> _events;
    370  int _refreshSession;
    371  bool _processing;
    372  bool _interrupted;
    373  };
    374 
    375  public:
    376  class PlaneId {
    377  public:
    378  enum Ids { Normal = 0 // _planes[0]
    379  , Selection = 1 // _planes[1]
    380  , AutoCopy = 2 // _planes[2]
    381  , Widget = 3
    382  , Printer = 4
    383  , Image = 5
    384  , Working = 6
    385  };
    386  };
    387 
    388  private:
    389  class DrawingPlanes {
    390  public:
    391  DrawingPlanes ( const QSize& size, CellWidget* cw );
    392  ~DrawingPlanes ();
    393  inline bool getLineMode () const;
    394  inline size_t getWorkingPlane () const;
    395  inline void pushWorkingPlane ();
    396  inline void popWorkingPlane ();
    397  inline int width () const;
    398  inline int height () const;
    399  inline QSize size () const;
    400  inline void select ( size_t i );
    401  inline QPainter& painter ( size_t i=PlaneId::Working );
    402  inline void begin ( size_t i=PlaneId::Working );
    403  inline void end ( size_t i=PlaneId::Working );
    404  inline void buffersBegin ();
    405  inline void buffersEnd ();
    406  void setLineMode ( bool mode );
    407  void setPen ( const QPen& pen );
    408  void setBrush ( const QBrush& brush );
    409  void setBackground ( const QBrush& brush );
    410  void setBackgroundMode ( Qt::BGMode mode );
    411  void resize ( const QSize& size );
    412  void shiftLeft ( int dx );
    413  void shiftRight ( int dx );
    414  void shiftUp ( int dy );
    415  void shiftDown ( int dy );
    416  inline void copyToSelect ();
    417  inline void copyToSelect ( const QRect& );
    418  void copyToSelect ( int sx, int sy, int h, int w );
    419  inline void copyToScreen ();
    420  void copyToScreen ( int sx, int sy, int h, int w );
    421  inline void copyToPrinter ( int xpaper, int ypaper, QPrinter*, CellWidget::PainterCb_t& );
    422  void copyToPrinter ( int xpaper, int ypaper, int sx, int sy, int h, int w, QPrinter*, CellWidget::PainterCb_t& );
    423  inline void copyToImage ( QImage*, CellWidget::PainterCb_t& );
    424  void copyToImage ( int sx, int sy, int h, int w, QImage*, CellWidget::PainterCb_t& );
    425  private:
    426  static const int _cartoucheWidth;
    427  static const int _cartoucheHeight;
    428  static const int _titleHeight;
    429  CellWidget* _cellWidget;
    430  QPrinter* _printer;
    431  QImage* _image;
    432  QPixmap* _planes[3];
    433  QPainter _painters[PlaneId::Working];
    434  QPen _normalPen;
    435  QPen _linePen;
    436  QPoint _brushOrigin;
    437  size_t _workingPlane;
    438  size_t _pushWorkingPlane;
    439  bool _lineMode;
    440  private:
    441  DrawingPlanes ( const DrawingPlanes& );
    442  DrawingPlanes& operator= ( const DrawingPlanes& );
    443  };
    444 
    445  private:
    446  class DrawingQuery : public Query {
    447  public:
    448  DrawingQuery ( CellWidget* widget );
    449  inline void setQuery ( const Box& area
    450  , const Transformation& transformation
    451  , const BasicLayer* basicLayer
    452  , ExtensionSlice::Mask extensionMask
    453  , unsigned int filter
    454  );
    455  inline void addDrawExtensionGo ( const Name&
    456  , InitExtensionGo_t*
    457  , DrawExtensionGo_t*
    458  );
    459  inline void copyDrawExtensionGos ( const DrawingQuery& );
    460  void setDrawExtensionGo ( const Name& );
    461  virtual bool hasMasterCellCallback () const;
    462  virtual bool hasGoCallback () const;
    463  virtual bool hasMarkerCallback () const;
    464  virtual bool hasRubberCallback () const;
    465  virtual bool hasExtensionGoCallback () const;
    466  virtual void masterCellCallback ();
    467  virtual void goCallback ( Go* );
    468  virtual void rubberCallback ( Rubber* );
    469  virtual void markerCallback ( Marker* );
    470  virtual void extensionGoCallback ( Go* );
    471  void drawMasterCell ( const Cell* cell
    472  , const Transformation& transformation
    473  );
    474  void drawGo ( const Go* go
    475  , const BasicLayer* basicLayer
    476  , const Box& area
    477  , const Transformation& transformation
    478  );
    479  void drawRubber ( const Rubber* rubber
    480  , const Box& area
    481  , const Transformation& transformation
    482  );
    483  void drawMarker ( const Marker* marker
    484  , const Box& area
    485  , const Transformation& transformation
    486  );
    487  void drawExtensionGo ( CellWidget* widget
    488  , const Go* go
    489  , const BasicLayer* basicLayer
    490  , const Box& area
    491  , const Transformation& transformation
    492  );
    493  inline unsigned int getGoCount () const;
    494  inline unsigned int getExtensionGoCount () const;
    495  inline unsigned int getInstanceCount () const;
    496  inline void resetGoCount ();
    497  inline void resetExtensionGoCount ();
    498  inline void resetInstanceCount ();
    499 
    500  protected:
    501  CellWidget* _cellWidget;
    502  DrawExtensionGo_t* _drawExtensionGo;
    503  map<Name,pair<InitExtensionGo_t*,DrawExtensionGo_t*> >
    504  _drawExtensionGos;
    505  unsigned int _goCount;
    506  unsigned int _extensionGoCount;
    507  unsigned int _instanceCount;
    508  };
    509 
    510  private:
    511  class TextDrawingQuery : public Query {
    512  public:
    513  TextDrawingQuery ( CellWidget* widget );
    514  inline void setQuery ( const Box& area
    515  , const Transformation& transformation
    516  );
    517  virtual bool hasMasterCellCallback () const;
    518  virtual bool hasGoCallback () const;
    519  virtual bool hasRubberCallback () const;
    520  virtual bool hasExtensionGoCallback () const;
    521  virtual void masterCellCallback ();
    522  virtual void goCallback ( Go* go );
    523  virtual void extensionGoCallback ( Go* go );
    524  virtual void rubberCallback ( Rubber* );
    525 
    526  protected:
    527  CellWidget* _cellWidget;
    528  };
    529 
    530  private:
    531  class SelectorCriterions {
    532  public:
    533  SelectorCriterions ();
    534  ~SelectorCriterions ();
    535  inline void setCellWidget ( CellWidget* );
    536  inline const vector<SelectorCriterion*>& getCriterions () const;
    537  SelectorCriterion* add ( const Net* net );
    538  SelectorCriterion* add ( Box area );
    539  inline SelectorCriterion* add ( SelectorCriterion* );
    540  bool remove ( const Net* net );
    541  void clear ();
    542  void invalidate ();
    543  void revalidate ();
    544  inline size_t size () const;
    545  private:
    546  CellWidget* _cellWidget;
    547  vector<SelectorCriterion*> _criterions;
    548  };
    549 
    550  public:
    551  class State {
    552  public:
    553  inline State ( Cell* cell=NULL, Path topPath=Path() );
    554  State* clone () const;
    555  inline void setCell ( Cell* );
    556  inline void setTopPath ( Path );
    557  inline void setCellWidget ( CellWidget* );
    558  inline void setCursorStep ( DbU::Unit );
    559  inline DbU::Unit getCursorStep () const;
    560  inline DbU::UnitPower getUnitPower () const;
    561  inline void setDbuMode ( int );
    562  inline void setUnitPower ( DbU::UnitPower );
    563  inline void setShowBoundaries ( bool );
    564  inline void setShowSelection ( bool );
    565  inline void setCumulativeSelection ( bool );
    566  void setScale ( float );
    567  inline void setTopLeft ( DbU::Unit, DbU::Unit );
    568  inline void setTopLeft ( const Point& );
    569  inline void setQueryFilter ( Query::Mask );
    570  inline void setStartLevel ( int );
    571  inline void setStopLevel ( int );
    572  inline void setRubberShape ( RubberShape );
    573  inline void setHistoryEnable ( bool );
    574  bool scaleHistoryUp ();
    575  bool scaleHistoryDown ();
    576  inline Cell* getCell () const;
    577  inline Cell* getTopCell () const;
    578  inline Path getTopPath () const;
    579  const Name& getName () const;
    580  inline SelectorCriterions& getSelection ();
    581  inline RulerSet& getRulers ();
    582  inline DbU::Unit cursorStep () const;
    583  inline unsigned int getDbuMode () const;
    584  inline bool gridMode () const;
    585  inline bool symbolicMode () const;
    586  inline bool physicalMode () const;
    587  inline bool nanoMode () const;
    588  inline bool microMode () const;
    589  inline bool showBoundaries () const;
    590  inline bool showSelection () const;
    591  inline bool cumulativeSelection () const;
    592  inline bool getHistoryEnable () const;
    593  inline size_t getHistorySize () const;
    594  inline const float& getScale () const;
    595  inline const Point& getTopLeft () const;
    596  inline Query::Mask getQueryFilter () const;
    597  inline int getStartLevel () const;
    598  inline int getStopLevel () const;
    599  inline RubberShape getRubberShape () const;
    600 
    601  private:
    602  class ScaleEntry {
    603  public:
    604  inline ScaleEntry ( float, const Point& );
    605  public:
    606  float _scale;
    607  Point _topLeft;
    608  };
    609 
    610  private:
    611  Cell* _cell;
    612  Path _topPath;
    613  Name _hierarchicalName;
    614  CellWidget* _cellWidget;
    615  SelectorCriterions _selection;
    616  RulerSet _rulers;
    617  DbU::Unit _cursorStep;
    618  unsigned int _dbuMode;
    619  DbU::UnitPower _unitPower;
    620  bool _showBoundaries;
    621  bool _showSelection;
    622  Query::Mask _queryFilter;
    623  int _startLevel;
    624  int _stopLevel;
    625  RubberShape _rubberShape;
    626  bool _cumulativeSelection;
    627  vector<ScaleEntry> _scaleHistory;
    628  size_t _ihistory;
    629  bool _historyEnable;
    630  };
    631  public:
    632  class FindStateName : public unary_function< const shared_ptr<State>&, bool > {
    633  public:
    634  inline FindStateName ( const Name& );
    635  inline bool operator() ( const shared_ptr<State>& );
    636  private:
    637  const Name _cellHierName;
    638  };
    639 
    640  protected:
    641  // Internal: Attributes.
    642  static int _initialSide;
    643  vector<Qt::CursorShape> _cursors;
    644  // MapView* _mapView;
    645  Technology* _technology;
    646  PaletteWidget* _palette;
    647  Box _screenArea;
    648  RedrawManager _redrawManager;
    649  DrawingPlanes _drawingPlanes;
    650  DrawingQuery _drawingQuery;
    651  TextDrawingQuery _textDrawingQuery;
    652  DisplayStyle::HSVr _darkening;
    653  QPoint _mousePosition;
    654  Spot _spot;
    655  shared_ptr<State> _state;
    656  bool _isPrinter;
    657  bool _cellChanged;
    658  bool _selectionHasChanged;
    659  int _delaySelectionChanged;
    660  bool _cellModificated;
    661  bool _enableRedrawInterrupt;
    662  SelectorSet _selectors;
    663  Command* _activeCommand;
    664  vector<Command*> _commands;
    665  size_t _redrawRectCount;
    666  int _textFontHeight;
    667 
    668  friend class RedrawManager;
    669  };
    670 
    671 
    672  inline void CellWidget::Spot::setShowSpot ( bool show )
    673  { _showSpot = show; }
    674 
    675 
    676  inline const QPoint& CellWidget::Spot::getSpotPoint () const
    677  { return _spotPoint; }
    678 
    679 
    680  inline void CellWidget::DrawingQuery::setQuery ( const Box& area
    681  , const Transformation& transformation
    682  , const BasicLayer* basicLayer
    683  , ExtensionSlice::Mask extensionMask
    684  , unsigned int filter
    685  )
    686  {
    687  Query::setQuery ( _cellWidget->getCell()
    688  , area
    689  , transformation
    690  , basicLayer
    691  , extensionMask
    692  , filter
    693  );
    694  }
    695 
    696 
    697  inline void CellWidget::setEnableRedrawInterrupt ( bool state )
    698  { _enableRedrawInterrupt = state; }
    699 
    700 
    701  inline void CellWidget::openRefreshSession ()
    702  { _redrawManager.openRefreshSession (); }
    703 
    704 
    705  inline void CellWidget::closeRefreshSession ()
    706  { _redrawManager.closeRefreshSession (); }
    707 
    708 
    709  inline void CellWidget::DrawingQuery::addDrawExtensionGo ( const Name& name
    710  , InitExtensionGo_t* initExtensionGo
    711  , DrawExtensionGo_t* drawExtensionGo
    712  )
    713  { _drawExtensionGos[name] = make_pair(initExtensionGo,drawExtensionGo); }
    714 
    715 
    716  inline void CellWidget::DrawingQuery::copyDrawExtensionGos ( const CellWidget::DrawingQuery& other )
    717  { _drawExtensionGos = other._drawExtensionGos; }
    718 
    719 
    720  inline void CellWidget::DrawingQuery::resetGoCount ()
    721  { _goCount = 0; }
    722 
    723 
    724  inline void CellWidget::DrawingQuery::resetExtensionGoCount ()
    725  { _extensionGoCount = 0; }
    726 
    727 
    728  inline void CellWidget::DrawingQuery::resetInstanceCount ()
    729  { _instanceCount = 0; }
    730 
    731 
    732  inline unsigned int CellWidget::DrawingQuery::getGoCount () const
    733  { return _goCount; }
    734 
    735 
    736  inline unsigned int CellWidget::DrawingQuery::getExtensionGoCount () const
    737  { return _extensionGoCount; }
    738 
    739 
    740  inline unsigned int CellWidget::DrawingQuery::getInstanceCount () const
    741  { return _instanceCount; }
    742 
    743 
    744  inline CellWidget::RedrawEvent::EventType CellWidget::RedrawEvent::getType () const
    745  { return _type; }
    746 
    747 
    748  inline int CellWidget::RedrawEvent::getShift () const
    749  { return _shift; }
    750 
    751 
    752  inline bool CellWidget::RedrawManager::isProcessing () const
    753  { return _processing; }
    754 
    755 
    756  inline void CellWidget::RedrawManager::stopProcessing ()
    757  { _processing = false; }
    758 
    759 
    760  inline size_t CellWidget::RedrawManager::getPendings () const
    761  { return _events.size(); }
    762 
    763 
    764  inline void CellWidget::RedrawManager::openRefreshSession ()
    765  { _refreshSession++; }
    766 
    767 
    768  inline void CellWidget::RedrawManager::closeRefreshSession ()
    769  {
    770  _refreshSession--;
    771  if ( !_processing && (_refreshSession == 0) ) process ();
    772  }
    773 
    774 
    775  inline bool CellWidget::RedrawManager::interrupted () const
    776  {
    777 #ifdef ALLOW_REQUEST_INTERRUPT
    778  return ( _events.size() > 5 ) || _interrupted;
    779 #else
    780  return _interrupted;
    781 #endif
    782  }
    783 
    784 
    785  inline bool CellWidget::DrawingPlanes::getLineMode () const
    786  { return _lineMode; }
    787 
    788 
    789  inline size_t CellWidget::DrawingPlanes::getWorkingPlane () const
    790  { return _workingPlane; }
    791 
    792 
    793  inline void CellWidget::DrawingPlanes::pushWorkingPlane ()
    794  { _pushWorkingPlane = _workingPlane; }
    795 
    796 
    797  inline void CellWidget::DrawingPlanes::popWorkingPlane ()
    798  { _workingPlane = _pushWorkingPlane; }
    799 
    800 
    801  inline int CellWidget::DrawingPlanes::width () const
    802  { return _planes[PlaneId::Normal]->width(); }
    803 
    804 
    805  inline int CellWidget::DrawingPlanes::height () const
    806  { return _planes[PlaneId::Normal]->height(); }
    807 
    808 
    809  inline QSize CellWidget::DrawingPlanes::size () const
    810  { return _planes[PlaneId::Normal]->size(); }
    811 
    812 
    813  inline void CellWidget::DrawingPlanes::select ( size_t i )
    814  { _workingPlane = i; }
    815 
    816 
    817  inline QPainter& CellWidget::DrawingPlanes::painter ( size_t i )
    818  { return _painters[ (i>=PlaneId::Working) ? _workingPlane : i ]; }
    819 
    820 
    821  inline void CellWidget::DrawingPlanes::begin ( size_t i )
    822  {
    823  size_t wp = (i>=PlaneId::Working) ? _workingPlane : i;
    824  switch ( wp ) {
    825  case PlaneId::Normal:
    826  case PlaneId::Selection:
    827  case PlaneId::AutoCopy: _painters[wp ].begin( _planes[wp] ); break;
    828  case PlaneId::Widget: _painters[PlaneId::Widget ].begin( _cellWidget ); break;
    829  case PlaneId::Printer: _painters[PlaneId::Printer].begin( _printer ); break;
    830  case PlaneId::Image: _painters[PlaneId::Image ].begin( _image ); break;
    831  default:
    832  std::cerr << "[BUG] Bad plane selection." << std::endl;
    833  }
    834  }
    835 
    836 
    837  inline void CellWidget::DrawingPlanes::end ( size_t i )
    838  { _painters[(i>=PlaneId::Working)?_workingPlane:i].end (); }
    839 
    840 
    841  inline void CellWidget::DrawingPlanes::buffersBegin ()
    842  {
    843  begin( PlaneId::Normal );
    844  begin( PlaneId::Selection );
    845  begin( PlaneId::AutoCopy );
    846  }
    847 
    848 
    849  inline void CellWidget::DrawingPlanes::buffersEnd ()
    850  {
    851  end( PlaneId::Normal );
    852  end( PlaneId::Selection );
    853  end( PlaneId::AutoCopy );
    854  }
    855 
    856 
    857  inline void CellWidget::DrawingPlanes::copyToSelect ()
    858  { copyToSelect ( 0, 0, width(), height() ); }
    859 
    860 
    861  inline void CellWidget::DrawingPlanes::copyToSelect ( const QRect& r )
    862  { copyToSelect ( r.x(), r.y(), r.width(), r.height() ); }
    863 
    864 
    865  inline void CellWidget::DrawingPlanes::copyToScreen ()
    866  { copyToScreen ( 0, 0, width(), height() ); }
    867 
    868 
    869  inline void CellWidget::DrawingPlanes::copyToPrinter ( int xpaper, int ypaper, QPrinter* printer, CellWidget::PainterCb_t& cb )
    870  {
    871  copyToPrinter ( xpaper
    872  , ypaper
    873  , 0
    874  , 0
    875  , _cellWidget->geometry().width()
    876  , _cellWidget->geometry().height()
    877  , printer
    878  , cb
    879  );
    880  }
    881 
    882 
    883  inline void CellWidget::DrawingPlanes::copyToImage ( QImage* image, CellWidget::PainterCb_t& cb )
    884  {
    885  copyToImage ( 0
    886  , 0
    887  , _cellWidget->geometry().width()
    888  , _cellWidget->geometry().height()
    889  , image
    890  , cb
    891  );
    892  }
    893 
    894 
    895  inline void CellWidget::SelectorCriterions::setCellWidget ( CellWidget* cw )
    896  { _cellWidget = cw; }
    897 
    898 
    899  inline size_t CellWidget::SelectorCriterions::size () const
    900  { return _criterions.size(); }
    901 
    902 
    903  inline const vector<SelectorCriterion*>& CellWidget::SelectorCriterions::getCriterions () const
    904  { return _criterions; }
    905 
    906 
    907  inline SelectorCriterion* CellWidget::SelectorCriterions::add ( SelectorCriterion* criterion )
    908  {
    909  _criterions.push_back( criterion );
    910  return _criterions.back();
    911  }
    912 
    913 
    914  inline CellWidget::State::ScaleEntry::ScaleEntry ( float scale, const Point& topLeft )
    915  : _scale(scale), _topLeft(topLeft)
    916  { }
    917 
    918 
    919  inline CellWidget::State::State ( Cell* cell, Path topPath )
    920  : _cell (cell)
    921  , _topPath (topPath)
    922  , _hierarchicalName ()
    923  , _cellWidget (NULL)
    924  , _selection ()
    925  , _rulers ()
    926  , _cursorStep (DbU::lambda(0.5))
    927  , _dbuMode (DbU::Symbolic)
    928  , _unitPower (DbU::Nano)
    929  , _showBoundaries (true)
    930  , _showSelection (false)
    931  , _queryFilter (~Query::DoTerminalCells)
    932  , _startLevel (0)
    933  , _stopLevel (99)
    934  , _rubberShape (CellWidget::Barycentric)
    935  , _cumulativeSelection(false)
    936  , _scaleHistory ()
    937  , _ihistory (0)
    938  , _historyEnable (false)
    939  {
    940  _scaleHistory.push_back ( ScaleEntry(1.0,Point(0,0)) );
    941  if (_cell) _hierarchicalName = Name( _cell->getHierarchicalName() );
    942  }
    943 
    944 
    945  inline unsigned int CellWidget::State::getDbuMode () const
    946  { return _dbuMode; }
    947 
    948 
    949  inline bool CellWidget::State::symbolicMode () const
    950  { return (_dbuMode == DbU::Symbolic); }
    951 
    952 
    953  inline bool CellWidget::State::gridMode () const
    954  { return (_dbuMode == DbU::Grid); }
    955 
    956 
    957  inline bool CellWidget::State::physicalMode () const
    958  { return (_dbuMode == DbU::Physical); }
    959 
    960 
    961  inline void CellWidget::State::setCell ( Cell* cell )
    962  {
    963  _cell = cell;
    964  if (_cell) _hierarchicalName = Name( _cell->getHierarchicalName() );
    965  }
    966 
    967 
    968  inline void CellWidget::State::setTopPath ( Path topPath )
    969  { _topPath = topPath; }
    970 
    971 
    972  inline void CellWidget::State::setCellWidget ( CellWidget* cw )
    973  {
    974  _cellWidget = cw;
    975  _selection.setCellWidget ( cw );
    976  }
    977 
    978 
    979  inline void CellWidget::State::setCursorStep ( DbU::Unit step )
    980  { _cursorStep = step; }
    981 
    982  inline DbU::Unit CellWidget::State::getCursorStep () const
    983  { return _cursorStep; }
    984 
    985 
    986  inline DbU::UnitPower CellWidget::State::getUnitPower () const
    987  { return _unitPower; }
    988 
    989 
    990  inline void CellWidget::State::setDbuMode ( int mode )
    991  {
    992  _dbuMode = mode;
    993  switch ( _dbuMode ) {
    994  case DbU::Symbolic: _cursorStep = DbU::fromLambda(0.5); break;
    995  case DbU::Grid: _cursorStep = DbU::fromGrid (1.0); break;
    996  case DbU::Physical: _cursorStep = DbU::fromGrid (1.0); break;
    997  }
    998  }
    999 
    1000 
    1001  inline void CellWidget::State::setUnitPower ( DbU::UnitPower p )
    1002  { _unitPower = p; }
    1003 
    1004 
    1005  inline void CellWidget::State::setShowBoundaries ( bool state )
    1006  { _showBoundaries = state; }
    1007 
    1008 
    1009  inline void CellWidget::State::setShowSelection ( bool state )
    1010  { _showSelection = state; }
    1011 
    1012 
    1013  inline void CellWidget::State::setCumulativeSelection ( bool state )
    1014  { _cumulativeSelection = state; }
    1015 
    1016 
    1017  inline void CellWidget::State::setTopLeft ( DbU::Unit x, DbU::Unit y )
    1018  {
    1019  _scaleHistory[_ihistory]._topLeft.setX(x);
    1020  _scaleHistory[_ihistory]._topLeft.setY(y);
    1021  }
    1022 
    1023 
    1024  inline void CellWidget::State::setTopLeft ( const Point& topLeft )
    1025  { _scaleHistory[_ihistory]._topLeft = topLeft; }
    1026 
    1027 
    1028  inline void CellWidget::State::setQueryFilter ( Query::Mask mask )
    1029  { _queryFilter = mask; }
    1030 
    1031 
    1032  inline void CellWidget::State::setStartLevel ( int level )
    1033  { _startLevel = level; }
    1034 
    1035 
    1036  inline void CellWidget::State::setStopLevel ( int level )
    1037  { _stopLevel = level; }
    1038 
    1039 
    1040  inline void CellWidget::State::setRubberShape ( RubberShape shape )
    1041  { _rubberShape = shape; }
    1042 
    1043 
    1044  inline void CellWidget::State::setHistoryEnable ( bool enable )
    1045  { _historyEnable = enable; }
    1046 
    1047 
    1048  inline Cell* CellWidget::State::getCell () const
    1049  { return _cell; }
    1050 
    1051 
    1052  inline Path CellWidget::State::getTopPath () const
    1053  { return _topPath; }
    1054 
    1055 
    1056  inline Cell* CellWidget::State::getTopCell () const
    1057  { return (_topPath.isEmpty()) ? _cell : _topPath.getOwnerCell(); }
    1058 
    1059 
    1060  inline DbU::Unit CellWidget::State::cursorStep () const
    1061  { return _cursorStep; }
    1062 
    1063 
    1064  inline CellWidget::SelectorCriterions& CellWidget::State::getSelection ()
    1065  { return _selection; }
    1066 
    1067 
    1068  inline RulerSet& CellWidget::State::getRulers ()
    1069  { return _rulers; }
    1070 
    1071 
    1072  inline bool CellWidget::State::showBoundaries () const
    1073  { return _showBoundaries; }
    1074 
    1075 
    1076  inline bool CellWidget::State::showSelection () const
    1077  { return _showSelection; }
    1078 
    1079 
    1080  inline bool CellWidget::State::cumulativeSelection () const
    1081  { return _cumulativeSelection; }
    1082 
    1083 
    1084  inline bool CellWidget::State::getHistoryEnable () const
    1085  { return _historyEnable; }
    1086 
    1087 
    1088  inline size_t CellWidget::State::getHistorySize () const
    1089  { return _scaleHistory.size(); }
    1090 
    1091 
    1092  inline const Point& CellWidget::State::getTopLeft () const
    1093  { return _scaleHistory[_ihistory]._topLeft; }
    1094 
    1095 
    1096  inline Query::Mask CellWidget::State::getQueryFilter () const
    1097  { return _queryFilter; }
    1098 
    1099 
    1100  inline int CellWidget::State::getStartLevel () const
    1101  { return _startLevel; }
    1102 
    1103 
    1104  inline int CellWidget::State::getStopLevel () const
    1105  { return _stopLevel; }
    1106 
    1107 
    1108  inline CellWidget::RubberShape CellWidget::State::getRubberShape () const
    1109  { return _rubberShape; }
    1110 
    1111 
    1112  inline const float& CellWidget::State::getScale () const
    1113  { return _scaleHistory[_ihistory]._scale; }
    1114 
    1115 
    1116  inline CellWidget::FindStateName::FindStateName ( const Name& cellHierName )
    1117  : unary_function< const shared_ptr<State>&, bool >()
    1118  , _cellHierName(cellHierName)
    1119  { }
    1120 
    1121 
    1122  inline bool CellWidget::FindStateName::operator () ( const shared_ptr<State>& state )
    1123  { return state->getName() == _cellHierName; }
    1124 
    1125 
    1126  inline void CellWidget::setActiveCommand ( Command* command )
    1127  { _activeCommand = command; }
    1128 
    1129 
    1130  inline Command* CellWidget::getActiveCommand () const
    1131  { return _activeCommand; }
    1132 
    1133 
    1134  inline void CellWidget::resetActiveCommand ()
    1135  { _activeCommand = NULL; }
    1136 
    1137 
    1138  inline void CellWidget::setCursorStep ( DbU::Unit step )
    1139  { _state->setCursorStep(step); }
    1140 
    1141 
    1142  inline void CellWidget::setRealSnapGridStep ( DbU::Unit step )
    1143  { DbU::setRealSnapGridStep(step); }
    1144 
    1145 
    1146  inline shared_ptr<CellWidget::State>& CellWidget::getState ()
    1147  {
    1148  _state->setTopLeft ( getTopLeft() );
    1149  return _state;
    1150  }
    1151 
    1152 
    1153  inline shared_ptr<CellWidget::State> CellWidget::getStateClone ()
    1154  {
    1155  _state->setTopLeft ( getTopLeft() );
    1156  return shared_ptr<State>( _state->clone() );
    1157  }
    1158 
    1159 
    1160  inline void CellWidget::addDrawExtensionGo ( const Name& name
    1161  , InitExtensionGo_t* initExtensionGo
    1162  , DrawExtensionGo_t* drawExtensionGo
    1163  )
    1164  { _drawingQuery.addDrawExtensionGo( name, initExtensionGo, drawExtensionGo ); }
    1165 
    1166 
    1167  inline void CellWidget::copyDrawExtensionGos ( const CellWidget* other )
    1168  { _drawingQuery.copyDrawExtensionGos( other->_drawingQuery ); }
    1169 
    1170 
    1171  inline void CellWidget::setStartLevel ( int level )
    1172  {
    1173  _drawingQuery.setStartLevel ( level );
    1174  _state->setStartLevel ( level );
    1175  emit queryFilterChanged ();
    1176  }
    1177 
    1178 
    1179  inline void CellWidget::setStopLevel ( int level )
    1180  {
    1181  _drawingQuery.setStopLevel ( level );
    1182  _state->setStopLevel ( level );
    1183  emit queryFilterChanged ();
    1184  }
    1185 
    1186 
    1187  inline int CellWidget::getStartLevel () const
    1188  { return _drawingQuery.getStartLevel (); }
    1189 
    1190 
    1191  inline int CellWidget::getStopLevel () const
    1192  { return _drawingQuery.getStopLevel (); }
    1193 
    1194 
    1195  inline CellWidget::DrawingPlanes& CellWidget::getDrawingPlanes ()
    1196  { return _drawingPlanes; }
    1197 
    1198 
    1199  inline SelectorSet& CellWidget::getSelectorSet ()
    1200  { return _selectors; }
    1201 
    1202 
    1203  Occurrences CellWidget::getOccurrencesUnder ( const QRect& area ) const
    1204  { return getOccurrencesUnder(screenToDbuBox(area)); }
    1205 
    1206 
    1207  inline void CellWidget::addRuler ( const Point& origin, const Point& extremity )
    1208  {
    1209  _state->getRulers().insert ( shared_ptr<Ruler>( new Ruler(origin,extremity) ) );
    1210  refresh ();
    1211  }
    1212 
    1213 
    1214  inline void CellWidget::addRuler ( shared_ptr<Ruler> ruler )
    1215  {
    1216  _state->getRulers().insert ( ruler );
    1217  refresh ();
    1218  }
    1219 
    1220 
    1221  inline void CellWidget::clearRulers ()
    1222  { _state->getRulers().clear (); refresh(); }
    1223 
    1224 
    1225  inline void CellWidget::refresh ()
    1226  { _redrawManager.refresh(); }
    1227 
    1228 
    1229  inline void CellWidget::redrawSelection ()
    1230  { redrawSelection ( QRect(QPoint(0,0),_drawingPlanes.size()) ); }
    1231 
    1232 
    1233  inline void CellWidget::copyToPrinter ( int xpaper, int ypaper, QPrinter* printer, CellWidget::PainterCb_t& cb )
    1234  { _drawingPlanes.copyToPrinter( xpaper, ypaper, printer, cb ); }
    1235 
    1236 
    1237  inline void CellWidget::copyToImage ( QImage* image, PainterCb_t& cb )
    1238  { _drawingPlanes.copyToImage ( image, cb ); }
    1239 
    1240 
    1241  inline DbU::Unit CellWidget::toDbu ( float d ) const
    1242  {
    1243  DbU::Unit unit;
    1244  switch ( getDbuMode() ) {
    1245  case DbU::Physical: unit = DbU::grid(DbU::physicalToGrid(d,DbU::Micro)); break;
    1246  case DbU::Grid: unit = DbU::grid(d); break;
    1247  case DbU::Db: unit = DbU::db((long)d); break;
    1248  default:
    1249  case DbU::Symbolic: unit = DbU::lambda(d); break;
    1250  }
    1251  return unit;
    1252  }
    1253 
    1254 
    1255  inline int CellWidget::dbuToScreenX ( DbU::Unit x ) const
    1256  { return (int)rint ( (float)( x - _screenArea.getXMin() ) * getScale() ); }
    1257 
    1258 
    1259  inline int CellWidget::dbuToScreenY ( DbU::Unit y ) const
    1260  { return (int)rint ( (float)( _screenArea.getYMax() - y ) * getScale() ); }
    1261 
    1262 
    1263  inline int CellWidget::dbuToScreenLength ( DbU::Unit length ) const
    1264  { return (int)rint ( (float)length * getScale() ); }
    1265 
    1266 
    1267  inline QPoint CellWidget::dbuToScreenPoint ( DbU::Unit x, DbU::Unit y ) const
    1268  { return QPoint ( dbuToScreenX(x), dbuToScreenY(y) ); }
    1269 
    1270 
    1271  inline QPoint CellWidget::dbuToScreenPoint ( const Point& point ) const
    1272  { return QPoint ( dbuToScreenX(point.getX()), dbuToScreenY(point.getY()) ); }
    1273 
    1274 
    1275  inline DbU::Unit CellWidget::screenToDbuX ( int x ) const
    1276  { return (DbU::Unit)(x/getScale()) + _screenArea.getXMin(); }
    1277 
    1278 
    1279  inline DbU::Unit CellWidget::screenToDbuY ( int y ) const
    1280  { return _screenArea.getYMax() - (DbU::Unit)(y/getScale()); }
    1281 
    1282 
    1283  inline DbU::Unit CellWidget::screenToDbuLength ( int length ) const
    1284  { return (int)( (float)length / getScale() ); }
    1285 
    1286 
    1287  inline Point CellWidget::screenToDbuPoint ( const QPoint& point ) const
    1288  { return Point ( screenToDbuX(point.x()), screenToDbuY(point.y()) ); }
    1289 
    1290 
    1291  inline Box CellWidget::screenToDbuBox ( const QRect& rect ) const
    1292  {
    1293  return Box ( screenToDbuX(rect.x())
    1294  , screenToDbuY(rect.y())
    1295  , screenToDbuX(rect.x()+rect.width ())
    1296  , screenToDbuY(rect.y()+rect.height())
    1297  );
    1298  }
    1299 
    1300 
    1301  inline Box& CellWidget::pixelInflate ( Box& box, int pixels ) const
    1302  { return box.inflate(screenToDbuLength(pixels)); }
    1303 
    1304 
    1305  inline Point CellWidget::getTopLeft () const
    1306  { return Point(_screenArea.getXMin(),_screenArea.getYMax()); }
    1307 
    1308 
    1309  inline Box CellWidget::getVisibleArea () const
    1310  { return computeVisibleArea(getScale()); }
    1311 
    1312 
    1313  inline Cell* CellWidget::getCell () const
    1314  { return _state->getCell(); }
    1315 
    1316 
    1317  inline Cell* CellWidget::getTopCell () const
    1318  { return _state->getTopCell(); }
    1319 
    1320 
    1321  inline Path CellWidget::getTopPath () const
    1322  { return _state->getTopPath(); }
    1323 
    1324 
    1325  inline PaletteWidget* CellWidget::getPalette ()
    1326  { return _palette; }
    1327 
    1328 
    1329  inline DbU::Unit CellWidget::cursorStep () const
    1330  { return _state->cursorStep(); }
    1331 
    1332 
    1333  inline unsigned int CellWidget::getDbuMode () const
    1334  { return _state->getDbuMode(); }
    1335 
    1336 
    1337  inline bool CellWidget::gridMode () const
    1338  { return _state->gridMode(); }
    1339 
    1340 
    1341  inline bool CellWidget::symbolicMode () const
    1342  { return _state->symbolicMode(); }
    1343 
    1344 
    1345  inline bool CellWidget::physicalMode () const
    1346  { return _state->physicalMode(); }
    1347 
    1348 
    1349  inline DbU::UnitPower CellWidget::getUnitPower () const
    1350  { return _state->getUnitPower(); }
    1351 
    1352 
    1353  inline bool CellWidget::showBoundaries () const
    1354  { return _state->showBoundaries(); }
    1355 
    1356 
    1357  inline bool CellWidget::showSelection () const
    1358  { return _state->showSelection(); }
    1359 
    1360 
    1361  inline bool CellWidget::cumulativeSelection () const
    1362  { return _state->cumulativeSelection(); }
    1363 
    1364 
    1365  inline QPainter& CellWidget::getPainter ( size_t plane )
    1366  { return _drawingPlanes.painter(plane); }
    1367 
    1368 
    1369  inline const DisplayStyle::HSVr& CellWidget::getDarkening () const
    1370  { return _darkening; }
    1371 
    1372 
    1373  inline const float& CellWidget::getScale () const
    1374  { return _state->getScale(); }
    1375 
    1376 
    1377  inline const QPoint& CellWidget::getMousePosition () const
    1378  { return _mousePosition; }
    1379 
    1380 
    1381  inline void CellWidget::updateMousePosition ()
    1382  {
    1383  Point mousePoint = screenToDbuPoint ( _mousePosition );
    1384  emit mousePositionChanged ( _onCursorGrid(mousePoint) );
    1385  }
    1386 
    1387 
    1388  inline void CellWidget::setQueryFilter ( Query::Mask filter )
    1389  {
    1390  _state->setQueryFilter ( filter );
    1391  emit queryFilterChanged ();
    1392  }
    1393 
    1394 
    1395  inline Query::Mask CellWidget::getQueryFilter () const
    1396  { return _state->getQueryFilter(); }
    1397 
    1398 
    1399  inline void CellWidget::setDbuMode ( int mode )
    1400  { _state->setDbuMode(mode); }
    1401 
    1402 
    1403  inline void CellWidget::setUnitPower ( DbU::UnitPower p )
    1404  { _state->setUnitPower(p); }
    1405 
    1406 
    1407  inline void CellWidget::setRubberShape ( RubberShape shape )
    1408  {
    1409  _state->setRubberShape ( shape );
    1410  _redrawManager.refresh ();
    1411  emit queryFilterChanged ();
    1412  }
    1413 
    1414 
    1415  inline CellWidget::RubberShape CellWidget::getRubberShape () const
    1416  { return _state->getRubberShape(); }
    1417 
    1418 
    1419  inline void CellWidget::setPen ( const QPen& pen, size_t plane )
    1420  { _drawingPlanes.painter(plane).setPen(pen); }
    1421 
    1422 
    1423  inline void CellWidget::setDarkening ( const DisplayStyle::HSVr& darkening )
    1424  { _darkening = darkening; }
    1425 
    1426 
    1427  inline bool CellWidget::isPrinter () const
    1428  { return _isPrinter; }
    1429 
    1430 
    1431  inline void CellWidget::setPrinter ( bool state )
    1432  { _isPrinter = state; }
    1433 
    1434 
    1435  inline bool CellWidget::timeout ( const char* fname, const Timer& timer, double timeout, bool& timedout ) const
    1436  {
    1437  if ( timedout ) return true;
    1438  if ( timer.getCombTimeOnTheFly() < timeout ) return false;
    1439 
    1440  timedout = true;
    1441  cerr << Warning("CellWidget::%s(): timeout %.3f (limit:%.1f)."
    1442  ,fname,timer.getCombTimeOnTheFly(),timeout) << endl;
    1443  return true;
    1444  }
    1445 
    1446 
    1447  inline DbU::Unit CellWidget::_snapGridStep () const
    1448  { return symbolicMode() ? DbU::getSymbolicSnapGridStep() : DbU::getRealSnapGridStep(); }
    1449 
    1450 
    1451  inline DbU::Unit CellWidget::_onSnapGrid ( DbU::Unit u ) const
    1452  { return symbolicMode() ? DbU::getOnSymbolicSnapGrid(u) : DbU::getOnRealSnapGrid(u); }
    1453 
    1454 
    1455  inline Point CellWidget::_onSnapGrid ( const Point& p ) const
    1456  { return Point(_onSnapGrid(p.getX()),_onSnapGrid(p.getY())); }
    1457 
    1458 
    1459  inline DbU::Unit CellWidget::_onCursorGrid ( DbU::Unit u ) const
    1460  { return DbU::getOnCustomGrid(u,cursorStep()); }
    1461 
    1462 
    1463  inline Point CellWidget::_onCursorGrid ( const Point& p ) const
    1464  { return Point(_onCursorGrid(p.getX()),_onCursorGrid(p.getY())); }
    1465 
    1466 
    1467 } // End of Hurricane namespace.
    1468 
    1469 
    1470 GETSTRING_POINTER_SUPPORT(Hurricane::CellWidget);
    1471 IOSTREAM_POINTER_SUPPORT(Hurricane::CellWidget);
    static DbU::Unit getOnCustomGrid(DbU::Unit u, DbU::Unit step, SnapMode mode=Nearest)
    +
    1 // -*- C++ -*-
    2 //
    3 // This file is part of the Coriolis Software.
    4 // Copyright (c) UPMC/LIP6 2008-2018, All Rights Reserved
    5 //
    6 // +-----------------------------------------------------------------+
    7 // | C O R I O L I S |
    8 // | V L S I B a c k e n d D a t a - B a s e |
    9 // | |
    10 // | Author : Jean-Paul CHAPUT |
    11 // | E-mail : Jean-Paul.Chaput@asim.lip6.fr |
    12 // | =============================================================== |
    13 // | C++ Header : "./hurricane/viewer/CellWidget.h" |
    14 // +-----------------------------------------------------------------+
    15 
    16 
    17 #pragma once
    18 #include <math.h>
    19 #include <vector>
    20 #include <functional>
    21 #include <memory>
    22 #include <boost/function.hpp>
    23 #include <QWidget>
    24 #include <QPixmap>
    25 #include <QPainter>
    26 #include <QPrinter>
    27 #include <QImage>
    28 #include <QRect>
    29 #include <QPoint>
    30 class QCursor;
    31 class QShowEvent;
    32 class QResizeEvent;
    33 class QMouseEvent;
    34 class QKeyEvent;
    35 class QAction;
    36 
    37 #include "hurricane/Timer.h"
    38 #include "hurricane/Commons.h"
    39 #include "hurricane/Warning.h"
    40 #include "hurricane/Point.h"
    41 #include "hurricane/Box.h"
    42 #include "hurricane/Transformation.h"
    43 #include "hurricane/Query.h"
    44 #include "hurricane/viewer/DisplayStyle.h"
    45 #include "hurricane/viewer/CellWidgets.h"
    46 #include "hurricane/viewer/Selector.h"
    47 #include "hurricane/viewer/SelectorCriterion.h"
    48 #include "hurricane/viewer/Ruler.h"
    49 
    50 
    51 namespace Hurricane {
    52 
    53  using std::vector;
    54  using std::unary_function;
    55  using std::shared_ptr;
    56 
    57  class Technology;
    58  class BasicLayer;
    59  class Go;
    60  class Net;
    61  class Cell;
    62  class Instance;
    63  class Slice;
    64  class Segment;
    65  class Contact;
    66  class Pad;
    67  class Selector;
    68  class PaletteWidget;
    69  class Command;
    70 //class MapView;
    71 
    72  enum UpdateState { ExternalEmit = 0
    73  , InternalEmit
    74  , InternalReceive
    75  };
    76 
    77 
    78 // -------------------------------------------------------------------
    79 // Class : "Hurricane::CellWidget".
    80 
    81 
    82  class CellWidget : public QWidget {
    83  Q_OBJECT;
    84 
    85  private:
    86  class DrawingPlanes;
    87  public:
    88  class State;
    89  typedef void ( DrawExtensionGo_t )( CellWidget*
    90  , const Go*
    91  , const BasicLayer*
    92  , const Box&
    93  , const Transformation&
    94  );
    95  typedef void ( InitExtensionGo_t )( CellWidget* );
    96  typedef boost::function< void(QPainter&) > PainterCb_t;
    97  enum RubberShape { Centric=1, Barycentric, Steiner };
    98  enum TextFlag { Bold =0x0001
    99  , BigFont =0x0002
    100  , Reverse =0x0004
    101  , Frame =0x0008
    102  , Rounded =0x0010
    103  , Center =0x0020
    104  , Left =0x0040
    105  , Right =0x0080
    106  , Top =0x0100
    107  };
    108  enum Flag { NoFlags =0x0000
    109  , NoResetCommands=0x0001
    110  };
    111  public:
    113  public:
    114  // Constructor & Destructor.
    115  CellWidget ( QWidget* parent=NULL );
    116  virtual ~CellWidget ();
    117  // Accessors.
    118  // MapView* getMapView () { return _mapView; };
    119  void setCell ( Cell*, Path topPath=Path(), unsigned int flags=NoFlags );
    120  inline Cell* getCell () const;
    121  inline Cell* getTopCell () const;
    122  inline Path getTopPath () const;
    123  inline shared_ptr<State>& getState ();
    124  inline shared_ptr<State> getStateClone ();
    125  inline PaletteWidget* getPalette ();
    126  inline Occurrences getOccurrencesUnder ( const QRect& ) const;
    127  Occurrences getOccurrencesUnder ( const Box& ) const;
    128  inline SelectorSet& getSelectorSet ();
    129  inline RulerSet& getRulerSet ();
    130  inline RubberShape getRubberShape () const;
    131  inline int getStartLevel () const;
    132  inline int getStopLevel () const;
    133  inline Query::Mask getQueryFilter () const ;
    134  void bindToPalette ( PaletteWidget* );
    135  void detachFromPalette ();
    136  void detach ( Selector*);
    137  void bindCommand ( Command* );
    138  void unbindCommand ( Command* );
    139  void resetCommands ();
    140  inline void setActiveCommand ( Command* );
    141  inline Command* getActiveCommand () const;
    142  Command* getCommand ( const std::string& ) const;
    143  inline void resetActiveCommand ();
    144  inline void setCursorStep ( DbU::Unit );
    145  inline void setRealSnapGridStep ( DbU::Unit step );
    146  inline unsigned int getDbuMode () const;
    147  inline bool gridMode () const;
    148  inline bool symbolicMode () const;
    149  inline bool physicalMode () const;
    150  inline DbU::UnitPower getUnitPower () const;
    151  inline bool showBoundaries () const;
    152  inline bool showSelection () const;
    153  inline bool cumulativeSelection () const;
    154  inline void setDbuMode ( int );
    155  inline void setUnitPower ( DbU::UnitPower );
    156  inline void setRubberShape ( RubberShape );
    157  inline void setStartLevel ( int );
    158  inline void setStopLevel ( int );
    159  inline void setQueryFilter ( Query::Mask );
    160  inline bool timeout ( const char*, const Timer&, double timeout, bool& timedout ) const;
    161  // Painter control & Hurricane objects drawing primitives.
    162  inline void setEnableRedrawInterrupt ( bool );
    163  inline void addDrawExtensionGo ( const Name&, InitExtensionGo_t*, DrawExtensionGo_t* );
    164  inline void copyDrawExtensionGos ( const CellWidget* );
    165  inline QPainter& getPainter ( size_t plane=PlaneId::Working );
    166  inline const DisplayStyle::HSVr& getDarkening () const;
    167  inline void copyToPrinter ( int xpaper, int ypaper, QPrinter*, PainterCb_t& );
    168  inline void copyToImage ( QImage*, PainterCb_t& );
    169  inline int getPixelThreshold () const;
    170  inline const float& getScale () const;
    171  inline const QPoint& getMousePosition () const;
    172  inline void updateMousePosition ();
    173  void setLayerVisible ( const Name& layer, bool visible );
    174  bool isLayerVisible ( const Name& );
    175  bool isDrawable ( const Name& );
    176  bool isDrawableLayer ( const Name& );
    177  bool isDrawableExtension ( const Name& );
    178  bool isSelectable ( const Name& ) const;
    179  bool isSelectable ( const Layer* ) const;
    180  bool isPrinter () const;
    181  void setPrinter ( bool );
    182  inline void setDarkening ( const DisplayStyle::HSVr& );
    183  inline void setPen ( const QPen& , size_t plane=PlaneId::Working );
    184  void drawBox ( DbU::Unit, DbU::Unit, DbU::Unit, DbU::Unit );
    185  void drawBox ( const Box& );
    186  void drawBoxBorder ( const Box& );
    187  void drawLine ( DbU::Unit, DbU::Unit, DbU::Unit, DbU::Unit, bool mode=true );
    188  void drawLine ( const Point&, const Point&, bool mode=true );
    189  void drawText ( const Point&, const char*, unsigned int flags=0, int angle=0 );
    190  void drawGrid ( QRect );
    191  void drawSpot ();
    192  void drawRuler ( shared_ptr<Ruler> );
    193  void drawRulers ( QRect );
    194  void drawDisplayText ( const QRect& , const char*, unsigned int flags=0 );
    195  void drawDisplayText ( const QPoint&, const char*, unsigned int flags=0, int angle=0 );
    196  void drawScreenPolygon ( const QPoint*, int count, size_t plane=PlaneId::Working );
    197  void drawScreenPolygon ( const QPolygon&, size_t plane=PlaneId::Working );
    198  void drawScreenLine ( const QPoint&, const QPoint&, size_t plane=PlaneId::Working, bool mode=true );
    199  void drawScreenRect ( const QPoint&, const QPoint&, size_t plane=PlaneId::Working );
    200  void drawScreenRect ( const QRect& , size_t plane=PlaneId::Working );
    201  void drawScreenPolyline ( const QPoint*, int, int, size_t plane=PlaneId::Working );
    202  // Geometric conversions.
    203  inline DbU::Unit toDbu ( float ) const;
    204  QRect dbuToScreenRect ( DbU::Unit x1, DbU::Unit y1, DbU::Unit x2, DbU::Unit y2, bool usePoint=true ) const;
    205  QRect dbuToScreenRect ( const Box& box , bool usePoint=true ) const;
    206  inline int dbuToScreenX ( DbU::Unit x ) const;
    207  inline int dbuToScreenY ( DbU::Unit y ) const;
    208  inline int dbuToScreenLength ( DbU::Unit length ) const;
    209  inline QPoint dbuToScreenPoint ( DbU::Unit x, DbU::Unit y ) const;
    210  inline QPoint dbuToScreenPoint ( const Point& point ) const;
    211  inline DbU::Unit screenToDbuLength ( int length ) const;
    212  inline DbU::Unit screenToDbuX ( int x ) const;
    213  inline DbU::Unit screenToDbuY ( int y ) const;
    214  inline Point screenToDbuPoint ( const QPoint& point ) const;
    215  inline Box screenToDbuBox ( const QRect& rect ) const;
    216  inline Box& pixelInflate ( Box&, int pixels ) const;
    217  inline Point getTopLeft () const;
    218  inline Box getVisibleArea () const;
    219  Box computeVisibleArea ( float scale ) const;
    220  Box computeVisibleArea ( float scale, const Point& topLeft ) const;
    221  Box computeVisibleArea ( const Box&, float& scale ) const;
    222  inline DbU::Unit cursorStep () const;
    223  inline bool _underDetailedGridThreshold() const;
    224  inline DbU::Unit _snapGridStep () const;
    225  inline DbU::Unit _onSnapGrid ( DbU::Unit ) const;
    226  inline Point _onSnapGrid ( const Point& ) const;
    227  inline DbU::Unit _onCursorGrid ( DbU::Unit ) const;
    228  inline Point _onCursorGrid ( const Point& ) const;
    229  // Qt QWidget Functions Overloads.
    230  void pushCursor ( Qt::CursorShape cursor );
    231  void popCursor ();
    232  virtual QSize minimumSizeHint () const;
    233  virtual void showEvent ( QShowEvent* );
    234  virtual void resizeEvent ( QResizeEvent* );
    235  virtual void wheelEvent ( QWheelEvent* );
    236  virtual void keyPressEvent ( QKeyEvent* );
    237  virtual void keyReleaseEvent ( QKeyEvent* );
    238  virtual void mouseMoveEvent ( QMouseEvent* );
    239  virtual void mousePressEvent ( QMouseEvent* );
    240  virtual void mouseReleaseEvent ( QMouseEvent* );
    241  signals:
    242  void cellChanged ( Cell* );
    243  void cellPreModificated ();
    244  void cellPostModificated ();
    245  void stateChanged ( shared_ptr<CellWidget::State>& );
    246  void styleChanged ();
    247  void queryFilterChanged ();
    248  void dbuModeChanged ( unsigned int mode, DbU::UnitPower );
    249  void updatePalette ( Cell* );
    250  void mousePositionChanged ( const Point& position );
    251  void selectionModeChanged ();
    252  void selectionChanged ( const SelectorSet& );
    253  void selectionToggled ( Selector* );
    254  void unlinkSelector ( Selector* );
    255  void showBoundariesToggled ( bool );
    256  protected:
    257  virtual void paintEvent ( QPaintEvent* );
    258  public slots:
    259  // Qt QWidget Slots Overload & CellWidget Specifics.
    260  void setState ( shared_ptr<CellWidget::State>&
    261  , unsigned int flags=NoFlags );
    262  inline void openRefreshSession ();
    263  inline void closeRefreshSession ();
    264  inline DrawingPlanes& getDrawingPlanes ();
    265  // void select ( const Net* );
    266  void select ( Occurrence );
    267  bool isSelected ( Occurrence );
    268  void selectOccurrencesUnder ( Box selectArea );
    269  // void unselect ( const Net* );
    270  void unselect ( Occurrence );
    271  void unselectAll ();
    272  void toggleSelection ( Occurrence );
    273  void setShowSelection ( bool state );
    274  void setCumulativeSelection ( bool state );
    275  // void _select ( const Net* );
    276  // void _unselect ( const Net* );
    277  // void _selectOccurrencesUnder ( Box selectArea );
    278  void _unselectAll ();
    279  inline void addRuler ( const Point&, const Point& );
    280  inline void addRuler ( shared_ptr<Ruler> );
    281  inline void clearRulers ();
    282  void changeQueryFilter ();
    283  void rubberChange ();
    284  void changeDbuMode ( unsigned int mode, DbU::UnitPower );
    285  void setStyle ( int id );
    286  void updatePalette ();
    287  void cellPreModificate ();
    288  void cellPostModificate ();
    289  inline void refresh ();
    290  void _redraw ( QRect redrawArea );
    291  inline void redrawSelection ();
    292  void redrawSelection ( QRect redrawArea );
    293  void goLeft ( int dx = 0 );
    294  void goRight ( int dx = 0 );
    295  void goUp ( int dy = 0 );
    296  void goDown ( int dy = 0 );
    297  void fitToContents ( bool historyEnable=true );
    298  void fitToNet ( const Net*, bool historyEnable=true );
    299  void setScale ( float );
    300  void scaleHistoryUp ();
    301  void scaleHistoryDown ();
    302  // void setGridMode ();
    303  // void setSymbolicMode ();
    304  // void setPhysicalMode ( DbU::UnitPower );
    305  void setShowBoundaries ( bool state );
    306  void reframe ();
    307  void reframe ( const Box& box, bool historyEnable=true );
    308  void displayReframe ();
    309  void _goLeft ( int dx );
    310  void _goRight ( int dx );
    311  void _goUp ( int dy );
    312  void _goDown ( int dy );
    313  void _refresh ();
    314  std::string _getString () const;
    315 
    316  private:
    317  class Spot {
    318  public:
    319  Spot ( CellWidget* );
    320  void setRestore ( bool );
    321  inline void setShowSpot ( bool );
    322  inline const QPoint& getSpotPoint () const;
    323  void restore ();
    324  QPoint computeSpotPoint ( const QPoint& );
    325  void moveTo ( const QPoint& );
    326  private:
    327  CellWidget* _cellWidget;
    328  QPoint _spotPoint;
    329  bool _restore;
    330  bool _showSpot;
    331  };
    332 
    333  private:
    334  class RedrawEvent {
    335  public:
    336  enum EventType { GoLeft = 1
    337  , GoRight = 2
    338  , GoUp = 3
    339  , GoDown = 4
    340  , Refresh = 5
    341  };
    342  public:
    343  RedrawEvent ( EventType, int shift, CellWidget* );
    344  inline EventType getType () const;
    345  inline int getShift () const;
    346  private:
    347  EventType _type;
    348  int _shift;
    349  };
    350 
    351  private:
    352  class RedrawManager {
    353  public:
    354  inline RedrawManager ( CellWidget* );
    355  ~RedrawManager ();
    356  void goLeft ( int );
    357  void goRight ( int );
    358  void goUp ( int );
    359  void goDown ( int );
    360  void refresh ();
    361  void process ();
    362  inline void stopProcessing ();
    363  inline bool isProcessing () const;
    364  inline bool interrupted () const;
    365  inline size_t getPendings () const;
    366  inline void openRefreshSession ();
    367  inline void closeRefreshSession ();
    368  private:
    369  CellWidget* _widget;
    370  list<RedrawEvent*> _events;
    371  int _refreshSession;
    372  bool _processing;
    373  bool _interrupted;
    374  };
    375 
    376  public:
    377  class PlaneId {
    378  public:
    379  enum Ids { Normal = 0 // _planes[0]
    380  , Selection = 1 // _planes[1]
    381  , AutoCopy = 2 // _planes[2]
    382  , Widget = 3
    383  , Printer = 4
    384  , Image = 5
    385  , Working = 6
    386  };
    387  };
    388 
    389  private:
    390  class DrawingPlanes {
    391  public:
    392  DrawingPlanes ( const QSize& size, CellWidget* cw );
    393  ~DrawingPlanes ();
    394  inline bool getLineMode () const;
    395  inline size_t getWorkingPlane () const;
    396  inline void pushWorkingPlane ();
    397  inline void popWorkingPlane ();
    398  inline int width () const;
    399  inline int height () const;
    400  inline QSize size () const;
    401  inline void select ( size_t i );
    402  inline QPainter& painter ( size_t i=PlaneId::Working );
    403  inline void begin ( size_t i=PlaneId::Working );
    404  inline void end ( size_t i=PlaneId::Working );
    405  inline void buffersBegin ();
    406  inline void buffersEnd ();
    407  void setLineMode ( bool mode );
    408  void setPen ( const QPen& pen );
    409  void setBrush ( const QBrush& brush );
    410  void setBackground ( const QBrush& brush );
    411  void setBackgroundMode ( Qt::BGMode mode );
    412  void resize ( const QSize& size );
    413  void shiftLeft ( int dx );
    414  void shiftRight ( int dx );
    415  void shiftUp ( int dy );
    416  void shiftDown ( int dy );
    417  inline void copyToSelect ();
    418  inline void copyToSelect ( const QRect& );
    419  void copyToSelect ( int sx, int sy, int h, int w );
    420  inline void copyToScreen ();
    421  void copyToScreen ( int sx, int sy, int h, int w );
    422  inline void copyToPrinter ( int xpaper, int ypaper, QPrinter*, CellWidget::PainterCb_t& );
    423  void copyToPrinter ( int xpaper, int ypaper, int sx, int sy, int h, int w, QPrinter*, CellWidget::PainterCb_t& );
    424  inline void copyToImage ( QImage*, CellWidget::PainterCb_t& );
    425  void copyToImage ( int sx, int sy, int h, int w, QImage*, CellWidget::PainterCb_t& );
    426  private:
    427  static const int _cartoucheWidth;
    428  static const int _cartoucheHeight;
    429  static const int _titleHeight;
    430  CellWidget* _cellWidget;
    431  QPrinter* _printer;
    432  QImage* _image;
    433  QPixmap* _planes[3];
    434  QPainter _painters[PlaneId::Working];
    435  QPen _normalPen;
    436  QPen _linePen;
    437  QPoint _brushOrigin;
    438  size_t _workingPlane;
    439  size_t _pushWorkingPlane;
    440  bool _lineMode;
    441  private:
    442  DrawingPlanes ( const DrawingPlanes& );
    443  DrawingPlanes& operator= ( const DrawingPlanes& );
    444  };
    445 
    446  private:
    447  class DrawingQuery : public Query {
    448  public:
    449  DrawingQuery ( CellWidget* widget );
    450  inline void setQuery ( const Box& area
    451  , const Transformation& transformation
    452  , const BasicLayer* basicLayer
    453  , ExtensionSlice::Mask extensionMask
    454  , unsigned int filter
    455  );
    456  inline void addDrawExtensionGo ( const Name&
    457  , InitExtensionGo_t*
    458  , DrawExtensionGo_t*
    459  );
    460  inline void copyDrawExtensionGos ( const DrawingQuery& );
    461  void setDrawExtensionGo ( const Name& );
    462  virtual bool hasMasterCellCallback () const;
    463  virtual bool hasGoCallback () const;
    464  virtual bool hasMarkerCallback () const;
    465  virtual bool hasRubberCallback () const;
    466  virtual bool hasExtensionGoCallback () const;
    467  virtual void masterCellCallback ();
    468  virtual void goCallback ( Go* );
    469  virtual void rubberCallback ( Rubber* );
    470  virtual void markerCallback ( Marker* );
    471  virtual void extensionGoCallback ( Go* );
    472  void drawMasterCell ( const Cell* cell
    473  , const Transformation& transformation
    474  );
    475  void drawGo ( const Go* go
    476  , const BasicLayer* basicLayer
    477  , const Box& area
    478  , const Transformation& transformation
    479  );
    480  void drawRubber ( const Rubber* rubber
    481  , const Box& area
    482  , const Transformation& transformation
    483  );
    484  void drawMarker ( const Marker* marker
    485  , const Box& area
    486  , const Transformation& transformation
    487  );
    488  void drawExtensionGo ( CellWidget* widget
    489  , const Go* go
    490  , const BasicLayer* basicLayer
    491  , const Box& area
    492  , const Transformation& transformation
    493  );
    494  inline unsigned int getGoCount () const;
    495  inline unsigned int getExtensionGoCount () const;
    496  inline unsigned int getInstanceCount () const;
    497  inline void resetGoCount ();
    498  inline void resetExtensionGoCount ();
    499  inline void resetInstanceCount ();
    500 
    501  protected:
    502  CellWidget* _cellWidget;
    503  DrawExtensionGo_t* _drawExtensionGo;
    504  map<Name,pair<InitExtensionGo_t*,DrawExtensionGo_t*> >
    505  _drawExtensionGos;
    506  unsigned int _goCount;
    507  unsigned int _extensionGoCount;
    508  unsigned int _instanceCount;
    509  };
    510 
    511  private:
    512  class TextDrawingQuery : public Query {
    513  public:
    514  TextDrawingQuery ( CellWidget* widget );
    515  inline void setQuery ( const Box& area
    516  , const Transformation& transformation
    517  );
    518  virtual bool hasMasterCellCallback () const;
    519  virtual bool hasGoCallback () const;
    520  virtual bool hasRubberCallback () const;
    521  virtual bool hasExtensionGoCallback () const;
    522  virtual void masterCellCallback ();
    523  virtual void goCallback ( Go* go );
    524  virtual void extensionGoCallback ( Go* go );
    525  virtual void rubberCallback ( Rubber* );
    526 
    527  protected:
    528  CellWidget* _cellWidget;
    529  };
    530 
    531  private:
    532  class SelectorCriterions {
    533  public:
    534  SelectorCriterions ();
    535  ~SelectorCriterions ();
    536  inline void setCellWidget ( CellWidget* );
    537  inline const vector<SelectorCriterion*>& getCriterions () const;
    538  SelectorCriterion* add ( const Net* net );
    539  SelectorCriterion* add ( Box area );
    540  inline SelectorCriterion* add ( SelectorCriterion* );
    541  bool remove ( const Net* net );
    542  void clear ();
    543  void invalidate ();
    544  void revalidate ();
    545  inline size_t size () const;
    546  private:
    547  CellWidget* _cellWidget;
    548  vector<SelectorCriterion*> _criterions;
    549  };
    550 
    551  public:
    552  class State {
    553  public:
    554  inline State ( Cell* cell=NULL, Path topPath=Path() );
    555  State* clone () const;
    556  inline void setCell ( Cell* );
    557  inline void setTopPath ( Path );
    558  inline void setCellWidget ( CellWidget* );
    559  inline void setCursorStep ( DbU::Unit );
    560  inline DbU::Unit getCursorStep () const;
    561  inline DbU::UnitPower getUnitPower () const;
    562  inline void setDbuMode ( int );
    563  inline void setUnitPower ( DbU::UnitPower );
    564  inline void setShowBoundaries ( bool );
    565  inline void setShowSelection ( bool );
    566  inline void setCumulativeSelection ( bool );
    567  void setScale ( float );
    568  inline void setTopLeft ( DbU::Unit, DbU::Unit );
    569  inline void setTopLeft ( const Point& );
    570  inline void setQueryFilter ( Query::Mask );
    571  inline void setStartLevel ( int );
    572  inline void setStopLevel ( int );
    573  inline void setRubberShape ( RubberShape );
    574  inline void setHistoryEnable ( bool );
    575  bool scaleHistoryUp ();
    576  bool scaleHistoryDown ();
    577  inline Cell* getCell () const;
    578  inline Cell* getTopCell () const;
    579  inline Path getTopPath () const;
    580  const Name& getName () const;
    581  inline SelectorCriterions& getSelection ();
    582  inline RulerSet& getRulers ();
    583  inline DbU::Unit cursorStep () const;
    584  inline unsigned int getDbuMode () const;
    585  inline bool gridMode () const;
    586  inline bool symbolicMode () const;
    587  inline bool physicalMode () const;
    588  inline bool nanoMode () const;
    589  inline bool microMode () const;
    590  inline bool showBoundaries () const;
    591  inline bool showSelection () const;
    592  inline bool cumulativeSelection () const;
    593  inline bool getHistoryEnable () const;
    594  inline size_t getHistorySize () const;
    595  inline const float& getScale () const;
    596  inline const Point& getTopLeft () const;
    597  inline Query::Mask getQueryFilter () const;
    598  inline int getStartLevel () const;
    599  inline int getStopLevel () const;
    600  inline RubberShape getRubberShape () const;
    601 
    602  private:
    603  class ScaleEntry {
    604  public:
    605  inline ScaleEntry ( float, const Point& );
    606  public:
    607  float _scale;
    608  Point _topLeft;
    609  };
    610 
    611  private:
    612  Cell* _cell;
    613  Path _topPath;
    614  Name _hierarchicalName;
    615  CellWidget* _cellWidget;
    616  SelectorCriterions _selection;
    617  RulerSet _rulers;
    618  DbU::Unit _cursorStep;
    619  unsigned int _dbuMode;
    620  DbU::UnitPower _unitPower;
    621  bool _showBoundaries;
    622  bool _showSelection;
    623  Query::Mask _queryFilter;
    624  int _startLevel;
    625  int _stopLevel;
    626  RubberShape _rubberShape;
    627  bool _cumulativeSelection;
    628  vector<ScaleEntry> _scaleHistory;
    629  size_t _ihistory;
    630  bool _historyEnable;
    631  };
    632  public:
    633  class FindStateName : public unary_function< const shared_ptr<State>&, bool > {
    634  public:
    635  inline FindStateName ( const Name& );
    636  inline bool operator() ( const shared_ptr<State>& );
    637  private:
    638  const Name _cellHierName;
    639  };
    640 
    641  protected:
    642  // Internal: Attributes.
    643  vector<Qt::CursorShape> _cursors;
    644  // MapView* _mapView;
    645  Technology* _technology;
    646  PaletteWidget* _palette;
    647  Box _screenArea;
    648  RedrawManager _redrawManager;
    649  DrawingPlanes _drawingPlanes;
    650  DrawingQuery _drawingQuery;
    651  TextDrawingQuery _textDrawingQuery;
    652  DisplayStyle::HSVr _darkening;
    653  QPoint _mousePosition;
    654  Spot _spot;
    655  shared_ptr<State> _state;
    656  bool _isPrinter;
    657  bool _cellChanged;
    658  bool _selectionHasChanged;
    659  int _delaySelectionChanged;
    660  bool _cellModificated;
    661  bool _enableRedrawInterrupt;
    662  SelectorSet _selectors;
    663  Command* _activeCommand;
    664  vector<Command*> _commands;
    665  size_t _redrawRectCount;
    666  int _textFontHeight;
    667  int _pixelThreshold;
    668 
    669  friend class RedrawManager;
    670  };
    671 
    672 
    673  inline void CellWidget::Spot::setShowSpot ( bool show )
    674  { _showSpot = show; }
    675 
    676 
    677  inline const QPoint& CellWidget::Spot::getSpotPoint () const
    678  { return _spotPoint; }
    679 
    680 
    681  inline void CellWidget::DrawingQuery::setQuery ( const Box& area
    682  , const Transformation& transformation
    683  , const BasicLayer* basicLayer
    684  , ExtensionSlice::Mask extensionMask
    685  , unsigned int filter
    686  )
    687  {
    688  Query::setQuery ( _cellWidget->getCell()
    689  , area
    690  , transformation
    691  , basicLayer
    692  , extensionMask
    693  , filter
    694  );
    695  }
    696 
    697 
    698  inline void CellWidget::setEnableRedrawInterrupt ( bool state )
    699  { _enableRedrawInterrupt = state; }
    700 
    701 
    702  inline void CellWidget::openRefreshSession ()
    703  { _redrawManager.openRefreshSession (); }
    704 
    705 
    706  inline void CellWidget::closeRefreshSession ()
    707  { _redrawManager.closeRefreshSession (); }
    708 
    709 
    710  inline void CellWidget::DrawingQuery::addDrawExtensionGo ( const Name& name
    711  , InitExtensionGo_t* initExtensionGo
    712  , DrawExtensionGo_t* drawExtensionGo
    713  )
    714  { _drawExtensionGos[name] = make_pair(initExtensionGo,drawExtensionGo); }
    715 
    716 
    717  inline void CellWidget::DrawingQuery::copyDrawExtensionGos ( const CellWidget::DrawingQuery& other )
    718  { _drawExtensionGos = other._drawExtensionGos; }
    719 
    720 
    721  inline void CellWidget::DrawingQuery::resetGoCount ()
    722  { _goCount = 0; }
    723 
    724 
    725  inline void CellWidget::DrawingQuery::resetExtensionGoCount ()
    726  { _extensionGoCount = 0; }
    727 
    728 
    729  inline void CellWidget::DrawingQuery::resetInstanceCount ()
    730  { _instanceCount = 0; }
    731 
    732 
    733  inline unsigned int CellWidget::DrawingQuery::getGoCount () const
    734  { return _goCount; }
    735 
    736 
    737  inline unsigned int CellWidget::DrawingQuery::getExtensionGoCount () const
    738  { return _extensionGoCount; }
    739 
    740 
    741  inline unsigned int CellWidget::DrawingQuery::getInstanceCount () const
    742  { return _instanceCount; }
    743 
    744 
    745  inline CellWidget::RedrawEvent::EventType CellWidget::RedrawEvent::getType () const
    746  { return _type; }
    747 
    748 
    749  inline int CellWidget::RedrawEvent::getShift () const
    750  { return _shift; }
    751 
    752 
    753  inline bool CellWidget::RedrawManager::isProcessing () const
    754  { return _processing; }
    755 
    756 
    757  inline void CellWidget::RedrawManager::stopProcessing ()
    758  { _processing = false; }
    759 
    760 
    761  inline size_t CellWidget::RedrawManager::getPendings () const
    762  { return _events.size(); }
    763 
    764 
    765  inline void CellWidget::RedrawManager::openRefreshSession ()
    766  { _refreshSession++; }
    767 
    768 
    769  inline void CellWidget::RedrawManager::closeRefreshSession ()
    770  {
    771  _refreshSession--;
    772  if ( !_processing && (_refreshSession == 0) ) process ();
    773  }
    774 
    775 
    776  inline bool CellWidget::RedrawManager::interrupted () const
    777  {
    778 #ifdef ALLOW_REQUEST_INTERRUPT
    779  return ( _events.size() > 5 ) || _interrupted;
    780 #else
    781  return _interrupted;
    782 #endif
    783  }
    784 
    785 
    786  inline bool CellWidget::DrawingPlanes::getLineMode () const
    787  { return _lineMode; }
    788 
    789 
    790  inline size_t CellWidget::DrawingPlanes::getWorkingPlane () const
    791  { return _workingPlane; }
    792 
    793 
    794  inline void CellWidget::DrawingPlanes::pushWorkingPlane ()
    795  { _pushWorkingPlane = _workingPlane; }
    796 
    797 
    798  inline void CellWidget::DrawingPlanes::popWorkingPlane ()
    799  { _workingPlane = _pushWorkingPlane; }
    800 
    801 
    802  inline int CellWidget::DrawingPlanes::width () const
    803  { return _planes[PlaneId::Normal]->width(); }
    804 
    805 
    806  inline int CellWidget::DrawingPlanes::height () const
    807  { return _planes[PlaneId::Normal]->height(); }
    808 
    809 
    810  inline QSize CellWidget::DrawingPlanes::size () const
    811  { return _planes[PlaneId::Normal]->size(); }
    812 
    813 
    814  inline void CellWidget::DrawingPlanes::select ( size_t i )
    815  { _workingPlane = i; }
    816 
    817 
    818  inline QPainter& CellWidget::DrawingPlanes::painter ( size_t i )
    819  { return _painters[ (i>=PlaneId::Working) ? _workingPlane : i ]; }
    820 
    821 
    822  inline void CellWidget::DrawingPlanes::begin ( size_t i )
    823  {
    824  size_t wp = (i>=PlaneId::Working) ? _workingPlane : i;
    825  switch ( wp ) {
    826  case PlaneId::Normal:
    827  case PlaneId::Selection:
    828  case PlaneId::AutoCopy: _painters[wp ].begin( _planes[wp] ); break;
    829  case PlaneId::Widget: _painters[PlaneId::Widget ].begin( _cellWidget ); break;
    830  case PlaneId::Printer: _painters[PlaneId::Printer].begin( _printer ); break;
    831  case PlaneId::Image: _painters[PlaneId::Image ].begin( _image ); break;
    832  default:
    833  std::cerr << "[BUG] Bad plane selection." << std::endl;
    834  }
    835  }
    836 
    837 
    838  inline void CellWidget::DrawingPlanes::end ( size_t i )
    839  { _painters[(i>=PlaneId::Working)?_workingPlane:i].end (); }
    840 
    841 
    842  inline void CellWidget::DrawingPlanes::buffersBegin ()
    843  {
    844  begin( PlaneId::Normal );
    845  begin( PlaneId::Selection );
    846  begin( PlaneId::AutoCopy );
    847  }
    848 
    849 
    850  inline void CellWidget::DrawingPlanes::buffersEnd ()
    851  {
    852  end( PlaneId::Normal );
    853  end( PlaneId::Selection );
    854  end( PlaneId::AutoCopy );
    855  }
    856 
    857 
    858  inline void CellWidget::DrawingPlanes::copyToSelect ()
    859  { copyToSelect ( 0, 0, width(), height() ); }
    860 
    861 
    862  inline void CellWidget::DrawingPlanes::copyToSelect ( const QRect& r )
    863  { copyToSelect ( r.x(), r.y(), r.width(), r.height() ); }
    864 
    865 
    866  inline void CellWidget::DrawingPlanes::copyToScreen ()
    867  { copyToScreen ( 0, 0, width(), height() ); }
    868 
    869 
    870  inline void CellWidget::DrawingPlanes::copyToPrinter ( int xpaper, int ypaper, QPrinter* printer, CellWidget::PainterCb_t& cb )
    871  {
    872  copyToPrinter ( xpaper
    873  , ypaper
    874  , 0
    875  , 0
    876  , _cellWidget->geometry().width()
    877  , _cellWidget->geometry().height()
    878  , printer
    879  , cb
    880  );
    881  }
    882 
    883 
    884  inline void CellWidget::DrawingPlanes::copyToImage ( QImage* image, CellWidget::PainterCb_t& cb )
    885  {
    886  copyToImage ( 0
    887  , 0
    888  , _cellWidget->geometry().width()
    889  , _cellWidget->geometry().height()
    890  , image
    891  , cb
    892  );
    893  }
    894 
    895 
    896  inline void CellWidget::SelectorCriterions::setCellWidget ( CellWidget* cw )
    897  { _cellWidget = cw; }
    898 
    899 
    900  inline size_t CellWidget::SelectorCriterions::size () const
    901  { return _criterions.size(); }
    902 
    903 
    904  inline const vector<SelectorCriterion*>& CellWidget::SelectorCriterions::getCriterions () const
    905  { return _criterions; }
    906 
    907 
    908  inline SelectorCriterion* CellWidget::SelectorCriterions::add ( SelectorCriterion* criterion )
    909  {
    910  _criterions.push_back( criterion );
    911  return _criterions.back();
    912  }
    913 
    914 
    915  inline CellWidget::State::ScaleEntry::ScaleEntry ( float scale, const Point& topLeft )
    916  : _scale(scale), _topLeft(topLeft)
    917  { }
    918 
    919 
    920  inline CellWidget::State::State ( Cell* cell, Path topPath )
    921  : _cell (cell)
    922  , _topPath (topPath)
    923  , _hierarchicalName ()
    924  , _cellWidget (NULL)
    925  , _selection ()
    926  , _rulers ()
    927  , _cursorStep (DbU::lambda(0.5))
    928  , _dbuMode (DbU::Symbolic)
    929  , _unitPower (DbU::Nano)
    930  , _showBoundaries (true)
    931  , _showSelection (false)
    932  , _queryFilter (~Query::DoTerminalCells)
    933  , _startLevel (0)
    934  , _stopLevel (99)
    935  , _rubberShape (CellWidget::Barycentric)
    936  , _cumulativeSelection(false)
    937  , _scaleHistory ()
    938  , _ihistory (0)
    939  , _historyEnable (false)
    940  {
    941  _scaleHistory.push_back ( ScaleEntry(1.0,Point(0,0)) );
    942  if (_cell) _hierarchicalName = Name( _cell->getHierarchicalName() );
    943  }
    944 
    945 
    946  inline unsigned int CellWidget::State::getDbuMode () const
    947  { return _dbuMode; }
    948 
    949 
    950  inline bool CellWidget::State::symbolicMode () const
    951  { return (_dbuMode == DbU::Symbolic); }
    952 
    953 
    954  inline bool CellWidget::State::gridMode () const
    955  { return (_dbuMode == DbU::Grid); }
    956 
    957 
    958  inline bool CellWidget::State::physicalMode () const
    959  { return (_dbuMode == DbU::Physical); }
    960 
    961 
    962  inline void CellWidget::State::setCell ( Cell* cell )
    963  {
    964  _cell = cell;
    965  if (_cell) _hierarchicalName = Name( _cell->getHierarchicalName() );
    966  }
    967 
    968 
    969  inline void CellWidget::State::setTopPath ( Path topPath )
    970  { _topPath = topPath; }
    971 
    972 
    973  inline void CellWidget::State::setCellWidget ( CellWidget* cw )
    974  {
    975  _cellWidget = cw;
    976  _selection.setCellWidget ( cw );
    977  }
    978 
    979 
    980  inline void CellWidget::State::setCursorStep ( DbU::Unit step )
    981  { _cursorStep = step; }
    982 
    983  inline DbU::Unit CellWidget::State::getCursorStep () const
    984  { return _cursorStep; }
    985 
    986 
    987  inline DbU::UnitPower CellWidget::State::getUnitPower () const
    988  { return _unitPower; }
    989 
    990 
    991  inline void CellWidget::State::setDbuMode ( int mode )
    992  {
    993  _dbuMode = mode;
    994  switch ( _dbuMode ) {
    995  case DbU::Symbolic: _cursorStep = DbU::fromLambda(0.5); break;
    996  case DbU::Grid: _cursorStep = DbU::fromGrid (1.0); break;
    997  case DbU::Physical: _cursorStep = DbU::fromGrid (1.0); break;
    998  }
    999  }
    1000 
    1001 
    1002  inline void CellWidget::State::setUnitPower ( DbU::UnitPower p )
    1003  { _unitPower = p; }
    1004 
    1005 
    1006  inline void CellWidget::State::setShowBoundaries ( bool state )
    1007  { _showBoundaries = state; }
    1008 
    1009 
    1010  inline void CellWidget::State::setShowSelection ( bool state )
    1011  { _showSelection = state; }
    1012 
    1013 
    1014  inline void CellWidget::State::setCumulativeSelection ( bool state )
    1015  { _cumulativeSelection = state; }
    1016 
    1017 
    1018  inline void CellWidget::State::setTopLeft ( DbU::Unit x, DbU::Unit y )
    1019  {
    1020  _scaleHistory[_ihistory]._topLeft.setX(x);
    1021  _scaleHistory[_ihistory]._topLeft.setY(y);
    1022  }
    1023 
    1024 
    1025  inline void CellWidget::State::setTopLeft ( const Point& topLeft )
    1026  { _scaleHistory[_ihistory]._topLeft = topLeft; }
    1027 
    1028 
    1029  inline void CellWidget::State::setQueryFilter ( Query::Mask mask )
    1030  { _queryFilter = mask; }
    1031 
    1032 
    1033  inline void CellWidget::State::setStartLevel ( int level )
    1034  { _startLevel = level; }
    1035 
    1036 
    1037  inline void CellWidget::State::setStopLevel ( int level )
    1038  { _stopLevel = level; }
    1039 
    1040 
    1041  inline void CellWidget::State::setRubberShape ( RubberShape shape )
    1042  { _rubberShape = shape; }
    1043 
    1044 
    1045  inline void CellWidget::State::setHistoryEnable ( bool enable )
    1046  { _historyEnable = enable; }
    1047 
    1048 
    1049  inline Cell* CellWidget::State::getCell () const
    1050  { return _cell; }
    1051 
    1052 
    1053  inline Path CellWidget::State::getTopPath () const
    1054  { return _topPath; }
    1055 
    1056 
    1057  inline Cell* CellWidget::State::getTopCell () const
    1058  { return (_topPath.isEmpty()) ? _cell : _topPath.getOwnerCell(); }
    1059 
    1060 
    1061  inline DbU::Unit CellWidget::State::cursorStep () const
    1062  { return _cursorStep; }
    1063 
    1064 
    1065  inline CellWidget::SelectorCriterions& CellWidget::State::getSelection ()
    1066  { return _selection; }
    1067 
    1068 
    1069  inline RulerSet& CellWidget::State::getRulers ()
    1070  { return _rulers; }
    1071 
    1072 
    1073  inline bool CellWidget::State::showBoundaries () const
    1074  { return _showBoundaries; }
    1075 
    1076 
    1077  inline bool CellWidget::State::showSelection () const
    1078  { return _showSelection; }
    1079 
    1080 
    1081  inline bool CellWidget::State::cumulativeSelection () const
    1082  { return _cumulativeSelection; }
    1083 
    1084 
    1085  inline bool CellWidget::State::getHistoryEnable () const
    1086  { return _historyEnable; }
    1087 
    1088 
    1089  inline size_t CellWidget::State::getHistorySize () const
    1090  { return _scaleHistory.size(); }
    1091 
    1092 
    1093  inline const Point& CellWidget::State::getTopLeft () const
    1094  { return _scaleHistory[_ihistory]._topLeft; }
    1095 
    1096 
    1097  inline Query::Mask CellWidget::State::getQueryFilter () const
    1098  { return _queryFilter; }
    1099 
    1100 
    1101  inline int CellWidget::State::getStartLevel () const
    1102  { return _startLevel; }
    1103 
    1104 
    1105  inline int CellWidget::State::getStopLevel () const
    1106  { return _stopLevel; }
    1107 
    1108 
    1109  inline CellWidget::RubberShape CellWidget::State::getRubberShape () const
    1110  { return _rubberShape; }
    1111 
    1112 
    1113  inline const float& CellWidget::State::getScale () const
    1114  { return _scaleHistory[_ihistory]._scale; }
    1115 
    1116 
    1117  inline int CellWidget::getPixelThreshold () const
    1118  { return _pixelThreshold; }
    1119 
    1120  inline CellWidget::FindStateName::FindStateName ( const Name& cellHierName )
    1121  : unary_function< const shared_ptr<State>&, bool >()
    1122  , _cellHierName(cellHierName)
    1123  { }
    1124 
    1125 
    1126  inline bool CellWidget::FindStateName::operator () ( const shared_ptr<State>& state )
    1127  { return state->getName() == _cellHierName; }
    1128 
    1129 
    1130  inline void CellWidget::setActiveCommand ( Command* command )
    1131  { _activeCommand = command; }
    1132 
    1133 
    1134  inline Command* CellWidget::getActiveCommand () const
    1135  { return _activeCommand; }
    1136 
    1137 
    1138  inline void CellWidget::resetActiveCommand ()
    1139  { _activeCommand = NULL; }
    1140 
    1141 
    1142  inline void CellWidget::setCursorStep ( DbU::Unit step )
    1143  { _state->setCursorStep(step); }
    1144 
    1145 
    1146  inline void CellWidget::setRealSnapGridStep ( DbU::Unit step )
    1147  { DbU::setRealSnapGridStep(step); }
    1148 
    1149 
    1150  inline shared_ptr<CellWidget::State>& CellWidget::getState ()
    1151  {
    1152  _state->setTopLeft ( getTopLeft() );
    1153  return _state;
    1154  }
    1155 
    1156 
    1157  inline shared_ptr<CellWidget::State> CellWidget::getStateClone ()
    1158  {
    1159  _state->setTopLeft ( getTopLeft() );
    1160  return shared_ptr<State>( _state->clone() );
    1161  }
    1162 
    1163 
    1164  inline void CellWidget::addDrawExtensionGo ( const Name& name
    1165  , InitExtensionGo_t* initExtensionGo
    1166  , DrawExtensionGo_t* drawExtensionGo
    1167  )
    1168  { _drawingQuery.addDrawExtensionGo( name, initExtensionGo, drawExtensionGo ); }
    1169 
    1170 
    1171  inline void CellWidget::copyDrawExtensionGos ( const CellWidget* other )
    1172  { _drawingQuery.copyDrawExtensionGos( other->_drawingQuery ); }
    1173 
    1174 
    1175  inline void CellWidget::setStartLevel ( int level )
    1176  {
    1177  _drawingQuery.setStartLevel ( level );
    1178  _state->setStartLevel ( level );
    1179  emit queryFilterChanged ();
    1180  }
    1181 
    1182 
    1183  inline void CellWidget::setStopLevel ( int level )
    1184  {
    1185  _drawingQuery.setStopLevel ( level );
    1186  _state->setStopLevel ( level );
    1187  emit queryFilterChanged ();
    1188  }
    1189 
    1190 
    1191  inline int CellWidget::getStartLevel () const
    1192  { return _drawingQuery.getStartLevel (); }
    1193 
    1194 
    1195  inline int CellWidget::getStopLevel () const
    1196  { return _drawingQuery.getStopLevel (); }
    1197 
    1198 
    1199  inline CellWidget::DrawingPlanes& CellWidget::getDrawingPlanes ()
    1200  { return _drawingPlanes; }
    1201 
    1202 
    1203  inline SelectorSet& CellWidget::getSelectorSet ()
    1204  { return _selectors; }
    1205 
    1206 
    1207  Occurrences CellWidget::getOccurrencesUnder ( const QRect& area ) const
    1208  { return getOccurrencesUnder(screenToDbuBox(area)); }
    1209 
    1210 
    1211  inline void CellWidget::addRuler ( const Point& origin, const Point& extremity )
    1212  {
    1213  _state->getRulers().insert ( shared_ptr<Ruler>( new Ruler(origin,extremity) ) );
    1214  refresh ();
    1215  }
    1216 
    1217 
    1218  inline void CellWidget::addRuler ( shared_ptr<Ruler> ruler )
    1219  {
    1220  _state->getRulers().insert ( ruler );
    1221  refresh ();
    1222  }
    1223 
    1224 
    1225  inline void CellWidget::clearRulers ()
    1226  { _state->getRulers().clear (); refresh(); }
    1227 
    1228 
    1229  inline void CellWidget::refresh ()
    1230  { _redrawManager.refresh(); }
    1231 
    1232 
    1233  inline void CellWidget::redrawSelection ()
    1234  { redrawSelection ( QRect(QPoint(0,0),_drawingPlanes.size()) ); }
    1235 
    1236 
    1237  inline void CellWidget::copyToPrinter ( int xpaper, int ypaper, QPrinter* printer, CellWidget::PainterCb_t& cb )
    1238  { _drawingPlanes.copyToPrinter( xpaper, ypaper, printer, cb ); }
    1239 
    1240 
    1241  inline void CellWidget::copyToImage ( QImage* image, PainterCb_t& cb )
    1242  { _drawingPlanes.copyToImage ( image, cb ); }
    1243 
    1244 
    1245  inline DbU::Unit CellWidget::toDbu ( float d ) const
    1246  {
    1247  DbU::Unit unit;
    1248  switch ( getDbuMode() ) {
    1249  case DbU::Physical: unit = DbU::grid(DbU::physicalToGrid(d,DbU::Micro)); break;
    1250  case DbU::Grid: unit = DbU::grid(d); break;
    1251  case DbU::Db: unit = DbU::db((long)d); break;
    1252  default:
    1253  case DbU::Symbolic: unit = DbU::lambda(d); break;
    1254  }
    1255  return unit;
    1256  }
    1257 
    1258 
    1259  inline int CellWidget::dbuToScreenX ( DbU::Unit x ) const
    1260  { return (int)rint ( (float)( x - _screenArea.getXMin() ) * getScale() ); }
    1261 
    1262 
    1263  inline int CellWidget::dbuToScreenY ( DbU::Unit y ) const
    1264  { return (int)rint ( (float)( _screenArea.getYMax() - y ) * getScale() ); }
    1265 
    1266 
    1267  inline int CellWidget::dbuToScreenLength ( DbU::Unit length ) const
    1268  { return (int)rint ( (float)length * getScale() ); }
    1269 
    1270 
    1271  inline QPoint CellWidget::dbuToScreenPoint ( DbU::Unit x, DbU::Unit y ) const
    1272  { return QPoint ( dbuToScreenX(x), dbuToScreenY(y) ); }
    1273 
    1274 
    1275  inline QPoint CellWidget::dbuToScreenPoint ( const Point& point ) const
    1276  { return QPoint ( dbuToScreenX(point.getX()), dbuToScreenY(point.getY()) ); }
    1277 
    1278 
    1279  inline DbU::Unit CellWidget::screenToDbuX ( int x ) const
    1280  { return (DbU::Unit)(x/getScale()) + _screenArea.getXMin(); }
    1281 
    1282 
    1283  inline DbU::Unit CellWidget::screenToDbuY ( int y ) const
    1284  { return _screenArea.getYMax() - (DbU::Unit)(y/getScale()); }
    1285 
    1286 
    1287  inline DbU::Unit CellWidget::screenToDbuLength ( int length ) const
    1288  { return (int)( (float)length / getScale() ); }
    1289 
    1290 
    1291  inline Point CellWidget::screenToDbuPoint ( const QPoint& point ) const
    1292  { return Point ( screenToDbuX(point.x()), screenToDbuY(point.y()) ); }
    1293 
    1294 
    1295  inline Box CellWidget::screenToDbuBox ( const QRect& rect ) const
    1296  {
    1297  return Box ( screenToDbuX(rect.x())
    1298  , screenToDbuY(rect.y())
    1299  , screenToDbuX(rect.x()+rect.width ())
    1300  , screenToDbuY(rect.y()+rect.height())
    1301  );
    1302  }
    1303 
    1304 
    1305  inline Box& CellWidget::pixelInflate ( Box& box, int pixels ) const
    1306  { return box.inflate(screenToDbuLength(pixels)); }
    1307 
    1308 
    1309  inline Point CellWidget::getTopLeft () const
    1310  { return Point(_screenArea.getXMin(),_screenArea.getYMax()); }
    1311 
    1312 
    1313  inline Box CellWidget::getVisibleArea () const
    1314  { return computeVisibleArea(getScale()); }
    1315 
    1316 
    1317  inline Cell* CellWidget::getCell () const
    1318  { return _state->getCell(); }
    1319 
    1320 
    1321  inline Cell* CellWidget::getTopCell () const
    1322  { return _state->getTopCell(); }
    1323 
    1324 
    1325  inline Path CellWidget::getTopPath () const
    1326  { return _state->getTopPath(); }
    1327 
    1328 
    1329  inline PaletteWidget* CellWidget::getPalette ()
    1330  { return _palette; }
    1331 
    1332 
    1333  inline DbU::Unit CellWidget::cursorStep () const
    1334  { return _state->cursorStep(); }
    1335 
    1336 
    1337  inline unsigned int CellWidget::getDbuMode () const
    1338  { return _state->getDbuMode(); }
    1339 
    1340 
    1341  inline bool CellWidget::gridMode () const
    1342  { return _state->gridMode(); }
    1343 
    1344 
    1345  inline bool CellWidget::symbolicMode () const
    1346  { return _state->symbolicMode(); }
    1347 
    1348 
    1349  inline bool CellWidget::physicalMode () const
    1350  { return _state->physicalMode(); }
    1351 
    1352 
    1353  inline DbU::UnitPower CellWidget::getUnitPower () const
    1354  { return _state->getUnitPower(); }
    1355 
    1356 
    1357  inline bool CellWidget::showBoundaries () const
    1358  { return _state->showBoundaries(); }
    1359 
    1360 
    1361  inline bool CellWidget::showSelection () const
    1362  { return _state->showSelection(); }
    1363 
    1364 
    1365  inline bool CellWidget::cumulativeSelection () const
    1366  { return _state->cumulativeSelection(); }
    1367 
    1368 
    1369  inline QPainter& CellWidget::getPainter ( size_t plane )
    1370  { return _drawingPlanes.painter(plane); }
    1371 
    1372 
    1373  inline const DisplayStyle::HSVr& CellWidget::getDarkening () const
    1374  { return _darkening; }
    1375 
    1376 
    1377  inline const float& CellWidget::getScale () const
    1378  { return _state->getScale(); }
    1379 
    1380 
    1381  inline const QPoint& CellWidget::getMousePosition () const
    1382  { return _mousePosition; }
    1383 
    1384 
    1385  inline void CellWidget::updateMousePosition ()
    1386  {
    1387  Point mousePoint = screenToDbuPoint ( _mousePosition );
    1388  emit mousePositionChanged ( _onCursorGrid(mousePoint) );
    1389  }
    1390 
    1391 
    1392  inline void CellWidget::setQueryFilter ( Query::Mask filter )
    1393  {
    1394  _state->setQueryFilter ( filter );
    1395  emit queryFilterChanged ();
    1396  }
    1397 
    1398 
    1399  inline Query::Mask CellWidget::getQueryFilter () const
    1400  { return _state->getQueryFilter(); }
    1401 
    1402 
    1403  inline void CellWidget::setDbuMode ( int mode )
    1404  { _state->setDbuMode(mode); }
    1405 
    1406 
    1407  inline void CellWidget::setUnitPower ( DbU::UnitPower p )
    1408  { _state->setUnitPower(p); }
    1409 
    1410 
    1411  inline void CellWidget::setRubberShape ( RubberShape shape )
    1412  {
    1413  _state->setRubberShape ( shape );
    1414  _redrawManager.refresh ();
    1415  emit queryFilterChanged ();
    1416  }
    1417 
    1418 
    1419  inline CellWidget::RubberShape CellWidget::getRubberShape () const
    1420  { return _state->getRubberShape(); }
    1421 
    1422 
    1423  inline void CellWidget::setPen ( const QPen& pen, size_t plane )
    1424  { _drawingPlanes.painter(plane).setPen(pen); }
    1425 
    1426 
    1427  inline void CellWidget::setDarkening ( const DisplayStyle::HSVr& darkening )
    1428  { _darkening = darkening; }
    1429 
    1430 
    1431  inline bool CellWidget::isPrinter () const
    1432  { return _isPrinter; }
    1433 
    1434 
    1435  inline void CellWidget::setPrinter ( bool state )
    1436  { _isPrinter = state; }
    1437 
    1438 
    1439  inline bool CellWidget::timeout ( const char* fname, const Timer& timer, double timeout, bool& timedout ) const
    1440  {
    1441  if ( timedout ) return true;
    1442  if ( timer.getCombTimeOnTheFly() < timeout ) return false;
    1443 
    1444  timedout = true;
    1445  cerr << Warning("CellWidget::%s(): timeout %.3f (limit:%.1f)."
    1446  ,fname,timer.getCombTimeOnTheFly(),timeout) << endl;
    1447  return true;
    1448  }
    1449 
    1450 
    1451  inline DbU::Unit CellWidget::_snapGridStep () const
    1452  { return symbolicMode() ? DbU::getSymbolicSnapGridStep() : DbU::getRealSnapGridStep(); }
    1453 
    1454 
    1455  inline DbU::Unit CellWidget::_onSnapGrid ( DbU::Unit u ) const
    1456  { return symbolicMode() ? DbU::getOnSymbolicSnapGrid(u) : DbU::getOnRealSnapGrid(u); }
    1457 
    1458 
    1459  inline Point CellWidget::_onSnapGrid ( const Point& p ) const
    1460  { return Point(_onSnapGrid(p.getX()),_onSnapGrid(p.getY())); }
    1461 
    1462 
    1463  inline DbU::Unit CellWidget::_onCursorGrid ( DbU::Unit u ) const
    1464  { return DbU::getOnCustomGrid(u,cursorStep()); }
    1465 
    1466 
    1467  inline Point CellWidget::_onCursorGrid ( const Point& p ) const
    1468  { return Point(_onCursorGrid(p.getX()),_onCursorGrid(p.getY())); }
    1469 
    1470 
    1471 } // End of Hurricane namespace.
    1472 
    1473 
    1474 GETSTRING_POINTER_SUPPORT(Hurricane::CellWidget);
    1475 IOSTREAM_POINTER_SUPPORT(Hurricane::CellWidget);
    static DbU::Unit getOnCustomGrid(DbU::Unit u, DbU::Unit step, SnapMode mode=Nearest)
    @@ -88,7 +88,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/DisplayStyle_8h_source.html b/hurricane/doc/viewer/html/DisplayStyle_8h_source.html index 24a5dc04..84dc8aed 100644 --- a/hurricane/doc/viewer/html/DisplayStyle_8h_source.html +++ b/hurricane/doc/viewer/html/DisplayStyle_8h_source.html @@ -74,7 +74,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/Graphics_8h_source.html b/hurricane/doc/viewer/html/Graphics_8h_source.html index 1ba63287..25213e05 100644 --- a/hurricane/doc/viewer/html/Graphics_8h_source.html +++ b/hurricane/doc/viewer/html/Graphics_8h_source.html @@ -78,7 +78,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/InspectorWidget_8h_source.html b/hurricane/doc/viewer/html/InspectorWidget_8h_source.html index aac6cb2e..aaa253f0 100644 --- a/hurricane/doc/viewer/html/InspectorWidget_8h_source.html +++ b/hurricane/doc/viewer/html/InspectorWidget_8h_source.html @@ -55,7 +55,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/annotated.html b/hurricane/doc/viewer/html/annotated.html index ccfdcdf2..45cd0488 100644 --- a/hurricane/doc/viewer/html/annotated.html +++ b/hurricane/doc/viewer/html/annotated.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1CellImage-members.html b/hurricane/doc/viewer/html/classHurricane_1_1CellImage-members.html index 84c73842..5582c47e 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1CellImage-members.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1CellImage-members.html @@ -59,7 +59,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1CellImage.html b/hurricane/doc/viewer/html/classHurricane_1_1CellImage.html index fc50148b..aa45e047 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1CellImage.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1CellImage.html @@ -261,7 +261,7 @@ ShowScale: display a false color scale at the bottom of the image. Useful if you
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1CellPrinter-members.html b/hurricane/doc/viewer/html/classHurricane_1_1CellPrinter-members.html index 1b691be7..2ed7552e 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1CellPrinter-members.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1CellPrinter-members.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1CellPrinter.html b/hurricane/doc/viewer/html/classHurricane_1_1CellPrinter.html index e21d4f7a..bc26a243 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1CellPrinter.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1CellPrinter.html @@ -240,7 +240,7 @@ Implementation details
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1CellViewer-members.html b/hurricane/doc/viewer/html/classHurricane_1_1CellViewer-members.html index 144ecc12..a3321ff1 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1CellViewer-members.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1CellViewer-members.html @@ -69,7 +69,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1CellViewer.html b/hurricane/doc/viewer/html/classHurricane_1_1CellViewer.html index f9b3c010..f1da78bc 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1CellViewer.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1CellViewer.html @@ -511,7 +511,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1CellWidget-members.html b/hurricane/doc/viewer/html/classHurricane_1_1CellWidget-members.html index e2891601..0939c070 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1CellWidget-members.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1CellWidget-members.html @@ -55,7 +55,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1CellWidget.html b/hurricane/doc/viewer/html/classHurricane_1_1CellWidget.html index 1cfd1e9d..cc96de88 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1CellWidget.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1CellWidget.html @@ -97,7 +97,7 @@ Public Types
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1DisplayStyle-members.html b/hurricane/doc/viewer/html/classHurricane_1_1DisplayStyle-members.html index 6575676d..2f6264e8 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1DisplayStyle-members.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1DisplayStyle-members.html @@ -71,7 +71,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1DisplayStyle.html b/hurricane/doc/viewer/html/classHurricane_1_1DisplayStyle.html index e8e4cc3e..c8366519 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1DisplayStyle.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1DisplayStyle.html @@ -620,7 +620,7 @@ Static Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1Graphics-members.html b/hurricane/doc/viewer/html/classHurricane_1_1Graphics-members.html index cf57f3ed..66cafb0e 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1Graphics-members.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1Graphics-members.html @@ -71,7 +71,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1Graphics.html b/hurricane/doc/viewer/html/classHurricane_1_1Graphics.html index fdd5ae1e..6c75dddf 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1Graphics.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1Graphics.html @@ -673,7 +673,7 @@ Static Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1InspectorWidget-members.html b/hurricane/doc/viewer/html/classHurricane_1_1InspectorWidget-members.html index a2589f87..d1fd3431 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1InspectorWidget-members.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1InspectorWidget-members.html @@ -55,7 +55,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classHurricane_1_1InspectorWidget.html b/hurricane/doc/viewer/html/classHurricane_1_1InspectorWidget.html index 2f65a347..8a7a75d3 100644 --- a/hurricane/doc/viewer/html/classHurricane_1_1InspectorWidget.html +++ b/hurricane/doc/viewer/html/classHurricane_1_1InspectorWidget.html @@ -140,7 +140,7 @@ Inspector Memory Management
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/classes.html b/hurricane/doc/viewer/html/classes.html index 41904396..201852f4 100644 --- a/hurricane/doc/viewer/html/classes.html +++ b/hurricane/doc/viewer/html/classes.html @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/dir_0afc25342c548a63e1813d8fbde8101d.html b/hurricane/doc/viewer/html/dir_0afc25342c548a63e1813d8fbde8101d.html index 906f9fd6..1795f312 100644 --- a/hurricane/doc/viewer/html/dir_0afc25342c548a63e1813d8fbde8101d.html +++ b/hurricane/doc/viewer/html/dir_0afc25342c548a63e1813d8fbde8101d.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/dir_22af1943967c75aa4d199e6ffd8de9d2.html b/hurricane/doc/viewer/html/dir_22af1943967c75aa4d199e6ffd8de9d2.html index b5deaea5..761e8dd8 100644 --- a/hurricane/doc/viewer/html/dir_22af1943967c75aa4d199e6ffd8de9d2.html +++ b/hurricane/doc/viewer/html/dir_22af1943967c75aa4d199e6ffd8de9d2.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/dir_53ec41d7bc61ef1f85d867f95df84d28.html b/hurricane/doc/viewer/html/dir_53ec41d7bc61ef1f85d867f95df84d28.html index e7305718..dec2e762 100644 --- a/hurricane/doc/viewer/html/dir_53ec41d7bc61ef1f85d867f95df84d28.html +++ b/hurricane/doc/viewer/html/dir_53ec41d7bc61ef1f85d867f95df84d28.html @@ -53,7 +53,7 @@ Directories
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/hurricane/doc/viewer/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html index b4d3da4d..10784571 100644 --- a/hurricane/doc/viewer/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ b/hurricane/doc/viewer/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/files.html b/hurricane/doc/viewer/html/files.html index 5499435d..0c08b66b 100644 --- a/hurricane/doc/viewer/html/files.html +++ b/hurricane/doc/viewer/html/files.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/functions.html b/hurricane/doc/viewer/html/functions.html index 547d81e8..5f01e3c5 100644 --- a/hurricane/doc/viewer/html/functions.html +++ b/hurricane/doc/viewer/html/functions.html @@ -286,7 +286,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/functions_enum.html b/hurricane/doc/viewer/html/functions_enum.html index 8035e6b7..062cab15 100644 --- a/hurricane/doc/viewer/html/functions_enum.html +++ b/hurricane/doc/viewer/html/functions_enum.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/functions_eval.html b/hurricane/doc/viewer/html/functions_eval.html index 63af9994..cdb8983d 100644 --- a/hurricane/doc/viewer/html/functions_eval.html +++ b/hurricane/doc/viewer/html/functions_eval.html @@ -52,7 +52,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/functions_func.html b/hurricane/doc/viewer/html/functions_func.html index 60d1ab98..3b3dbf6c 100644 --- a/hurricane/doc/viewer/html/functions_func.html +++ b/hurricane/doc/viewer/html/functions_func.html @@ -271,7 +271,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/graph_legend.html b/hurricane/doc/viewer/html/graph_legend.html index 7c7e4f2b..4ba34c8d 100644 --- a/hurricane/doc/viewer/html/graph_legend.html +++ b/hurricane/doc/viewer/html/graph_legend.html @@ -74,7 +74,7 @@ A yellow dashed arrow denotes a relation between a template instance and the tem
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/group__graphicsGroup.html b/hurricane/doc/viewer/html/group__graphicsGroup.html index 2a09b498..5e1b258b 100644 --- a/hurricane/doc/viewer/html/group__graphicsGroup.html +++ b/hurricane/doc/viewer/html/group__graphicsGroup.html @@ -96,7 +96,7 @@ General Structure of the Graphics Object
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/index.html b/hurricane/doc/viewer/html/index.html index 70666fb9..f0324507 100644 --- a/hurricane/doc/viewer/html/index.html +++ b/hurricane/doc/viewer/html/index.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/html/modules.html b/hurricane/doc/viewer/html/modules.html index 439a1e77..838c77d2 100644 --- a/hurricane/doc/viewer/html/modules.html +++ b/hurricane/doc/viewer/html/modules.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/hurricane/doc/viewer/latex/refman.tex b/hurricane/doc/viewer/latex/refman.tex index d108043e..51d9161e 100644 --- a/hurricane/doc/viewer/latex/refman.tex +++ b/hurricane/doc/viewer/latex/refman.tex @@ -34,7 +34,7 @@ \vspace*{1cm} {\large Generated by Doxygen 1.8.14}\\ \vspace*{0.5cm} - {\small Thu Nov 12 2020 13:58:48}\\ + {\small Fri Oct 1 2021 19:23:10}\\ \end{center} \end{titlepage} diff --git a/katabatic/doc/html/AutoContactHTee_8h_source.html b/katabatic/doc/html/AutoContactHTee_8h_source.html index 4081ecf0..a7742837 100644 --- a/katabatic/doc/html/AutoContactHTee_8h_source.html +++ b/katabatic/doc/html/AutoContactHTee_8h_source.html @@ -65,7 +65,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/AutoContactTerminal_8h_source.html b/katabatic/doc/html/AutoContactTerminal_8h_source.html index 67755d38..ccfc520e 100644 --- a/katabatic/doc/html/AutoContactTerminal_8h_source.html +++ b/katabatic/doc/html/AutoContactTerminal_8h_source.html @@ -66,7 +66,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/AutoContactTurn_8h_source.html b/katabatic/doc/html/AutoContactTurn_8h_source.html index 173319fe..ca049fbe 100644 --- a/katabatic/doc/html/AutoContactTurn_8h_source.html +++ b/katabatic/doc/html/AutoContactTurn_8h_source.html @@ -66,7 +66,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/AutoContactVTee_8h_source.html b/katabatic/doc/html/AutoContactVTee_8h_source.html index 240b1a7c..76135e78 100644 --- a/katabatic/doc/html/AutoContactVTee_8h_source.html +++ b/katabatic/doc/html/AutoContactVTee_8h_source.html @@ -65,7 +65,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/AutoContact_8h_source.html b/katabatic/doc/html/AutoContact_8h_source.html index 11aea44a..23f60d9f 100644 --- a/katabatic/doc/html/AutoContact_8h_source.html +++ b/katabatic/doc/html/AutoContact_8h_source.html @@ -44,7 +44,7 @@ $(function() {
    AutoContact.h
    -
    1 // -*- C++ -*-
    2 //
    3 // This file is part of the Coriolis Software.
    4 // Copyright (c) UPMC 2008-2018, All Rights Reserved
    5 //
    6 // +-----------------------------------------------------------------+
    7 // | C O R I O L I S |
    8 // | K a t a b a t i c - Routing Toolbox |
    9 // | |
    10 // | Author : Jean-Paul CHAPUT |
    11 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    12 // | =============================================================== |
    13 // | C++ Header : "./katabatic/AutoContact.h" |
    14 // +-----------------------------------------------------------------+
    15 
    16 
    17 #ifndef KATABATIC_AUTOCONTACT_H
    18 #define KATABATIC_AUTOCONTACT_H
    19 
    20 #include <vector>
    21 #include <map>
    22 #include "hurricane/Contact.h"
    23 #include "hurricane/ExtensionGo.h"
    24 #include "katabatic/Constants.h"
    25 #include "katabatic/AutoSegment.h"
    26 #include "katabatic/GCell.h"
    27 
    28 
    29 namespace Katabatic {
    30 
    31 
    32  using std::cerr;
    33  using std::endl;
    34  using Hurricane::tab;
    35  using Hurricane::Name;
    36  using Hurricane::Net;
    39  using Hurricane::Layer;
    40  using Hurricane::Contact;
    41  using Hurricane::ExtensionGo;
    42 
    43  class GCell;
    44  class KatabaticEngine;
    45  class AutoHorizontal;
    46  class AutoVertical;
    47  class AutoContact;
    48 
    49 
    50  typedef std::map<Contact*,AutoContact*> AutoContactLut;
    51 
    52 
    53 // -------------------------------------------------------------------
    54 // Class : "Katabatic::AutoContact".
    55 
    56  enum AutoContactFlag { CntFixed = 0x00000001
    57  , CntTerminal = 0x00000002
    58  , CntTurn = 0x00000004
    59  , CntHTee = 0x00000008
    60  , CntVTee = 0x00000010
    61  , CntInvalidated = 0x00000020
    62  , CntInvalidatedCache = 0x00000040
    63  , CntInCreationStage = 0x00000080
    64  , CntBadTopology = 0x00000100
    65  , CntIgnoreAnchor = 0x00000200
    66  , CntWeakTerminal = 0x00000400
    67  , CntUserNativeConstraints = 0x00000800
    68  };
    69 
    70  class AutoContact {
    71  public:
    72  static AutoContact* createFrom ( Contact* );
    73  public:
    74  // Wrapped Contact Accessors.
    75  inline Hook* getBodyHook ();
    76  inline Hook* getAnchorHook ();
    77  inline Component* getAnchor () const;
    78  inline Net* getNet () const;
    79  inline const Layer* getLayer () const;
    80  inline DbU::Unit getX () const;
    81  inline DbU::Unit getY () const;
    82  inline DbU::Unit getDx () const;
    83  inline DbU::Unit getDy () const;
    84  inline Point getCenter () const;
    85  inline Point getPosition () const;
    86  inline DbU::Unit getWidth () const;
    87  inline DbU::Unit getHalfWidth () const;
    88  inline DbU::Unit getHeight () const;
    89  inline DbU::Unit getHalfHeight () const;
    90  inline Components getSlaveComponents () const;
    91  // Wrapped Contact Modifiers.
    92  inline void setLayer ( const Layer* );
    93  inline void setWidth ( DbU::Unit );
    94  inline void setHeight ( DbU::Unit );
    95  inline void setSizes ( DbU::Unit width, DbU::Unit height );
    96  inline void setX ( DbU::Unit );
    97  inline void setY ( DbU::Unit );
    98  inline void setPosition ( DbU::Unit width, DbU::Unit height );
    99  inline void setPosition ( const Point& );
    100  inline void setDx ( DbU::Unit );
    101  inline void setDy ( DbU::Unit );
    102  inline void setOffset ( DbU::Unit dx, DbU::Unit dy );
    103  virtual void translate ( const DbU::Unit& tx, const DbU::Unit& ty );
    104  // Predicates.
    105  inline bool isInCreationStage () const;
    106  inline bool isInvalidated () const;
    107  inline bool isInvalidatedCache () const;
    108  inline bool isTerminal () const;
    109  inline bool isTurn () const;
    110  bool isTee ( unsigned int direction ) const;
    111  inline bool isHTee () const;
    112  inline bool isVTee () const;
    113  inline bool isFixed () const;
    114  inline bool isUserNativeConstraints () const;
    115  inline bool hasBadTopology () const;
    116  bool canDestroy ( unsigned int flags=0 ) const;
    117  bool canMoveUp ( const AutoSegment* moved ) const;
    118  // Accessors.
    119  inline Contact* base () const;
    120  static size_t getAllocateds ();
    121  static const Name& getStaticName ();
    122  virtual const Name& getName () const;
    123  inline size_t getId () const;
    124  virtual Box getBoundingBox () const;
    125  inline GCell* getGCell () const;
    126  virtual AutoSegment* getOpposite ( const AutoSegment* ) const = 0;
    127  virtual AutoSegment* getPerpandicular ( const AutoSegment* ) const = 0;
    128  virtual AutoSegment* getSegment ( unsigned int ) const = 0;
    129  unsigned int getMinDepth () const;
    130  unsigned int getMaxDepth () const;
    131  void getLengths ( DbU::Unit* lengths, AutoSegment::DepthLengthSet& );
    132  virtual Box getNativeConstraintBox () const;
    133  Interval getNativeUConstraints ( unsigned int direction ) const;
    134  Interval getUConstraints ( unsigned int direction ) const;
    135  inline DbU::Unit getCBXMin () const;
    136  inline DbU::Unit getCBXMax () const;
    137  inline DbU::Unit getCBYMin () const;
    138  inline DbU::Unit getCBYMax () const;
    139  inline Box getConstraintBox () const;
    140  Box& intersectConstraintBox ( Box& box ) const;
    141  // Collections.
    142  AutoSegments getAutoSegments ();
    143  // Modifiers.
    144  void invalidate ( unsigned int flags=0 );
    145  virtual void cacheDetach ( AutoSegment* ) = 0;
    146  virtual void cacheAttach ( AutoSegment* ) = 0;
    147  virtual void updateCache () = 0;
    148  virtual void updateGeometry () = 0;
    149  virtual void updateTopology () = 0;
    150  void showTopologyError ( const std::string&, unsigned int flags=0 );
    151  virtual void checkTopology ();
    152  inline void setFlags ( unsigned int );
    153  inline void unsetFlags ( unsigned int );
    154  void setGCell ( GCell* );
    155  inline void setCBXMin ( DbU::Unit xMin );
    156  inline void setCBXMax ( DbU::Unit xMax );
    157  inline void setCBYMin ( DbU::Unit yMin );
    158  inline void setCBYMax ( DbU::Unit yMax );
    159  void setConstraintBox ( const Box& box );
    160  bool restrictConstraintBox ( DbU::Unit constraintMin
    161  , DbU::Unit constraintMax
    162  , unsigned int flags=KbWarnOnError );
    163  void restoreNativeConstraintBox ();
    164  void migrateConstraintBox ( AutoContact* other );
    165  void destroy ();
    166  // Inspector Management.
    167  Record* _getRecord () const;
    168  virtual string _getString () const;
    169  virtual string _getTypeName () const;
    170 
    171  private:
    172  // Internal: Attributes.
    173  static size_t _maxId;
    174  static size_t _allocateds;
    175  static const Name _goName;
    176 
    177  protected:
    178  size_t _id;
    179  Contact* _contact;
    180  GCell* _gcell;
    181  unsigned int _flags;
    182  int _dxMin:8;
    183  int _dxMax:8;
    184  int _dyMin:8;
    185  int _dyMax:8;
    186 
    187  protected:
    188  // Constructors & Destructors.
    189  AutoContact ( GCell*, Contact* );
    190  virtual ~AutoContact ();
    191  static void _preCreate ( GCell*, Net*, const Layer* );
    192  virtual void _postCreate ();
    193  virtual void _preDestroy ();
    194  private:
    195  AutoContact ( const AutoContact& );
    196  AutoContact& operator= ( const AutoContact& );
    197 
    198  protected:
    199  inline int _getDeltaMin ( DbU::Unit x, DbU::Unit xMin );
    200  inline int _getDeltaMax ( DbU::Unit x, DbU::Unit xMin, DbU::Unit xMax );
    201  static void _getTopology ( Contact*, Component*& anchor, Horizontal**&, Vertical**&, size_t );
    202  virtual void _invalidate ( unsigned int flags ) = 0;
    203  };
    204 
    205 
    206 // Wrapped Contact Inline Functions.
    207  inline Hook* AutoContact::getBodyHook () { return _contact->getBodyHook(); }
    208  inline Hook* AutoContact::getAnchorHook () { return _contact->getAnchorHook(); }
    209  inline Component* AutoContact::getAnchor () const { return _contact->getAnchor(); }
    210  inline Net* AutoContact::getNet () const { return _contact->getNet(); }
    211  inline const Layer* AutoContact::getLayer () const { return _contact->getLayer(); }
    212  inline DbU::Unit AutoContact::getX () const { return _contact->getX(); }
    213  inline DbU::Unit AutoContact::getY () const { return _contact->getY(); }
    214  inline DbU::Unit AutoContact::getDx () const { return _contact->getDx(); }
    215  inline DbU::Unit AutoContact::getDy () const { return _contact->getDy(); }
    216  inline Point AutoContact::getCenter () const { return _contact->getCenter(); }
    217  inline Point AutoContact::getPosition () const { return _contact->getPosition(); }
    218  inline DbU::Unit AutoContact::getWidth () const { return _contact->getWidth(); }
    219  inline DbU::Unit AutoContact::getHalfWidth () const { return _contact->getHalfWidth(); }
    220  inline DbU::Unit AutoContact::getHeight () const { return _contact->getHeight(); }
    221  inline DbU::Unit AutoContact::getHalfHeight () const { return _contact->getHalfHeight(); }
    222  inline Components AutoContact::getSlaveComponents () const { return _contact->getSlaveComponents(); }
    223  inline void AutoContact::setLayer ( const Layer* layer ) { _contact->setLayer(layer); }
    224  inline void AutoContact::setWidth ( DbU::Unit w ) { _contact->setWidth(w); }
    225  inline void AutoContact::setHeight ( DbU::Unit h ) { _contact->setHeight(h); }
    226  inline void AutoContact::setSizes ( DbU::Unit w, DbU::Unit h ) { _contact->setSizes(w,h); }
    227  inline void AutoContact::setX ( DbU::Unit x ) { _contact->setX(x); }
    228  inline void AutoContact::setY ( DbU::Unit y ) { _contact->setY(y); }
    229  inline void AutoContact::setPosition ( DbU::Unit x, DbU::Unit y ) { _contact->setPosition(x,y); }
    230  inline void AutoContact::setPosition ( const Point& p ) { _contact->setPosition(p); }
    231  inline void AutoContact::setDx ( DbU::Unit dx ) { _contact->setDx(dx); }
    232  inline void AutoContact::setDy ( DbU::Unit dy ) { _contact->setDy(dy); }
    233  inline void AutoContact::setOffset ( DbU::Unit dx, DbU::Unit dy ) { _contact->setOffset(dx,dy); }
    234 // AutoContact Inline Functions.
    235  inline bool AutoContact::isInCreationStage () const { return _flags&CntInCreationStage; }
    236  inline bool AutoContact::isInvalidated () const { return _flags&CntInvalidated; }
    237  inline bool AutoContact::isInvalidatedCache () const { return _flags&CntInvalidatedCache; }
    238  inline bool AutoContact::isTurn () const { return _flags&CntTurn; }
    239  inline bool AutoContact::isFixed () const { return _flags&CntFixed; }
    240  inline bool AutoContact::isUserNativeConstraints () const { return _flags&CntUserNativeConstraints; }
    241  inline bool AutoContact::isTerminal () const { return _flags&CntTerminal; }
    242  inline bool AutoContact::isHTee () const { return _flags&CntHTee; }
    243  inline bool AutoContact::isVTee () const { return _flags&CntVTee; }
    244  inline bool AutoContact::hasBadTopology () const { return _flags&CntBadTopology; }
    245  inline size_t AutoContact::getId () const { return _id; }
    246  inline Contact* AutoContact::base () const { return _contact; }
    247  inline GCell* AutoContact::getGCell () const { return _gcell; }
    249  inline void AutoContact::setCBXMin ( DbU::Unit xMin ) { _dxMin = _getDeltaMin(xMin,_gcell->getX()); }
    250  inline void AutoContact::setCBXMax ( DbU::Unit xMax ) { _dxMax = _getDeltaMax(xMax,_gcell->getX(),_gcell->getXMax()); }
    251  inline void AutoContact::setCBYMin ( DbU::Unit yMin ) { _dyMin = _getDeltaMin(yMin,_gcell->getY()); }
    252  inline void AutoContact::setCBYMax ( DbU::Unit yMax ) { _dyMax = _getDeltaMax(yMax,_gcell->getY(),_gcell->getYMax()); }
    253  inline void AutoContact::setFlags ( unsigned int flags ) { _flags|= flags; }
    254  inline void AutoContact::unsetFlags ( unsigned int flags ) { _flags&=~flags; }
    255  inline int AutoContact::_getDeltaMin ( DbU::Unit x, DbU::Unit xMin ) { if (x<xMin) return 0; return (int)DbU::toLambda(x-xMin); }
    256  inline int AutoContact::_getDeltaMax ( DbU::Unit x, DbU::Unit xMin, DbU::Unit xMax ) { if (x>xMax) x=xMax; return (int)DbU::toLambda(x-xMin); }
    257 
    259  { return isFixed() ? _contact->getX() : DbU::fromLambda(_dxMin) + _gcell->getX(); }
    260 
    262  { return isFixed() ? _contact->getX() : DbU::fromLambda(_dxMax) + _gcell->getX(); }
    263 
    265  { return isFixed() ? _contact->getY() : DbU::fromLambda(_dyMin) + _gcell->getY(); }
    266 
    268  { return isFixed() ? _contact->getY() : DbU::fromLambda(_dyMax) + _gcell->getY(); }
    269 
    270 // -------------------------------------------------------------------
    271 // Class : "Katabatic::LocatorHelper".
    272 
    274  public:
    275  inline LocatorHelper ( AutoContact*, unsigned int flags=0 );
    276  inline bool isValid () const;
    277  inline AutoSegment* getSegment () const;
    278  inline void progress ();
    279  private:
    280  inline unsigned int _min () const;
    281  inline unsigned int _max () const;
    282  private:
    283  unsigned int _flags;
    284  unsigned int _index;
    285  AutoContact* _contact;
    286  };
    287 
    288 
    289  inline LocatorHelper::LocatorHelper ( AutoContact* contact, unsigned int flags )
    290  : _flags(flags), _index(_min()), _contact(contact)
    291  {
    292  cdebug_tabw(145,1);
    293  cdebug_log(145,0) << "CTOR LocatorHelper " << contact->_getString() << endl;
    294  cdebug_log(145,0) << "+ _min():" << _min() << endl;
    295  cdebug_log(145,0) << "+ _max():" << _max() << endl;
    296  cdebug_log(145,0) << "+ getSegment(_min()):" << _contact->getSegment(_min()) << endl;
    297  if (not _contact->getSegment(_index)) progress();
    298  cdebug_tabw(145,-1);
    299  }
    300 
    301  inline bool LocatorHelper::isValid () const
    302  { return _index < _max(); }
    303 
    304  inline unsigned int LocatorHelper::_min () const
    305  { return (_flags & (KbHorizontal|KbWithPerpands)) ? 0 : 2; }
    306 
    307  inline unsigned int LocatorHelper::_max () const
    308  { return ((_flags & KbHorizontal) and not (_flags & KbWithPerpands)) ? 2 : 4; }
    309 
    311  {
    312  cdebug_log(145,0) << "LocatorHelper::getSegment(" << _index << ") - " << _contact->getSegment(_index) << endl;
    313  return (_index < _max()) ? _contact->getSegment(_index) : NULL;
    314  }
    315 
    316  inline void LocatorHelper::progress ()
    317  {
    318  cdebug_tabw(145,1);
    319  ++_index;
    320  cdebug_log(145,0) << "LocatorHelper::progress() [" << _index << "] " << _contact->getSegment(_index) << endl;
    321  while ((_index < _max()) and (_contact->getSegment(_index) == NULL)) {
    322  ++_index;
    323  cdebug_log(145,0) << "LocatorHelper::progress() [" << _index << "] " << _contact->getSegment(_index) << endl;
    324  }
    325  cdebug_tabw(145,-1);
    326  }
    327 
    328 
    329 // -------------------------------------------------------------------
    330 // Helper Functions.
    331 
    332 
    333  template<typename Type>inline void order ( Type& a, Type& b ) { if (a>b) std::swap(a,b); }
    334 
    335  inline DbU::Unit setInBound ( DbU::Unit lower, DbU::Unit upper, DbU::Unit& value )
    336  {
    337  if ( lower > value ) value = lower;
    338  if ( upper < value ) value = upper;
    339 
    340  return value;
    341  }
    342 
    343  inline size_t abssub ( size_t a, size_t b ) { return (a>b) ? a-b : b-a; }
    344 
    345 
    346 } // Katabatic namespace.
    347 
    348 
    349 INSPECTOR_P_SUPPORT(Katabatic::AutoContact);
    350 
    351 
    352 #endif // KATABATIC_AUTOCONTACT_H
    Definition: AutoContact.h:63
    +
    1 // -*- C++ -*-
    2 //
    3 // This file is part of the Coriolis Software.
    4 // Copyright (c) UPMC 2008-2018, All Rights Reserved
    5 //
    6 // +-----------------------------------------------------------------+
    7 // | C O R I O L I S |
    8 // | K a t a b a t i c - Routing Toolbox |
    9 // | |
    10 // | Author : Jean-Paul CHAPUT |
    11 // | E-mail : Jean-Paul.Chaput@lip6.fr |
    12 // | =============================================================== |
    13 // | C++ Header : "./katabatic/AutoContact.h" |
    14 // +-----------------------------------------------------------------+
    15 
    16 
    17 #ifndef KATABATIC_AUTOCONTACT_H
    18 #define KATABATIC_AUTOCONTACT_H
    19 
    20 #include <vector>
    21 #include <map>
    22 #include "hurricane/Contact.h"
    23 #include "hurricane/ExtensionGo.h"
    24 #include "katabatic/Constants.h"
    25 #include "katabatic/AutoSegment.h"
    26 #include "katabatic/GCell.h"
    27 
    28 
    29 namespace Katabatic {
    30 
    31 
    32  using std::cerr;
    33  using std::endl;
    34  using Hurricane::tab;
    35  using Hurricane::Name;
    36  using Hurricane::Net;
    39  using Hurricane::Layer;
    40  using Hurricane::Contact;
    41  using Hurricane::ExtensionGo;
    42 
    43  class GCell;
    44  class KatabaticEngine;
    45  class AutoHorizontal;
    46  class AutoVertical;
    47  class AutoContact;
    48 
    49 
    50  typedef std::map<Contact*,AutoContact*> AutoContactLut;
    51 
    52 
    53 // -------------------------------------------------------------------
    54 // Class : "Katabatic::AutoContact".
    55 
    56  enum AutoContactFlag { CntFixed = 0x00000001
    57  , CntTerminal = 0x00000002
    58  , CntTurn = 0x00000004
    59  , CntHTee = 0x00000008
    60  , CntVTee = 0x00000010
    61  , CntInvalidated = 0x00000020
    62  , CntInvalidatedCache = 0x00000040
    63  , CntInCreationStage = 0x00000080
    64  , CntBadTopology = 0x00000100
    65  , CntIgnoreAnchor = 0x00000200
    66  , CntWeakTerminal = 0x00000400
    67  , CntUserNativeConstraints = 0x00000800
    68  };
    69 
    70  class AutoContact {
    71  public:
    72  static AutoContact* createFrom ( Contact* );
    73  public:
    74  // Wrapped Contact Accessors.
    75  inline Hook* getBodyHook ();
    76  inline Hook* getAnchorHook ();
    77  inline Component* getAnchor () const;
    78  inline Net* getNet () const;
    79  inline const Layer* getLayer () const;
    80  inline DbU::Unit getX () const;
    81  inline DbU::Unit getY () const;
    82  inline DbU::Unit getDx () const;
    83  inline DbU::Unit getDy () const;
    84  inline Point getCenter () const;
    85  inline Point getPosition () const;
    86  inline DbU::Unit getWidth () const;
    87  inline DbU::Unit getHalfWidth () const;
    88  inline DbU::Unit getHeight () const;
    89  inline DbU::Unit getHalfHeight () const;
    90  inline Components getSlaveComponents () const;
    91  // Wrapped Contact Modifiers.
    92  inline void setLayer ( const Layer* );
    93  inline void setWidth ( DbU::Unit );
    94  inline void setHeight ( DbU::Unit );
    95  inline void setSizes ( DbU::Unit width, DbU::Unit height );
    96  inline void setX ( DbU::Unit );
    97  inline void setY ( DbU::Unit );
    98  inline void setPosition ( DbU::Unit width, DbU::Unit height );
    99  inline void setPosition ( const Point& );
    100  inline void setDx ( DbU::Unit );
    101  inline void setDy ( DbU::Unit );
    102  inline void setOffset ( DbU::Unit dx, DbU::Unit dy );
    103  virtual void translate ( const DbU::Unit& tx, const DbU::Unit& ty );
    104  // Predicates.
    105  inline bool isInCreationStage () const;
    106  inline bool isInvalidated () const;
    107  inline bool isInvalidatedCache () const;
    108  inline bool isTerminal () const;
    109  inline bool isTurn () const;
    110  bool isTee ( unsigned int direction ) const;
    111  inline bool isHTee () const;
    112  inline bool isVTee () const;
    113  inline bool isFixed () const;
    114  inline bool isUserNativeConstraints () const;
    115  inline bool hasBadTopology () const;
    116  bool canDestroy ( unsigned int flags=0 ) const;
    117  bool canMoveUp ( const AutoSegment* moved ) const;
    118  // Accessors.
    119  inline Contact* base () const;
    120  static size_t getAllocateds ();
    121  static const Name& getStaticName ();
    122  virtual const Name& getName () const;
    123  inline size_t getId () const;
    124  virtual Box getBoundingBox () const;
    125  inline GCell* getGCell () const;
    126  virtual AutoSegment* getOpposite ( const AutoSegment* ) const = 0;
    127  virtual AutoSegment* getPerpandicular ( const AutoSegment* ) const = 0;
    128  virtual AutoSegment* getSegment ( unsigned int ) const = 0;
    129  unsigned int getMinDepth () const;
    130  unsigned int getMaxDepth () const;
    131  void getLengths ( DbU::Unit* lengths, AutoSegment::DepthLengthSet& );
    132  virtual Box getNativeConstraintBox () const;
    133  Interval getNativeUConstraints ( unsigned int direction ) const;
    134  Interval getUConstraints ( unsigned int direction ) const;
    135  inline DbU::Unit getCBXMin () const;
    136  inline DbU::Unit getCBXMax () const;
    137  inline DbU::Unit getCBYMin () const;
    138  inline DbU::Unit getCBYMax () const;
    139  inline Box getConstraintBox () const;
    140  Box& intersectConstraintBox ( Box& box ) const;
    141  // Collections.
    142  AutoSegments getAutoSegments ();
    143  // Modifiers.
    144  void invalidate ( unsigned int flags=0 );
    145  virtual void cacheDetach ( AutoSegment* ) = 0;
    146  virtual void cacheAttach ( AutoSegment* ) = 0;
    147  virtual void updateCache () = 0;
    148  virtual void updateGeometry () = 0;
    149  virtual void updateTopology () = 0;
    150  void showTopologyError ( const std::string&, unsigned int flags=0 );
    151  virtual void checkTopology ();
    152  inline void setFlags ( unsigned int );
    153  inline void unsetFlags ( unsigned int );
    154  void setGCell ( GCell* );
    155  inline void setCBXMin ( DbU::Unit xMin );
    156  inline void setCBXMax ( DbU::Unit xMax );
    157  inline void setCBYMin ( DbU::Unit yMin );
    158  inline void setCBYMax ( DbU::Unit yMax );
    159  void setConstraintBox ( const Box& box );
    160  bool restrictConstraintBox ( DbU::Unit constraintMin
    161  , DbU::Unit constraintMax
    162  , unsigned int flags=KbWarnOnError );
    163  void restoreNativeConstraintBox ();
    164  void migrateConstraintBox ( AutoContact* other );
    165  void destroy ();
    166  // Inspector Management.
    167  Record* _getRecord () const;
    168  virtual string _getString () const;
    169  virtual string _getTypeName () const;
    170 
    171  private:
    172  // Internal: Attributes.
    173  static size_t _maxId;
    174  static size_t _allocateds;
    175  static const Name _goName;
    176 
    177  protected:
    178  size_t _id;
    179  Contact* _contact;
    180  GCell* _gcell;
    181  unsigned int _flags;
    182  int _dxMin:8;
    183  int _dxMax:8;
    184  int _dyMin:8;
    185  int _dyMax:8;
    186 
    187  protected:
    188  // Constructors & Destructors.
    189  AutoContact ( GCell*, Contact* );
    190  virtual ~AutoContact ();
    191  static void _preCreate ( GCell*, Net*, const Layer* );
    192  virtual void _postCreate ();
    193  virtual void _preDestroy ();
    194  private:
    195  AutoContact ( const AutoContact& );
    196  AutoContact& operator= ( const AutoContact& );
    197 
    198  protected:
    199  inline int _getDeltaMin ( DbU::Unit x, DbU::Unit xMin );
    200  inline int _getDeltaMax ( DbU::Unit x, DbU::Unit xMin, DbU::Unit xMax );
    201  static void _getTopology ( Contact*, Component*& anchor, Horizontal**&, Vertical**&, size_t );
    202  virtual void _invalidate ( unsigned int flags ) = 0;
    203  };
    204 
    205 
    206 // Wrapped Contact Inline Functions.
    207  inline Hook* AutoContact::getBodyHook () { return _contact->getBodyHook(); }
    208  inline Hook* AutoContact::getAnchorHook () { return _contact->getAnchorHook(); }
    209  inline Component* AutoContact::getAnchor () const { return _contact->getAnchor(); }
    210  inline Net* AutoContact::getNet () const { return _contact->getNet(); }
    211  inline const Layer* AutoContact::getLayer () const { return _contact->getLayer(); }
    212  inline DbU::Unit AutoContact::getX () const { return _contact->getX(); }
    213  inline DbU::Unit AutoContact::getY () const { return _contact->getY(); }
    214  inline DbU::Unit AutoContact::getDx () const { return _contact->getDx(); }
    215  inline DbU::Unit AutoContact::getDy () const { return _contact->getDy(); }
    216  inline Point AutoContact::getCenter () const { return _contact->getCenter(); }
    217  inline Point AutoContact::getPosition () const { return _contact->getPosition(); }
    218  inline DbU::Unit AutoContact::getWidth () const { return _contact->getWidth(); }
    219  inline DbU::Unit AutoContact::getHalfWidth () const { return _contact->getHalfWidth(); }
    220  inline DbU::Unit AutoContact::getHeight () const { return _contact->getHeight(); }
    221  inline DbU::Unit AutoContact::getHalfHeight () const { return _contact->getHalfHeight(); }
    222  inline Components AutoContact::getSlaveComponents () const { return _contact->getSlaveComponents(); }
    223  inline void AutoContact::setLayer ( const Layer* layer ) { _contact->setLayer(layer); }
    224  inline void AutoContact::setWidth ( DbU::Unit w ) { _contact->setWidth(w); }
    225  inline void AutoContact::setHeight ( DbU::Unit h ) { _contact->setHeight(h); }
    226  inline void AutoContact::setSizes ( DbU::Unit w, DbU::Unit h ) { _contact->setSizes(w,h); }
    227  inline void AutoContact::setX ( DbU::Unit x ) { _contact->setX(x); }
    228  inline void AutoContact::setY ( DbU::Unit y ) { _contact->setY(y); }
    229  inline void AutoContact::setPosition ( DbU::Unit x, DbU::Unit y ) { _contact->setPosition(x,y); }
    230  inline void AutoContact::setPosition ( const Point& p ) { _contact->setPosition(p); }
    231  inline void AutoContact::setDx ( DbU::Unit dx ) { _contact->setDx(dx); }
    232  inline void AutoContact::setDy ( DbU::Unit dy ) { _contact->setDy(dy); }
    233  inline void AutoContact::setOffset ( DbU::Unit dx, DbU::Unit dy ) { _contact->setOffset(dx,dy); }
    234 // AutoContact Inline Functions.
    235  inline bool AutoContact::isInCreationStage () const { return _flags&CntInCreationStage; }
    236  inline bool AutoContact::isInvalidated () const { return _flags&CntInvalidated; }
    237  inline bool AutoContact::isInvalidatedCache () const { return _flags&CntInvalidatedCache; }
    238  inline bool AutoContact::isTurn () const { return _flags&CntTurn; }
    239  inline bool AutoContact::isFixed () const { return _flags&CntFixed; }
    240  inline bool AutoContact::isUserNativeConstraints () const { return _flags&CntUserNativeConstraints; }
    241  inline bool AutoContact::isTerminal () const { return _flags&CntTerminal; }
    242  inline bool AutoContact::isHTee () const { return _flags&CntHTee; }
    243  inline bool AutoContact::isVTee () const { return _flags&CntVTee; }
    244  inline bool AutoContact::hasBadTopology () const { return _flags&CntBadTopology; }
    245  inline size_t AutoContact::getId () const { return _id; }
    246  inline Contact* AutoContact::base () const { return _contact; }
    247  inline GCell* AutoContact::getGCell () const { return _gcell; }
    249  inline void AutoContact::setCBXMin ( DbU::Unit xMin ) { _dxMin = _getDeltaMin(xMin,_gcell->getX()); }
    250  inline void AutoContact::setCBXMax ( DbU::Unit xMax ) { _dxMax = _getDeltaMax(xMax,_gcell->getX(),_gcell->getXMax()); }
    251  inline void AutoContact::setCBYMin ( DbU::Unit yMin ) { _dyMin = _getDeltaMin(yMin,_gcell->getY()); }
    252  inline void AutoContact::setCBYMax ( DbU::Unit yMax ) { _dyMax = _getDeltaMax(yMax,_gcell->getY(),_gcell->getYMax()); }
    253  inline void AutoContact::setFlags ( unsigned int flags ) { _flags|= flags; }
    254  inline void AutoContact::unsetFlags ( unsigned int flags ) { _flags&=~flags; }
    255  inline int AutoContact::_getDeltaMin ( DbU::Unit x, DbU::Unit xMin ) { if (x<xMin) return 0; return (int)DbU::toLambda(x-xMin); }
    256  inline int AutoContact::_getDeltaMax ( DbU::Unit x, DbU::Unit xMin, DbU::Unit xMax ) { if (x>xMax) x=xMax; return (int)DbU::toLambda(x-xMin); }
    257 
    259  { return isFixed() ? _contact->getX() : DbU::fromLambda(_dxMin) + _gcell->getX(); }
    260 
    262  { return isFixed() ? _contact->getX() : DbU::fromLambda(_dxMax) + _gcell->getX(); }
    263 
    265  { return isFixed() ? _contact->getY() : DbU::fromLambda(_dyMin) + _gcell->getY(); }
    266 
    268  { return isFixed() ? _contact->getY() : DbU::fromLambda(_dyMax) + _gcell->getY(); }
    269 
    270 // -------------------------------------------------------------------
    271 // Class : "Katabatic::LocatorHelper".
    272 
    274  public:
    275  inline LocatorHelper ( AutoContact*, unsigned int flags=0 );
    276  inline bool isValid () const;
    277  inline AutoSegment* getSegment () const;
    278  inline void progress ();
    279  private:
    280  inline unsigned int _min () const;
    281  inline unsigned int _max () const;
    282  private:
    283  unsigned int _flags;
    284  unsigned int _index;
    285  AutoContact* _contact;
    286  };
    287 
    288 
    289  inline LocatorHelper::LocatorHelper ( AutoContact* contact, unsigned int flags )
    290  : _flags(flags), _index(_min()), _contact(contact)
    291  {
    292  cdebug_tabw(145,1);
    293  cdebug_log(145,0) << "CTOR LocatorHelper " << contact->_getString() << endl;
    294  cdebug_log(145,0) << "+ _min():" << _min() << endl;
    295  cdebug_log(145,0) << "+ _max():" << _max() << endl;
    296  cdebug_log(145,0) << "+ getSegment(_min()):" << _contact->getSegment(_min()) << endl;
    297  if (not _contact->getSegment(_index)) progress();
    298  cdebug_tabw(145,-1);
    299  }
    300 
    301  inline bool LocatorHelper::isValid () const
    302  { return _index < _max(); }
    303 
    304  inline unsigned int LocatorHelper::_min () const
    305  { return (_flags & (KbHorizontal|KbWithPerpands)) ? 0 : 2; }
    306 
    307  inline unsigned int LocatorHelper::_max () const
    308  { return ((_flags & KbHorizontal) and not (_flags & KbWithPerpands)) ? 2 : 4; }
    309 
    311  {
    312  cdebug_log(145,0) << "LocatorHelper::getSegment(" << _index << ") - " << _contact->getSegment(_index) << endl;
    313  return (_index < _max()) ? _contact->getSegment(_index) : NULL;
    314  }
    315 
    316  inline void LocatorHelper::progress ()
    317  {
    318  cdebug_tabw(145,1);
    319  ++_index;
    320  cdebug_log(145,0) << "LocatorHelper::progress() [" << _index << "] " << _contact->getSegment(_index) << endl;
    321  while ((_index < _max()) and (_contact->getSegment(_index) == NULL)) {
    322  ++_index;
    323  cdebug_log(145,0) << "LocatorHelper::progress() [" << _index << "] " << _contact->getSegment(_index) << endl;
    324  }
    325  cdebug_tabw(145,-1);
    326  }
    327 
    328 
    329 // -------------------------------------------------------------------
    330 // Helper Functions.
    331 
    332 
    333  template<typename Type>inline void order ( Type& a, Type& b ) { if (a>b) std::swap(a,b); }
    334 
    335  inline DbU::Unit setInBound ( DbU::Unit lower, DbU::Unit upper, DbU::Unit& value )
    336  {
    337  if ( lower > value ) value = lower;
    338  if ( upper < value ) value = upper;
    339 
    340  return value;
    341  }
    342 
    343  inline size_t abssub ( size_t a, size_t b ) { return (a>b) ? a-b : b-a; }
    344 
    345 
    346 } // Katabatic namespace.
    347 
    348 
    349 INSPECTOR_P_SUPPORT(Katabatic::AutoContact);
    350 
    351 
    352 #endif // KATABATIC_AUTOCONTACT_H
    Definition: AutoContact.h:63
    Net * getNet() const
    Definition: AutoContact.h:210
    DbU::Unit getY() const
    Definition: GCell.h:245
    static size_t getAllocateds()
    Definition: AutoContact.cpp:153
    @@ -57,23 +57,24 @@ $(function() {
    static const Name & getStaticName()
    Definition: AutoContact.cpp:157
    virtual void checkTopology()
    Definition: AutoContact.cpp:400
    void setOffset(DbU::Unit dx, DbU::Unit dy)
    Definition: AutoContact.h:233
    -
    void setX(const DbU::Unit &x)
    Net * getNet() const
    +
    void setSizes(DbU::Unit width, DbU::Unit height)
    AutoContactFlag
    Definition: AutoContact.h:56
    Hook * getAnchorHook()
    Definition: AutoContact.h:208
    DbU::Unit getDx() const
    Definition: AutoContact.h:214
    +
    void setLayer(const Layer *)
    DbU::Unit getCBXMin() const
    Definition: AutoContact.h:258
    Definition: AutoContact.h:56
    DbU::Unit getWidth() const
    Definition: AutoContact.h:218
    bool isInCreationStage() const
    Definition: AutoContact.h:235
    Definition: AutoContact.h:58
    +
    DbU::Unit getDy() const
    DbU::Unit getCBYMax() const
    Definition: AutoContact.h:267
    void setCBXMax(DbU::Unit xMax)
    Definition: AutoContact.h:250
    virtual DbU::Unit getX() const=0
    bool isFixed() const
    Definition: AutoContact.h:239
    -
    void setDx(const DbU::Unit &dx)
    virtual const Layer * getLayer() const=0
    @@ -87,25 +88,23 @@ $(function() {
    LocatorHelper(AutoContact *, unsigned int flags=0)
    Definition: AutoContact.h:289
    virtual Box getNativeConstraintBox() const
    Definition: AutoContact.cpp:261
    Definition: AutoContact.h:59
    -
    void setWidth(const DbU::Unit &width)
    -
    void setOffset(const DbU::Unit &dx, const DbU::Unit &dy)
    Point getCenter() const
    Definition: AutoContact.h:216
    void setLayer(const Layer *)
    Definition: AutoContact.h:223
    bool canMoveUp(const AutoSegment *moved) const
    Definition: AutoContact.cpp:413
    -
    void setY(const DbU::Unit &y)
    void setWidth(DbU::Unit)
    Definition: AutoContact.h:224
    void setDx(DbU::Unit)
    Definition: AutoContact.h:231
    DbU::Unit getHalfHeight() const
    +
    void setPosition(DbU::Unit x, DbU::Unit y)
    void setCBYMax(DbU::Unit yMax)
    Definition: AutoContact.h:252
    +
    void setHeight(DbU::Unit)
    bool isInvalidated() const
    Definition: AutoContact.h:236
    virtual void translate(const DbU::Unit &tx, const DbU::Unit &ty)
    Definition: AutoContact.cpp:532
    Routing Global Cell.
    Definition: GCell.h:74
    -
    void setSizes(const DbU::Unit &width, const DbU::Unit &height)
    bool isHTee() const
    Definition: AutoContact.h:242
    Component * getAnchor() const
    Abstract base class for AutoSegment.
    Definition: AutoSegment.h:104
    @@ -114,26 +113,32 @@ $(function() {
    Interval getUConstraints(unsigned int direction) const
    Definition: AutoContact.cpp:283
    DbU::Unit getHeight() const
    Definition: AutoContact.h:220
    void migrateConstraintBox(AutoContact *other)
    Definition: AutoContact.cpp:511
    +
    DbU::Unit getDx() const
    void setY(DbU::Unit)
    Definition: AutoContact.h:228
    +
    void setDx(DbU::Unit)
    void setSizes(DbU::Unit width, DbU::Unit height)
    Definition: AutoContact.h:226
    virtual DbU::Unit getY() const=0
    unsigned int getMaxDepth() const
    Definition: AutoContact.cpp:205
    Box getConstraintBox() const
    Definition: AutoContact.h:248
    virtual AutoSegment * getPerpandicular(const AutoSegment *) const =0
    Definition: AutoContact.cpp:183
    +
    void setWidth(DbU::Unit)
    virtual Box getBoundingBox() const
    Definition: AutoContact.cpp:528
    Definition: AutoContact.h:64
    The namespace dedicated to Katabatic.
    Definition: Katabatic.dox:13
    virtual void updateTopology()=0
    Locator Helper Collection&#39;s Locators.
    Definition: AutoContact.h:273
    -
    const DbU::Unit & getWidth() const
    Hook * getAnchorHook()
    DbU::Unit getY() const
    Definition: AutoContact.h:213
    +
    void setOffset(DbU::Unit dx, DbU::Unit dy)
    Component * getAnchor() const
    Definition: AutoContact.h:209
    +
    DbU::Unit getWidth() const
    const Layer * getLayer() const
    Definition: AutoContact.h:211
    DbU::Unit getDy() const
    Definition: AutoContact.h:215
    DbU::Unit getXMax() const
    Definition: GCell.h:246
    +
    void setDy(DbU::Unit)
    +
    void setY(DbU::Unit)
    bool isTurn() const
    Definition: AutoContact.h:238
    void setHeight(DbU::Unit)
    Definition: AutoContact.h:225
    @@ -141,23 +146,21 @@ $(function() {
    Definition: AutoContact.h:62
    DbU::Unit getHalfHeight() const
    Definition: AutoContact.h:221
    Definition: Constants.h:27
    +
    void setX(DbU::Unit)
    size_t getId() const
    Definition: AutoContact.h:245
    unsigned int getMinDepth() const
    Definition: AutoContact.cpp:187
    bool isVTee() const
    Definition: AutoContact.h:243
    Definition: AutoContact.h:60
    DbU::Unit getYMax() const
    Definition: GCell.h:247
    bool canDestroy(unsigned int flags=0) const
    Definition: AutoContact.cpp:161
    -
    void setDy(const DbU::Unit &dy)
    Definition: AutoContact.h:57
    bool isTee(unsigned int direction) const
    Definition: AutoContact.cpp:406
    -
    const DbU::Unit & getDy() const
    DbU::Unit getX() const
    Definition: AutoContact.h:212
    DbU::Unit getCBYMin() const
    Definition: AutoContact.h:264
    bool hasBadTopology() const
    Definition: AutoContact.h:244
    Box & intersectConstraintBox(Box &box) const
    Definition: AutoContact.cpp:507
    virtual const Name & getName() const
    Definition: AutoContact.cpp:175
    Components getSlaveComponents() const
    Definition: AutoContact.h:222
    -
    const DbU::Unit & getHeight() const
    bool restrictConstraintBox(DbU::Unit constraintMin, DbU::Unit constraintMax, unsigned int flags=KbWarnOnError)
    Definition: AutoContact.cpp:453
    Abstract base class for AutoContact.
    Definition: AutoContact.h:70
    void setCBYMin(DbU::Unit yMin)
    Definition: AutoContact.h:251
    @@ -172,26 +175,23 @@ $(function() {
    Hook * getBodyHook()
    Definition: AutoContact.h:207
    void setCBXMin(DbU::Unit xMin)
    Definition: AutoContact.h:249
    virtual void updateGeometry()=0
    -
    void setLayer(const Layer *layer)
    +
    DbU::Unit getHeight() const
    void setGCell(GCell *)
    Definition: AutoContact.cpp:314
    virtual AutoSegment * getOpposite(const AutoSegment *) const =0
    DbU::Unit getHalfWidth() const
    Definition: AutoContact.h:219
    void setX(DbU::Unit)
    Definition: AutoContact.h:227
    static double toLambda(Unit u)
    -
    const DbU::Unit & getDx() const
    -
    void setPosition(const DbU::Unit &x, const DbU::Unit &y)
    GCell * getGCell() const
    Definition: AutoContact.h:247
    bool isValid() const
    Definition: AutoContact.h:301
    Contact * base() const
    Definition: AutoContact.h:246
    -
    void setHeight(const DbU::Unit &height)


    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/AutoHorizontal_8h_source.html b/katabatic/doc/html/AutoHorizontal_8h_source.html index 9084c931..73b1ad4e 100644 --- a/katabatic/doc/html/AutoHorizontal_8h_source.html +++ b/katabatic/doc/html/AutoHorizontal_8h_source.html @@ -84,7 +84,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/AutoSegment_8h_source.html b/katabatic/doc/html/AutoSegment_8h_source.html index fe7ba4ac..3462df47 100644 --- a/katabatic/doc/html/AutoSegment_8h_source.html +++ b/katabatic/doc/html/AutoSegment_8h_source.html @@ -257,7 +257,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/AutoSegments_8h_source.html b/katabatic/doc/html/AutoSegments_8h_source.html index 8aab7b8c..1468aa7a 100644 --- a/katabatic/doc/html/AutoSegments_8h_source.html +++ b/katabatic/doc/html/AutoSegments_8h_source.html @@ -101,7 +101,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/AutoVertical_8h_source.html b/katabatic/doc/html/AutoVertical_8h_source.html index ea0d98cb..a4cb7f7b 100644 --- a/katabatic/doc/html/AutoVertical_8h_source.html +++ b/katabatic/doc/html/AutoVertical_8h_source.html @@ -84,7 +84,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/ChipTools_8h_source.html b/katabatic/doc/html/ChipTools_8h_source.html index 4f80b359..abf6b3ee 100644 --- a/katabatic/doc/html/ChipTools_8h_source.html +++ b/katabatic/doc/html/ChipTools_8h_source.html @@ -71,7 +71,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/Constants_8h_source.html b/katabatic/doc/html/Constants_8h_source.html index 8ecd4190..422986f8 100644 --- a/katabatic/doc/html/Constants_8h_source.html +++ b/katabatic/doc/html/Constants_8h_source.html @@ -74,7 +74,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/GCellGrid_8h_source.html b/katabatic/doc/html/GCellGrid_8h_source.html index f1672da1..b5acb9c2 100644 --- a/katabatic/doc/html/GCellGrid_8h_source.html +++ b/katabatic/doc/html/GCellGrid_8h_source.html @@ -78,7 +78,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/GCell_8h_source.html b/katabatic/doc/html/GCell_8h_source.html index 4e977b94..9a8c6958 100644 --- a/katabatic/doc/html/GCell_8h_source.html +++ b/katabatic/doc/html/GCell_8h_source.html @@ -144,7 +144,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/GCells_8h_source.html b/katabatic/doc/html/GCells_8h_source.html index 181f3224..65ef5163 100644 --- a/katabatic/doc/html/GCells_8h_source.html +++ b/katabatic/doc/html/GCells_8h_source.html @@ -59,7 +59,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/Grid_8h_source.html b/katabatic/doc/html/Grid_8h_source.html index f69fb46b..5f2d8972 100644 --- a/katabatic/doc/html/Grid_8h_source.html +++ b/katabatic/doc/html/Grid_8h_source.html @@ -77,7 +77,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/KatabaticEngine_8h_source.html b/katabatic/doc/html/KatabaticEngine_8h_source.html index 31eb9ac2..50da42f3 100644 --- a/katabatic/doc/html/KatabaticEngine_8h_source.html +++ b/katabatic/doc/html/KatabaticEngine_8h_source.html @@ -122,7 +122,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/Observer_8h_source.html b/katabatic/doc/html/Observer_8h_source.html index edcd189b..87f64cb7 100644 --- a/katabatic/doc/html/Observer_8h_source.html +++ b/katabatic/doc/html/Observer_8h_source.html @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/Session_8h_source.html b/katabatic/doc/html/Session_8h_source.html index 7c7ba3ea..5c82738f 100644 --- a/katabatic/doc/html/Session_8h_source.html +++ b/katabatic/doc/html/Session_8h_source.html @@ -100,7 +100,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/annotated.html b/katabatic/doc/html/annotated.html index 3545b1ba..d4d10884 100644 --- a/katabatic/doc/html/annotated.html +++ b/katabatic/doc/html/annotated.html @@ -82,7 +82,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoContact-members.html b/katabatic/doc/html/classKatabatic_1_1AutoContact-members.html index 83d97420..8e624bd9 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoContact-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoContact-members.html @@ -126,7 +126,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoContact.html b/katabatic/doc/html/classKatabatic_1_1AutoContact.html index 20dd6066..114d5bad 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoContact.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoContact.html @@ -478,7 +478,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::getDx().

    +

    References Contact::getDx().

    @@ -506,7 +506,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::getDy().

    +

    References Contact::getDy().

    @@ -588,7 +588,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::getWidth().

    +

    References Contact::getWidth().

    @@ -644,7 +644,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::getHeight().

    +

    References Contact::getHeight().

    @@ -729,7 +729,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::setLayer().

    +

    References Contact::setLayer().

    Referenced by AutoSegment::reduceDoglegLayer(), AutoContactVTee::updateTopology(), AutoContactTurn::updateTopology(), AutoContactHTee::updateTopology(), and AutoContactTerminal::updateTopology().

    @@ -760,7 +760,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::setWidth().

    +

    References Contact::setWidth().

    @@ -789,7 +789,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::setHeight().

    +

    References Contact::setHeight().

    @@ -828,7 +828,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::setSizes().

    +

    References Contact::setSizes().

    @@ -857,7 +857,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::setX().

    +

    References Contact::setX().

    Referenced by AutoVertical::_postCreate(), AutoContactVTee::updateGeometry(), AutoContactTurn::updateGeometry(), AutoContactHTee::updateGeometry(), and AutoContactTerminal::updateGeometry().

    @@ -888,7 +888,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::setY().

    +

    References Contact::setY().

    Referenced by AutoHorizontal::_postCreate(), AutoContactVTee::updateGeometry(), AutoContactTurn::updateGeometry(), AutoContactHTee::updateGeometry(), and AutoContactTerminal::updateGeometry().

    @@ -929,7 +929,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::setPosition().

    +

    References Contact::setPosition().

    @@ -958,7 +958,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::setPosition().

    +

    References Contact::setPosition().

    @@ -987,7 +987,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::setDx().

    +

    References Contact::setDx().

    @@ -1016,7 +1016,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::setDy().

    +

    References Contact::setDy().

    @@ -1055,7 +1055,7 @@ Notes - Differences from Katabatic 2

    Base class method proxy.

    -

    References Contact::setOffset().

    +

    References Contact::setOffset().

    @@ -2433,7 +2433,7 @@ Notes - Differences from Katabatic 2
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoContactHTee-members.html b/katabatic/doc/html/classKatabatic_1_1AutoContactHTee-members.html index aab1584f..d84953c1 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoContactHTee-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoContactHTee-members.html @@ -127,7 +127,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoContactHTee.html b/katabatic/doc/html/classKatabatic_1_1AutoContactHTee.html index 16928f8f..16e0ee42 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoContactHTee.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoContactHTee.html @@ -276,7 +276,7 @@ Additional Inherited Members
    Returns
    The created AutoContactHTee.

    Create a new AutoContactHTee.

    -

    References Katabatic::CntInCreationStage, and Contact::create().

    +

    References Katabatic::CntInCreationStage, and Contact::create().

    Referenced by GCellTopology::_do_xG(), GCellTopology::_do_xG_1M1_1M2(), and GCellTopology::_do_xG_xM1_xM3().

    @@ -454,7 +454,7 @@ Update H-Tee Topology
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoContactTerminal-members.html b/katabatic/doc/html/classKatabatic_1_1AutoContactTerminal-members.html index 2f8283e9..f844f7a5 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoContactTerminal-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoContactTerminal-members.html @@ -128,7 +128,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoContactTerminal.html b/katabatic/doc/html/classKatabatic_1_1AutoContactTerminal.html index c6d5ae6d..184d3c6f 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoContactTerminal.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoContactTerminal.html @@ -384,7 +384,7 @@ Additional Inherited Members

    Create a new AutoContactTerminal anchored on rp. (x,y) gives the absolute position.

    The anchor component rp is most often a Hurricane::RoutingPad (occurrencing a Hurricane::Segment) or directly a Hurricane::Segment, in case of RoutingPad layer promotion.

    -

    References Katabatic::CntInCreationStage, Contact::create(), Component::getPosition(), and DbU::getValueString().

    +

    References Katabatic::CntInCreationStage, Contact::create(), Component::getPosition(), and DbU::getValueString().

    @@ -594,7 +594,7 @@ Update Terminal Topology
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoContactTurn-members.html b/katabatic/doc/html/classKatabatic_1_1AutoContactTurn-members.html index bcacd688..00f0e701 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoContactTurn-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoContactTurn-members.html @@ -127,7 +127,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoContactTurn.html b/katabatic/doc/html/classKatabatic_1_1AutoContactTurn.html index 7eeeb7fb..4e0ee62f 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoContactTurn.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoContactTurn.html @@ -276,7 +276,7 @@ Additional Inherited Members
    Returns
    The created AutoContactTurn.

    Create a new AutoContactTurn.

    -

    References Katabatic::CntInCreationStage, and Contact::create().

    +

    References Katabatic::CntInCreationStage, and Contact::create().

    Referenced by GCellTopology::_do_1G_1M3(), GCellTopology::_do_1G_xM1(), GCellTopology::_do_xG(), GCellTopology::_do_xG_1M1_1M2(), GCellTopology::_do_xG_1Pad(), GCellTopology::_do_xG_xM1_xM3(), GCellTopology::_do_xG_xM3(), AutoHorizontal::_makeDogleg(), AutoVertical::_makeDogleg(), GCellTopology::doRp_Access(), GCellTopology::doRp_StairCaseH(), GCellTopology::doRp_StairCaseV(), and anonymous_namespace{LoadGrByNet.cpp}::singleGCell().

    @@ -456,7 +456,7 @@ Update Turn Topology
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoContactVTee-members.html b/katabatic/doc/html/classKatabatic_1_1AutoContactVTee-members.html index fa11fe1e..87781eab 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoContactVTee-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoContactVTee-members.html @@ -127,7 +127,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoContactVTee.html b/katabatic/doc/html/classKatabatic_1_1AutoContactVTee.html index f9b83c93..ee8ae3dc 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoContactVTee.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoContactVTee.html @@ -276,7 +276,7 @@ Additional Inherited Members
    Returns
    The created AutoContactVTee.

    Create a new AutoContactVTee.

    -

    References Katabatic::CntInCreationStage, and Contact::create().

    +

    References Katabatic::CntInCreationStage, and Contact::create().

    Referenced by GCellTopology::_do_xG(), GCellTopology::_do_xG_xM1_xM3(), GCellTopology::_do_xG_xM2(), and GCellTopology::_do_xG_xM3().

    @@ -446,7 +446,7 @@ Additional Inherited Members
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoHorizontal-members.html b/katabatic/doc/html/classKatabatic_1_1AutoHorizontal-members.html index 18181ac5..f22d52d4 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoHorizontal-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoHorizontal-members.html @@ -182,7 +182,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoHorizontal.html b/katabatic/doc/html/classKatabatic_1_1AutoHorizontal.html index ea39f0d9..207af76b 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoHorizontal.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoHorizontal.html @@ -1233,7 +1233,7 @@ moveULeft() for an Horizontal
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegment-members.html b/katabatic/doc/html/classKatabatic_1_1AutoSegment-members.html index dd4d7bb5..984445c4 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegment-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegment-members.html @@ -182,7 +182,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegment.html b/katabatic/doc/html/classKatabatic_1_1AutoSegment.html index e95a6f65..d81f94c0 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegment.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegment.html @@ -4367,7 +4367,7 @@ Reduce Example
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegments__Aligneds-members.html b/katabatic/doc/html/classKatabatic_1_1AutoSegments__Aligneds-members.html index 14de1852..9eac41b5 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegments__Aligneds-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegments__Aligneds-members.html @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegments__Aligneds.html b/katabatic/doc/html/classKatabatic_1_1AutoSegments__Aligneds.html index 30a165ab..dfeb41e7 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegments__Aligneds.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegments__Aligneds.html @@ -205,7 +205,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegments__AnchorOnGCell-members.html b/katabatic/doc/html/classKatabatic_1_1AutoSegments__AnchorOnGCell-members.html index 1945be55..81689a8e 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegments__AnchorOnGCell-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegments__AnchorOnGCell-members.html @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegments__AnchorOnGCell.html b/katabatic/doc/html/classKatabatic_1_1AutoSegments__AnchorOnGCell.html index 96e0a9aa..78b319ec 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegments__AnchorOnGCell.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegments__AnchorOnGCell.html @@ -209,7 +209,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegments__InDirection-members.html b/katabatic/doc/html/classKatabatic_1_1AutoSegments__InDirection-members.html index 4ecb9aeb..97ca7a3f 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegments__InDirection-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegments__InDirection-members.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegments__InDirection.html b/katabatic/doc/html/classKatabatic_1_1AutoSegments__InDirection.html index 2728848d..baf8cc57 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegments__InDirection.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegments__InDirection.html @@ -164,7 +164,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegments__IsAccountable-members.html b/katabatic/doc/html/classKatabatic_1_1AutoSegments__IsAccountable-members.html index d41314b1..ade5d557 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegments__IsAccountable-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegments__IsAccountable-members.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegments__IsAccountable.html b/katabatic/doc/html/classKatabatic_1_1AutoSegments__IsAccountable.html index 9ab57e17..569648cf 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegments__IsAccountable.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegments__IsAccountable.html @@ -134,7 +134,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegments__OnContact-members.html b/katabatic/doc/html/classKatabatic_1_1AutoSegments__OnContact-members.html index 95659d9e..9113a1ca 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegments__OnContact-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegments__OnContact-members.html @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegments__OnContact.html b/katabatic/doc/html/classKatabatic_1_1AutoSegments__OnContact.html index 57486d40..d8f966fb 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegments__OnContact.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegments__OnContact.html @@ -215,7 +215,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegments__Perpandiculars-members.html b/katabatic/doc/html/classKatabatic_1_1AutoSegments__Perpandiculars-members.html index d7dd68d0..2dcba9fb 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegments__Perpandiculars-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegments__Perpandiculars-members.html @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoSegments__Perpandiculars.html b/katabatic/doc/html/classKatabatic_1_1AutoSegments__Perpandiculars.html index 2e4def84..bff8a250 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoSegments__Perpandiculars.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoSegments__Perpandiculars.html @@ -195,7 +195,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoVertical-members.html b/katabatic/doc/html/classKatabatic_1_1AutoVertical-members.html index f84c4467..ef6b821f 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoVertical-members.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoVertical-members.html @@ -182,7 +182,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1AutoVertical.html b/katabatic/doc/html/classKatabatic_1_1AutoVertical.html index e6ad2965..847e7c9a 100644 --- a/katabatic/doc/html/classKatabatic_1_1AutoVertical.html +++ b/katabatic/doc/html/classKatabatic_1_1AutoVertical.html @@ -1233,7 +1233,7 @@ moveULeft() for an Horizontal
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1BaseGrid-members.html b/katabatic/doc/html/classKatabatic_1_1BaseGrid-members.html index 05d820e6..fbc82771 100644 --- a/katabatic/doc/html/classKatabatic_1_1BaseGrid-members.html +++ b/katabatic/doc/html/classKatabatic_1_1BaseGrid-members.html @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1BaseGrid.html b/katabatic/doc/html/classKatabatic_1_1BaseGrid.html index 8d45605d..069cd680 100644 --- a/katabatic/doc/html/classKatabatic_1_1BaseGrid.html +++ b/katabatic/doc/html/classKatabatic_1_1BaseGrid.html @@ -439,7 +439,7 @@ Protected Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1BaseGrid_1_1Axis-members.html b/katabatic/doc/html/classKatabatic_1_1BaseGrid_1_1Axis-members.html index 66883367..ff0f545b 100644 --- a/katabatic/doc/html/classKatabatic_1_1BaseGrid_1_1Axis-members.html +++ b/katabatic/doc/html/classKatabatic_1_1BaseGrid_1_1Axis-members.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1BaseGrid_1_1Axis.html b/katabatic/doc/html/classKatabatic_1_1BaseGrid_1_1Axis.html index 0cc081e4..694c295b 100644 --- a/katabatic/doc/html/classKatabatic_1_1BaseGrid_1_1Axis.html +++ b/katabatic/doc/html/classKatabatic_1_1BaseGrid_1_1Axis.html @@ -212,7 +212,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1BaseObserver-members.html b/katabatic/doc/html/classKatabatic_1_1BaseObserver-members.html index 3dee0c0b..d94d3312 100644 --- a/katabatic/doc/html/classKatabatic_1_1BaseObserver-members.html +++ b/katabatic/doc/html/classKatabatic_1_1BaseObserver-members.html @@ -53,7 +53,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1BaseObserver.html b/katabatic/doc/html/classKatabatic_1_1BaseObserver.html index 7403f4df..a3cac117 100644 --- a/katabatic/doc/html/classKatabatic_1_1BaseObserver.html +++ b/katabatic/doc/html/classKatabatic_1_1BaseObserver.html @@ -107,7 +107,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1ChipTools-members.html b/katabatic/doc/html/classKatabatic_1_1ChipTools-members.html index 13c8f357..0a367b90 100644 --- a/katabatic/doc/html/classKatabatic_1_1ChipTools-members.html +++ b/katabatic/doc/html/classKatabatic_1_1ChipTools-members.html @@ -64,7 +64,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1ChipTools.html b/katabatic/doc/html/classKatabatic_1_1ChipTools.html index dbf858b5..6d29554c 100644 --- a/katabatic/doc/html/classKatabatic_1_1ChipTools.html +++ b/katabatic/doc/html/classKatabatic_1_1ChipTools.html @@ -99,7 +99,7 @@ Public Member Functions @@ -412,7 +412,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1GCell-members.html b/katabatic/doc/html/classKatabatic_1_1GCell-members.html index 576fff0a..5c1e91ca 100644 --- a/katabatic/doc/html/classKatabatic_1_1GCell-members.html +++ b/katabatic/doc/html/classKatabatic_1_1GCell-members.html @@ -113,7 +113,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1GCell.html b/katabatic/doc/html/classKatabatic_1_1GCell.html index 56d8986d..8cdf8cdc 100644 --- a/katabatic/doc/html/classKatabatic_1_1GCell.html +++ b/katabatic/doc/html/classKatabatic_1_1GCell.html @@ -1914,7 +1914,7 @@ GCell Implantation
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1GCellDensitySet-members.html b/katabatic/doc/html/classKatabatic_1_1GCellDensitySet-members.html index 90bae86b..89905109 100644 --- a/katabatic/doc/html/classKatabatic_1_1GCellDensitySet-members.html +++ b/katabatic/doc/html/classKatabatic_1_1GCellDensitySet-members.html @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1GCellDensitySet.html b/katabatic/doc/html/classKatabatic_1_1GCellDensitySet.html index 6b8bba76..6189e007 100644 --- a/katabatic/doc/html/classKatabatic_1_1GCellDensitySet.html +++ b/katabatic/doc/html/classKatabatic_1_1GCellDensitySet.html @@ -341,7 +341,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1GCellGrid-members.html b/katabatic/doc/html/classKatabatic_1_1GCellGrid-members.html index 72bd2bb0..72d1c6cd 100644 --- a/katabatic/doc/html/classKatabatic_1_1GCellGrid-members.html +++ b/katabatic/doc/html/classKatabatic_1_1GCellGrid-members.html @@ -95,7 +95,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1GCellGrid.html b/katabatic/doc/html/classKatabatic_1_1GCellGrid.html index 85b0b722..cbd6b5cd 100644 --- a/katabatic/doc/html/classKatabatic_1_1GCellGrid.html +++ b/katabatic/doc/html/classKatabatic_1_1GCellGrid.html @@ -550,7 +550,7 @@ Static Protected Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByDensity-members.html b/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByDensity-members.html index 74893237..ec0be0db 100644 --- a/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByDensity-members.html +++ b/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByDensity-members.html @@ -53,7 +53,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByDensity.html b/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByDensity.html index 898785c9..75ca7815 100644 --- a/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByDensity.html +++ b/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByDensity.html @@ -91,7 +91,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByIndex-members.html b/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByIndex-members.html index 1fafad25..4d8e6199 100644 --- a/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByIndex-members.html +++ b/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByIndex-members.html @@ -52,7 +52,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByIndex.html b/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByIndex.html index a7c2fbcb..35446f2d 100644 --- a/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByIndex.html +++ b/katabatic/doc/html/classKatabatic_1_1GCell_1_1CompareByIndex.html @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1GCell_1_1Key-members.html b/katabatic/doc/html/classKatabatic_1_1GCell_1_1Key-members.html index e2491fb8..ff41be99 100644 --- a/katabatic/doc/html/classKatabatic_1_1GCell_1_1Key-members.html +++ b/katabatic/doc/html/classKatabatic_1_1GCell_1_1Key-members.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1GCell_1_1Key.html b/katabatic/doc/html/classKatabatic_1_1GCell_1_1Key.html index fc132232..ee8a187f 100644 --- a/katabatic/doc/html/classKatabatic_1_1GCell_1_1Key.html +++ b/katabatic/doc/html/classKatabatic_1_1GCell_1_1Key.html @@ -201,7 +201,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1Grid-members.html b/katabatic/doc/html/classKatabatic_1_1Grid-members.html index d11f29a1..6f84b955 100644 --- a/katabatic/doc/html/classKatabatic_1_1Grid-members.html +++ b/katabatic/doc/html/classKatabatic_1_1Grid-members.html @@ -74,7 +74,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1Grid.html b/katabatic/doc/html/classKatabatic_1_1Grid.html index 34c89b38..9598415f 100644 --- a/katabatic/doc/html/classKatabatic_1_1Grid.html +++ b/katabatic/doc/html/classKatabatic_1_1Grid.html @@ -481,7 +481,7 @@ class Katabatic::Grid< GCellT >
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1KatabaticEngine-members.html b/katabatic/doc/html/classKatabatic_1_1KatabaticEngine-members.html index 32b609d8..0e855148 100644 --- a/katabatic/doc/html/classKatabatic_1_1KatabaticEngine-members.html +++ b/katabatic/doc/html/classKatabatic_1_1KatabaticEngine-members.html @@ -109,7 +109,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1KatabaticEngine.html b/katabatic/doc/html/classKatabatic_1_1KatabaticEngine.html index 0f831c22..61b15d5c 100644 --- a/katabatic/doc/html/classKatabatic_1_1KatabaticEngine.html +++ b/katabatic/doc/html/classKatabatic_1_1KatabaticEngine.html @@ -1424,7 +1424,7 @@ KatabaticEngine Implementation Details
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1LocatorHelper-members.html b/katabatic/doc/html/classKatabatic_1_1LocatorHelper-members.html index 33d23b17..9ecb0082 100644 --- a/katabatic/doc/html/classKatabatic_1_1LocatorHelper-members.html +++ b/katabatic/doc/html/classKatabatic_1_1LocatorHelper-members.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1LocatorHelper.html b/katabatic/doc/html/classKatabatic_1_1LocatorHelper.html index 11f5e51d..e37b0f68 100644 --- a/katabatic/doc/html/classKatabatic_1_1LocatorHelper.html +++ b/katabatic/doc/html/classKatabatic_1_1LocatorHelper.html @@ -215,7 +215,7 @@ Implementation Details
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1Observable-members.html b/katabatic/doc/html/classKatabatic_1_1Observable-members.html index d5b9a868..99abd434 100644 --- a/katabatic/doc/html/classKatabatic_1_1Observable-members.html +++ b/katabatic/doc/html/classKatabatic_1_1Observable-members.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1Observable.html b/katabatic/doc/html/classKatabatic_1_1Observable.html index cec77b86..faebda0a 100644 --- a/katabatic/doc/html/classKatabatic_1_1Observable.html +++ b/katabatic/doc/html/classKatabatic_1_1Observable.html @@ -219,7 +219,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1Observer-members.html b/katabatic/doc/html/classKatabatic_1_1Observer-members.html index ce2ee89e..17dfec7e 100644 --- a/katabatic/doc/html/classKatabatic_1_1Observer-members.html +++ b/katabatic/doc/html/classKatabatic_1_1Observer-members.html @@ -55,7 +55,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1Observer.html b/katabatic/doc/html/classKatabatic_1_1Observer.html index 05efaccf..2df5ffb3 100644 --- a/katabatic/doc/html/classKatabatic_1_1Observer.html +++ b/katabatic/doc/html/classKatabatic_1_1Observer.html @@ -142,7 +142,7 @@ Observer Implementation Notes
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1Session-members.html b/katabatic/doc/html/classKatabatic_1_1Session-members.html index 8df13473..535a41bc 100644 --- a/katabatic/doc/html/classKatabatic_1_1Session-members.html +++ b/katabatic/doc/html/classKatabatic_1_1Session-members.html @@ -86,7 +86,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classKatabatic_1_1Session.html b/katabatic/doc/html/classKatabatic_1_1Session.html index 6a65406d..b501622a 100644 --- a/katabatic/doc/html/classKatabatic_1_1Session.html +++ b/katabatic/doc/html/classKatabatic_1_1Session.html @@ -1149,7 +1149,7 @@ Revalidate AutoSegments. Just before this stage, they are on the correct axis an
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classanonymous__namespace_02LoadGrByNet_8cpp_03_1_1GCellTopology-members.html b/katabatic/doc/html/classanonymous__namespace_02LoadGrByNet_8cpp_03_1_1GCellTopology-members.html index e16bc880..bcc5663d 100644 --- a/katabatic/doc/html/classanonymous__namespace_02LoadGrByNet_8cpp_03_1_1GCellTopology-members.html +++ b/katabatic/doc/html/classanonymous__namespace_02LoadGrByNet_8cpp_03_1_1GCellTopology-members.html @@ -66,7 +66,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classanonymous__namespace_02LoadGrByNet_8cpp_03_1_1GCellTopology.html b/katabatic/doc/html/classanonymous__namespace_02LoadGrByNet_8cpp_03_1_1GCellTopology.html index 864916c3..f6663e3f 100644 --- a/katabatic/doc/html/classanonymous__namespace_02LoadGrByNet_8cpp_03_1_1GCellTopology.html +++ b/katabatic/doc/html/classanonymous__namespace_02LoadGrByNet_8cpp_03_1_1GCellTopology.html @@ -97,7 +97,7 @@ Private Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/classes.html b/katabatic/doc/html/classes.html index 8ea794f0..efd588a9 100644 --- a/katabatic/doc/html/classes.html +++ b/katabatic/doc/html/classes.html @@ -82,7 +82,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/dir_46a5d811a0c60e95b7acaa92d73c003a.html b/katabatic/doc/html/dir_46a5d811a0c60e95b7acaa92d73c003a.html index 52d0c56f..4323affa 100644 --- a/katabatic/doc/html/dir_46a5d811a0c60e95b7acaa92d73c003a.html +++ b/katabatic/doc/html/dir_46a5d811a0c60e95b7acaa92d73c003a.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/katabatic/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html index e7a77b02..b027adea 100644 --- a/katabatic/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ b/katabatic/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -53,7 +53,7 @@ Directories
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/files.html b/katabatic/doc/html/files.html index b5c98025..5b112bb9 100644 --- a/katabatic/doc/html/files.html +++ b/katabatic/doc/html/files.html @@ -67,7 +67,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions.html b/katabatic/doc/html/functions.html index 5daf0a95..34a77f28 100644 --- a/katabatic/doc/html/functions.html +++ b/katabatic/doc/html/functions.html @@ -106,7 +106,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_0x7e.html b/katabatic/doc/html/functions_0x7e.html index 85ca2f2e..d39eddf1 100644 --- a/katabatic/doc/html/functions_0x7e.html +++ b/katabatic/doc/html/functions_0x7e.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_a.html b/katabatic/doc/html/functions_a.html index 2b8d8bfc..e60aa075 100644 --- a/katabatic/doc/html/functions_a.html +++ b/katabatic/doc/html/functions_a.html @@ -94,7 +94,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_b.html b/katabatic/doc/html/functions_b.html index d36d6d69..b246e97f 100644 --- a/katabatic/doc/html/functions_b.html +++ b/katabatic/doc/html/functions_b.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_c.html b/katabatic/doc/html/functions_c.html index 9362a8d3..af851329 100644 --- a/katabatic/doc/html/functions_c.html +++ b/katabatic/doc/html/functions_c.html @@ -130,7 +130,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_d.html b/katabatic/doc/html/functions_d.html index f18b49f0..95c7f28d 100644 --- a/katabatic/doc/html/functions_d.html +++ b/katabatic/doc/html/functions_d.html @@ -84,7 +84,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_e.html b/katabatic/doc/html/functions_e.html index c8852062..4e7164be 100644 --- a/katabatic/doc/html/functions_e.html +++ b/katabatic/doc/html/functions_e.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_enum.html b/katabatic/doc/html/functions_enum.html index 67245951..b2b3ef64 100644 --- a/katabatic/doc/html/functions_enum.html +++ b/katabatic/doc/html/functions_enum.html @@ -46,7 +46,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_eval.html b/katabatic/doc/html/functions_eval.html index 5b7d2b08..e0fc75ce 100644 --- a/katabatic/doc/html/functions_eval.html +++ b/katabatic/doc/html/functions_eval.html @@ -64,7 +64,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_f.html b/katabatic/doc/html/functions_f.html index 7c9cd929..9f33f0a1 100644 --- a/katabatic/doc/html/functions_f.html +++ b/katabatic/doc/html/functions_f.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func.html b/katabatic/doc/html/functions_func.html index c7e594da..69ce2ecd 100644 --- a/katabatic/doc/html/functions_func.html +++ b/katabatic/doc/html/functions_func.html @@ -106,7 +106,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_0x7e.html b/katabatic/doc/html/functions_func_0x7e.html index 22361656..f19c2d5c 100644 --- a/katabatic/doc/html/functions_func_0x7e.html +++ b/katabatic/doc/html/functions_func_0x7e.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_a.html b/katabatic/doc/html/functions_func_a.html index dbe1dcef..d0dabdc2 100644 --- a/katabatic/doc/html/functions_func_a.html +++ b/katabatic/doc/html/functions_func_a.html @@ -85,7 +85,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_b.html b/katabatic/doc/html/functions_func_b.html index e52d87d0..464215ed 100644 --- a/katabatic/doc/html/functions_func_b.html +++ b/katabatic/doc/html/functions_func_b.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_c.html b/katabatic/doc/html/functions_func_c.html index e4637313..56df3a57 100644 --- a/katabatic/doc/html/functions_func_c.html +++ b/katabatic/doc/html/functions_func_c.html @@ -130,7 +130,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_d.html b/katabatic/doc/html/functions_func_d.html index 6e4dde86..13d1cd57 100644 --- a/katabatic/doc/html/functions_func_d.html +++ b/katabatic/doc/html/functions_func_d.html @@ -81,7 +81,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_e.html b/katabatic/doc/html/functions_func_e.html index 757391ef..7a5d2533 100644 --- a/katabatic/doc/html/functions_func_e.html +++ b/katabatic/doc/html/functions_func_e.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_f.html b/katabatic/doc/html/functions_func_f.html index e0f767c9..cc447d98 100644 --- a/katabatic/doc/html/functions_func_f.html +++ b/katabatic/doc/html/functions_func_f.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_g.html b/katabatic/doc/html/functions_func_g.html index 267577d0..e1a4be12 100644 --- a/katabatic/doc/html/functions_func_g.html +++ b/katabatic/doc/html/functions_func_g.html @@ -622,7 +622,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_h.html b/katabatic/doc/html/functions_func_h.html index e9e20187..cb4bb033 100644 --- a/katabatic/doc/html/functions_func_h.html +++ b/katabatic/doc/html/functions_func_h.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_i.html b/katabatic/doc/html/functions_func_i.html index 98c34290..764df136 100644 --- a/katabatic/doc/html/functions_func_i.html +++ b/katabatic/doc/html/functions_func_i.html @@ -169,7 +169,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_k.html b/katabatic/doc/html/functions_func_k.html index 897d8a00..50b7bc00 100644 --- a/katabatic/doc/html/functions_func_k.html +++ b/katabatic/doc/html/functions_func_k.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_l.html b/katabatic/doc/html/functions_func_l.html index fa5bda37..bcd3e6d2 100644 --- a/katabatic/doc/html/functions_func_l.html +++ b/katabatic/doc/html/functions_func_l.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_m.html b/katabatic/doc/html/functions_func_m.html index 22c5a9c5..0a7df38b 100644 --- a/katabatic/doc/html/functions_func_m.html +++ b/katabatic/doc/html/functions_func_m.html @@ -73,7 +73,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_n.html b/katabatic/doc/html/functions_func_n.html index 74ba7840..9b5173f4 100644 --- a/katabatic/doc/html/functions_func_n.html +++ b/katabatic/doc/html/functions_func_n.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_o.html b/katabatic/doc/html/functions_func_o.html index 3b72b751..431d533d 100644 --- a/katabatic/doc/html/functions_func_o.html +++ b/katabatic/doc/html/functions_func_o.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_p.html b/katabatic/doc/html/functions_func_p.html index a1df0d71..24121784 100644 --- a/katabatic/doc/html/functions_func_p.html +++ b/katabatic/doc/html/functions_func_p.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_r.html b/katabatic/doc/html/functions_func_r.html index a8a1e809..5304f0f6 100644 --- a/katabatic/doc/html/functions_func_r.html +++ b/katabatic/doc/html/functions_func_r.html @@ -88,7 +88,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_s.html b/katabatic/doc/html/functions_func_s.html index c7c88d9b..5c632624 100644 --- a/katabatic/doc/html/functions_func_s.html +++ b/katabatic/doc/html/functions_func_s.html @@ -165,7 +165,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_t.html b/katabatic/doc/html/functions_func_t.html index 531a5581..7362ee44 100644 --- a/katabatic/doc/html/functions_func_t.html +++ b/katabatic/doc/html/functions_func_t.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_u.html b/katabatic/doc/html/functions_func_u.html index e9c3da9f..6befeba6 100644 --- a/katabatic/doc/html/functions_func_u.html +++ b/katabatic/doc/html/functions_func_u.html @@ -93,7 +93,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_func_x.html b/katabatic/doc/html/functions_func_x.html index 4478bfb4..438acbe2 100644 --- a/katabatic/doc/html/functions_func_x.html +++ b/katabatic/doc/html/functions_func_x.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_g.html b/katabatic/doc/html/functions_g.html index d91761ce..750a72cc 100644 --- a/katabatic/doc/html/functions_g.html +++ b/katabatic/doc/html/functions_g.html @@ -622,7 +622,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_h.html b/katabatic/doc/html/functions_h.html index 8bdc48d1..1cb6a36c 100644 --- a/katabatic/doc/html/functions_h.html +++ b/katabatic/doc/html/functions_h.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_i.html b/katabatic/doc/html/functions_i.html index 2906f707..3bb7d332 100644 --- a/katabatic/doc/html/functions_i.html +++ b/katabatic/doc/html/functions_i.html @@ -169,7 +169,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_k.html b/katabatic/doc/html/functions_k.html index 279c808c..125684a2 100644 --- a/katabatic/doc/html/functions_k.html +++ b/katabatic/doc/html/functions_k.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_l.html b/katabatic/doc/html/functions_l.html index 9abe4fe9..2334bac4 100644 --- a/katabatic/doc/html/functions_l.html +++ b/katabatic/doc/html/functions_l.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_m.html b/katabatic/doc/html/functions_m.html index 6b548a7f..4cb5fe2a 100644 --- a/katabatic/doc/html/functions_m.html +++ b/katabatic/doc/html/functions_m.html @@ -85,7 +85,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_n.html b/katabatic/doc/html/functions_n.html index 3ce4b1c2..5d4a97bf 100644 --- a/katabatic/doc/html/functions_n.html +++ b/katabatic/doc/html/functions_n.html @@ -52,7 +52,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_o.html b/katabatic/doc/html/functions_o.html index 32aecb47..f56f883a 100644 --- a/katabatic/doc/html/functions_o.html +++ b/katabatic/doc/html/functions_o.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_p.html b/katabatic/doc/html/functions_p.html index 9a962b74..9ccc3a4a 100644 --- a/katabatic/doc/html/functions_p.html +++ b/katabatic/doc/html/functions_p.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_r.html b/katabatic/doc/html/functions_r.html index 8f44637d..b87583e7 100644 --- a/katabatic/doc/html/functions_r.html +++ b/katabatic/doc/html/functions_r.html @@ -88,7 +88,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_s.html b/katabatic/doc/html/functions_s.html index df214f0b..6f5316a4 100644 --- a/katabatic/doc/html/functions_s.html +++ b/katabatic/doc/html/functions_s.html @@ -168,7 +168,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_t.html b/katabatic/doc/html/functions_t.html index cc704f04..f8237e51 100644 --- a/katabatic/doc/html/functions_t.html +++ b/katabatic/doc/html/functions_t.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_type.html b/katabatic/doc/html/functions_type.html index 93b7d66c..3dfc0921 100644 --- a/katabatic/doc/html/functions_type.html +++ b/katabatic/doc/html/functions_type.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_u.html b/katabatic/doc/html/functions_u.html index b8985929..57092675 100644 --- a/katabatic/doc/html/functions_u.html +++ b/katabatic/doc/html/functions_u.html @@ -93,7 +93,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/functions_x.html b/katabatic/doc/html/functions_x.html index c9e948fa..6f820400 100644 --- a/katabatic/doc/html/functions_x.html +++ b/katabatic/doc/html/functions_x.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/graph_legend.html b/katabatic/doc/html/graph_legend.html index ab7e663e..4c713a67 100644 --- a/katabatic/doc/html/graph_legend.html +++ b/katabatic/doc/html/graph_legend.html @@ -74,7 +74,7 @@ A yellow dashed arrow denotes a relation between a template instance and the tem
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/group__LoadGlobalRouting.html b/katabatic/doc/html/group__LoadGlobalRouting.html index dfa9f750..23658a77 100644 --- a/katabatic/doc/html/group__LoadGlobalRouting.html +++ b/katabatic/doc/html/group__LoadGlobalRouting.html @@ -377,7 +377,7 @@ doRp_Access()

    The GCell into which the AutoContactTerminal is created may be under the pads area. However, it will be right on the border of the GCell. The global router vertexes of GCell under the pad area are marked as blocked so will never be used for routing.

    Remark: The segments and contacts added to ensure the layer connexity are not
    put into the Katabatic database. They are plain Hurricane objects, invisibles from it.
    -

    References Contact::create(), Horizontal::create(), Vertical::create(), AutoContactTerminal::create(), Hook::detach(), Component::getBodyHook(), RoutingPad::getBoundingBox(), RoutingPad::getCenter(), Session::getContactLayer(), Grid< GCellT >::getGCell(), KatabaticEngine::getGCellGrid(), Box::getHeight(), Session::getKatabatic(), RoutingPad::getLayer(), Component::getNet(), RoutingPad::getOccurrence(), Transformation::getOrientation(), Occurrence::getPath(), Session::getRoutingLayer(), Path::getTransformation(), Box::getWidth(), Box::getXMax(), Box::getXMin(), Box::getYMax(), Box::getYMin(), anonymous_namespace{LoadGrByNet.cpp}::HAccess, Katabatic::KbHorizontal, Point::setX(), and Point::setY().

    +

    References Contact::create(), Horizontal::create(), Vertical::create(), AutoContactTerminal::create(), Hook::detach(), Component::getBodyHook(), RoutingPad::getBoundingBox(), RoutingPad::getCenter(), Session::getContactLayer(), Grid< GCellT >::getGCell(), KatabaticEngine::getGCellGrid(), Box::getHeight(), Session::getKatabatic(), RoutingPad::getLayer(), Component::getNet(), RoutingPad::getOccurrence(), Transformation::getOrientation(), Occurrence::getPath(), Session::getRoutingLayer(), Path::getTransformation(), Box::getWidth(), Box::getXMax(), Box::getXMin(), Box::getYMax(), Box::getYMin(), anonymous_namespace{LoadGrByNet.cpp}::HAccess, Katabatic::KbHorizontal, Point::setX(), and Point::setY().

    Referenced by GCellTopology::_do_xG_1Pad().

    @@ -866,7 +866,7 @@ _do_xG_xM3()
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/group__grpSynthHierarchy.html b/katabatic/doc/html/group__grpSynthHierarchy.html index a13f8a92..ec87c741 100644 --- a/katabatic/doc/html/group__grpSynthHierarchy.html +++ b/katabatic/doc/html/group__grpSynthHierarchy.html @@ -114,7 +114,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/hierarchy.html b/katabatic/doc/html/hierarchy.html index edceb7aa..e664f19f 100644 --- a/katabatic/doc/html/hierarchy.html +++ b/katabatic/doc/html/hierarchy.html @@ -85,7 +85,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/index.html b/katabatic/doc/html/index.html index 8d8a1164..81df0ec2 100644 --- a/katabatic/doc/html/index.html +++ b/katabatic/doc/html/index.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/modules.html b/katabatic/doc/html/modules.html index b2f0b678..b5d30d25 100644 --- a/katabatic/doc/html/modules.html +++ b/katabatic/doc/html/modules.html @@ -55,7 +55,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/namespaceKatabatic.html b/katabatic/doc/html/namespaceKatabatic.html index b33ebde9..06d2cd06 100644 --- a/katabatic/doc/html/namespaceKatabatic.html +++ b/katabatic/doc/html/namespaceKatabatic.html @@ -615,7 +615,7 @@ Enumerations
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/namespaceanonymous__namespace_02AutoSegment_8cpp_03.html b/katabatic/doc/html/namespaceanonymous__namespace_02AutoSegment_8cpp_03.html index b9d721c0..96c1831e 100644 --- a/katabatic/doc/html/namespaceanonymous__namespace_02AutoSegment_8cpp_03.html +++ b/katabatic/doc/html/namespaceanonymous__namespace_02AutoSegment_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/namespaceanonymous__namespace_02ChipTools_8cpp_03.html b/katabatic/doc/html/namespaceanonymous__namespace_02ChipTools_8cpp_03.html index 5485653f..36561442 100644 --- a/katabatic/doc/html/namespaceanonymous__namespace_02ChipTools_8cpp_03.html +++ b/katabatic/doc/html/namespaceanonymous__namespace_02ChipTools_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/namespaceanonymous__namespace_02GCell_8cpp_03.html b/katabatic/doc/html/namespaceanonymous__namespace_02GCell_8cpp_03.html index f5c569ec..4c233389 100644 --- a/katabatic/doc/html/namespaceanonymous__namespace_02GCell_8cpp_03.html +++ b/katabatic/doc/html/namespaceanonymous__namespace_02GCell_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/namespaceanonymous__namespace_02KatabaticEngine_8cpp_03.html b/katabatic/doc/html/namespaceanonymous__namespace_02KatabaticEngine_8cpp_03.html index b7832bdf..a068970f 100644 --- a/katabatic/doc/html/namespaceanonymous__namespace_02KatabaticEngine_8cpp_03.html +++ b/katabatic/doc/html/namespaceanonymous__namespace_02KatabaticEngine_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/namespaceanonymous__namespace_02LoadGrByNet_8cpp_03.html b/katabatic/doc/html/namespaceanonymous__namespace_02LoadGrByNet_8cpp_03.html index acc36a55..3750d3e0 100644 --- a/katabatic/doc/html/namespaceanonymous__namespace_02LoadGrByNet_8cpp_03.html +++ b/katabatic/doc/html/namespaceanonymous__namespace_02LoadGrByNet_8cpp_03.html @@ -83,7 +83,7 @@ Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/namespaceanonymous__namespace_02Session_8cpp_03.html b/katabatic/doc/html/namespaceanonymous__namespace_02Session_8cpp_03.html index d3f5783b..855e9245 100644 --- a/katabatic/doc/html/namespaceanonymous__namespace_02Session_8cpp_03.html +++ b/katabatic/doc/html/namespaceanonymous__namespace_02Session_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/namespacemembers.html b/katabatic/doc/html/namespacemembers.html index 7cfbfcf7..de7c4e91 100644 --- a/katabatic/doc/html/namespacemembers.html +++ b/katabatic/doc/html/namespacemembers.html @@ -333,7 +333,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/namespacemembers_enum.html b/katabatic/doc/html/namespacemembers_enum.html index 2215ef41..42d2a368 100644 --- a/katabatic/doc/html/namespacemembers_enum.html +++ b/katabatic/doc/html/namespacemembers_enum.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/namespacemembers_eval.html b/katabatic/doc/html/namespacemembers_eval.html index 9495651d..de305467 100644 --- a/katabatic/doc/html/namespacemembers_eval.html +++ b/katabatic/doc/html/namespacemembers_eval.html @@ -269,7 +269,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/namespacemembers_func.html b/katabatic/doc/html/namespacemembers_func.html index 0dcdc8d3..ba866686 100644 --- a/katabatic/doc/html/namespacemembers_func.html +++ b/katabatic/doc/html/namespacemembers_func.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/namespacemembers_type.html b/katabatic/doc/html/namespacemembers_type.html index e234c458..1a1f230c 100644 --- a/katabatic/doc/html/namespacemembers_type.html +++ b/katabatic/doc/html/namespacemembers_type.html @@ -70,7 +70,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/html/namespaces.html b/katabatic/doc/html/namespaces.html index 6e179cf7..2bc8c183 100644 --- a/katabatic/doc/html/namespaces.html +++ b/katabatic/doc/html/namespaces.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/katabatic/doc/latex/refman.tex b/katabatic/doc/latex/refman.tex index 7541edda..c3336a7f 100644 --- a/katabatic/doc/latex/refman.tex +++ b/katabatic/doc/latex/refman.tex @@ -34,7 +34,7 @@ \vspace*{1cm} {\large Generated by Doxygen 1.8.14}\\ \vspace*{0.5cm} - {\small Thu Nov 12 2020 13:59:30}\\ + {\small Fri Oct 1 2021 19:23:14}\\ \end{center} \end{titlepage} diff --git a/katabatic/doc/man/man3/Katabatic.3 b/katabatic/doc/man/man3/Katabatic.3 index e515a96f..e8bca3eb 100644 --- a/katabatic/doc/man/man3/Katabatic.3 +++ b/katabatic/doc/man/man3/Katabatic.3 @@ -1,4 +1,4 @@ -.TH "Katabatic" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "Katabatic" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoContact.3 b/katabatic/doc/man/man3/Katabatic_AutoContact.3 index 44de623e..7ef2cabe 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoContact.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoContact.3 @@ -1,4 +1,4 @@ -.TH "AutoContact" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoContact" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoContactHTee.3 b/katabatic/doc/man/man3/Katabatic_AutoContactHTee.3 index dc774fad..69e4dfca 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoContactHTee.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoContactHTee.3 @@ -1,4 +1,4 @@ -.TH "AutoContactHTee" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoContactHTee" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoContactTerminal.3 b/katabatic/doc/man/man3/Katabatic_AutoContactTerminal.3 index c012830a..a0d357f5 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoContactTerminal.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoContactTerminal.3 @@ -1,4 +1,4 @@ -.TH "AutoContactTerminal" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoContactTerminal" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoContactTurn.3 b/katabatic/doc/man/man3/Katabatic_AutoContactTurn.3 index 589f2873..b7be61f0 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoContactTurn.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoContactTurn.3 @@ -1,4 +1,4 @@ -.TH "AutoContactTurn" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoContactTurn" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoContactVTee.3 b/katabatic/doc/man/man3/Katabatic_AutoContactVTee.3 index 3095f32b..6ce0361a 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoContactVTee.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoContactVTee.3 @@ -1,4 +1,4 @@ -.TH "AutoContactVTee" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoContactVTee" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoHorizontal.3 b/katabatic/doc/man/man3/Katabatic_AutoHorizontal.3 index d8414070..34deff0c 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoHorizontal.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoHorizontal.3 @@ -1,4 +1,4 @@ -.TH "AutoHorizontal" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoHorizontal" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoSegment.3 b/katabatic/doc/man/man3/Katabatic_AutoSegment.3 index b87def1b..0b053af7 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoSegment.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoSegment.3 @@ -1,4 +1,4 @@ -.TH "AutoSegment" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoSegment" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoSegments_Aligneds.3 b/katabatic/doc/man/man3/Katabatic_AutoSegments_Aligneds.3 index de93d17a..e0edc88c 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoSegments_Aligneds.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoSegments_Aligneds.3 @@ -1,4 +1,4 @@ -.TH "AutoSegments_Aligneds" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoSegments_Aligneds" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoSegments_AnchorOnGCell.3 b/katabatic/doc/man/man3/Katabatic_AutoSegments_AnchorOnGCell.3 index 4cea2dc6..b4ddc4cf 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoSegments_AnchorOnGCell.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoSegments_AnchorOnGCell.3 @@ -1,4 +1,4 @@ -.TH "AutoSegments_AnchorOnGCell" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoSegments_AnchorOnGCell" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoSegments_InDirection.3 b/katabatic/doc/man/man3/Katabatic_AutoSegments_InDirection.3 index 3ff3cea6..ab8f39db 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoSegments_InDirection.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoSegments_InDirection.3 @@ -1,4 +1,4 @@ -.TH "AutoSegments_InDirection" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoSegments_InDirection" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoSegments_IsAccountable.3 b/katabatic/doc/man/man3/Katabatic_AutoSegments_IsAccountable.3 index 0c435145..a32ebea8 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoSegments_IsAccountable.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoSegments_IsAccountable.3 @@ -1,4 +1,4 @@ -.TH "AutoSegments_IsAccountable" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoSegments_IsAccountable" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoSegments_OnContact.3 b/katabatic/doc/man/man3/Katabatic_AutoSegments_OnContact.3 index de8430c3..e6c799b1 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoSegments_OnContact.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoSegments_OnContact.3 @@ -1,4 +1,4 @@ -.TH "AutoSegments_OnContact" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoSegments_OnContact" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoSegments_Perpandiculars.3 b/katabatic/doc/man/man3/Katabatic_AutoSegments_Perpandiculars.3 index 08989cdd..d9040d1c 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoSegments_Perpandiculars.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoSegments_Perpandiculars.3 @@ -1,4 +1,4 @@ -.TH "AutoSegments_Perpandiculars" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoSegments_Perpandiculars" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_AutoVertical.3 b/katabatic/doc/man/man3/Katabatic_AutoVertical.3 index 90da3588..faaf1af1 100644 --- a/katabatic/doc/man/man3/Katabatic_AutoVertical.3 +++ b/katabatic/doc/man/man3/Katabatic_AutoVertical.3 @@ -1,4 +1,4 @@ -.TH "AutoVertical" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "AutoVertical" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_BaseGrid.3 b/katabatic/doc/man/man3/Katabatic_BaseGrid.3 index 8111db07..d19aeb78 100644 --- a/katabatic/doc/man/man3/Katabatic_BaseGrid.3 +++ b/katabatic/doc/man/man3/Katabatic_BaseGrid.3 @@ -1,4 +1,4 @@ -.TH "BaseGrid" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "BaseGrid" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_BaseGrid_Axis.3 b/katabatic/doc/man/man3/Katabatic_BaseGrid_Axis.3 index d55bcd71..84927402 100644 --- a/katabatic/doc/man/man3/Katabatic_BaseGrid_Axis.3 +++ b/katabatic/doc/man/man3/Katabatic_BaseGrid_Axis.3 @@ -1,4 +1,4 @@ -.TH "BaseGrid::Axis" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "BaseGrid::Axis" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_BaseObserver.3 b/katabatic/doc/man/man3/Katabatic_BaseObserver.3 index 5ce0b117..2cffea06 100644 --- a/katabatic/doc/man/man3/Katabatic_BaseObserver.3 +++ b/katabatic/doc/man/man3/Katabatic_BaseObserver.3 @@ -1,4 +1,4 @@ -.TH "BaseObserver" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "BaseObserver" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_ChipTools.3 b/katabatic/doc/man/man3/Katabatic_ChipTools.3 index f423013d..ce1646f9 100644 --- a/katabatic/doc/man/man3/Katabatic_ChipTools.3 +++ b/katabatic/doc/man/man3/Katabatic_ChipTools.3 @@ -1,4 +1,4 @@ -.TH "ChipTools" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "ChipTools" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_GCell.3 b/katabatic/doc/man/man3/Katabatic_GCell.3 index 87edadd1..a6a6b272 100644 --- a/katabatic/doc/man/man3/Katabatic_GCell.3 +++ b/katabatic/doc/man/man3/Katabatic_GCell.3 @@ -1,4 +1,4 @@ -.TH "GCell" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "GCell" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_GCellDensitySet.3 b/katabatic/doc/man/man3/Katabatic_GCellDensitySet.3 index 9c5a2b26..b2c98268 100644 --- a/katabatic/doc/man/man3/Katabatic_GCellDensitySet.3 +++ b/katabatic/doc/man/man3/Katabatic_GCellDensitySet.3 @@ -1,4 +1,4 @@ -.TH "GCellDensitySet" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "GCellDensitySet" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_GCellGrid.3 b/katabatic/doc/man/man3/Katabatic_GCellGrid.3 index 99bb2818..3f76a314 100644 --- a/katabatic/doc/man/man3/Katabatic_GCellGrid.3 +++ b/katabatic/doc/man/man3/Katabatic_GCellGrid.3 @@ -1,4 +1,4 @@ -.TH "GCellGrid" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "GCellGrid" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_GCell_CompareByDensity.3 b/katabatic/doc/man/man3/Katabatic_GCell_CompareByDensity.3 index 786ec134..49fe2f37 100644 --- a/katabatic/doc/man/man3/Katabatic_GCell_CompareByDensity.3 +++ b/katabatic/doc/man/man3/Katabatic_GCell_CompareByDensity.3 @@ -1,4 +1,4 @@ -.TH "GCell::CompareByDensity" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "GCell::CompareByDensity" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_GCell_CompareByIndex.3 b/katabatic/doc/man/man3/Katabatic_GCell_CompareByIndex.3 index 19047d43..8ce56112 100644 --- a/katabatic/doc/man/man3/Katabatic_GCell_CompareByIndex.3 +++ b/katabatic/doc/man/man3/Katabatic_GCell_CompareByIndex.3 @@ -1,4 +1,4 @@ -.TH "GCell::CompareByIndex" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "GCell::CompareByIndex" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_GCell_Key.3 b/katabatic/doc/man/man3/Katabatic_GCell_Key.3 index 37f06b4f..e5597599 100644 --- a/katabatic/doc/man/man3/Katabatic_GCell_Key.3 +++ b/katabatic/doc/man/man3/Katabatic_GCell_Key.3 @@ -1,4 +1,4 @@ -.TH "GCell::Key" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "GCell::Key" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_Grid.3 b/katabatic/doc/man/man3/Katabatic_Grid.3 index 7336241e..23350c3a 100644 --- a/katabatic/doc/man/man3/Katabatic_Grid.3 +++ b/katabatic/doc/man/man3/Katabatic_Grid.3 @@ -1,4 +1,4 @@ -.TH "Grid< GCellT >" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "Grid< GCellT >" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_KatabaticEngine.3 b/katabatic/doc/man/man3/Katabatic_KatabaticEngine.3 index 4e3b36d2..e9463e8a 100644 --- a/katabatic/doc/man/man3/Katabatic_KatabaticEngine.3 +++ b/katabatic/doc/man/man3/Katabatic_KatabaticEngine.3 @@ -1,4 +1,4 @@ -.TH "KatabaticEngine" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "KatabaticEngine" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_LocatorHelper.3 b/katabatic/doc/man/man3/Katabatic_LocatorHelper.3 index 5f0ca14e..bb12c8f1 100644 --- a/katabatic/doc/man/man3/Katabatic_LocatorHelper.3 +++ b/katabatic/doc/man/man3/Katabatic_LocatorHelper.3 @@ -1,4 +1,4 @@ -.TH "LocatorHelper" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "LocatorHelper" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_Observable.3 b/katabatic/doc/man/man3/Katabatic_Observable.3 index bf3392a9..4e4dd9a1 100644 --- a/katabatic/doc/man/man3/Katabatic_Observable.3 +++ b/katabatic/doc/man/man3/Katabatic_Observable.3 @@ -1,4 +1,4 @@ -.TH "Observable" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "Observable" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_Observer.3 b/katabatic/doc/man/man3/Katabatic_Observer.3 index 73df72bb..9f5c6aea 100644 --- a/katabatic/doc/man/man3/Katabatic_Observer.3 +++ b/katabatic/doc/man/man3/Katabatic_Observer.3 @@ -1,4 +1,4 @@ -.TH "Observer< T >" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "Observer< T >" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/Katabatic_Session.3 b/katabatic/doc/man/man3/Katabatic_Session.3 index d85bea44..428d0594 100644 --- a/katabatic/doc/man/man3/Katabatic_Session.3 +++ b/katabatic/doc/man/man3/Katabatic_Session.3 @@ -1,4 +1,4 @@ -.TH "Session" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "Session" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/LoadGlobalRouting.3 b/katabatic/doc/man/man3/LoadGlobalRouting.3 index 9eb50bd4..d7d23f90 100644 --- a/katabatic/doc/man/man3/LoadGlobalRouting.3 +++ b/katabatic/doc/man/man3/LoadGlobalRouting.3 @@ -1,4 +1,4 @@ -.TH "LoadGlobalRouting" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "LoadGlobalRouting" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/anonymous_namespace{AutoSegment.cpp}.3 b/katabatic/doc/man/man3/anonymous_namespace{AutoSegment.cpp}.3 index 80d20138..ff9ab083 100644 --- a/katabatic/doc/man/man3/anonymous_namespace{AutoSegment.cpp}.3 +++ b/katabatic/doc/man/man3/anonymous_namespace{AutoSegment.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{AutoSegment.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "anonymous_namespace{AutoSegment.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/anonymous_namespace{ChipTools.cpp}.3 b/katabatic/doc/man/man3/anonymous_namespace{ChipTools.cpp}.3 index 2882bbd4..10dcc2bb 100644 --- a/katabatic/doc/man/man3/anonymous_namespace{ChipTools.cpp}.3 +++ b/katabatic/doc/man/man3/anonymous_namespace{ChipTools.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{ChipTools.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "anonymous_namespace{ChipTools.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/anonymous_namespace{GCell.cpp}.3 b/katabatic/doc/man/man3/anonymous_namespace{GCell.cpp}.3 index cbab2416..e2e35f8e 100644 --- a/katabatic/doc/man/man3/anonymous_namespace{GCell.cpp}.3 +++ b/katabatic/doc/man/man3/anonymous_namespace{GCell.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{GCell.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "anonymous_namespace{GCell.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/anonymous_namespace{KatabaticEngine.cpp}.3 b/katabatic/doc/man/man3/anonymous_namespace{KatabaticEngine.cpp}.3 index 91ba2c2f..3a545b08 100644 --- a/katabatic/doc/man/man3/anonymous_namespace{KatabaticEngine.cpp}.3 +++ b/katabatic/doc/man/man3/anonymous_namespace{KatabaticEngine.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{KatabaticEngine.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "anonymous_namespace{KatabaticEngine.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/anonymous_namespace{LoadGrByNet.cpp}.3 b/katabatic/doc/man/man3/anonymous_namespace{LoadGrByNet.cpp}.3 index 4f3145ea..987bd9fe 100644 --- a/katabatic/doc/man/man3/anonymous_namespace{LoadGrByNet.cpp}.3 +++ b/katabatic/doc/man/man3/anonymous_namespace{LoadGrByNet.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{LoadGrByNet.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "anonymous_namespace{LoadGrByNet.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/anonymous_namespace{LoadGrByNet.cpp}_GCellTopology.3 b/katabatic/doc/man/man3/anonymous_namespace{LoadGrByNet.cpp}_GCellTopology.3 index fd9d5635..e75ad20a 100644 --- a/katabatic/doc/man/man3/anonymous_namespace{LoadGrByNet.cpp}_GCellTopology.3 +++ b/katabatic/doc/man/man3/anonymous_namespace{LoadGrByNet.cpp}_GCellTopology.3 @@ -1,4 +1,4 @@ -.TH "GCellTopology" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "GCellTopology" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/anonymous_namespace{Session.cpp}.3 b/katabatic/doc/man/man3/anonymous_namespace{Session.cpp}.3 index 864cc05a..cb814021 100644 --- a/katabatic/doc/man/man3/anonymous_namespace{Session.cpp}.3 +++ b/katabatic/doc/man/man3/anonymous_namespace{Session.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{Session.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "anonymous_namespace{Session.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/man/man3/grpSynthHierarchy.3 b/katabatic/doc/man/man3/grpSynthHierarchy.3 index f67036db..20e9cf11 100644 --- a/katabatic/doc/man/man3/grpSynthHierarchy.3 +++ b/katabatic/doc/man/man3/grpSynthHierarchy.3 @@ -1,4 +1,4 @@ -.TH "grpSynthHierarchy" 3 "Thu Nov 12 2020" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- +.TH "grpSynthHierarchy" 3 "Fri Oct 1 2021" "Version 1.0" "Katabatic - Routing Toolbox" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/katabatic/doc/rtf/refman.rtf b/katabatic/doc/rtf/refman.rtf index 2688e3d4..9ab166b1 100644 --- a/katabatic/doc/rtf/refman.rtf +++ b/katabatic/doc/rtf/refman.rtf @@ -86,7 +86,7 @@ 1.0 \par }}Katabatic - Routing Toolbox} {\comment Generated byDoxgyen. } -{\creatim \yr2020\mo11\dy12\hr13\min59\sec30} +{\creatim \yr2021\mo10\dy1\hr19\min23\sec14} }\pard\plain \sectd\pgnlcrm {\footer \s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid {\chpgn}} @@ -99,7 +99,7 @@ \par\par\par\par\par\par\par\par\par\par\par\par \pard\plain \s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid {\field\fldedit {\*\fldinst AUTHOR \\*MERGEFORMAT}{\fldrslt AUTHOR}}\par -Version 1.0\par{\field\fldedit {\*\fldinst CREATEDATE \\*MERGEFORMAT}{\fldrslt Thu Nov 12 2020 }}\par +Version 1.0\par{\field\fldedit {\*\fldinst CREATEDATE \\*MERGEFORMAT}{\fldrslt Fri Oct 1 2021 }}\par \page\page\vertalt \pard\plain \s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid Table of Contents\par diff --git a/kite/doc/html/Constants_8h_source.html b/kite/doc/html/Constants_8h_source.html index c9903c7f..0a398b23 100644 --- a/kite/doc/html/Constants_8h_source.html +++ b/kite/doc/html/Constants_8h_source.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/DataNegociate_8h_source.html b/kite/doc/html/DataNegociate_8h_source.html index e83c883b..f7bb02b4 100644 --- a/kite/doc/html/DataNegociate_8h_source.html +++ b/kite/doc/html/DataNegociate_8h_source.html @@ -96,7 +96,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/HorizontalTrack_8h_source.html b/kite/doc/html/HorizontalTrack_8h_source.html index c9810dee..e76d005b 100644 --- a/kite/doc/html/HorizontalTrack_8h_source.html +++ b/kite/doc/html/HorizontalTrack_8h_source.html @@ -59,7 +59,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/KiteEngine_8h_source.html b/kite/doc/html/KiteEngine_8h_source.html index 59c6faa2..098b319e 100644 --- a/kite/doc/html/KiteEngine_8h_source.html +++ b/kite/doc/html/KiteEngine_8h_source.html @@ -79,7 +79,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/Manipulator_8h_source.html b/kite/doc/html/Manipulator_8h_source.html index e6cb8516..9092f5f4 100644 --- a/kite/doc/html/Manipulator_8h_source.html +++ b/kite/doc/html/Manipulator_8h_source.html @@ -94,7 +94,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/NegociateWindow_8h_source.html b/kite/doc/html/NegociateWindow_8h_source.html index 14e916c6..07b37d55 100644 --- a/kite/doc/html/NegociateWindow_8h_source.html +++ b/kite/doc/html/NegociateWindow_8h_source.html @@ -83,7 +83,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/RoutingEventHistory_8h_source.html b/kite/doc/html/RoutingEventHistory_8h_source.html index 856a2421..6f3775da 100644 --- a/kite/doc/html/RoutingEventHistory_8h_source.html +++ b/kite/doc/html/RoutingEventHistory_8h_source.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/RoutingEventLoop_8h_source.html b/kite/doc/html/RoutingEventLoop_8h_source.html index 197bcc78..955d56eb 100644 --- a/kite/doc/html/RoutingEventLoop_8h_source.html +++ b/kite/doc/html/RoutingEventLoop_8h_source.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/RoutingEventQueue_8h_source.html b/kite/doc/html/RoutingEventQueue_8h_source.html index 27dd5f28..069cb7a1 100644 --- a/kite/doc/html/RoutingEventQueue_8h_source.html +++ b/kite/doc/html/RoutingEventQueue_8h_source.html @@ -66,7 +66,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/RoutingEvent_8h_source.html b/kite/doc/html/RoutingEvent_8h_source.html index f784a68e..e4c5fecd 100644 --- a/kite/doc/html/RoutingEvent_8h_source.html +++ b/kite/doc/html/RoutingEvent_8h_source.html @@ -110,7 +110,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/RoutingPlane_8h_source.html b/kite/doc/html/RoutingPlane_8h_source.html index b60a85d7..8bda819b 100644 --- a/kite/doc/html/RoutingPlane_8h_source.html +++ b/kite/doc/html/RoutingPlane_8h_source.html @@ -82,7 +82,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/SegmentFsm_8h_source.html b/kite/doc/html/SegmentFsm_8h_source.html index 7b29412a..6016f22b 100644 --- a/kite/doc/html/SegmentFsm_8h_source.html +++ b/kite/doc/html/SegmentFsm_8h_source.html @@ -126,7 +126,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/Session_8h_source.html b/kite/doc/html/Session_8h_source.html index ec8ca7eb..0b46ca48 100644 --- a/kite/doc/html/Session_8h_source.html +++ b/kite/doc/html/Session_8h_source.html @@ -79,7 +79,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/TrackElement_8h_source.html b/kite/doc/html/TrackElement_8h_source.html index 0c02a32c..b4ec9b92 100644 --- a/kite/doc/html/TrackElement_8h_source.html +++ b/kite/doc/html/TrackElement_8h_source.html @@ -132,7 +132,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/TrackFixedSegment_8h_source.html b/kite/doc/html/TrackFixedSegment_8h_source.html index 67ecbb24..7ef6ed6c 100644 --- a/kite/doc/html/TrackFixedSegment_8h_source.html +++ b/kite/doc/html/TrackFixedSegment_8h_source.html @@ -73,7 +73,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/TrackMarker_8h_source.html b/kite/doc/html/TrackMarker_8h_source.html index 485a6a92..8eab85fd 100644 --- a/kite/doc/html/TrackMarker_8h_source.html +++ b/kite/doc/html/TrackMarker_8h_source.html @@ -65,7 +65,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/TrackSegment_8h_source.html b/kite/doc/html/TrackSegment_8h_source.html index 11567e18..83df7e66 100644 --- a/kite/doc/html/TrackSegment_8h_source.html +++ b/kite/doc/html/TrackSegment_8h_source.html @@ -107,7 +107,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/Track_8h_source.html b/kite/doc/html/Track_8h_source.html index 4f4c7ff2..fdfc55d3 100644 --- a/kite/doc/html/Track_8h_source.html +++ b/kite/doc/html/Track_8h_source.html @@ -115,7 +115,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/VerticalTrack_8h_source.html b/kite/doc/html/VerticalTrack_8h_source.html index 9af82ac7..044a9d1d 100644 --- a/kite/doc/html/VerticalTrack_8h_source.html +++ b/kite/doc/html/VerticalTrack_8h_source.html @@ -59,7 +59,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/annotated.html b/kite/doc/html/annotated.html index be5d5761..e36250ec 100644 --- a/kite/doc/html/annotated.html +++ b/kite/doc/html/annotated.html @@ -71,7 +71,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1DataNegociate-members.html b/kite/doc/html/classKite_1_1DataNegociate-members.html index f9a8945e..8d969613 100644 --- a/kite/doc/html/classKite_1_1DataNegociate-members.html +++ b/kite/doc/html/classKite_1_1DataNegociate-members.html @@ -86,7 +86,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1DataNegociate.html b/kite/doc/html/classKite_1_1DataNegociate.html index 0924a8b3..1a08e146 100644 --- a/kite/doc/html/classKite_1_1DataNegociate.html +++ b/kite/doc/html/classKite_1_1DataNegociate.html @@ -814,7 +814,7 @@ Modifications History
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1HorizontalTrack-members.html b/kite/doc/html/classKite_1_1HorizontalTrack-members.html index 6a9d995e..f65716fe 100644 --- a/kite/doc/html/classKite_1_1HorizontalTrack-members.html +++ b/kite/doc/html/classKite_1_1HorizontalTrack-members.html @@ -111,7 +111,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1HorizontalTrack.html b/kite/doc/html/classKite_1_1HorizontalTrack.html index cd51d960..d195095d 100644 --- a/kite/doc/html/classKite_1_1HorizontalTrack.html +++ b/kite/doc/html/classKite_1_1HorizontalTrack.html @@ -313,7 +313,7 @@ Additional Inherited Members
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1KiteEngine-members.html b/kite/doc/html/classKite_1_1KiteEngine-members.html index 05b15494..564a5395 100644 --- a/kite/doc/html/classKite_1_1KiteEngine-members.html +++ b/kite/doc/html/classKite_1_1KiteEngine-members.html @@ -114,7 +114,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1KiteEngine.html b/kite/doc/html/classKite_1_1KiteEngine.html index 488f91fd..3ecaee3d 100644 --- a/kite/doc/html/classKite_1_1KiteEngine.html +++ b/kite/doc/html/classKite_1_1KiteEngine.html @@ -397,7 +397,7 @@ Static Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1Manipulator-members.html b/kite/doc/html/classKite_1_1Manipulator-members.html index 148af299..7f5ca0ac 100644 --- a/kite/doc/html/classKite_1_1Manipulator-members.html +++ b/kite/doc/html/classKite_1_1Manipulator-members.html @@ -88,7 +88,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1Manipulator.html b/kite/doc/html/classKite_1_1Manipulator.html index 88e99684..9cd33c58 100644 --- a/kite/doc/html/classKite_1_1Manipulator.html +++ b/kite/doc/html/classKite_1_1Manipulator.html @@ -768,7 +768,7 @@ One Dogleg (max)
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1NegociateWindow-members.html b/kite/doc/html/classKite_1_1NegociateWindow-members.html index 04fb6675..abf6c37f 100644 --- a/kite/doc/html/classKite_1_1NegociateWindow-members.html +++ b/kite/doc/html/classKite_1_1NegociateWindow-members.html @@ -74,7 +74,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1NegociateWindow.html b/kite/doc/html/classKite_1_1NegociateWindow.html index 4aab01a5..39fc32f4 100644 --- a/kite/doc/html/classKite_1_1NegociateWindow.html +++ b/kite/doc/html/classKite_1_1NegociateWindow.html @@ -623,7 +623,7 @@ Static Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1RoutingEvent-members.html b/kite/doc/html/classKite_1_1RoutingEvent-members.html index a43408ce..db13f2f3 100644 --- a/kite/doc/html/classKite_1_1RoutingEvent-members.html +++ b/kite/doc/html/classKite_1_1RoutingEvent-members.html @@ -97,7 +97,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1RoutingEvent.html b/kite/doc/html/classKite_1_1RoutingEvent.html index 7d3421e1..489b263a 100644 --- a/kite/doc/html/classKite_1_1RoutingEvent.html +++ b/kite/doc/html/classKite_1_1RoutingEvent.html @@ -1313,7 +1313,7 @@ Static Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1RoutingEventHistory-members.html b/kite/doc/html/classKite_1_1RoutingEventHistory-members.html index 23bab423..5f1063c2 100644 --- a/kite/doc/html/classKite_1_1RoutingEventHistory-members.html +++ b/kite/doc/html/classKite_1_1RoutingEventHistory-members.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1RoutingEventHistory.html b/kite/doc/html/classKite_1_1RoutingEventHistory.html index c4355ae7..3a5cbfa3 100644 --- a/kite/doc/html/classKite_1_1RoutingEventHistory.html +++ b/kite/doc/html/classKite_1_1RoutingEventHistory.html @@ -259,7 +259,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1RoutingEventLoop-members.html b/kite/doc/html/classKite_1_1RoutingEventLoop-members.html index bffe5759..3883af6a 100644 --- a/kite/doc/html/classKite_1_1RoutingEventLoop-members.html +++ b/kite/doc/html/classKite_1_1RoutingEventLoop-members.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1RoutingEventLoop.html b/kite/doc/html/classKite_1_1RoutingEventLoop.html index 857c6056..db55cda5 100644 --- a/kite/doc/html/classKite_1_1RoutingEventLoop.html +++ b/kite/doc/html/classKite_1_1RoutingEventLoop.html @@ -244,7 +244,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1RoutingEventQueue-members.html b/kite/doc/html/classKite_1_1RoutingEventQueue-members.html index 7713914d..a1b7da55 100644 --- a/kite/doc/html/classKite_1_1RoutingEventQueue-members.html +++ b/kite/doc/html/classKite_1_1RoutingEventQueue-members.html @@ -65,7 +65,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1RoutingEventQueue.html b/kite/doc/html/classKite_1_1RoutingEventQueue.html index b4070e65..53c5fb68 100644 --- a/kite/doc/html/classKite_1_1RoutingEventQueue.html +++ b/kite/doc/html/classKite_1_1RoutingEventQueue.html @@ -408,7 +408,7 @@ Implementation Details
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1RoutingEvent_1_1Key-members.html b/kite/doc/html/classKite_1_1RoutingEvent_1_1Key-members.html index 21ee4836..0f3247d7 100644 --- a/kite/doc/html/classKite_1_1RoutingEvent_1_1Key-members.html +++ b/kite/doc/html/classKite_1_1RoutingEvent_1_1Key-members.html @@ -53,7 +53,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1RoutingEvent_1_1Key.html b/kite/doc/html/classKite_1_1RoutingEvent_1_1Key.html index 4ed6289c..1cc7ee4f 100644 --- a/kite/doc/html/classKite_1_1RoutingEvent_1_1Key.html +++ b/kite/doc/html/classKite_1_1RoutingEvent_1_1Key.html @@ -105,7 +105,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1RoutingPlane-members.html b/kite/doc/html/classKite_1_1RoutingPlane-members.html index e0fa9969..2decaeba 100644 --- a/kite/doc/html/classKite_1_1RoutingPlane-members.html +++ b/kite/doc/html/classKite_1_1RoutingPlane-members.html @@ -73,7 +73,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1RoutingPlane.html b/kite/doc/html/classKite_1_1RoutingPlane.html index bc532984..f177f23c 100644 --- a/kite/doc/html/classKite_1_1RoutingPlane.html +++ b/kite/doc/html/classKite_1_1RoutingPlane.html @@ -677,7 +677,7 @@ Fig 1: Horizontal RoutingPlane
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1SegmentAction-members.html b/kite/doc/html/classKite_1_1SegmentAction-members.html index 0a44f159..635bdf14 100644 --- a/kite/doc/html/classKite_1_1SegmentAction-members.html +++ b/kite/doc/html/classKite_1_1SegmentAction-members.html @@ -82,7 +82,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1SegmentAction.html b/kite/doc/html/classKite_1_1SegmentAction.html index efa41ffe..90e30be8 100644 --- a/kite/doc/html/classKite_1_1SegmentAction.html +++ b/kite/doc/html/classKite_1_1SegmentAction.html @@ -397,7 +397,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1SegmentFsm-members.html b/kite/doc/html/classKite_1_1SegmentFsm-members.html index ca7fcd6c..9a77ff70 100644 --- a/kite/doc/html/classKite_1_1SegmentFsm-members.html +++ b/kite/doc/html/classKite_1_1SegmentFsm-members.html @@ -88,7 +88,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1SegmentFsm.html b/kite/doc/html/classKite_1_1SegmentFsm.html index 757dee0c..e647e3aa 100644 --- a/kite/doc/html/classKite_1_1SegmentFsm.html +++ b/kite/doc/html/classKite_1_1SegmentFsm.html @@ -926,7 +926,7 @@ Candidates Track Ordering
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1SegmentObserver-members.html b/kite/doc/html/classKite_1_1SegmentObserver-members.html index 9c6b938c..4d3d6db0 100644 --- a/kite/doc/html/classKite_1_1SegmentObserver-members.html +++ b/kite/doc/html/classKite_1_1SegmentObserver-members.html @@ -55,7 +55,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1SegmentObserver.html b/kite/doc/html/classKite_1_1SegmentObserver.html index 050a7f65..4f884a9d 100644 --- a/kite/doc/html/classKite_1_1SegmentObserver.html +++ b/kite/doc/html/classKite_1_1SegmentObserver.html @@ -109,7 +109,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1Session-members.html b/kite/doc/html/classKite_1_1Session-members.html index 1cadec58..3fdd0adc 100644 --- a/kite/doc/html/classKite_1_1Session-members.html +++ b/kite/doc/html/classKite_1_1Session-members.html @@ -99,7 +99,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1Session.html b/kite/doc/html/classKite_1_1Session.html index e86b68f8..e21c27dc 100644 --- a/kite/doc/html/classKite_1_1Session.html +++ b/kite/doc/html/classKite_1_1Session.html @@ -666,7 +666,7 @@ The Lookup Mechanism
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1Track-members.html b/kite/doc/html/classKite_1_1Track-members.html index 5b47214d..29e44c10 100644 --- a/kite/doc/html/classKite_1_1Track-members.html +++ b/kite/doc/html/classKite_1_1Track-members.html @@ -111,7 +111,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1Track.html b/kite/doc/html/classKite_1_1Track.html index 1fbfd0ad..72d79493 100644 --- a/kite/doc/html/classKite_1_1Track.html +++ b/kite/doc/html/classKite_1_1Track.html @@ -1633,7 +1633,7 @@ Fig 3: Track::getBeginIndex()
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1TrackElement-members.html b/kite/doc/html/classKite_1_1TrackElement-members.html index ecb928c9..fcd18521 100644 --- a/kite/doc/html/classKite_1_1TrackElement-members.html +++ b/kite/doc/html/classKite_1_1TrackElement-members.html @@ -118,7 +118,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1TrackElement.html b/kite/doc/html/classKite_1_1TrackElement.html index 6d9717c1..32590672 100644 --- a/kite/doc/html/classKite_1_1TrackElement.html +++ b/kite/doc/html/classKite_1_1TrackElement.html @@ -2191,7 +2191,7 @@ TrackElement Abstract
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1TrackFixedSegment-members.html b/kite/doc/html/classKite_1_1TrackFixedSegment-members.html index a338f954..3182ef5a 100644 --- a/kite/doc/html/classKite_1_1TrackFixedSegment-members.html +++ b/kite/doc/html/classKite_1_1TrackFixedSegment-members.html @@ -119,7 +119,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1TrackFixedSegment.html b/kite/doc/html/classKite_1_1TrackFixedSegment.html index 58d77850..b8e06bcd 100644 --- a/kite/doc/html/classKite_1_1TrackFixedSegment.html +++ b/kite/doc/html/classKite_1_1TrackFixedSegment.html @@ -572,7 +572,7 @@ Static Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1TrackMarker-members.html b/kite/doc/html/classKite_1_1TrackMarker-members.html index f9fe4919..8aebb8c7 100644 --- a/kite/doc/html/classKite_1_1TrackMarker-members.html +++ b/kite/doc/html/classKite_1_1TrackMarker-members.html @@ -59,7 +59,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1TrackMarker.html b/kite/doc/html/classKite_1_1TrackMarker.html index 6643da0f..b8f50272 100644 --- a/kite/doc/html/classKite_1_1TrackMarker.html +++ b/kite/doc/html/classKite_1_1TrackMarker.html @@ -282,7 +282,7 @@ Static Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1TrackSegment-members.html b/kite/doc/html/classKite_1_1TrackSegment-members.html index 2970c503..337df93d 100644 --- a/kite/doc/html/classKite_1_1TrackSegment-members.html +++ b/kite/doc/html/classKite_1_1TrackSegment-members.html @@ -120,7 +120,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1TrackSegment.html b/kite/doc/html/classKite_1_1TrackSegment.html index 65d9ec54..f7013c55 100644 --- a/kite/doc/html/classKite_1_1TrackSegment.html +++ b/kite/doc/html/classKite_1_1TrackSegment.html @@ -1691,7 +1691,7 @@ Global, Weak Global and Local Segments
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1VerticalTrack-members.html b/kite/doc/html/classKite_1_1VerticalTrack-members.html index 9676c46c..aa6f5e07 100644 --- a/kite/doc/html/classKite_1_1VerticalTrack-members.html +++ b/kite/doc/html/classKite_1_1VerticalTrack-members.html @@ -111,7 +111,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classKite_1_1VerticalTrack.html b/kite/doc/html/classKite_1_1VerticalTrack.html index b1720738..8122d904 100644 --- a/kite/doc/html/classKite_1_1VerticalTrack.html +++ b/kite/doc/html/classKite_1_1VerticalTrack.html @@ -314,7 +314,7 @@ Additional Inherited Members
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/classes.html b/kite/doc/html/classes.html index a20b5ec6..2b2b11df 100644 --- a/kite/doc/html/classes.html +++ b/kite/doc/html/classes.html @@ -79,7 +79,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/dir_2916ee297f5e79ec495d393dfe8ba769.html b/kite/doc/html/dir_2916ee297f5e79ec495d393dfe8ba769.html index 17eb03dc..d10d1d11 100644 --- a/kite/doc/html/dir_2916ee297f5e79ec495d393dfe8ba769.html +++ b/kite/doc/html/dir_2916ee297f5e79ec495d393dfe8ba769.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/kite/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html index ba5b0719..dcca0c31 100644 --- a/kite/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ b/kite/doc/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -53,7 +53,7 @@ Directories
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/files.html b/kite/doc/html/files.html index 2ca12e52..17b31ba2 100644 --- a/kite/doc/html/files.html +++ b/kite/doc/html/files.html @@ -68,7 +68,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions.html b/kite/doc/html/functions.html index 531be0b5..a035ef21 100644 --- a/kite/doc/html/functions.html +++ b/kite/doc/html/functions.html @@ -53,7 +53,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_0x7e.html b/kite/doc/html/functions_0x7e.html index 84aa3e6d..7cab86cc 100644 --- a/kite/doc/html/functions_0x7e.html +++ b/kite/doc/html/functions_0x7e.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_a.html b/kite/doc/html/functions_a.html index bfb05748..aac6d6c1 100644 --- a/kite/doc/html/functions_a.html +++ b/kite/doc/html/functions_a.html @@ -84,7 +84,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_b.html b/kite/doc/html/functions_b.html index f8007ebd..166360b6 100644 --- a/kite/doc/html/functions_b.html +++ b/kite/doc/html/functions_b.html @@ -64,7 +64,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_c.html b/kite/doc/html/functions_c.html index 4b1ebba9..07352e21 100644 --- a/kite/doc/html/functions_c.html +++ b/kite/doc/html/functions_c.html @@ -104,7 +104,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_d.html b/kite/doc/html/functions_d.html index 0a8b993b..b02f5b96 100644 --- a/kite/doc/html/functions_d.html +++ b/kite/doc/html/functions_d.html @@ -74,7 +74,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_e.html b/kite/doc/html/functions_e.html index ff4428b0..f79e8540 100644 --- a/kite/doc/html/functions_e.html +++ b/kite/doc/html/functions_e.html @@ -91,7 +91,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_enum.html b/kite/doc/html/functions_enum.html index dcbeda99..87636bc5 100644 --- a/kite/doc/html/functions_enum.html +++ b/kite/doc/html/functions_enum.html @@ -64,7 +64,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_eval.html b/kite/doc/html/functions_eval.html index 511b194f..8d4eb2c8 100644 --- a/kite/doc/html/functions_eval.html +++ b/kite/doc/html/functions_eval.html @@ -312,7 +312,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_f.html b/kite/doc/html/functions_f.html index 29688864..c6ff3f13 100644 --- a/kite/doc/html/functions_f.html +++ b/kite/doc/html/functions_f.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func.html b/kite/doc/html/functions_func.html index 024fe67e..8dfbc43b 100644 --- a/kite/doc/html/functions_func.html +++ b/kite/doc/html/functions_func.html @@ -53,7 +53,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_0x7e.html b/kite/doc/html/functions_func_0x7e.html index f895f826..4fb9d89a 100644 --- a/kite/doc/html/functions_func_0x7e.html +++ b/kite/doc/html/functions_func_0x7e.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_a.html b/kite/doc/html/functions_func_a.html index 6288fbc9..bbc7aecf 100644 --- a/kite/doc/html/functions_func_a.html +++ b/kite/doc/html/functions_func_a.html @@ -66,7 +66,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_b.html b/kite/doc/html/functions_func_b.html index 331a3ca3..07e95c73 100644 --- a/kite/doc/html/functions_func_b.html +++ b/kite/doc/html/functions_func_b.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_c.html b/kite/doc/html/functions_func_c.html index 48a46d6f..46cbbe9c 100644 --- a/kite/doc/html/functions_func_c.html +++ b/kite/doc/html/functions_func_c.html @@ -98,7 +98,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_d.html b/kite/doc/html/functions_func_d.html index 5016375f..81b530aa 100644 --- a/kite/doc/html/functions_func_d.html +++ b/kite/doc/html/functions_func_d.html @@ -71,7 +71,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_e.html b/kite/doc/html/functions_func_e.html index 42993807..8e3b744d 100644 --- a/kite/doc/html/functions_func_e.html +++ b/kite/doc/html/functions_func_e.html @@ -55,7 +55,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_f.html b/kite/doc/html/functions_func_f.html index 94da616f..398ed061 100644 --- a/kite/doc/html/functions_func_f.html +++ b/kite/doc/html/functions_func_f.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_g.html b/kite/doc/html/functions_func_g.html index 283be023..0a4ec56c 100644 --- a/kite/doc/html/functions_func_g.html +++ b/kite/doc/html/functions_func_g.html @@ -454,7 +454,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_h.html b/kite/doc/html/functions_func_h.html index da39fab5..e84fd62d 100644 --- a/kite/doc/html/functions_func_h.html +++ b/kite/doc/html/functions_func_h.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_i.html b/kite/doc/html/functions_func_i.html index 1933a7b2..bfb19ad8 100644 --- a/kite/doc/html/functions_func_i.html +++ b/kite/doc/html/functions_func_i.html @@ -171,7 +171,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_l.html b/kite/doc/html/functions_func_l.html index 731f6465..f8bae224 100644 --- a/kite/doc/html/functions_func_l.html +++ b/kite/doc/html/functions_func_l.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_m.html b/kite/doc/html/functions_func_m.html index 30c96062..1ddbdbe3 100644 --- a/kite/doc/html/functions_func_m.html +++ b/kite/doc/html/functions_func_m.html @@ -59,7 +59,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_n.html b/kite/doc/html/functions_func_n.html index 6500b6db..a39383f8 100644 --- a/kite/doc/html/functions_func_n.html +++ b/kite/doc/html/functions_func_n.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_o.html b/kite/doc/html/functions_func_o.html index e3a5f36d..8283168c 100644 --- a/kite/doc/html/functions_func_o.html +++ b/kite/doc/html/functions_func_o.html @@ -48,7 +48,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_p.html b/kite/doc/html/functions_func_p.html index 4deef3a9..731a1e0d 100644 --- a/kite/doc/html/functions_func_p.html +++ b/kite/doc/html/functions_func_p.html @@ -64,7 +64,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_r.html b/kite/doc/html/functions_func_r.html index 5def813f..ab1e4109 100644 --- a/kite/doc/html/functions_func_r.html +++ b/kite/doc/html/functions_func_r.html @@ -104,7 +104,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_s.html b/kite/doc/html/functions_func_s.html index daaa0286..44acac33 100644 --- a/kite/doc/html/functions_func_s.html +++ b/kite/doc/html/functions_func_s.html @@ -136,7 +136,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_func_u.html b/kite/doc/html/functions_func_u.html index fe2862b4..d193324d 100644 --- a/kite/doc/html/functions_func_u.html +++ b/kite/doc/html/functions_func_u.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_g.html b/kite/doc/html/functions_g.html index 44845a14..8b50d47f 100644 --- a/kite/doc/html/functions_g.html +++ b/kite/doc/html/functions_g.html @@ -454,7 +454,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_h.html b/kite/doc/html/functions_h.html index 0d2a80ba..ebbb38d9 100644 --- a/kite/doc/html/functions_h.html +++ b/kite/doc/html/functions_h.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_i.html b/kite/doc/html/functions_i.html index 11ccfe1e..eff6ca5b 100644 --- a/kite/doc/html/functions_i.html +++ b/kite/doc/html/functions_i.html @@ -183,7 +183,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_l.html b/kite/doc/html/functions_l.html index 49b222a1..400c1ee8 100644 --- a/kite/doc/html/functions_l.html +++ b/kite/doc/html/functions_l.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_m.html b/kite/doc/html/functions_m.html index d5c5170b..38b9ec9a 100644 --- a/kite/doc/html/functions_m.html +++ b/kite/doc/html/functions_m.html @@ -75,7 +75,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_n.html b/kite/doc/html/functions_n.html index 6d72869e..9cead260 100644 --- a/kite/doc/html/functions_n.html +++ b/kite/doc/html/functions_n.html @@ -66,7 +66,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_o.html b/kite/doc/html/functions_o.html index 35a7059b..a6ceaf4f 100644 --- a/kite/doc/html/functions_o.html +++ b/kite/doc/html/functions_o.html @@ -65,7 +65,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_p.html b/kite/doc/html/functions_p.html index 39c8f237..ac3aed18 100644 --- a/kite/doc/html/functions_p.html +++ b/kite/doc/html/functions_p.html @@ -79,7 +79,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_r.html b/kite/doc/html/functions_r.html index 03e8556a..f107431a 100644 --- a/kite/doc/html/functions_r.html +++ b/kite/doc/html/functions_r.html @@ -124,7 +124,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_s.html b/kite/doc/html/functions_s.html index b15b962a..09f34610 100644 --- a/kite/doc/html/functions_s.html +++ b/kite/doc/html/functions_s.html @@ -170,7 +170,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_t.html b/kite/doc/html/functions_t.html index d0d09a69..a75796df 100644 --- a/kite/doc/html/functions_t.html +++ b/kite/doc/html/functions_t.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_u.html b/kite/doc/html/functions_u.html index c12e34b2..e582d6e1 100644 --- a/kite/doc/html/functions_u.html +++ b/kite/doc/html/functions_u.html @@ -63,7 +63,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/functions_vars.html b/kite/doc/html/functions_vars.html index 0e4ba313..98f5f9ed 100644 --- a/kite/doc/html/functions_vars.html +++ b/kite/doc/html/functions_vars.html @@ -46,7 +46,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/graph_legend.html b/kite/doc/html/graph_legend.html index 77f4244f..8b423e32 100644 --- a/kite/doc/html/graph_legend.html +++ b/kite/doc/html/graph_legend.html @@ -74,7 +74,7 @@ A yellow dashed arrow denotes a relation between a template instance and the tem
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/group__AlgorithmOverview.html b/kite/doc/html/group__AlgorithmOverview.html index 2bb63beb..2e75c39a 100644 --- a/kite/doc/html/group__AlgorithmOverview.html +++ b/kite/doc/html/group__AlgorithmOverview.html @@ -82,7 +82,7 @@ Compute the Tracks in which the - Generated by doxygen 1.8.14 on Thu Nov 12 2020 + Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page diff --git a/kite/doc/html/group__grpSynthHierarchy.html b/kite/doc/html/group__grpSynthHierarchy.html index da9d9b9a..1e657354 100644 --- a/kite/doc/html/group__grpSynthHierarchy.html +++ b/kite/doc/html/group__grpSynthHierarchy.html @@ -108,7 +108,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/hierarchy.html b/kite/doc/html/hierarchy.html index 28b8cdf3..b8bd0427 100644 --- a/kite/doc/html/hierarchy.html +++ b/kite/doc/html/hierarchy.html @@ -76,7 +76,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/index.html b/kite/doc/html/index.html index fd031030..6cb0390a 100644 --- a/kite/doc/html/index.html +++ b/kite/doc/html/index.html @@ -55,7 +55,7 @@ The internal description which details how - Generated by doxygen 1.8.14 on Thu Nov 12 2020 + Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page diff --git a/kite/doc/html/modules.html b/kite/doc/html/modules.html index 7d555007..f7812acf 100644 --- a/kite/doc/html/modules.html +++ b/kite/doc/html/modules.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaceKite.html b/kite/doc/html/namespaceKite.html index ca10da1b..ed35f3ca 100644 --- a/kite/doc/html/namespaceKite.html +++ b/kite/doc/html/namespaceKite.html @@ -199,7 +199,7 @@ Enumerations
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaceanonymous__namespace_02AutoSegment_8cpp_03.html b/kite/doc/html/namespaceanonymous__namespace_02AutoSegment_8cpp_03.html index 1a1bf4f7..f26e9e73 100644 --- a/kite/doc/html/namespaceanonymous__namespace_02AutoSegment_8cpp_03.html +++ b/kite/doc/html/namespaceanonymous__namespace_02AutoSegment_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaceanonymous__namespace_02ChipTools_8cpp_03.html b/kite/doc/html/namespaceanonymous__namespace_02ChipTools_8cpp_03.html index 223dfc4c..3c34f35b 100644 --- a/kite/doc/html/namespaceanonymous__namespace_02ChipTools_8cpp_03.html +++ b/kite/doc/html/namespaceanonymous__namespace_02ChipTools_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaceanonymous__namespace_02GCell_8cpp_03.html b/kite/doc/html/namespaceanonymous__namespace_02GCell_8cpp_03.html index c33516b6..1d920b52 100644 --- a/kite/doc/html/namespaceanonymous__namespace_02GCell_8cpp_03.html +++ b/kite/doc/html/namespaceanonymous__namespace_02GCell_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaceanonymous__namespace_02KatabaticEngine_8cpp_03.html b/kite/doc/html/namespaceanonymous__namespace_02KatabaticEngine_8cpp_03.html index 5920daa6..c2ca288d 100644 --- a/kite/doc/html/namespaceanonymous__namespace_02KatabaticEngine_8cpp_03.html +++ b/kite/doc/html/namespaceanonymous__namespace_02KatabaticEngine_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaceanonymous__namespace_02LoadGrByNet_8cpp_03.html b/kite/doc/html/namespaceanonymous__namespace_02LoadGrByNet_8cpp_03.html index 62fbd240..243d658a 100644 --- a/kite/doc/html/namespaceanonymous__namespace_02LoadGrByNet_8cpp_03.html +++ b/kite/doc/html/namespaceanonymous__namespace_02LoadGrByNet_8cpp_03.html @@ -53,7 +53,7 @@ Classes
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaceanonymous__namespace_02Manipulator_8cpp_03.html b/kite/doc/html/namespaceanonymous__namespace_02Manipulator_8cpp_03.html index d02da413..72f76cc7 100644 --- a/kite/doc/html/namespaceanonymous__namespace_02Manipulator_8cpp_03.html +++ b/kite/doc/html/namespaceanonymous__namespace_02Manipulator_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaceanonymous__namespace_02NegociateWindow_8cpp_03.html b/kite/doc/html/namespaceanonymous__namespace_02NegociateWindow_8cpp_03.html index 3d635e93..4230a2d1 100644 --- a/kite/doc/html/namespaceanonymous__namespace_02NegociateWindow_8cpp_03.html +++ b/kite/doc/html/namespaceanonymous__namespace_02NegociateWindow_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaceanonymous__namespace_02RoutingPlane_8cpp_03.html b/kite/doc/html/namespaceanonymous__namespace_02RoutingPlane_8cpp_03.html index 791daae4..c612e9b7 100644 --- a/kite/doc/html/namespaceanonymous__namespace_02RoutingPlane_8cpp_03.html +++ b/kite/doc/html/namespaceanonymous__namespace_02RoutingPlane_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaceanonymous__namespace_02SegmentFsm_8cpp_03.html b/kite/doc/html/namespaceanonymous__namespace_02SegmentFsm_8cpp_03.html index 8b9dc3c6..e3ab9499 100644 --- a/kite/doc/html/namespaceanonymous__namespace_02SegmentFsm_8cpp_03.html +++ b/kite/doc/html/namespaceanonymous__namespace_02SegmentFsm_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaceanonymous__namespace_02Session_8cpp_03.html b/kite/doc/html/namespaceanonymous__namespace_02Session_8cpp_03.html index 303576c9..9c0ff9fd 100644 --- a/kite/doc/html/namespaceanonymous__namespace_02Session_8cpp_03.html +++ b/kite/doc/html/namespaceanonymous__namespace_02Session_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaceanonymous__namespace_02TrackElement_8cpp_03.html b/kite/doc/html/namespaceanonymous__namespace_02TrackElement_8cpp_03.html index b065d555..45c450a1 100644 --- a/kite/doc/html/namespaceanonymous__namespace_02TrackElement_8cpp_03.html +++ b/kite/doc/html/namespaceanonymous__namespace_02TrackElement_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaceanonymous__namespace_02Track_8cpp_03.html b/kite/doc/html/namespaceanonymous__namespace_02Track_8cpp_03.html index 3c0e97c4..f6cb803f 100644 --- a/kite/doc/html/namespaceanonymous__namespace_02Track_8cpp_03.html +++ b/kite/doc/html/namespaceanonymous__namespace_02Track_8cpp_03.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespacemembers.html b/kite/doc/html/namespacemembers.html index e9d8d98d..42babab0 100644 --- a/kite/doc/html/namespacemembers.html +++ b/kite/doc/html/namespacemembers.html @@ -76,7 +76,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespacemembers_enum.html b/kite/doc/html/namespacemembers_enum.html index 04d1b1c0..f2d18203 100644 --- a/kite/doc/html/namespacemembers_enum.html +++ b/kite/doc/html/namespacemembers_enum.html @@ -46,7 +46,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespacemembers_eval.html b/kite/doc/html/namespacemembers_eval.html index c5ed922f..3e14da19 100644 --- a/kite/doc/html/namespacemembers_eval.html +++ b/kite/doc/html/namespacemembers_eval.html @@ -70,7 +70,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespacemembers_type.html b/kite/doc/html/namespacemembers_type.html index 885c43a3..bf66b42f 100644 --- a/kite/doc/html/namespacemembers_type.html +++ b/kite/doc/html/namespacemembers_type.html @@ -46,7 +46,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/namespaces.html b/kite/doc/html/namespaces.html index d0ed7140..14ff1927 100644 --- a/kite/doc/html/namespaces.html +++ b/kite/doc/html/namespaces.html @@ -62,7 +62,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/pageNotes.html b/kite/doc/html/pageNotes.html index 55433a81..7a30b6e7 100644 --- a/kite/doc/html/pageNotes.html +++ b/kite/doc/html/pageNotes.html @@ -150,7 +150,7 @@ Evaluation with Cadence NanoRoute
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/html/pages.html b/kite/doc/html/pages.html index 25838ab4..f1f7f7dd 100644 --- a/kite/doc/html/pages.html +++ b/kite/doc/html/pages.html @@ -50,7 +50,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/kite/doc/latex/refman.tex b/kite/doc/latex/refman.tex index ee427045..cf81868b 100644 --- a/kite/doc/latex/refman.tex +++ b/kite/doc/latex/refman.tex @@ -34,7 +34,7 @@ \vspace*{1cm} {\large Generated by Doxygen 1.8.14}\\ \vspace*{0.5cm} - {\small Thu Nov 12 2020 13:59:42}\\ + {\small Fri Oct 1 2021 19:23:15}\\ \end{center} \end{titlepage} diff --git a/kite/doc/man/man3/AlgorithmOverview.3 b/kite/doc/man/man3/AlgorithmOverview.3 index f59a2966..f0cce0b6 100644 --- a/kite/doc/man/man3/AlgorithmOverview.3 +++ b/kite/doc/man/man3/AlgorithmOverview.3 @@ -1,4 +1,4 @@ -.TH "AlgorithmOverview" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "AlgorithmOverview" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite.3 b/kite/doc/man/man3/Kite.3 index 39ba7d03..b77dcd42 100644 --- a/kite/doc/man/man3/Kite.3 +++ b/kite/doc/man/man3/Kite.3 @@ -1,4 +1,4 @@ -.TH "Kite" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "Kite" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_DataNegociate.3 b/kite/doc/man/man3/Kite_DataNegociate.3 index d6e5006c..8685913f 100644 --- a/kite/doc/man/man3/Kite_DataNegociate.3 +++ b/kite/doc/man/man3/Kite_DataNegociate.3 @@ -1,4 +1,4 @@ -.TH "DataNegociate" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "DataNegociate" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_HorizontalTrack.3 b/kite/doc/man/man3/Kite_HorizontalTrack.3 index 45ea5a4a..fc9beb8a 100644 --- a/kite/doc/man/man3/Kite_HorizontalTrack.3 +++ b/kite/doc/man/man3/Kite_HorizontalTrack.3 @@ -1,4 +1,4 @@ -.TH "HorizontalTrack" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "HorizontalTrack" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_KiteEngine.3 b/kite/doc/man/man3/Kite_KiteEngine.3 index 54cd6eeb..aafdbfb6 100644 --- a/kite/doc/man/man3/Kite_KiteEngine.3 +++ b/kite/doc/man/man3/Kite_KiteEngine.3 @@ -1,4 +1,4 @@ -.TH "KiteEngine" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "KiteEngine" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_Manipulator.3 b/kite/doc/man/man3/Kite_Manipulator.3 index fe16ac22..cd670756 100644 --- a/kite/doc/man/man3/Kite_Manipulator.3 +++ b/kite/doc/man/man3/Kite_Manipulator.3 @@ -1,4 +1,4 @@ -.TH "Manipulator" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "Manipulator" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_NegociateWindow.3 b/kite/doc/man/man3/Kite_NegociateWindow.3 index 2337c9a3..47d96273 100644 --- a/kite/doc/man/man3/Kite_NegociateWindow.3 +++ b/kite/doc/man/man3/Kite_NegociateWindow.3 @@ -1,4 +1,4 @@ -.TH "NegociateWindow" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "NegociateWindow" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_RoutingEvent.3 b/kite/doc/man/man3/Kite_RoutingEvent.3 index 6b37e81e..b2a12255 100644 --- a/kite/doc/man/man3/Kite_RoutingEvent.3 +++ b/kite/doc/man/man3/Kite_RoutingEvent.3 @@ -1,4 +1,4 @@ -.TH "RoutingEvent" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "RoutingEvent" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_RoutingEventHistory.3 b/kite/doc/man/man3/Kite_RoutingEventHistory.3 index ab7cc2a3..9ca62d5c 100644 --- a/kite/doc/man/man3/Kite_RoutingEventHistory.3 +++ b/kite/doc/man/man3/Kite_RoutingEventHistory.3 @@ -1,4 +1,4 @@ -.TH "RoutingEventHistory" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "RoutingEventHistory" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_RoutingEventLoop.3 b/kite/doc/man/man3/Kite_RoutingEventLoop.3 index 86a7fac8..9f6eaeca 100644 --- a/kite/doc/man/man3/Kite_RoutingEventLoop.3 +++ b/kite/doc/man/man3/Kite_RoutingEventLoop.3 @@ -1,4 +1,4 @@ -.TH "RoutingEventLoop" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "RoutingEventLoop" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_RoutingEventQueue.3 b/kite/doc/man/man3/Kite_RoutingEventQueue.3 index e627e733..7c2dab15 100644 --- a/kite/doc/man/man3/Kite_RoutingEventQueue.3 +++ b/kite/doc/man/man3/Kite_RoutingEventQueue.3 @@ -1,4 +1,4 @@ -.TH "RoutingEventQueue" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "RoutingEventQueue" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_RoutingEvent_Key.3 b/kite/doc/man/man3/Kite_RoutingEvent_Key.3 index 39168964..9afaaa3e 100644 --- a/kite/doc/man/man3/Kite_RoutingEvent_Key.3 +++ b/kite/doc/man/man3/Kite_RoutingEvent_Key.3 @@ -1,4 +1,4 @@ -.TH "RoutingEvent::Key" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "RoutingEvent::Key" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_RoutingPlane.3 b/kite/doc/man/man3/Kite_RoutingPlane.3 index d3cbb2a4..84c79342 100644 --- a/kite/doc/man/man3/Kite_RoutingPlane.3 +++ b/kite/doc/man/man3/Kite_RoutingPlane.3 @@ -1,4 +1,4 @@ -.TH "RoutingPlane" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "RoutingPlane" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_SegmentAction.3 b/kite/doc/man/man3/Kite_SegmentAction.3 index 5c640492..b9f26a63 100644 --- a/kite/doc/man/man3/Kite_SegmentAction.3 +++ b/kite/doc/man/man3/Kite_SegmentAction.3 @@ -1,4 +1,4 @@ -.TH "SegmentAction" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "SegmentAction" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_SegmentFsm.3 b/kite/doc/man/man3/Kite_SegmentFsm.3 index a9b91727..ce00a7a2 100644 --- a/kite/doc/man/man3/Kite_SegmentFsm.3 +++ b/kite/doc/man/man3/Kite_SegmentFsm.3 @@ -1,4 +1,4 @@ -.TH "SegmentFsm" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "SegmentFsm" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_SegmentObserver.3 b/kite/doc/man/man3/Kite_SegmentObserver.3 index bc2f65cc..d1f1c97e 100644 --- a/kite/doc/man/man3/Kite_SegmentObserver.3 +++ b/kite/doc/man/man3/Kite_SegmentObserver.3 @@ -1,4 +1,4 @@ -.TH "SegmentObserver" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "SegmentObserver" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_Session.3 b/kite/doc/man/man3/Kite_Session.3 index 771dce4d..6f4d3fee 100644 --- a/kite/doc/man/man3/Kite_Session.3 +++ b/kite/doc/man/man3/Kite_Session.3 @@ -1,4 +1,4 @@ -.TH "Session" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "Session" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_Track.3 b/kite/doc/man/man3/Kite_Track.3 index 61aa13a2..0714508a 100644 --- a/kite/doc/man/man3/Kite_Track.3 +++ b/kite/doc/man/man3/Kite_Track.3 @@ -1,4 +1,4 @@ -.TH "Track" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "Track" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_TrackElement.3 b/kite/doc/man/man3/Kite_TrackElement.3 index c0c48845..b19653a5 100644 --- a/kite/doc/man/man3/Kite_TrackElement.3 +++ b/kite/doc/man/man3/Kite_TrackElement.3 @@ -1,4 +1,4 @@ -.TH "TrackElement" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "TrackElement" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_TrackFixedSegment.3 b/kite/doc/man/man3/Kite_TrackFixedSegment.3 index 3fb11cf5..c50dbbcc 100644 --- a/kite/doc/man/man3/Kite_TrackFixedSegment.3 +++ b/kite/doc/man/man3/Kite_TrackFixedSegment.3 @@ -1,4 +1,4 @@ -.TH "TrackFixedSegment" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "TrackFixedSegment" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_TrackMarker.3 b/kite/doc/man/man3/Kite_TrackMarker.3 index ac6aa50f..4ca8b09b 100644 --- a/kite/doc/man/man3/Kite_TrackMarker.3 +++ b/kite/doc/man/man3/Kite_TrackMarker.3 @@ -1,4 +1,4 @@ -.TH "TrackMarker" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "TrackMarker" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_TrackSegment.3 b/kite/doc/man/man3/Kite_TrackSegment.3 index dca0161d..b3fbf333 100644 --- a/kite/doc/man/man3/Kite_TrackSegment.3 +++ b/kite/doc/man/man3/Kite_TrackSegment.3 @@ -1,4 +1,4 @@ -.TH "TrackSegment" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "TrackSegment" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/Kite_VerticalTrack.3 b/kite/doc/man/man3/Kite_VerticalTrack.3 index 29fc8e8f..25d46bc9 100644 --- a/kite/doc/man/man3/Kite_VerticalTrack.3 +++ b/kite/doc/man/man3/Kite_VerticalTrack.3 @@ -1,4 +1,4 @@ -.TH "VerticalTrack" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "VerticalTrack" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/anonymous_namespace{AutoSegment.cpp}.3 b/kite/doc/man/man3/anonymous_namespace{AutoSegment.cpp}.3 index f9d7cab6..307da45d 100644 --- a/kite/doc/man/man3/anonymous_namespace{AutoSegment.cpp}.3 +++ b/kite/doc/man/man3/anonymous_namespace{AutoSegment.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{AutoSegment.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "anonymous_namespace{AutoSegment.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/anonymous_namespace{ChipTools.cpp}.3 b/kite/doc/man/man3/anonymous_namespace{ChipTools.cpp}.3 index 46e936d0..cb3c025e 100644 --- a/kite/doc/man/man3/anonymous_namespace{ChipTools.cpp}.3 +++ b/kite/doc/man/man3/anonymous_namespace{ChipTools.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{ChipTools.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "anonymous_namespace{ChipTools.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/anonymous_namespace{GCell.cpp}.3 b/kite/doc/man/man3/anonymous_namespace{GCell.cpp}.3 index 1df4cc57..0e1ea8b9 100644 --- a/kite/doc/man/man3/anonymous_namespace{GCell.cpp}.3 +++ b/kite/doc/man/man3/anonymous_namespace{GCell.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{GCell.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "anonymous_namespace{GCell.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/anonymous_namespace{KatabaticEngine.cpp}.3 b/kite/doc/man/man3/anonymous_namespace{KatabaticEngine.cpp}.3 index 15de6cb4..8c43e27a 100644 --- a/kite/doc/man/man3/anonymous_namespace{KatabaticEngine.cpp}.3 +++ b/kite/doc/man/man3/anonymous_namespace{KatabaticEngine.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{KatabaticEngine.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "anonymous_namespace{KatabaticEngine.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/anonymous_namespace{LoadGrByNet.cpp}.3 b/kite/doc/man/man3/anonymous_namespace{LoadGrByNet.cpp}.3 index ff8f6b9e..70b1f916 100644 --- a/kite/doc/man/man3/anonymous_namespace{LoadGrByNet.cpp}.3 +++ b/kite/doc/man/man3/anonymous_namespace{LoadGrByNet.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{LoadGrByNet.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "anonymous_namespace{LoadGrByNet.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/anonymous_namespace{Manipulator.cpp}.3 b/kite/doc/man/man3/anonymous_namespace{Manipulator.cpp}.3 index 1dcf96d6..1e618bfd 100644 --- a/kite/doc/man/man3/anonymous_namespace{Manipulator.cpp}.3 +++ b/kite/doc/man/man3/anonymous_namespace{Manipulator.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{Manipulator.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "anonymous_namespace{Manipulator.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/anonymous_namespace{NegociateWindow.cpp}.3 b/kite/doc/man/man3/anonymous_namespace{NegociateWindow.cpp}.3 index d0d92811..a01d8a41 100644 --- a/kite/doc/man/man3/anonymous_namespace{NegociateWindow.cpp}.3 +++ b/kite/doc/man/man3/anonymous_namespace{NegociateWindow.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{NegociateWindow.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "anonymous_namespace{NegociateWindow.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/anonymous_namespace{RoutingPlane.cpp}.3 b/kite/doc/man/man3/anonymous_namespace{RoutingPlane.cpp}.3 index 24e9b705..a0b195c8 100644 --- a/kite/doc/man/man3/anonymous_namespace{RoutingPlane.cpp}.3 +++ b/kite/doc/man/man3/anonymous_namespace{RoutingPlane.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{RoutingPlane.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "anonymous_namespace{RoutingPlane.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/anonymous_namespace{SegmentFsm.cpp}.3 b/kite/doc/man/man3/anonymous_namespace{SegmentFsm.cpp}.3 index aa500e05..1ec264b4 100644 --- a/kite/doc/man/man3/anonymous_namespace{SegmentFsm.cpp}.3 +++ b/kite/doc/man/man3/anonymous_namespace{SegmentFsm.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{SegmentFsm.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "anonymous_namespace{SegmentFsm.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/anonymous_namespace{Session.cpp}.3 b/kite/doc/man/man3/anonymous_namespace{Session.cpp}.3 index 8f3289e2..62573138 100644 --- a/kite/doc/man/man3/anonymous_namespace{Session.cpp}.3 +++ b/kite/doc/man/man3/anonymous_namespace{Session.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{Session.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "anonymous_namespace{Session.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/anonymous_namespace{Track.cpp}.3 b/kite/doc/man/man3/anonymous_namespace{Track.cpp}.3 index eec8a6bf..08c038a5 100644 --- a/kite/doc/man/man3/anonymous_namespace{Track.cpp}.3 +++ b/kite/doc/man/man3/anonymous_namespace{Track.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{Track.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "anonymous_namespace{Track.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/anonymous_namespace{TrackElement.cpp}.3 b/kite/doc/man/man3/anonymous_namespace{TrackElement.cpp}.3 index bb4180f3..f5d5ae68 100644 --- a/kite/doc/man/man3/anonymous_namespace{TrackElement.cpp}.3 +++ b/kite/doc/man/man3/anonymous_namespace{TrackElement.cpp}.3 @@ -1,4 +1,4 @@ -.TH "anonymous_namespace{TrackElement.cpp}" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "anonymous_namespace{TrackElement.cpp}" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/grpSynthHierarchy.3 b/kite/doc/man/man3/grpSynthHierarchy.3 index 88ff105b..b37c1ff0 100644 --- a/kite/doc/man/man3/grpSynthHierarchy.3 +++ b/kite/doc/man/man3/grpSynthHierarchy.3 @@ -1,4 +1,4 @@ -.TH "grpSynthHierarchy" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "grpSynthHierarchy" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/man/man3/pageNotes.3 b/kite/doc/man/man3/pageNotes.3 index ecccccbd..1ed5c6b1 100644 --- a/kite/doc/man/man3/pageNotes.3 +++ b/kite/doc/man/man3/pageNotes.3 @@ -1,4 +1,4 @@ -.TH "pageNotes" 3 "Thu Nov 12 2020" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- +.TH "pageNotes" 3 "Fri Oct 1 2021" "Version 1.0" "Kite - Detailed Router" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/kite/doc/rtf/refman.rtf b/kite/doc/rtf/refman.rtf index 5e8d88a1..6a74ecc8 100644 --- a/kite/doc/rtf/refman.rtf +++ b/kite/doc/rtf/refman.rtf @@ -86,7 +86,7 @@ 1.0 \par }}Kite - Detailed Router} {\comment Generated byDoxgyen. } -{\creatim \yr2020\mo11\dy12\hr13\min59\sec42} +{\creatim \yr2021\mo10\dy1\hr19\min23\sec15} }\pard\plain \sectd\pgnlcrm {\footer \s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid {\chpgn}} @@ -99,7 +99,7 @@ \par\par\par\par\par\par\par\par\par\par\par\par \pard\plain \s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid {\field\fldedit {\*\fldinst AUTHOR \\*MERGEFORMAT}{\fldrslt AUTHOR}}\par -Version 1.0\par{\field\fldedit {\*\fldinst CREATEDATE \\*MERGEFORMAT}{\fldrslt Thu Nov 12 2020 }}\par +Version 1.0\par{\field\fldedit {\*\fldinst CREATEDATE \\*MERGEFORMAT}{\fldrslt Fri Oct 1 2021 }}\par \page\page\vertalt \pard\plain \s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid Table of Contents\par diff --git a/oroshi/doc/html/annotated.html b/oroshi/doc/html/annotated.html index ba3797ca..5f4d832a 100644 --- a/oroshi/doc/html/annotated.html +++ b/oroshi/doc/html/annotated.html @@ -60,7 +60,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/classes.html b/oroshi/doc/html/classes.html index 902cab2b..4d88659e 100644 --- a/oroshi/doc/html/classes.html +++ b/oroshi/doc/html/classes.html @@ -61,7 +61,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/classpython_1_1capacitormatrix_1_1CapacitorStack-members.html b/oroshi/doc/html/classpython_1_1capacitormatrix_1_1CapacitorStack-members.html index 9897188c..27ce5ef8 100644 --- a/oroshi/doc/html/classpython_1_1capacitormatrix_1_1CapacitorStack-members.html +++ b/oroshi/doc/html/classpython_1_1capacitormatrix_1_1CapacitorStack-members.html @@ -106,7 +106,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/classpython_1_1capacitormatrix_1_1CapacitorStack.html b/oroshi/doc/html/classpython_1_1capacitormatrix_1_1CapacitorStack.html index 366c2c24..283ea2d2 100644 --- a/oroshi/doc/html/classpython_1_1capacitormatrix_1_1CapacitorStack.html +++ b/oroshi/doc/html/classpython_1_1capacitormatrix_1_1CapacitorStack.html @@ -706,7 +706,7 @@ Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/classpython_1_1capacitorrouted_1_1RoutMatchedCapacitor-members.html b/oroshi/doc/html/classpython_1_1capacitorrouted_1_1RoutMatchedCapacitor-members.html index 0069ed33..05d516f2 100644 --- a/oroshi/doc/html/classpython_1_1capacitorrouted_1_1RoutMatchedCapacitor-members.html +++ b/oroshi/doc/html/classpython_1_1capacitorrouted_1_1RoutMatchedCapacitor-members.html @@ -260,7 +260,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/classpython_1_1capacitorrouted_1_1RoutMatchedCapacitor.html b/oroshi/doc/html/classpython_1_1capacitorrouted_1_1RoutMatchedCapacitor.html index 2fc1280b..a2cba48e 100644 --- a/oroshi/doc/html/classpython_1_1capacitorrouted_1_1RoutMatchedCapacitor.html +++ b/oroshi/doc/html/classpython_1_1capacitorrouted_1_1RoutMatchedCapacitor.html @@ -941,7 +941,7 @@ Layout
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/classpython_1_1capacitorunit_1_1CapacitorUnit-members.html b/oroshi/doc/html/classpython_1_1capacitorunit_1_1CapacitorUnit-members.html index 7c5493cd..57d420d6 100644 --- a/oroshi/doc/html/classpython_1_1capacitorunit_1_1CapacitorUnit-members.html +++ b/oroshi/doc/html/classpython_1_1capacitorunit_1_1CapacitorUnit-members.html @@ -94,7 +94,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/classpython_1_1capacitorunit_1_1CapacitorUnit.html b/oroshi/doc/html/classpython_1_1capacitorunit_1_1CapacitorUnit.html index 7d143fc6..47051529 100644 --- a/oroshi/doc/html/classpython_1_1capacitorunit_1_1CapacitorUnit.html +++ b/oroshi/doc/html/classpython_1_1capacitorunit_1_1CapacitorUnit.html @@ -1561,7 +1561,7 @@ An exception is raised if the entered capacitor type is unknown.
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/classpython_1_1capacitorvrtracks_1_1VerticalRoutingTracks-members.html b/oroshi/doc/html/classpython_1_1capacitorvrtracks_1_1VerticalRoutingTracks-members.html index b7b474ed..d1a702a3 100644 --- a/oroshi/doc/html/classpython_1_1capacitorvrtracks_1_1VerticalRoutingTracks-members.html +++ b/oroshi/doc/html/classpython_1_1capacitorvrtracks_1_1VerticalRoutingTracks-members.html @@ -150,7 +150,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/classpython_1_1capacitorvrtracks_1_1VerticalRoutingTracks.html b/oroshi/doc/html/classpython_1_1capacitorvrtracks_1_1VerticalRoutingTracks.html index 4d6d75d0..eaf2cc3e 100644 --- a/oroshi/doc/html/classpython_1_1capacitorvrtracks_1_1VerticalRoutingTracks.html +++ b/oroshi/doc/html/classpython_1_1capacitorvrtracks_1_1VerticalRoutingTracks.html @@ -312,7 +312,7 @@ Layout
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/classpython_1_1stack_1_1Stack-members.html b/oroshi/doc/html/classpython_1_1stack_1_1Stack-members.html index 9352180c..97a966ec 100644 --- a/oroshi/doc/html/classpython_1_1stack_1_1Stack-members.html +++ b/oroshi/doc/html/classpython_1_1stack_1_1Stack-members.html @@ -56,7 +56,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/classpython_1_1stack_1_1Stack.html b/oroshi/doc/html/classpython_1_1stack_1_1Stack.html index f92a8f6d..191d9936 100644 --- a/oroshi/doc/html/classpython_1_1stack_1_1Stack.html +++ b/oroshi/doc/html/classpython_1_1stack_1_1Stack.html @@ -314,7 +314,7 @@ Stack Implementation Details
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/dir_7837fde3ab9c1fb2fc5be7b717af8d79.html b/oroshi/doc/html/dir_7837fde3ab9c1fb2fc5be7b717af8d79.html index 5da8fb1c..c71e89c6 100644 --- a/oroshi/doc/html/dir_7837fde3ab9c1fb2fc5be7b717af8d79.html +++ b/oroshi/doc/html/dir_7837fde3ab9c1fb2fc5be7b717af8d79.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/functions.html b/oroshi/doc/html/functions.html index d6240f67..b88bdcd6 100644 --- a/oroshi/doc/html/functions.html +++ b/oroshi/doc/html/functions.html @@ -283,7 +283,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/functions_func.html b/oroshi/doc/html/functions_func.html index ec3ea231..b1fc1dde 100644 --- a/oroshi/doc/html/functions_func.html +++ b/oroshi/doc/html/functions_func.html @@ -283,7 +283,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/graph_legend.html b/oroshi/doc/html/graph_legend.html index 44cd4069..17df788f 100644 --- a/oroshi/doc/html/graph_legend.html +++ b/oroshi/doc/html/graph_legend.html @@ -74,7 +74,7 @@ A yellow dashed arrow denotes a relation between a template instance and the tem
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/hierarchy.html b/oroshi/doc/html/hierarchy.html index 2d107987..f74ed441 100644 --- a/oroshi/doc/html/hierarchy.html +++ b/oroshi/doc/html/hierarchy.html @@ -57,7 +57,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/html/index.html b/oroshi/doc/html/index.html index 45cd8881..fdf3a8d9 100644 --- a/oroshi/doc/html/index.html +++ b/oroshi/doc/html/index.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/oroshi/doc/latex/refman.tex b/oroshi/doc/latex/refman.tex index 8afd5521..5e2ee813 100644 --- a/oroshi/doc/latex/refman.tex +++ b/oroshi/doc/latex/refman.tex @@ -34,7 +34,7 @@ \vspace*{1cm} {\large Generated by Doxygen 1.8.14}\\ \vspace*{0.5cm} - {\small Thu Nov 12 2020 13:59:55}\\ + {\small Fri Oct 1 2021 19:23:16}\\ \end{center} \end{titlepage} diff --git a/oroshi/doc/man/man3/python_capacitormatrix_CapacitorStack.3 b/oroshi/doc/man/man3/python_capacitormatrix_CapacitorStack.3 index f2ee82b2..1e731d56 100644 --- a/oroshi/doc/man/man3/python_capacitormatrix_CapacitorStack.3 +++ b/oroshi/doc/man/man3/python_capacitormatrix_CapacitorStack.3 @@ -1,4 +1,4 @@ -.TH "CapacitorStack" 3 "Thu Nov 12 2020" "Version 1.0" "Oroshi - Analog Devices Layout" \" -*- nroff -*- +.TH "CapacitorStack" 3 "Fri Oct 1 2021" "Version 1.0" "Oroshi - Analog Devices Layout" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/oroshi/doc/man/man3/python_capacitorrouted_RoutMatchedCapacitor.3 b/oroshi/doc/man/man3/python_capacitorrouted_RoutMatchedCapacitor.3 index 76a1a058..7a008f2a 100644 --- a/oroshi/doc/man/man3/python_capacitorrouted_RoutMatchedCapacitor.3 +++ b/oroshi/doc/man/man3/python_capacitorrouted_RoutMatchedCapacitor.3 @@ -1,4 +1,4 @@ -.TH "RoutMatchedCapacitor" 3 "Thu Nov 12 2020" "Version 1.0" "Oroshi - Analog Devices Layout" \" -*- nroff -*- +.TH "RoutMatchedCapacitor" 3 "Fri Oct 1 2021" "Version 1.0" "Oroshi - Analog Devices Layout" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/oroshi/doc/man/man3/python_capacitorunit_CapacitorUnit.3 b/oroshi/doc/man/man3/python_capacitorunit_CapacitorUnit.3 index 6b8c06ce..162b5c70 100644 --- a/oroshi/doc/man/man3/python_capacitorunit_CapacitorUnit.3 +++ b/oroshi/doc/man/man3/python_capacitorunit_CapacitorUnit.3 @@ -1,4 +1,4 @@ -.TH "CapacitorUnit" 3 "Thu Nov 12 2020" "Version 1.0" "Oroshi - Analog Devices Layout" \" -*- nroff -*- +.TH "CapacitorUnit" 3 "Fri Oct 1 2021" "Version 1.0" "Oroshi - Analog Devices Layout" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/oroshi/doc/man/man3/python_capacitorvrtracks_VerticalRoutingTracks.3 b/oroshi/doc/man/man3/python_capacitorvrtracks_VerticalRoutingTracks.3 index 0b567eed..73876e09 100644 --- a/oroshi/doc/man/man3/python_capacitorvrtracks_VerticalRoutingTracks.3 +++ b/oroshi/doc/man/man3/python_capacitorvrtracks_VerticalRoutingTracks.3 @@ -1,4 +1,4 @@ -.TH "VerticalRoutingTracks" 3 "Thu Nov 12 2020" "Version 1.0" "Oroshi - Analog Devices Layout" \" -*- nroff -*- +.TH "VerticalRoutingTracks" 3 "Fri Oct 1 2021" "Version 1.0" "Oroshi - Analog Devices Layout" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/oroshi/doc/man/man3/python_stack_Stack.3 b/oroshi/doc/man/man3/python_stack_Stack.3 index a3674ff1..1e83c1e7 100644 --- a/oroshi/doc/man/man3/python_stack_Stack.3 +++ b/oroshi/doc/man/man3/python_stack_Stack.3 @@ -1,4 +1,4 @@ -.TH "Stack" 3 "Thu Nov 12 2020" "Version 1.0" "Oroshi - Analog Devices Layout" \" -*- nroff -*- +.TH "Stack" 3 "Fri Oct 1 2021" "Version 1.0" "Oroshi - Analog Devices Layout" \" -*- nroff -*- .ad l .nh .SH NAME diff --git a/oroshi/doc/rtf/refman.rtf b/oroshi/doc/rtf/refman.rtf index 4387538c..c735a671 100644 --- a/oroshi/doc/rtf/refman.rtf +++ b/oroshi/doc/rtf/refman.rtf @@ -86,7 +86,7 @@ 1.0 \par }}Oroshi - Analog Devices Layout} {\comment Generated byDoxgyen. } -{\creatim \yr2020\mo11\dy12\hr13\min59\sec55} +{\creatim \yr2021\mo10\dy1\hr19\min23\sec16} }\pard\plain \sectd\pgnlcrm {\footer \s29\widctlpar\tqc\tx4320\tqr\tx8640\qr\adjustright \fs20\cgrid {\chpgn}} @@ -99,7 +99,7 @@ \par\par\par\par\par\par\par\par\par\par\par\par \pard\plain \s16\qc\sa60\widctlpar\outlinelevel1\adjustright \f1\cgrid {\field\fldedit {\*\fldinst AUTHOR \\*MERGEFORMAT}{\fldrslt AUTHOR}}\par -Version 1.0\par{\field\fldedit {\*\fldinst CREATEDATE \\*MERGEFORMAT}{\fldrslt Thu Nov 12 2020 }}\par +Version 1.0\par{\field\fldedit {\*\fldinst CREATEDATE \\*MERGEFORMAT}{\fldrslt Fri Oct 1 2021 }}\par \page\page\vertalt \pard\plain \s1\sb240\sa60\keepn\widctlpar\adjustright \b\f1\fs36\kerning36\cgrid Table of Contents\par diff --git a/unicorn/doc/unicorn/html/UnicornGui_8h_source.html b/unicorn/doc/unicorn/html/UnicornGui_8h_source.html index be2d2bdf..1017138e 100644 --- a/unicorn/doc/unicorn/html/UnicornGui_8h_source.html +++ b/unicorn/doc/unicorn/html/UnicornGui_8h_source.html @@ -61,7 +61,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/annotated.html b/unicorn/doc/unicorn/html/annotated.html index ea075101..d95c1adc 100644 --- a/unicorn/doc/unicorn/html/annotated.html +++ b/unicorn/doc/unicorn/html/annotated.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/classUnicorn_1_1UnicornGui-members.html b/unicorn/doc/unicorn/html/classUnicorn_1_1UnicornGui-members.html index 7c00998a..868941ae 100644 --- a/unicorn/doc/unicorn/html/classUnicorn_1_1UnicornGui-members.html +++ b/unicorn/doc/unicorn/html/classUnicorn_1_1UnicornGui-members.html @@ -73,7 +73,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/classUnicorn_1_1UnicornGui.html b/unicorn/doc/unicorn/html/classUnicorn_1_1UnicornGui.html index 9058906e..046b32d5 100644 --- a/unicorn/doc/unicorn/html/classUnicorn_1_1UnicornGui.html +++ b/unicorn/doc/unicorn/html/classUnicorn_1_1UnicornGui.html @@ -202,7 +202,7 @@ Static Public Member Functions
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/classes.html b/unicorn/doc/unicorn/html/classes.html index ccccc741..68f23aff 100644 --- a/unicorn/doc/unicorn/html/classes.html +++ b/unicorn/doc/unicorn/html/classes.html @@ -54,7 +54,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/dir_4aa09a10ca668c28f3c8e57fb374580b.html b/unicorn/doc/unicorn/html/dir_4aa09a10ca668c28f3c8e57fb374580b.html index 1c896f8a..c6159b42 100644 --- a/unicorn/doc/unicorn/html/dir_4aa09a10ca668c28f3c8e57fb374580b.html +++ b/unicorn/doc/unicorn/html/dir_4aa09a10ca668c28f3c8e57fb374580b.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/unicorn/doc/unicorn/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html index fdb66adf..ac407e7f 100644 --- a/unicorn/doc/unicorn/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html +++ b/unicorn/doc/unicorn/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -53,7 +53,7 @@ Directories
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/files.html b/unicorn/doc/unicorn/html/files.html index 8eb264ae..ee816b8a 100644 --- a/unicorn/doc/unicorn/html/files.html +++ b/unicorn/doc/unicorn/html/files.html @@ -50,7 +50,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/functions.html b/unicorn/doc/unicorn/html/functions.html index 3c96bbc7..81e27962 100644 --- a/unicorn/doc/unicorn/html/functions.html +++ b/unicorn/doc/unicorn/html/functions.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/functions_func.html b/unicorn/doc/unicorn/html/functions_func.html index 7c85e02e..79afe500 100644 --- a/unicorn/doc/unicorn/html/functions_func.html +++ b/unicorn/doc/unicorn/html/functions_func.html @@ -58,7 +58,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/hierarchy.html b/unicorn/doc/unicorn/html/hierarchy.html index 8bc629be..a8b4c24a 100644 --- a/unicorn/doc/unicorn/html/hierarchy.html +++ b/unicorn/doc/unicorn/html/hierarchy.html @@ -51,7 +51,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/index.html b/unicorn/doc/unicorn/html/index.html index 2714cf92..7eeb7a39 100644 --- a/unicorn/doc/unicorn/html/index.html +++ b/unicorn/doc/unicorn/html/index.html @@ -45,7 +45,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/namespaceUnicorn.html b/unicorn/doc/unicorn/html/namespaceUnicorn.html index a96ebc17..e582fceb 100644 --- a/unicorn/doc/unicorn/html/namespaceUnicorn.html +++ b/unicorn/doc/unicorn/html/namespaceUnicorn.html @@ -59,7 +59,7 @@ Classes
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/namespaces.html b/unicorn/doc/unicorn/html/namespaces.html index 729ad204..35268348 100644 --- a/unicorn/doc/unicorn/html/namespaces.html +++ b/unicorn/doc/unicorn/html/namespaces.html @@ -50,7 +50,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/html/pages.html b/unicorn/doc/unicorn/html/pages.html index 686fa02d..ad11877d 100644 --- a/unicorn/doc/unicorn/html/pages.html +++ b/unicorn/doc/unicorn/html/pages.html @@ -49,7 +49,7 @@ $(function() {
    - +
    Generated by doxygen 1.8.14 on Thu Nov 12 2020Generated by doxygen 1.8.14 on Fri Oct 1 2021 Return to top of page
    diff --git a/unicorn/doc/unicorn/latex/refman.tex b/unicorn/doc/unicorn/latex/refman.tex index 5596bd0a..707f08e3 100644 --- a/unicorn/doc/unicorn/latex/refman.tex +++ b/unicorn/doc/unicorn/latex/refman.tex @@ -34,7 +34,7 @@ \vspace*{1cm} {\large Generated by Doxygen 1.8.14}\\ \vspace*{0.5cm} - {\small Thu Nov 12 2020 14:00:01}\\ + {\small Fri Oct 1 2021 19:23:18}\\ \end{center} \end{titlepage}